技术分享
某大型车企 Oracle RAC 环境数据备份与恢复 实践
2017-05-08
一、导读
本人就职于某汽车行业信息部门,因项目需要在Oracle RAC集群环境下,根据实际情况对Oracle数据库进行备份;使用生产环境的rman全备数据,进行恢复据搭建测试环境。本文将详细介绍此案例中Oracle数据库rman全备份过程、Oracle RAC 环境下rman备份数据如何恢复至单机服务器。考虑到非常的实用,将实施经验分享给更多同行进行交流学习。
二、背景环境
生产环境使用两台DELL R840 服务器,安装了 linux centos 7.6操作系统,并配置多路径,使用 EMC untiy 作为共享存储,分配了2个1T LUN 存储数据库文件,1个500G LUN存放归档数据,3个30G LUN存放 OCR 、FALSH、GIMR数据。Oracle RAC 软件版本是19C 19.0.0.0.0。
三、数据备份
1、备份策略
为保障oracle rac 集群数据安全,因项目组要求设计数据库备份方案。考虑到服务器RAC1与RAC2每台服务器自带2T本地可用容量,每次全备产生约400GB数据文件。可将奇数天备份到RAC1,偶数天备份到RAC2,4*400GB=1.6TB,每台服务器可以备份4天的全量数据。空间非常的富余,不计划使用rman的增量备份,直接全量备份近8天数据,恢复也较为方便。
2、备份过程
在RAC1主机下执行,(RAC2同理)
首先Oracle 数据库开启归档,归档模式下,才可以进行数据库的热备份、联机备份、手工备份等。非归档模式下,只能进行冷备份。当然我们rman备份是在线备份。
su - oracle sqlplus / as sysdba
archive log list 查看当前归档日志 Automatic archival 行是 disabled show parameter dest 查砍参数信息,我们来更改log_archive_dest_1这个参数 alter system set log_archive_dest_1='+ARCH'; shutdown immediate 关闭数据库,关闭一致性 startup mount 数据库启动到mount alter database archivelog 数据库开启归档模式 alter database open 正常开启数据库 archive log list 检查验证
接着,创建rman脚本目录
mkdir -p /u01/backup/rman mkdir -p /u01/backup/log mkdir -p /u01/backup/data chown -R oracle:oinstall /u01/backup/
创建备份执行脚本,并加入定时任务
cd /u01/backup/rman vim db_bak_daily_lev0.sh #! /bin/sh format=`date +'%Y%m%d'` rman cmdfile=/u01/backup/rman/db_bak_daily_lev0.rcv log=/u01/backup/log/db_bak_$format.log append echo ""
创建备份数据清理脚本, 并加入定时任务,只备份近4次数据,脚本会自动判断最近一次rman备份是否成功,不成功将不删除备份数据。这里我调用了 zabora.sh 脚本判断rman备份状态,sql语句也比较简单。
cd /u01/backup/rman vim db_bak_delete.sh #!/bin/bash # crontab oracle rman 备份保留偶数天数据,近4次数据,日志保留30天 rman_status=`/usr/local/zabbix-agent-5.0.0/script/zabora/zabora.sh -s db_rman` if [ $rman_status -eq 0 ];then find /u01/backup/data/ -mtime +7 -exec rm -rf {} \; find /u01/backup/log/ -mtime +29 -exec rm -rf {} \; fi
定时任务 (RAC1)
crontab -e 00 01 1-31/2 * * su - oracle -c "/u01/backup/rman/db_bak_daily_lev0.sh" 00 03 1-31/2 * * /u01/backup/rman/db_bak_delete.sh > /tmp/db_bak_delete.log 2>&1
定时任务 (RAC2)
crontab -e 00 01 2-31/2 * * su - oracle -c "/u01/backup/rman/db_bak_daily_lev0.sh" 00 03 2-31/2 * * /u01/backup/rman/db_bak_delete.sh > /tmp/db_bak_delete.log 2>&1
记得重启定时任务
systemctl restart crond.service
创建rman执行脚本,用于被上述执行脚本调用
cd /u01/backup/rman vim db_bak_daily_lev0.rcv connect target / run{ backup current controlfile tag='bak_ctlfile' format='/u01/backup/data/ctl_file_%U_%T'; backup spfile tag='spfile' format='/u01/backup/data/ecology_spfile_%U_%T'; crosscheck backupset; allocate channel c1 device type disk format '/u01/backup/data/FULL_%U_%T'; allocate channel c2 device type disk format '/u01/backup/data/FULL_%U_%T'; backup incremental level 0 cumulative database plus archivelog not backed up format '/u01/backup/data/%d_log_%T_%U' delete all input ; delete noprompt obsolete device type disk; crosscheck backupset; release channel c1; release channel c2; }
3、测试验证
第一次可手动执行备份任务,不等到凌晨自动执行
su - oracle -c "/u01/backup/rman/db_bak_daily_lev0.sh"
查看日志log
cd /u01/backup/log cat db_bak_20210529.log
四、数据恢复
因为本项目使用的是全备数据,无增量。恢复命令较简单。举例几个常用恢复操作命令。
1、数据完全恢复
su - oracle rman target /
shutdown immediate startup mount restore database; recover database; alter database open;
2、表空间数据恢复
su - oracle rman target /
shutdown immediate startup mount restore tablespace spacename; recover tablespace spacename; alter database open;
五、Oracle RAC 集群迁移至Oracle单机服务器
因项目组需要利用生产环境的真实数据,搭建测试环境,便于开发测试,测试环境没有必要搭建复杂的Oracle rac集群,占用资源多,就计划选择单机版Oracle,考虑到数据泵expdp、impdp效率较低(也尝试导入成功了,确实大量数据非常的慢,本项目400多GB的备份数据),决定使用Oracle rac下的rman备份数据恢复至单机Oracle。若考虑到极端情况下需要做迁移、恢复,又没有更多的Oracle rac所需资源,那迁移至oracle单机还是有必要掌握了解的。那让
expdp impdp的方式是一种逻辑备份与恢复,不需要考虑Oracle环境基础架构,而rman备份与恢复是一种底层数据文件的备份,在由集群恢复至单机数据文件命名与路径是不相同的,在此过程中需要注意一下。
首先,准备好Oracle单机环境,开启归档模式,Oracle数据库的安装不是本文的重点,相信网上的安装资料非常的多。
1、生成spfile参数文件
登录到RAC1上
su - oracle sqlplus / as sysdba create pfile= '/u01/backup/data /initecology.ora from spfile;
将此文件复制到oracle单机上/u01/app/oracle/product/19.0.0/db_1/dbs/initecology.ora 并进行修改,目的是将Oracle rac环境下的设置改为单机环境:
vim initecology.ora ecology.__data_transfer_cache_size=0 ecology.__db_cache_size=35970351104 ecology.__inmemory_ext_roarea=0 ecology.__inmemory_ext_rwarea=0 ecology.__java_pool_size=939524096 ecology.__large_pool_size=671088640 ecology.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment ecology.__pga_aggregate_target=17582522368 ecology.__sga_target=8192M ecology.__shared_io_pool_size=134217728 ecology.__shared_pool_size=14495514624 ecology.__streams_pool_size=268435456 ecology.__unified_pga_pool_size=0 *.control_files='/u01/app/oracle/oradata/ECOLOGY/controlfile/o1_mf_hnml302f_.ctl' *.db_block_size=8192 *.db_create_file_dest='/u01/app/oracle/oradata/ECOLOGY/' *.db_name='ecology' *.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area/ECOLOGY/' *.db_recovery_file_dest_size=20480m *.deferred_segment_creation=FALSE *.diagnostic_dest='/u01/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=ecologyXDB)' *.event='28401 trace name context forever, level 1:10949 trace name context forever, level 1' *.log_archive_dest_1='LOCATION=/u01/backup/arch' *.log_archive_format='%t_%s_%r.dbf' *.nls_language='AMERICAN' *.nls_territory='AMERICA' *.open_cursors=1000 *.parallel_force_local=TRUE *.pga_aggregate_target=16720m *.processes=6400 *.remote_login_passwordfile='exclusive' *.session_cached_cursors=300 *.sga_target=8192m *.undo_tablespace='UNDOTBS1'
在Oracle 单机上执行 SQL> create spfile from pfile;
2、恢复控制文件
将Oracle rac环境下的全备份文件, 复制到oracle单机 /u01/backup/data /目录下,以下操作均是在Oracle单机环境下进行。备份文件如下:
su - oracle rman target / shutdown immediate; startup nomount; restore controlfile from '/u01/backup/data/ctl_file_70vv9gkk_1_1_20210520'; 恢复控制文件 alter database mount; crosscheck backup; delete noprompt expired backup; 清理备份,因是新安装的Oracle,此前无备份。
3、 将备份数据注册到rman
rman环境下继续执行:
catalog backuppiece '/u01/backup/data/FULL_76vv9glr_1_1_20210520'; catalog backuppiece '/u01/backup/data/FULL_77vv9glr_1_1_20210520'; catalog backuppiece '/u01/backup/data/ECOLOGY_log_20210520_73vv9gl1_1_1'; catalog backuppiece '/u01/backup/data/ECOLOGY_log_20210520_74vv9gl2_1_1'; catalog backuppiece '/u01/backup/data/ECOLOGY_log_20210520_75vv9gli_1_1'; catalog backuppiece '/u01/backup/data/ECOLOGY_log_20210520_78vv9h2b_1_1'; catalog backuppiece '/u01/backup/data/ECOLOGY_log_20210520_79vv9h2b_1_1';
3、数据还原恢复
执行list backup of database; 根据备份信息,进行文件重命名。Oracle rac 环境使用的是ASM管理磁盘,目录与单机oracle不同,因此在还原恢复时候,需要先将备份文件的ASM文件路径,修改为Oracle单机环境路径。
RMAN> run { SET NEWNAME FOR DATAFILE 2 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology03.dbf'; SET NEWNAME FOR DATAFILE 3 to '/u01/app/oracle/oradata/ECOLOGY/datafile/sysaux.dbf'; SET NEWNAME FOR DATAFILE 5 to '/u01/app/oracle/oradata/ECOLOGY/datafile/undotbs2.dbf'; SET NEWNAME FOR DATAFILE 7 to '/u01/app/oracle/oradata/ECOLOGY/datafile/users.dbf'; SET NEWNAME FOR DATAFILE 9 to '/u01/app/oracle/oradata/ECOLOGY/datafile/em7.dbf'; SET NEWNAME FOR DATAFILE 10 to '/u01/app/oracle/oradata/ECOLOGY/datafile/emssage.dbf'; SET NEWNAME FOR DATAFILE 13 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology07.dbf'; SET NEWNAME FOR DATAFILE 16 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology10.dbf'; SET NEWNAME FOR DATAFILE 19 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology13.dbf'; SET NEWNAME FOR DATAFILE 20 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology14.dbf'; SET NEWNAME FOR DATAFILE 23 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology02.dbf'; SET NEWNAME FOR DATAFILE 24 to '/u01/app/oracle/oradata/ECOLOGY/datafile/emssage01.dbf'; SET NEWNAME FOR DATAFILE 1 to '/u01/app/oracle/oradata/ECOLOGY/datafile/system.dbf'; SET NEWNAME FOR DATAFILE 4 to '/u01/app/oracle/oradata/ECOLOGY/datafile/undotbs1.dbf'; SET NEWNAME FOR DATAFILE 8 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology04.dbf'; SET NEWNAME FOR DATAFILE 11 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology05.dbf'; SET NEWNAME FOR DATAFILE 12 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology06.dbf'; SET NEWNAME FOR DATAFILE 14 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology08.dbf'; SET NEWNAME FOR DATAFILE 15 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology09.dbf'; SET NEWNAME FOR DATAFILE 17 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology11.dbf'; SET NEWNAME FOR DATAFILE 18 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology12.dbf'; SET NEWNAME FOR DATAFILE 21 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology15.dbf'; SET NEWNAME FOR DATAFILE 22 to '/u01/app/oracle/oradata/ECOLOGY/datafile/ecology01.dbf'; SET NEWNAME FOR DATAFILE 25 to '/u01/app/oracle/oradata/ECOLOGY/datafile/emssage02.dbf'; alter database mount; 如果已经启动到mount,就不要加入此行,不然会报错 RESTORE DATABASE; SWITCH DATAFILE ALL; recover database; }
注意:此命令行要一起执行还原恢复,最好放入文本中执行
4、修改数据库日志文件
第三步已经完成了数据库的还原恢复,备份数据日志文件使用的是rac环境目录,需要更修改为单机版本。
su - oracle sqlplus / as sysdba
SQL> select member from v$logfile; 修改日志文件 alter database rename file '+DATA/ECOLOGY/ONLINELOG/group_2.262.1042811345' to '/u01/app/oracle/oradata/ECOLOGY/onlinelog/redo2_2.log'; alter database rename file '+ARCH/ECOLOGY/ONLINELOG/group_2.259.1042811345' to '/u01/app/oracle/oradata/ECOLOGY/onlinelog/redo2_1.log'; alter database rename file '+DATA/ECOLOGY/ONLINELOG/group_1.263.1042811345' to '/u01/app/oracle/oradata/ECOLOGY/onlinelog/redo1_2.log'; alter database rename file '+ARCH/ECOLOGY/ONLINELOG/group_1.260.1042811345' to '/u01/app/oracle/oradata/ECOLOGY/onlinelog/redo1_1.log'; alter database rename file '+DATA/ECOLOGY/ONLINELOG/group_3.259.1042811593' to '/u01/app/oracle/oradata/ECOLOGY/onlinelog/redo3_2.log'; alter database rename file '+ARCH/ECOLOGY/ONLINELOG/group_3.257.1042811593' to '/u01/app/oracle/oradata/ECOLOGY/onlinelog/redo3_1.log'; alter database rename file '+DATA/ECOLOGY/ONLINELOG/group_4.258.1042811593' to '/u01/app/oracle/oradata/ECOLOGY/onlinelog/redo4_2.log'; alter database rename file '+ARCH/ECOLOGY/ONLINELOG/group_4.258.1042811593' to '/u01/app/oracle/oradata/ECOLOGY/onlinelog/redo4_1.log'; alter database open resetlogs;
5、 删除无效日志组
SQL> select THREAD#, STATUS, ENABLED from v$thread; THREAD# STATUS ENABLED --------- 1 OPEN PUBLIC 2 CLOSED PUBLIC SQL> select group# from v$log where THREAD#=2; GROUP# ---------- 3 4 SQL> alter database disable thread 2; SQL> alter database drop logfile group 3; SQL> alter database drop logfile group 4; SQL> select THREAD#, STATUS, ENABLED from v$thread; 验证是否已删除
6、删除 undo表空间
查看undo表空间,并删除节点2(在此不使用)的undo表空间
SQL> sho parameter undo; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ temp_undo_enabled boolean FALSE undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS1 SQL> select tablespace_name from dba_tablespaces where contents='UNDO'; TABLESPACE_NAME ------------------------------ UNDOTBS1 UNDOTBS2 SQL> drop tablespace UNDOTBS2 including contents and datafiles; 删除节点2
7、创建temp表空间
SQL> select name from v$tempfile; NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/ECOLOGY/ECOLOGY/datafile/o1_mf_temp_jbg3tlg5_.tmp SQL> select tablespace_name from dba_tablespaces where contents='TEMPORARY'; TABLESPACE_NAME ------------------------------ TEMP SQL> create temporary tablespace TEMP1 tempfile '/u01/app/oracle/oradata/ECOLOGY/datafile/temp01.dbf' size 100M; Tablespace created. SQL> alter database default temporary tablespace TEMP1; Database altered. SQL> drop tablespace TEMP including contents and datafiles; Tablespace dropped.
8、数据库更改IP地址
数据库里的配置文件,还是RAC 集群地址,因此要改为Oracle单机服务器的IP
监听IP更改:vim /u01/app/oracle/product/19.0.0/db_1/network/admin/listener.ora
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.50)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) )
远程连接IP更改:vim /u01/app/oracle/product/19.0.0/db_1/network/admin/tnsnames.ora
ECOLOGY = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.50)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ecology) ) )
数据库执行:
SQL> ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.9.50)(PORT=1521))';
至此数据库已恢复完毕,可重启监听与数据库,进行登录验证数据恢复情况,经实践检验与原库保持一致,并且恢复效率非常的高,用时约1小时,满足公司对故障快速恢复的要求。
六、实践总结
此次经过摸索实践、因地制宜地对公司Oracle RAC 集群进行了数据备份,确保数据库备份安全,当发生数据库灾难或文件损坏时,可及时根据上述操作文档进行备份数据恢复,保证数据库能备份能恢复,系统运维更加健全。针对我司特殊场景需要将Oracle RAC集群环境备份数据,恢复至单机Oracle上,或是数据库迁移,提供了可靠的解决方案,同时将此方法分享给各位同行进行交流学习。实践过程中,类比数据泵 expdp、impdp备份方式,rman备份恢复效率更高,确实也印证了此观点 。实践出真知, 本人也在此实践中获益匪浅,知识是用来传递与分享的,希望能看到读者们、技术大牛们更多更好的文章,感谢阅读!

- 标签:
-
其他