一、問題
1.1、環境
電腦環境:Windows 10;
數據庫環境:Oracle 11g;
JDK環境: Jdk1.8;
Docker版本:Server Version: 19.03.3
1.2、問題
如何利用shell腳本編寫Oracle數據庫備份腳本呢?
本文原文地址:51CTO博客
二、解答
2.1、第1版;
初始版本的shell
#!/bin/bash
#auto backup oracle
#define PATH 定義路徑變量
echo "----------數據庫備份開始----------"
echo "----------開始準備環境變量----------"
export ORACLE_BASE=C:/softWareInstalled/oracle
export ORACLE_HOME=$ORACLE_BASE/oracleInstalled/product/11.2.0TZC/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin:.
export ORACLE_SID=PETS
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
CURDATE=$(date '+%Y%m%d%H%M%S')
echo "----------當前系統系統日期爲=[$CURDATE]----------"
backup_directory=/opt/backup/
echo "----------備份目錄爲=[$backup_directory]----------"
data_file_prefix=pets
BACKUP_FILE=$backup_directory/pets$CURDATE.dmp
delete_prev_month_data_file(){
echo "----------開始刪除5天前的數據----------"
premonth=$(date -d"5 days ago" '+%Y%m%d')
rm -rf $backup_directory/$data_file_prefix$premonth* || true
echo "----------刪除5天前的記錄完畢----------"
}
echo "----------開始備份當日=[$CURDATE]數據----------"
exp pets/pets@PETS FILE=$BACKUP_FILE owner='pets'
echo "----------備份完畢!----------"
delte_prev_month_data_file
echo ‘"----------刪除5天前的歷史數據完畢----------"
exit 0
#Use oracle dump backup 使用備份數據庫
/usr/bin/my
運行後的結果截圖:
在搜索了【Message 206 not found;】報錯之後,【僅次於狼的博客】表示:這是由於系統沒有找到ORACLE_HOME導致;但是看上面的代碼,我們命名已經設置了ORACLE_HOME啊,後來想明白了,我用的是Docker,Docker的C盤不是這麼寫的,於是在命令行輸入:
pwd
查看當前路徑爲:
/c/softWareInstalled/Docker Toolbox/test/shell ;所以,我們要把【C:/】改成【/c/】;運行截圖如下:
還是老問題,還是沒有找到ORACLE_HOME;接下來,我做兩個方面的操作:
1、將關鍵的路徑都打印出來;
2、查找oracle目錄下的路徑,發現:
我自己目錄下的BIN是大寫的。。。。。。
修改完執行:
然後再命令行跳到日誌中打印的ORACLE_HOME目錄:
cd /c/softWareInstalled/oracle/oracleInstalled/product/11.2.0TZC/dbhome_1
原來問題出在這裏;再對比了一下,果然是路徑寫錯了;修改後運行:
這裏說,無法打開C盤下的Program.DMP來寫入:可能是寫入權限不夠;因爲我電腦只有C盤,好多目錄不然寫;正當我準備修改文件時,發現上圖中大於號後面是讓我輸入東西的,後來輸入了一個y,可以導出了:
結果,在我當前目錄下就出現了一個這個文件:
很明顯,這就是我要備份的數據庫DMP文件;所以接下來如果要完善它,就需要讓他備份到可以寫入的目錄,而不是每次都要我手動授權才備份;於是,我修改了備份的路徑;再次執行,bingo,成功!!!
桌面上就出現了我需要備份的目錄:
2.2、定時任務
crontab -e
0 5 * * * /opt/app/oracle/bin/backup.sh
0 1 * * * /opt/backup/bin/backup_rfile.sh
這裏的cron表達式只支持,分時日月周;跟完整的表達式相比,缺少了秒和年;
第一個*表示分鐘 每小時的第幾分鐘執行 0-59
第二個*表示小時 每天的第幾個小時執行 0-23
第三個*表示日期 每月的第幾天執行 1-31
第四個*表示月曆 每年的第幾個月執行 1-12
第五個*表示星期 每週的第幾天執行 0-6
本篇說明內容完畢;
附錄:最終版本的shell腳本:
#!/bin/bash
#auto backup oracle
#define PATH 定義路徑變量
echo "----------數據庫備份開始----------"
echo "----------開始準備環境變量----------"
export ORACLE_BASE=/c/softWareInstalled/oracle/oracle
export ORACLE_HOME=$ORACLE_BASE/oracleInstalled/product/11.2.0TZC/dbhome_1
echo "----------ORACLE_HOME=[$ORACLE_HOME]----------"
export PATH=$PATH:$ORACLE_HOME/BIN:.
#echo "----------PATH=[$PATH]----------"
export ORACLE_SID=PETS
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
CURDATE=$(date '+%Y%m%d%H%M%S')
echo "----------當前系統系統日期爲=[$CURDATE]----------"
backup_directory=/c/Users/Auther/Desktop/bak
echo "----------備份目錄爲=[$backup_directory]----------"
data_file_prefix=pets
BACKUP_FILE=$backup_directory/pets$CURDATE.dmp
delete_prev_month_data_file(){
echo "----------開始刪除5天前的數據----------"
premonth=$(date -d"5 days ago" '+%Y%m%d')
rm -rf $backup_directory/$data_file_prefix$premonth* || true
echo "----------刪除5天前的記錄完畢----------"
}
echo "----------開始備份當日=[$CURDATE]數據----------"
exp pets/pets@ORCL FILE=$BACKUP_FILE owner='pets'
echo "----------備份完畢!----------"
delte_prev_month_data_file
echo ‘"----------刪除5天前的歷史數據完畢----------"
exit 0
#Use oracle dump backup 使用備份數據庫
/usr/bin/my
三、總結
歡迎關注我的
CSDN博客: https://blog.csdn.net/River_Continent
微信公衆號:幕橋社區
知乎:張牧野, https://www.zhihu.com/people/zhang-mu-ye-37-76/activities
簡書: https://www.jianshu.com/u/02c0096cbfd3