Linux下Oracle定時自動備份方案


公司業務系統數據庫是Oracle 11g,以前用的備份方案是用imp,但是這個方案的速度相對比較慢,最近經過研究,打算將備份方案改寫為expdp形式,記錄一下操作過程

服務器關系

兩台服務器用作備份,包含正式環境服務器跟備份服務器,正式環境每天凌晨3點定時通過expdp導出全庫,再用scp傳輸至備份服務器存檔

實現scp免密碼傳輸

直接運行scp傳輸命令,會提示輸入密碼,要實現無人值守定時運行,就需要讓兩台服務器的交互能夠自動免密,在此通過建立ssh信任關系的方法來實現
在正式服務器上執行ssh證書生成命令

ssh-keygen -t rsa

遇到提示一路回車

運行完畢后,在/root/.ssh目錄下會生成id_rsa,id_rsa.pub兩個文件

登錄備份服務器,在用戶對應.ssh目錄(如/root/.ssh)下新建authorized_keys文件,將正式服務器id_rsa.pub文件的內容追加進去

在正式服務器上隨意新建一個文件,測試scp傳輸

scp ./aaa root@192.168.x.x:/root/

現在已經不需要輸入密碼了,scp免密碼傳輸已經成功

Oracle數據庫新建虛擬目錄

新建臨時備份文件存儲目錄

mkdir /home/oradp

修改臨時備份文件目錄權限,讓oracle具有寫入權限

chown oracle:oinstall /home/oradp

登錄sqlplus

su - oracle
sqlplus /nolog

新建虛擬目錄供expdp使用

conn / as sysdba
create directory dpdata as '/shell';

查看目錄是否創建成功

select * from dba_directories;

用sys管理員給指定用戶賦予在該目錄的操作權限

grant read,write on directory dpdata to cmsxx;

Oracle數據庫虛擬目錄創建成功

編寫自動備份腳本

編寫自動備份的shell腳本供定時任務使用,在正式服務器下新建腳本存儲目錄

mkdir /shell

在shell目錄下新建backup_oracle.sh自動備份腳本,內容如下

#!/bin/sh
#自動備份oracle數據庫並壓縮

#定時任務示例
#凌晨1點備份
#0 1 * * * nohup /bin/sh /shell/backup_oracle.sh >> /shell/backup_oracle.log &

#數據庫用戶
db_user="cmsxx";
#數據庫密碼
db_password="*";
#數據庫服務器,需要在本地客戶端tnsnames中定義好
db_server="cmsxx";
#本地客戶端執行程序目錄
oracle_bin_dir="/home/oracle/xx/bin";
#oracle虛擬目錄名
oracle_directory="dpdata";
#備份服務器地址
backup_server="192.168.x.x";
#備份服務器用戶
backup_user="root";
#本地備份目錄,存放dump文件與臨時壓縮文件
local_backup_dir="/home/oradp";
#遠程備份目錄,對應備份服務器存放位置,需要提前掛載
remote_backup_dir="/xx/xx/oracle_backup";

#獲取當前日期
date_now=$(date +%Y%m%d);
#備份當天的數據庫
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 自動備份數據庫並壓縮開始 ----------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 數據庫備份開始 --------------------------------------------------------";
echo "su oracle -lc \"${oracle_bin_dir}/expdp ${db_user}/${db_password}@${db_server} directory=${oracle_directory} full=y dumpfile=${db_server}_${date_now}.dmp logfile=${db_server}_${date_now}.log\"";
su oracle -lc "${oracle_bin_dir}/expdp ${db_user}/${db_password}@${db_server} directory=${oracle_directory} full=y dumpfile=${db_server}_${date_now}.dmp logfile=${db_server}_${date_now}.log";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 數據庫備份結束 --------------------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 數據庫壓縮開始 --------------------------------------------------------";
echo "cd ${local_backup_dir} && tar -zcf ${db_server}_${date_now}.tar.gz ${db_server}_${date_now}.dmp ${db_server}_${date_now}.log";
cd ${local_backup_dir} && tar -zcf ${db_server}_${date_now}.tar.gz ${db_server}_${date_now}.dmp ${db_server}_${date_now}.log;
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 數據庫壓縮結束 --------------------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 傳輸備份文件開始 --------------------------------------------------------";
echo "scp ${local_backup_dir}/${db_server}_${date_now}.tar.gz ${backup_user}@${backup_server}:/${remote_backup_dir}";
scp ${local_backup_dir}/${db_server}_${date_now}.tar.gz ${backup_user}@${backup_server}:/${remote_backup_dir};
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 傳輸備份文件結束 --------------------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 刪除當前備份原始文件開始 ----------------------------------------------";
echo "rm -rf ${local_backup_dir}/${db_server}_${date_now}.dmp ${local_backup_dir}/${db_server}_${date_now}.log"
rm -rf ${local_backup_dir}/${db_server}_${date_now}.dmp ${local_backup_dir}/${db_server}_${date_now}.log;
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 刪除當前備份原始文件結束 ----------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 刪除當前備份壓縮文件開始 ----------------------------------------------";
echo "rm -rf ${local_backup_dir}/${db_server}_${date_now}.tar.gz"
rm -rf ${local_backup_dir}/${db_server}_${date_now}.tar.gz;
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 刪除當前備份壓縮文件結束 ----------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') 自動備份數據庫並壓縮結束 ----------------------------------------------";

給自動備份腳本增加執行權限

chmod +x /shell/backup_oracle.sh

將自動備份腳本加入定時任務

crontab -e
#凌晨1點備份
0 1 * * * nohup /usr/bin/sh /shell/backup_oracle.sh >> /shell/backup_oracle.log &

整個Oracle數據備份編寫到此結束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM