Linux下Oracle定时自动备份方案

公司业务系统数据库是Oracle 11g,以前用的备份方案是用imp,但是这个方案的速度相对比较慢,最近经过研究,打算将备份方案改写为expdp形式,记录一下操作过程

服务器关系

两台服务器用作备份,包含正式环境服务器跟备份服务器,正式环境每天凌晨3点定时通过expdp导出全库,再用scp传输至备份服务器存档

实现scp免密码传输

直接运行scp传输命令,会提示输入密码,要实现无人值守定时运行,就需要让两台服务器的交互能够自动免密,在此通过建立ssh信任关系的方法来实现 在正式服务器上执行ssh证书生成命令

ssh-keygen -t rsa

遇到提示一路回车

运行完毕后,在/root/.ssh目录下会生成id_rsa,id_rsa.pub两个文件

登录备份服务器,在用户对应.ssh目录(如/root/.ssh)下新建authorized_keys文件,将正式服务器id_rsa.pub文件的内容追加进去

在正式服务器上随意新建一个文件,测试scp传输

scp ./aaa root@192.168.x.x:/root/

现在已经不需要输入密码了,scp免密码传输已经成功

Oracle数据库新建虚拟目录

新建临时备份文件存储目录

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数据备份编写到此结束