利用Oracle內建的impdp和expdp進行簡單備份
目前有個這樣的需求,每天晚上23點將生產庫的資料備份到備份機器上,第二天備份機器的資料庫可以直接使用,資料是昨天生產庫的資料。(生產資料目前不多,全部資料不超過3000w條)。
由於沒有接觸過高深的Oracle知識,只會簡單的impdp和expdp這種內建的工具,所以打算用這種內建的命令加shell指令碼進行完成。
現在假設生產庫ip為192.168.1.20(簡稱20),備份庫ip為192.168.1.140(簡稱140)
我的設想是這樣的,20機器在晚上11點進行自動備份,然後想辦法將備份檔案拷貝到140機器,然後140機器進行匯入操作。
實現過程:
1.在140上安裝nfs檔案系統,將指定目錄共用到20上。
2.在20上添加備份指令碼使用crontab按時執行expdp語句
#!/bin/sh
ORACLE_BASE=/oracle
export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/
export ORACLE_HOME
ORACLE_SID=ORCL
export ORACLE_SID
export PATH=$PATH:$ORACLE_HOME/bin
export DATA_DIR=/oracle/admin/orcl/dpdump
export LOGS_DIR=/oracle/admin/orcl/dpdump
export BAKUPTIME=`date +%Y%m%d%H`
export NLS_LANG=american_america.AL32UTF8
echo "Starting bakup..."
echo "Bakup file path /oracle/admin/orcl/dpdump/HJXD_$BAKUPTIME.dmp"
expdp HJXD/hjxd directory=DATA_PUMP_DIR dumpfile=HJXD_$BAKUPTIME.dmp schemas=HJXD
echo "Bakup completed."
echo "start delete 10 day before ."
find /oracle/admin/orcl/dpdump/ -mtime +30 -type f -name *.dmp[ab] -exec rm -f {} \;
echo "end delete 10 day before ."
3.在20上添加cron任務將備份的檔案拷貝到nfs共用的目錄
##!my bash
myfilepath=/oracle/admin/ORCL/dpdump/;
filename=HJXD_`date -d "1 day ago" +%Y%m%d`23.dmp;
cp /oracle/admin/orcl/dpdump/$filename $myfilepath
4.140上使用cron任務將拷貝過來的nfs共用目錄下面的資料檔案匯入140的資料庫
fullexp.log
PATH=$PATH:$HOME/bin
export PATH
ORACLE_BASE=/oracle
export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/
export ORACLE_HOME
ORACLE_SID=ORCL
export ORACLE_SID
export PATH=$PATH:$ORACLE_HOME/bin
sqlplus sys/123456 as sysdba <<EOF
@/oracle/admin/ORCL/dpdump/impdp.sql;
EOF
export BAKUPTIME=`date -d "a day ago" +%Y%m%d23`;
chown oracle:oinstall /oracle/admin/ORCL/dpdump/HJXD_$BAKUPTIME.dmp;
echo "Starting impdp...";
echo "impdp file path /oracle/admin/ORCL/dpdump/HJXD_$BAKUPTIME.dmp";
impdp hjxdsas/123456 directory=DATA_PUMP_DIR dumpfile=HJXD_$BAKUPTIME.dmp logfile=fullexp.log remap_schema=HJXD:hjxdsas table_exists_action=replace
impdp.sql檔案
drop user hjxdsas cascade;
create user hjxdsas identified by 123456
default tablespace hjxd
temporary tablespace temp;
grant dba, create any trigger, drop any table, SELECT ANY table, SELECT ANY sequence, create user to hjxdsas identified by 123456;
grant connect, resource to hjxdsas;
grant exp_full_database,imp_full_database to hjxdsas;
第4步最開始的時候設定了oracle環境變數,原因是檔案拷貝過來是通過root使用者拷貝的(nfs要求兩邊操作的使用者有相同的uid,20,140機器的oracle使用者uid不一定一致,root使用者缺少一致);包括在使用oracle使用者進行cron任務執行也會發生一些錯誤,所以直接將oracle環境變數也設定給root,這樣直接使用root進行資料匯入。