公司業務系統數據庫是Oracle 11g,之前用的備份方案是用imp,可是這個方案的速度相對比較慢,最近通過研究,打算將備份方案改寫爲expdp形式,記錄一下操做過程sql
<!--more-->shell
兩臺服務器用做備份,包含正式環境服務器跟備份服務器,正式環境天天凌晨3點定時經過expdp導出全庫,再用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
新建臨時備份文件存儲目錄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數據備份編寫到此結束