Oracle 库定期备份表结构元数据信息至目标端备份脚本

一、背景描述

当前 xxx 项目 Oracle 11g RAC 库缺少 DG,并且日常没有备份,存在服务器或存储损坏,数据或表结构存在丢失风险,在和项目组同步后,项目组反馈可对该数据库定期备份相关结构信息,如存在数据丢失,只要备份的用户表结构等信息还在,可通过其它方式导入。

本次通过shell脚本来备份实现,将数据备份到本地,并scp 到远程目标端。

1xxx1/home/oracle/backups/xxx
  • 192.168.xxx.xxx
  • /database/xxxback/xxx
2xxx1/home/oracle/backups/xxx
  • 192.168.xxx.xxx
  • /database/xxxback/xxx

二、操作过程

1)Oracle 数据库创建备份用户

  • create user xxxback identified by xxxx;

2)创建备份目录

  • create or replace directory BACKUP_DIR as '/home/oracle/backups/xxx' ;

3)授予备份用户权限

  • grant read,write on directory BACKUP_DIR to xxxback;

4)创建免密登录远程服务器

5)编写脚本

6)定时备份  

# 定期从 xxx-primary-db1 服务器备份,root 用户执行定期备份至 192.168.xxx.xxx /database/xxback/xxx 目录
0 3 * * * su - oracle -c "/home/oracle/backups/xxx/xxx_metadata_backup.sh" >> /dev/null 2>&1
0 4 * * * su - oracle -c "/home/oracle/backups/xxx/xxx_metadata_backup.sh" > /dev/null 2>&1

三、备份脚本

3.1 xxx 备份脚本 (xxx_metadata_backup.sh)

