Oracle數(shù)據(jù)庫(kù)定時(shí)備份腳本方式(Linux)
說(shuō)明
腳本共分兩部分,一是主機(jī)腳本,二是備機(jī)腳本。主機(jī)上做備份,傳到備機(jī)上,備份文件做壓縮,備機(jī)上解壓縮備份文件并自動(dòng)導(dǎo)庫(kù)。
如果有導(dǎo)庫(kù)需求,導(dǎo)庫(kù)時(shí)由于原庫(kù)中前一天導(dǎo)入的數(shù)據(jù)存在,如果不全量刪除就進(jìn)行全量導(dǎo)入此時(shí)會(huì)有報(bào)錯(cuò)所以建議備機(jī)腳本中導(dǎo)庫(kù)前先全量刪除一次(會(huì)有不同情況,要參考實(shí)際情況來(lái)操作)。如果沒有導(dǎo)庫(kù)需求則可以忽略,將腳本中導(dǎo)庫(kù)部分刪除或注釋掉都可以。
Oracle數(shù)據(jù)庫(kù)導(dǎo)入dmp文件時(shí),要注意先在備庫(kù)中創(chuàng)建原庫(kù)相同的用戶(權(quán)限相同、名字相同)、表空間
Linux下直接執(zhí)行導(dǎo)庫(kù)命令即可,Windows下要進(jìn)入DOS窗口(cmd)中執(zhí)行命令
主機(jī)腳本
#這里采用 數(shù)據(jù)庫(kù)名稱_bak.sh 來(lái)命名,為了區(qū)分備份的具體數(shù)據(jù)庫(kù)
if [ -f ~/.bash_profile ];
then
. ~/.bash_profile
fi
echo "begin export boss dmp file..."
#設(shè)置環(huán)境變量
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=FSDB #SID
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH
export LANG=en_US.UTF-8
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
date=$(date +%Y%m%d) #當(dāng)前時(shí)間
days=10 #設(shè)置刪除10天前的數(shù)據(jù)
orsid='7.0.8.148:1521/FSDB' #要備份的Oracle數(shù)據(jù)庫(kù)IP、端口、SID
orowner=boss #要備份的數(shù)據(jù)庫(kù)的用戶名
bakuser=boss #使用此用戶來(lái)導(dǎo)出dmp
bakpass=bs #用戶密碼
bakdir=/home/oraclebak #備份文件路徑
bakdata=$orowner"_"$date.dmp #備份的dmp名稱
baklog=$orowner"_"$date.log #備份時(shí)產(chǎn)生的log名稱
ordatabak=$orowner"_"$date.tar.gz #將備份的dmp和log壓縮后的文件名稱
cd $bakdir
mkdir -p $orowner
cd $orowner
#導(dǎo)出dmp和log文件
exp $bakuser/$bakpass@$orsid grants=y owner=$orowner file=$bakdir/$orowner/$bakdata log=$bakdir/$orowner/$baklog
tar -zcvf $ordatabak $bakdata $baklog #壓縮dmp和log文件
scp /home/oraclebak/boss/$orowner"_"$date.tar.gz 7.0.8.149:/home/oraclebak #將備份文件傳到備份服務(wù)器上
find $bakdir/$orowner -type f -name "*.log" -exec rm {} \; #刪除log文件
find $bakdir/$orowner -type f -name "*.dmp" -exec rm {} \; #刪除dmp文件
find $bakdir/$orowner -type f -name "*.tar.gz" -mtime +$days -exec rm -rf {} \; #刪除10天前備份文件
注意:
#在操作系統(tǒng)中執(zhí)行 echo $ORACLE_HOME,即可查看ORACLE_HOME路徑 #在操作系統(tǒng)中執(zhí)行 echo $ORACLE_BASE,即可查看ORACLE_BASE路徑 #這個(gè)目前存在問(wèn)題,如果如以上刪除一天前的備份文件,實(shí)際上會(huì)保留兩天的備份文件,而有時(shí)候數(shù)據(jù)庫(kù)服務(wù)器#空間有限,所以要添加一個(gè)定時(shí)刪除備份文件的腳本,才能做到只保留一個(gè)備份文件。
備機(jī)上自動(dòng)導(dǎo)庫(kù)腳本
#這里采用 數(shù)據(jù)庫(kù)名稱_bak.sh 來(lái)命名,為了區(qū)分備份的具體數(shù)據(jù)庫(kù)
if [ -f ~/.bash_profile ];
then
. ~/.bash_profile
fi
echo "begin import boss dmp file..."
#設(shè)置環(huán)境變量
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=FSDB #SID
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH
export LANG=en_US.UTF-8
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
date=$(date +%Y%m%d) #當(dāng)前時(shí)間
bakdir=/home/oraclebak #備份文件路徑
days=10 #設(shè)置刪除10天前的數(shù)據(jù)
cd $bakdir
tar -zxvf boss"_"$date.tar.gz
imp boss/bs file=$bakdir/boss_$date.dmp log=$bakdir/bossimp_$date.log grants=no ignore=y full=y
echo "imp success!"
find $bakdir -type f -name "*.log" -mtime +$days -exec rm {} \; #刪除10天前l(fā)og文件
find $bakdir -type f -name "*.dmp" -mtime +$days -exec rm {} \; #刪除10天前dmp文件
find $bakdir -type f -name "*.tar.gz" -mtime +$days -exec rm -rf {} \; #刪除10天前備份文件
注:主機(jī)和備機(jī)最好配置無(wú)密傳輸,腳本寫好后加入定時(shí)任務(wù)。最好驗(yàn)證一下兩臺(tái)機(jī)器之間傳輸是否正常。腳本內(nèi)容按照實(shí)際情況做修改。
整個(gè)自動(dòng)備份oracle數(shù)據(jù)庫(kù)的過(guò)程(建議全程用root用戶)
1、創(chuàng)建一個(gè)目錄用于存放腳本。
2、給腳本授權(quán),至少要有執(zhí)行權(quán)限。
3、添加定時(shí)任務(wù)
[root@localhost /]# crontab -e #插入下面語(yǔ)句(每天凌晨一點(diǎn)備份一次) 00 1 * * * /腳本絕對(duì)路徑/腳本名稱 [root@localhost ~]# crontab -l
4、配置主備機(jī)之間的無(wú)密傳輸
(1)使用Xsell以root用戶連接連接數(shù)據(jù)庫(kù)服務(wù)器(主機(jī))執(zhí)行命令: ssh-keygen -t rsa,一路回車,進(jìn)入 /root/.ssh ,可以看到 id_rsa 和 id_rsa_pub 兩個(gè)文件,做如下操作:
[root@localhost ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): #一直回車 [root@localhost .ssh]# cd /root/.ssh [root@localhost .ssh]# ll total 8 -rw------- 1 root root 1675 May 21 11:31 id_rsa -rw-r--r-- 1 root root 408 May 21 11:31 id_rsa.pub [root@localhost .ssh]# cp id_rsa.pub id_rsa.pub.dbbak #備份出一份來(lái)使用
(2)在遠(yuǎn)程服務(wù)器(備機(jī))上執(zhí)行命令
[root@localhost ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): #一直回車
(3)在數(shù)據(jù)庫(kù)服務(wù)器(主機(jī))上執(zhí)行命令
[root@localhost .ssh]# scp ./id_rsa.pub.dbbak 服務(wù)器B_IP:/root/.ssh The authenticity of host '16.22.33.158(16.22.33.158)' can't be established. RSA key fingerprint is 62:a9:ar:77:04:b5:42:qd:13:6d:a8:44:b5:8b:23:5a. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '16.22.33.158' (RSA) to the list of known hosts. root@16.22.33.158's password: id_rsa.pub.dbbak 100% 408 0.4KB/s 00:00
(4)在遠(yuǎn)程服務(wù)器(備機(jī))上執(zhí)行命令
[root@localhost ~]# cd /root/.ssh/ [root@localhost .ssh]# cat id_rsa.pub.dbbak >> authorized_keys
(5)在數(shù)據(jù)庫(kù)服務(wù)器(主機(jī))上執(zhí)行id_rsa.pub.dbbak腳本,測(cè)試無(wú)密傳輸是否成功
[root@localhost .ssh]# scp ./id_rsa.pub.dbbak 服務(wù)器B_IP:/root/.ssh id_rsa.pub.dbbak 100% 408 0.4KB/s 00:00
謹(jǐn)慎起見,最好仔細(xì)測(cè)試腳本是否每天自動(dòng)跑并且有效(觀察2-3天)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle實(shí)現(xiàn)細(xì)粒度訪問(wèn)控制的步驟
細(xì)粒度訪問(wèn)控制是Oracle數(shù)據(jù)庫(kù)中用于提供行級(jí)和列級(jí)安全控制的強(qiáng)大功能,本文主要給大家介紹了Oracle實(shí)現(xiàn)細(xì)粒度訪問(wèn)控制的步驟,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-09-09
Oracle數(shù)據(jù)庫(kù)如何創(chuàng)建第一張表
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)如何創(chuàng)建第一張表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
oracle數(shù)據(jù)庫(kù)添加或刪除一列的sql語(yǔ)句
需要注意的一點(diǎn),如果要修改的表,不是當(dāng)前的用戶的表,那么就需要添加上用戶的名稱。以及有修改此表的權(quán)限2012-05-05
Redhat 6.2 下 oracle 11g R2的安裝詳解
這篇文章主要介紹了Redhat 6.2 下 oracle 11g R2的安裝詳解,需要的朋友可以參考下2016-07-07
Oracle在表中有數(shù)據(jù)的情況下修改字段類型或長(zhǎng)度的解決方法
這篇文章主要介紹了Oracle在表中有數(shù)據(jù)的情況下修改字段類型或長(zhǎng)度,修改其某個(gè)字段的類型或改變他的長(zhǎng)度,由于表中有數(shù)據(jù),不能直接修改,需要換個(gè)方法,接下來(lái)通過(guò)本文給大家介紹下解決方法,需要的朋友可以參考下2022-10-10
Oracle數(shù)據(jù)加載和卸載的實(shí)現(xiàn)方法
這篇文章主要介紹了Oracle數(shù)據(jù)加載和卸載的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒加載,需要的朋友可以參考下2018-08-08

