jiaoyutwt
作者jiaoyutwt·2021-05-29 15:15
系统运维工程师·山西省运城市盐湖区

某大型车企 Oracle RAC 环境数据备份与恢复 实践

字数 12595阅读 8855评论 3赞 10

# 一、导读
本人就职于某汽车行业信息部门,因项目需要在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备份恢复效率更高,确实也印证了此观点 。实践出真知, 本人也在此实践中获益匪浅,知识是用来传递与分享的,希望能看到读者们、技术大牛们更多更好的文章,感谢阅读!

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

10

添加新评论3 条评论

hfbosshfboss技术总监ahzyhl
2022-01-25 19:26
写的不错
hfbosshfboss技术总监ahzyhl
2022-01-25 19:26
写的不错
cpuboardcpuboard测试工程师士兰
2021-11-07 12:59
学习了
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广