说明:脚本共分两部分,一是主机脚本,二是备机脚本。主机上做备份,传到备机上,备份文件做压缩,备机上解压缩备份文件并自动导库。
如果有导库需求,导库时由于原库中前一天导入的数据存在,如果不全量删除就进行全量导入此时会有报错所以建议备机脚本中导库前先全量删除一次(会有不同情况,要参考实际情况来操作)。如果没有导库需求则可以忽略,将脚本中导库部分删除或注释掉都可以。
Oracle数据库导入dmp文件时,要注意先在备库中创建原库相同的用户(权限相同、名字相同)、表空间
Linux下直接执行导库命令即可,Windows下要进入DOS窗口(cmd)中执行命令
主机脚本:
#这里采用 数据库名称_bak.sh 来命名,为了区分备份的具体数据库
if [ -f ~/.bash_profile ];
then
. ~/.bash_profile
fi
echo "begin export boss dmp file..."
#设置环境变量
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) #当前时间
days=10 #设置删除10天前的数据
orsid='7.0.8.148:1521/FSDB' #要备份的Oracle数据库IP、端口、SID
orowner=boss #要备份的数据库的用户名
bakuser=boss #使用此用户来导出dmp
bakpass=bs #用户密码
bakdir=/home/oraclebak #备份文件路径
bakdata=$orowner"_"$date.dmp #备份的dmp名称
baklog=$orowner"_"$date.log #备份时产生的log名称
ordatabak=$orowner"_"$date.tar.gz #将备份的dmp和log压缩后的文件名称
cd $bakdir
mkdir -p $orowner
cd $orowner
#导出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 #将备份文件传到备份服务器上
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天前备份文件
注意:
#在操作系统中执行 echo $ORACLE_HOME,即可查看ORACLE_HOME路径
#在操作系统中执行 echo $ORACLE_BASE,即可查看ORACLE_BASE路径
#这个目前存在问题,如果如以上删除一天前的备份文件,实际上会保留两天的备份文件,而有时候数据库服务器#空间有限,所以要添加一个定时删除备份文件的脚本,才能做到只保留一个备份文件。
备机上自动导库脚本:
#这里采用 数据库名称_bak.sh 来命名,为了区分备份的具体数据库
if [ -f ~/.bash_profile ];
then
. ~/.bash_profile
fi
echo "begin import boss dmp file..."
#设置环境变量
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) #当前时间
bakdir=/home/oraclebak #备份文件路径
days=10 #设置删除10天前的数据
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天前log文件
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天前备份文件
注:主机和备机最好配置无密传输,脚本写好后加入定时任务。最好验证一下两台机器之间传输是否正常。脚本内容按照实际情况做修改。
整个自动备份oracle数据库的过程(建议全程用root用户):
1、创建一个目录用于存放脚本。
2、给脚本授权,至少要有执行权限。
3、添加定时任务
[root@localhost /]# crontab -e
#插入下面语句(每天凌晨一点备份一次)
00 1 * * * /脚本绝对路径/脚本名称
[root@localhost ~]# crontab -l
4、配置主备机之间的无密传输
(1)使用Xsell以root用户连接连接数据库服务器(主机)执行命令: ssh-keygen -t rsa,一路回车,进入 /root/.ssh ,可以看到 id_rsa 和 id_rsa_pub 两个文件,做如下操作:
[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 #备份出一份来使用
(2)在远程服务器(备机)上执行命令
[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)在数据库服务器(主机)上执行命令
[root@localhost .ssh]# scp ./id_rsa.pub.dbbak 服务器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)在远程服务器(备机)上执行命令
[root@localhost ~]# cd /root/.ssh/
[root@localhost .ssh]# cat id_rsa.pub.dbbak >> authorized_keys
(5)在数据库服务器(主机)上执行id_rsa.pub.dbbak脚本,测试无密传输是否成功
[root@localhost .ssh]# scp ./id_rsa.pub.dbbak 服务器B_IP:/root/.ssh
id_rsa.pub.dbbak 100% 408 0.4KB/s 00:00
谨慎起见,最好仔细测试脚本是否每天自动跑并且有效(观察2-3天)。