公司業務系統數據庫是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數據備份編寫到此結束