Linux下Oracle定時自動備份方案

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

<!--more-->shell

服務器關係

兩臺服務器用做備份,包含正式環境服務器跟備份服務器,正式環境天天凌晨3點定時經過expdp導出全庫,再用scp傳輸至備份服務器存檔數據庫

實現scp免密碼傳輸

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

ssh-keygen -t rsa

遇到提示一路回車oracle

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

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

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

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

如今已經不須要輸入密碼了,scp免密碼傳輸已經成功code

Oracle數據庫新建虛擬目錄

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

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數據備份編寫到此結束

相關文章
相關標籤/搜索