#!/bin/sh
# 脚本名称:xxx_metadata_backup.sh
# 功能:Oracle 11g RAC元数据备份及传输
# 备份内容:表结构、序列、触发器、存储过程等数据库对象(不包含数据)
# 备份频率:每天一次# ====== 核心配置 ======
export ORACLE_SID=xxx1
ORACLE_USER="xxxback"
ORACLE_PASS="xxx"
ORACLE_SERVICE="xxxx1"
SCHEMAS_TO_BACKUP=("xxx" "xxx")
ORACLE_DIR="BACKUP_DIR"
LOCAL_BACKUP_DIR="/home/oracle/backups/xxx"  # 已存在的目录
REMOTE_USER="xxxback"
REMOTE_SERVER="192.168.xxx.xxx"
REMOTE_PATH="/database/xxxback/xxx"
RETENTION_DAYS=7
# =====================# 设置Oracle环境
# export ORACLE_SID=xxx1
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'# 日志文件
CURRENT_DATE=$(date +%Y-%m-%d)
LOG_FILE="${LOCAL_BACKUP_DIR}/backup_${ORACLE_SERVICE}_${CURRENT_DATE}.log"# 1. 验证目录权限
echo "===== 备份开始 [${CURRENT_DATE}] =====" | tee "${LOG_FILE}"
echo "节点: $(hostname -s)" | tee -a "${LOG_FILE}"
echo "Oracle服务: ${ORACLE_SERVICE}" | tee -a "${LOG_FILE}"
echo "备份用户: ${SCHEMAS_TO_BACKUP[*]}" | tee -a "${LOG_FILE}"
echo "Oracle目录: ${ORACLE_DIR}" | tee -a "${LOG_FILE}"# 验证本地备份目录可写性
echo "[$(date +'%F %T')] 验证本地备份目录权限..." | tee -a "${LOG_FILE}"
if [ ! -d "${LOCAL_BACKUP_DIR}" ]; thenecho "[$(date +'%F %T')] [ERROR] 本地备份目录不存在: ${LOCAL_BACKUP_DIR}" | tee -a "${LOG_FILE}"exit 1
elif [ ! -w "${LOCAL_BACKUP_DIR}" ]; thenecho "[$(date +'%F %T')] [ERROR] 本地备份目录不可写: ${LOCAL_BACKUP_DIR}" | tee -a "${LOG_FILE}"exit 1
fi
echo "[$(date +'%F %T')] 本地备份目录验证通过: ${LOCAL_BACKUP_DIR}" | tee -a "${LOG_FILE}"# 查询Oracle目录路径
echo "[$(date +'%F %T')] 查询Oracle目录路径..." | tee -a "${LOG_FILE}"
{
sqlplus -s /nolog <<EOF
connect ${ORACLE_USER}/${ORACLE_PASS}@${ORACLE_SERVICE}
SET HEADING OFF FEEDBACK OFF PAGES 0
SELECT directory_path FROM dba_directories WHERE directory_name='${ORACLE_DIR}';
EXIT;
EOF
} > "${LOCAL_BACKUP_DIR}/dir_check.log" 2>&1DIR_PATH=$(grep -v '^$' "${LOCAL_BACKUP_DIR}/dir_check.log" | head -1)
if [ -z "$DIR_PATH" ]; thenecho "[$(date +'%F %T')] [ERROR] Oracle目录不存在或无权访问: ${ORACLE_DIR}" | tee -a "${LOG_FILE}"cat "${LOCAL_BACKUP_DIR}/dir_check.log" >> "${LOG_FILE}"exit 1
fi# 标准化路径格式(确保无结尾斜杠)
DIR_PATH=$(echo "${DIR_PATH}" | sed 's:/*$::')
LOCAL_BACKUP_DIR=$(echo "${LOCAL_BACKUP_DIR}" | sed 's:/*$::')echo "[$(date +'%F %T')] Oracle目录路径: ${DIR_PATH}" | tee -a "${LOG_FILE}"# 检查Oracle目录是否与本地备份目录相同
SAME_DIRECTORY=0
if [ "${DIR_PATH}" = "${LOCAL_BACKUP_DIR}" ]; thenecho "[$(date +'%F %T')] Oracle目录与本地备份目录相同,跳过移动操作" | tee -a "${LOG_FILE}"SAME_DIRECTORY=1
else# 验证Oracle目录可写性TEST_FILE="${DIR_PATH}/write_test_$(date +%s).tmp"touch "${TEST_FILE}" >/dev/null 2>&1if [ $? -ne 0 ]; thenecho "[$(date +'%F %T')] [ERROR] Oracle进程用户无法写入目录: ${DIR_PATH}" | tee -a "${LOG_FILE}"echo "请检查目录权限: ls -ld ${DIR_PATH}" | tee -a "${LOG_FILE}"exit 1elserm -f "${TEST_FILE}"echo "[$(date +'%F %T')] Oracle目录可写性验证通过" | tee -a "${LOG_FILE}"fi
fi# 2. 执行元数据备份
BACKUP_FILE="xxx_metadata_${ORACLE_SERVICE}_${CURRENT_DATE}.dmp"
BACKUP_LOG="expdp_${ORACLE_SERVICE}_${CURRENT_DATE}.log"echo "[$(date +'%F %T')] 开始元数据导出..." | tee -a "${LOG_FILE}"
{
expdp "${ORACLE_USER}"/"${ORACLE_PASS}"@"${ORACLE_SERVICE}" \DIRECTORY="${ORACLE_DIR}" \DUMPFILE="${BACKUP_FILE}" \LOGFILE="${BACKUP_LOG}" \SCHEMAS=$(IFS=,; echo "${SCHEMAS_TO_BACKUP[*]}") \CONTENT=METADATA_ONLY \CLUSTER=NO \EXCLUDE=STATISTICS \PARALLEL=1
} >> "${LOG_FILE}" 2>&1EXPDP_EXIT=$?
if [ $EXPDP_EXIT -ne 0 ]; thenecho "[$(date +'%F %T')] [ERROR] 元数据导出失败 (错误码: $EXPDP_EXIT)" | tee -a "${LOG_FILE}"# 提取并记录关键错误信息grep -iE 'error|failed|invalid|ora-|ude-' "${LOG_FILE}" | tail -10 | tee -a "${LOG_FILE}"exit 1
fi
echo "[$(date +'%F %T')] 元数据导出完成" | tee -a "${LOG_FILE}"# 3. 处理备份文件
if [ $SAME_DIRECTORY -eq 0 ]; thenecho "[$(date +'%F %T')] 移动备份文件到本地目录..." | tee -a "${LOG_FILE}"mv "${DIR_PATH}/${BACKUP_FILE}" "${LOCAL_BACKUP_DIR}/" || {echo "[$(date +'%F %T')] [ERROR] 移动备份文件失败" | tee -a "${LOG_FILE}"exit 1}mv "${DIR_PATH}/${BACKUP_LOG}" "${LOCAL_BACKUP_DIR}/" || {echo "[$(date +'%F %T')] [ERROR] 移动日志文件失败" | tee -a "${LOG_FILE}"exit 1}
elseecho "[$(date +'%F %T')] 备份文件已在本地目录,无需移动" | tee -a "${LOG_FILE}"
fi# 4. 传输备份文件
echo "[$(date +'%F %T')] 开始文件传输到远程服务器..." | tee -a "${LOG_FILE}"# 验证文件存在
FILES_TO_TRANSFER=("${LOCAL_BACKUP_DIR}/${BACKUP_FILE}""${LOCAL_BACKUP_DIR}/${BACKUP_LOG}""${LOG_FILE}"
)MISSING_FILE=0
for file in "${FILES_TO_TRANSFER[@]}"; doif [ ! -f "$file" ]; thenecho "[$(date +'%F %T')] [WARNING] 文件不存在: $file" | tee -a "${LOG_FILE}"MISSING_FILE=1fi
doneif [ $MISSING_FILE -eq 0 ]; thenscp -o StrictHostKeyChecking=no -o ConnectTimeout=30 \"${FILES_TO_TRANSFER[@]}" \"${REMOTE_USER}@${REMOTE_SERVER}:${REMOTE_PATH}/" >> "${LOG_FILE}" 2>&1SCP_EXIT=$?if [ $SCP_EXIT -ne 0 ]; thenecho "[$(date +'%F %T')] [ERROR] 文件传输失败 (错误码: $SCP_EXIT)" | tee -a "${LOG_FILE}"exit 1fiecho "[$(date +'%F %T')] 文件传输完成" | tee -a "${LOG_FILE}"
elseecho "[$(date +'%F %T')] [ERROR] 文件缺失,跳过传输" | tee -a "${LOG_FILE}"exit 1
fi# 5. 清理旧备份
echo "[$(date +'%F %T')] 清理过期备份文件..." | tee -a "${LOG_FILE}"# 本地清理
find "${LOCAL_BACKUP_DIR}" \-name "xxx_metadata_${ORACLE_SERVICE}_*.dmp" \-mtime +${RETENTION_DAYS} \-delete -print | tee -a "${LOG_FILE}"find "${LOCAL_BACKUP_DIR}" \-name "expdp_${ORACLE_SERVICE}_*.log" \-mtime +${RETENTION_DAYS} \-delete -print | tee -a "${LOG_FILE}"find "${LOCAL_BACKUP_DIR}" \-name "backup_${ORACLE_SERVICE}_*.log" \-mtime +${RETENTION_DAYS} \-delete -print | tee -a "${LOG_FILE}"# 如果Oracle目录不同,则清理该目录
if [ $SAME_DIRECTORY -eq 0 ]; thenfind "${DIR_PATH}" \-name "xxx_metadata_${ORACLE_SERVICE}_*.dmp" \-mtime +${RETENTION_DAYS} \-delete -print | tee -a "${LOG_FILE}"find "${DIR_PATH}" \-name "expdp_${ORACLE_SERVICE}_*.log" \-mtime +${RETENTION_DAYS} \-delete -print | tee -a "${LOG_FILE}"
fi# 远程清理
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 ${REMOTE_USER}@${REMOTE_SERVER} \"find ${REMOTE_PATH} \-name 'xxx_metadata_${ORACLE_SERVICE}_*.dmp' \-mtime +${RETENTION_DAYS} \-delete -print" | tee -a "${LOG_FILE}"ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 ${REMOTE_USER}@${REMOTE_SERVER} \"find ${REMOTE_PATH} \-name '*_${ORACLE_SERVICE}_*.log' \-mtime +${RETENTION_DAYS} \-delete -print" | tee -a "${LOG_FILE}"echo "[$(date +'%F %T')] 清理完成" | tee -a "${LOG_FILE}"
echo "===== 备份成功结束 [${CURRENT_DATE}] =====" | tee -a "${LOG_FILE}"
exit 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919551.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wps安装后win系统浏览窗口无法查看

前提需要有安装office软件&#xff0c;PDF一般默认是浏览器&#xff0c;如果设置浏览器不行&#xff0c;就安装Adobe Acrobat DC软件1、按winR键&#xff0c;输入regedit&#xff0c;进入注册表2、找到路径&#xff1a;\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Current…

Qt 中最经典、最常用的多线程通信场景

实现步骤创建工作类 (Worker)&#xff1a;在工作线程中处理数据的对象。创建线程对象 (QThread)&#xff1a;用来托管工作对象。连接信号槽&#xff1a;主线程 -> 工作线程&#xff1a;连接一个主窗口发出的信号到工作对象的槽&#xff0c;用于传递数据。工作线程 -> 主线…

【CV 目标检测】Fast RCNN模型①——与R-CNN区别

3.Fast RCNN模型 相比于R-CNN&#xff0c;Fast RCNN模型主要在以下三个方面进行了改进&#xff1a; 提高训练和预测速度 R-CNN首先从测试图中提取2000个候选区域&#xff0c;然后将这2000个候选区域分别输入到预训练好的CNN中提取特征。由于候选区域有大量的重叠&#xff0c;这…

Zookeeper学习

要精通 ZooKeeper&#xff0c;需要掌握其核心原理、数据模型、分布式协调机制、典型应用场景、运维管理与性能调优等方面的知识。以下是系统化的知识体系&#xff1a;✅ 一、ZooKeeper 基础原理ZooKeeper 是什么 分布式协调服务&#xff0c;提供一致性、高可用的元数据管理核心…

