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
英文地址,請注明出處:http://en.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;適用于車輛…