Oracle数据库根据是否开启归档和数据库所在服务器磁盘情况可以采取一下备份方式对数据进行备份:
一、磁盘空间充足情况下
1.数据库开启归档日志
Oracle数据库可采取RMAN备份方式。 优点:数据库出现问题后可以完全恢复数据库或近乎完全恢复数据库。也可以将数据库恢复到指定的时刻或位置。 缺点:磁盘占用较大,尤其是归档日志。而且rman备份无法直接将单表恢复到现有数据库中不影响其他数据和系统使用。只能异地恢复后在进行导出导入。
相关操作参考 确保数据库开启归档日志,(rman中备份配置自行配置即可)备份采取脚本方式。 rman备份脚本存放在/data/backup/orcl 下,包含了两个文件,一个是rman具体命令文本文件rman_bak.txt,一个是执行rman备份命令的脚本文件rman_exec.sh,通过执行脚本文件调用文本文件中rman备份命令来进行备份。
(1)备份命令文本,此脚本涉及的备份命令是以每一个数据文件作为一个备份文件进行的备份,自己可以根据需要自行调整备份格式:
vim rman_bak.txt
backup database filesperset 1 format '/data/backup/orcl/db/%d_%N_%s_%p_%u';
run {sql "alter system archive log current";}
backup archivelog all delete input format '/data/backup/orcl/db/arch_%h_%e_%s.bak';
backup spfile format '/data/backup/orcl/db/spfile.%s';
delete noprompt dbsolete;
backup current controlfile format '/data/backup/orcl/db/cl.%s';
(2)备份命令执行脚本:
vim rman_exec.sh
#oracle的环境变量.bash_profile要配置正确,此情况针对一个实例备份,多实例则自行分别定义环境变量。
source ~/.bash_profile
rman target / @/data/backup/orcl/rman_bak.txt log=/data/backup/orcl/rman_bak.log
注意: 以上命令手工录入,可能有个别字母输入错误,切记只作为参考,不可直接拷贝使用,实际情况需要测试脚本是否可正常执行。
对脚本文件rman_exec.sh授予执行权限:
chmod +x rman_exec.sh
将脚本配置到Linux系统的后台执行任务中配置时间间隔定时执行即可。需要注意的是要配置在系统用户oracle下,否则无法识别正常环境变量会导致备份失败。
2.数据库未开启归档
此情况建议开启归档采取rman备份方式。 也可以使用数据泵expdp方式进行逻辑导出备份。 优点:可以指定用户或指定某用户下单个表进行恢复,而不影响现有数据库和系统使用。 缺点:显而易见,没有归档日志,所以备份数据只可以恢复到导出那一刻数据,导出之后至数据损坏时这期间的数据无法恢复。
除此之外数据泵备份时建议将用户使用的表空间和用户创建脚本备份一下,便于恢复时使用的到。
相关操作参考
(1)sys用户登录数据库创建directory指定目录存放导出备份。
[root@local ~]# su - oracle
[oracle@local ~]$ sqlplus / as sysdba
SQL> create directory expdp as '/data/backup';
SQL> grant execute,read,write on directory expdp to public;
说明: expdp是创建的directory目录名称,自定义的。 grant授权本次是指定所有用户可以用,也可以单独指定用户授权。
(2)指定导出命令导出数据库: expdp 用户名/密码 directory=expdp dumpfile=2021xxxx_orcl.dmp logfile=2021xxxx_orcl.log
说明 1)用户密码是需要导出的用户和密码。 2)dumpfile是导出的dmp文件名,logfile指定导出日志。 3)如果是多个用户都需要导出,可以参考一下命令: expdp system/xxxx directory=expdp dumpfile=2021xxxx_sys_orcl.dmp logfile=2021xxxx_sys_orcl.log schemas=(SCOTT,TEXT) 注意:括号需要用斜杠转义才能识别,不然会报错,如果涉及到单引号也需要转义。
(3)配置导出脚本并利用Linux后台任务定时执行导出备份作业,以system导出多个用户为例:
[oracle@local ~]$ vim oracle_dmp.sh
# ORACLE ENV
export ORACLE_BASE=/oradata1/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0.2
export ORACLE_SID=BTXZ
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
# DUMP USER
db_user="system";
db_password="system#123";
db_server="sys";
# DUMP VARIABLES
oracle_directory="expdp";
backup_server="10.86.64.163";
backup_user="root";
local_backup_dir="/data/backup";
remote_backup_dir="/data/oracle_dmp";
date_now=$(date +%Y%m%d);
# 1.DUMP XZXT USER
echo "-- $(date +'%Y-%m-%d %H:%M:%S') oracle db_user dmp begin!! ----------------------------------------------";
echo "-- $(date +'%Y-%m-%d %H:%M:%S') begin time --------------------------------------------------------";
echo "expdp ${db_user}/${db_password} directory=${oracle_directory} dumpfile=${db_server}_${date_now}.dmp logfile=${db_server}_${date_now}.log\"";
expdp ${db_user}/${db_password} directory=${oracle_directory} dumpfile=${db_server}_${date_now}.dmp logfile=${db_server}_${date_now}.log schemas=\(SCOTT,TEXT\);
echo "-- $(date +'%Y-%m-%d %H:%M:%S') oracle dmp end!! --------------------------------------------------------";
# 2.COMPRESS DMP
echo "-- $(date +'%Y-%m-%d %H:%M:%S') dmp compress begin!! --------------------------------------------------------";
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') dmp compress end!! --------------------------------------------------------";
# 3.SCP ALL TAR&MD5 TO REMOTE SERVER
echo "-- $(date +'%Y-%m-%d %H:%M:%S') dmpfile scp begin!! --------------------------------------------------------";
echo "scp -P 63322 ${local_backup_dir}/${db_server}_${date_now}.tar.gz ${backup_user}@${backup_server}:${remote_backup_dir}";
md5sum ${local_backup_dir}/${db_server}_${date_now}.tar.gz > ${local_backup_dir}/${db_server}_${date_now}.md5
scp -P 63322 ${local_backup_dir}/${db_server}_${date_now}.{tar.gz,md5} ${backup_user}@${backup_server}:${remote_backup_dir};
echo "-- $(date +'%Y-%m-%d %H:%M:%S') dmpfile scp end!! --------------------------------------------------------";
# 4.SCP DMP TO REMOTE SERVER(no compress,skip step 2 and 3 ,Comment out the command)
#echo "-- $(date +'%Y-%m-%d %H:%M:%S') dmpfile scp begin!! --------------------------------------------------------";
#echo "scp -P 63322 ${local_backup_dir}/${db_server}_${date_now}.tar.gz ${backup_user}@${backup_server}:${remote_backup_dir}";
#md5sum ${local_backup_dir}/${db_server}_${date_now}.dmp > ${local_backup_dir}/${db_server}_${date_now}.md5
#scp -P 63322 ${local_backup_dir}/${db_server}_${date_now}.{dmp,md5} ${backup_user}@${backup_server}:${remote_backup_dir};
#echo "-- $(date +'%Y-%m-%d %H:%M:%S') dmpfile scp end!! --------------------------------------------------------";
# 5.DELETE LOCAL DMP&TAR.GZ
echo "-- $(date +'%Y-%m-%d %H:%M:%S') delete local dmp&tar.gz begin!! --------------------------------------------------------";
rm -rf ${local_backup_dir}/${db_server}_${date_now}.dmp
rm -rf ${local_backup_dir}/${db_server}_${date_now}.tar.gz
echo "-- $(date +'%Y-%m-%d %H:%M:%S') delete local dmp&tar.gz end!! --------------------------------------------------------";
说明: 1)脚本中根据自己环境修改成当前正确的配置。 2)数据库服务器使用系统用户oracle配置后台执行任务定时执行备份,还需要配置系统用户oracle到远程备份存放服务器root的免密登陆,才能正确执行脚本中scp命令。 3)如果数据量不大可以注释掉脚本中的第2步和第3步,把第4步的注释取消,直接scp导出的dmp文件到远程服务器即可。 4)脚本执行前也是需要在数据库库创建directory指定备份存储目录的,方法参考前段说明。脚本中local_backup_dir参数就是存储目录。
脚本配置完成并测试没有问题可以正常导出数据后就可以配置Linux后台任务定时执行(逻辑备份导出如果测试用时合适,建议一天一备,减小时间间隔,减少数据丢失量)。另外备份存放的远程服务器磁盘也需要配置定时删除脚本,防止时间过长导致备份太多占满磁盘空间导致备份拷贝失败。定期删除脚本参考如下(在远程备份存放服务器配置):
[oracle@local ~]$ /data/oracle_dmp
[oracle@local ~]$ vim delete_dmp.sh
source ~/.bash_profile
date >> /data/oracle_dmp/delete_listdmp.log
find /data/oracle_dmp -mtime +3 -type f -name "*.dmp" >> /data/oracle_dmp/delete_listdmp.log
date >> /data/oracle_dmp/delete_listdmp.log
find /data/oracle_dmp -mtime +3 -type f -name "*.dmp" -exec rm -rf {} \;
[oracle@local ~]$ chmod +x delete_dmp.sh
说明: 1)脚本和删除日志路径和备份文件路径一样,也可以自己定义。 2)脚本利用find命令查找备份存放目录下所有3天前的dmp结尾的文件然后进行删除(删除几天前自己可自定义)。切记制定好要删除的文件通配符,不然就会吧所有文件删除。 3)脚本配置并测试正常后即可配置到Linux后台任务中定时执行,建议删除操作在备份操作之前执行。
二、磁盘空间不足情况下
Oracle数据库服务器磁盘空间不足,RMAN备份和数据泵expdp导出dmp无法存放,就需要远程备份,使用exp工具在远程服务器上直接导出。此方法脚本可参考数据泵的脚本就行修改,导出语句加上远程连接配置即可,此外脚本需要在远程备份存放服务器执行,所以远程服务器还需要安装oracle客户端来执行备份命令。
三、其他备份方式
1.可以搭建DG环境作为备份、容灾方式。在DG环境上再配合RMAN或逻辑备份,增强安全性。 2.可以搭建OGG来进行数据同步也可以作为备份、容灾方案,只不过OGG需要额外运维成本。 3.第三方收费软件备份。
总结
备份是确保数据安全的重要措施,绝对不可忽略。因为本文属于笔记式手动输入所以难免有输入错误地方,以上所涉及到的备份方案仅供参考,不要直接拷贝使用,欢迎留言指正。
|