用TestComplete打造高效CI/CD测试流程

传统的UI测试往往受限于图形界面渲染&#xff0c;导致执行速度慢、资源占用高&#xff0c;难以适应持续集成/持续交付&#xff08;CI/CD&#xff09;管道的需求。自动化UI测试平台TestComplete的智能质量附加组件通过无头测试技术&#xff0c;为开发团队提供了一种更高效、更可…

C++ 浅拷贝 和深拷贝的知识点讲解

好问题 &#x1f44d;&#xff0c;这个就是理解 delete 的关键前置知识。 我从 C语言基础 出发&#xff0c;像教科书一样&#xff0c;从零讲给你听。1. 什么是“拷贝”&#xff1f; 在 C 中&#xff0c;当你有一个对象 A&#xff0c;然后写&#xff1a; Device_Info a; Device…

Arkts加载网页url的pdf发票黑屏问题

使用模拟器会闪退&#xff0c;连接真机预览正常import { HMRouter, HMRouterMgr, HMParamType, HMPageParam } from "hadss/hmrouter"; import { BaseTitle, RouterConstants } from "commonlib"; import { webview } from kit.ArkWeb; import { PDFView }…

使用 mongosh 设置 MongoDB 账号密码

可以使用 mongosh(MongoDB 6.0+ 的现代Shell)来设置账号密码。mongosh 是官方推荐的新一代MongoDB Shell工具,替代了传统的 mongo 命令。 【本人博文提到的ip均为随机生成的,不是实际的ip,仅供参考,如有雷同,纯属巧合】 使用 mongosh 设置 MongoDB 账号密码 1. 首先连…

HTML+CSS:浮动详解

在HTMLCSS布局中&#xff0c;浮动&#xff08;float&#xff09; 是一种经典的布局技术&#xff0c;用于控制元素在页面中的排列方式。它最初设计用于实现文字环绕图片的效果&#xff0c;后来被广泛用于复杂布局&#xff0c;但随着Flexbox和Grid的兴起&#xff0c;其使用场景有…

GPIO初始化及调用

下面把 HAL 库 和 标准外设库&#xff08;SPL&#xff09; 初始化 GPIO 点亮/熄灭 LED 的完整步骤、示例代码和常用 API 逐一说清楚。用例默认 PC13 接 LED&#xff08;蓝板常见&#xff1b;低电平点亮&#xff0c;高电平熄灭——若板子相反&#xff0c;只把写 1/0 对调即可&am…

【GPT入门】第48课 LlamaFacotory 合并原模型与LoRA模型

【GPT入门】第48课 LlamaFacotory 合并原模型与LoRA模型1.合并原模型与LoRA训练的增量模型2. 测试模型1.合并原模型与LoRA训练的增量模型 llamafactory-cli webui 执行合并 合并后模型大小 (base) rootautodl-container-b4b04ea4f2-b5ee47d1:~# du -sh /root/autodl-tmp/mod…

Python爬虫实战:研究tumblr,构建博客平台数据采集分析系统

1. 引言 1.1 研究背景 在信息爆炸的时代,社交媒体平台已成为人们获取信息、表达观点和进行社交互动的主要渠道。这些平台上积累的海量数据包含了用户偏好、社会趋势、文化现象等丰富信息,对学术研究、市场分析、产品开发等领域具有重要价值。 Tumblr 作为一个综合性的轻博客…

集成算法学习总结

一、集成学习基础认知 核心思想&#xff1a;集成学习&#xff08;ensemble learning&#xff09;通过构建并结合多个个体学习器来完成学习任务&#xff0c;类似于 “多个专家共同决策”&#xff0c;通常比单个学习器的性能更优。其核心逻辑是利用多个学习器的优势互补&#xff…

线程安全的产生以及解决方案

线程安全原子性&#xff08;Atomicity&#xff09;、可见性&#xff08;Visibility&#xff09;、有序性&#xff08;Ordering&#xff09; 是保证线程安全的三大核心要素 —— 线程安全问题的本质&#xff0c;几乎都是这三个特性中的一个或多个被破坏导致的。操作不会被 “中途…

Spring Cloud Netflix学习笔记01

文章目录前言一、微服务概述什么是微服务&#xff1f;微服务与微服务架构微服务优缺点优点缺点微服务技术栈有那些&#xff1f;二.SpringCloud入门概述SpringCloud是什么&#xff1f;SpringCloud和SpringBoot的关系Dubbo 和 SpringCloud技术选型总结SpringCloud能干嘛&#xff…

专题:2025母婴行业消费洞察与分龄营养趋势报告|附40 +份报告PDF、交互图表数据汇总下载

原文链接&#xff1a;https://tecdat.cn/?p43654 当95后妈妈拿着计算器对比DHA纯度&#xff0c;当爸爸们为“防红屁屁纸尿裤”货比三家&#xff0c;母婴行业的风向早就变了。从“一把奶粉喂到3岁”到“按月龄定制营养包”&#xff0c;从“进口就好”到“看专利数据下单”&…

redhat6/centos6 配置yum源

由于RHEL6/centos6系统官方早就停止通知维护了&#xff0c;公司的开发服务器有比较老&#xff0c;发现竟然scp都没有装。。。今天配置个本地yum源&#xff0c;安装一下常规软件和开发环境比较简单&#xff0c;直接上代码1.上传一个centos6的iso文件CentOS-6.5-x86_64-bin-DVD1.…

day31 SQLITE

数据库相关函数数据库创建int sqlite3_open( const char *filename, sqlite3 **ppDb);功能&#xff1a;打开数据库&#xff0c;不存在则创建参数&#xff1a;const char *filename 数据库名sqlite3 **ppDb 二级指针&#xff0c;传出ppDb数据库的一级指…

嵌入式-SPI番外之按钮驱动程序的编写-Day15

目录 一、按钮简单操作回忆 二、按钮新操作实现 &#xff08;1&#xff09;按钮的点击实现灯亮/灭 ①连接电路 ②初始化板载LED和按钮 ③按钮程序的基本原理&#xff08;核心仍为0亮/1灭&#xff09; ④按钮消抖的原理 三、按钮封装的操作-点击&#xff0c;双击&#xf…

星域智链科技:用科技点亮生活,以 AI 拓展无限可能

星域智链科技&#xff08;东莞市&#xff09;有限公司简介 星域智链科技&#xff08;东莞市&#xff09;有限公司&#xff0c;理念是 让科技便利生活、丰富生活&#xff0c;专注于科技、AI领域。 全场景 GPS 定位器 —— 精准追踪&#xff0c;守护安全&#xff0c;适用于车辆…