梁铭图,新炬网络首席架构师。具有十余年数据库运维、数据库设计、数据治理以及系统规划建设经验,拥有Oracle OCM和ACE Director、Togaf企业架构师(鉴定级)、IBM CATE等认证,曾获dbaplus年度MVP、华为云MVP等荣誉,并参与数据资产管理国家标准的编写工作。在数据库运维管理和架构设计、运维体系规划、数据资产管理方面有深入研究。
背景
某客户的生产环境数据库使用dataguard进行数据库灾备,生产数据库及灾备数据库的文件存储方式为ASM。由于备库的归档文件路径的磁盘空间不足,客户数据库管理员手动把归档日志文件删除了一部分,释放一些使用空间。但是经过排查发现重启灾备数据库后没有开启DG恢复模式,只是在接收主库传送过来的归档文件并没有应用到备库,导致删除备库归档日志文件脚本执行失败,造成归档路径磁盘空间不足。同时,由于删除了一部分没有应用到备库的归档文件,导致灾备数据库DG同步中断。
因此需要利用现有的数据库以及归档日志恢复数据同步。
运行环境
操作系统:HPUNIX
数据库版本:11.2.0.3
数据库配置:RAC
数据文件存储方式:ASM
问题处理
由于归档文件的丢失,备库恢复同步方式一般有如下两种:
通过主库全库备份来恢复备库
通过基于SCN备份主库来恢复备库
第一种方式适合数据库的数据量比较少,能过主库全库备份恢复备库。
第二种方式适合数据库的数据量比较大,主库全库备份时间较长,可以通过SCN备份方式增量恢复备库。
我们此次恢复备库采用第二种方式,基于SCN备份主库,主要步骤如下:
1.备库确认丢失归档信息
2.备库确认当前最小SCN号
3.主库通过基于SCN方式RMAN备份数据库
4.备库恢复数据库
5. 备库使用旧的控制文件采集数据文件路径信息
6. 备库恢复新的控制文件
7. 备库使用catalog datafilecopy命令扫描数据文件
8. 备库使用set newname 命令修改数据文件路径
9.主库备份缺失的数据文件
10.备库恢复新增加的数据文件
11.开启DG同步机制
1)备库确认丢失归档信息
在备库上执行查询:
select * from v$archive_gap;
LOW_SEQUENCE# HIGH_SEQUENCE#
------------- --------------
2 27893 28555
SELECT PROCESS,CLIENT_PROCESS,SEQUENCE#,STATUS FROM V$MANAGED_STANDBY;
PROCESS CLIENT_P SEQUENCE# STATUS
-------- ---------- ------------
ARCH ARCH 29358 CLOSING
ARCH ARCH 30774 CLOSING
ARCH ARCH 29359 CLOSING
RFS UNKNOWN 0 IDLE
RFS LGWR 29362 IDLE
RFS N/A 0 IDLE
RFS UNKNOWN 0 IDLE
MRP0 N/A 27893 WAIT_FOR_GAP
RFS UNKNOWN 0 IDLE
RFS LGWR 30776 IDLE
RFS N/A 0 IDLE
select name,value from v$dataguard_stats;
NAME VALUE
------------------------------
apply finish time +00 16:52:12.9
apply lag +94 04:21:02
estimated startup time 22
standby has been open N
transport lag +00 00:00:07
2)备库确认当前最小SCN号
在备库执行:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL> col current_scn for 999999999999999
SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
----------------
39597750709
select min(f.checkpoint_change#) from v$datafile_header f, v$datafile d
2 where f.file# =d.file# and d.enabled != 'READ ONLY' ;
MIN(F.FHSCN)
----------------
39597657793
我们分别查出了备库的当前SCN和文件头的最小SCN,强烈建议使用文件头最小SCN在主库进行增量备份
ALTER SYSTEM SET standby_file_management='AUTO' SCOPE=BOTH;
在主库上执行:
SQL> select FILE#,to_char(CREATION_TIME,'yyyy-mm-dd hh24:mi:ss') CREATION_TIME,STATUS,LAST_TIME,name from v$datafile where CREATION_CHANGE#> 39597657793; (备库小最SCN号)
FILE# CREATION_TIME STATUS LAST_TIME NAME
---------- -------------------- -------------- -------------------- ----
151 2017-07-13 online +DATA/xxxxxxx/datafile/*******.dbf
152 2017-08-18 online +DATA/xxxxxxx/datafile/*******.dbf
153 2017-08-18 online +DATA/xxxxxxx/datafile/*******.dbf
154 2017-08-18 online +DATA/xxxxxxx/datafile/*******.dbf
155 2017-08-18 online +DATA/xxxxxxx/datafile/*******.dbf
通过上面查询得知在备库最小SCN号之后主库增加了五个数据文件,即151、152、153、154、155号数据文件
查询备库数据文件信息:
select file#, name from v$datafile;
备库查询数据文件没有相关此五个数据文件信息
3)主库通过基于SCN方式RMAN备份数据库
$ORACLE_HOME/bin/rman target / log=/orabak/backup_20170823.log <<EOF
run
{
allocate channel t1 type disk;
allocate channel t2 type disk;
BACKUP as compressed backupset INCREMENTAL FROM SCN 39597657793(取备库最小SCN号) DATABASE FORMAT '/orabak/dg_%U' tag 'FORSTANDBY';
release channel t1;
release channel t2;
}
EOF
主数据库备份完毕后,备份一下主库的控制文件:
ALTER DATABASE CREATE standby controlfile AS '/orabak/standby.ctl';
把备份集远程复制到备库:
scp /orabak/* 16.1.14.201: /orabak
备库恢复数据库
备库启动到mount状态:
sqlplus / as sysdba
startup mount;
备份备库当前的控制文件:
rman target /
backup current controlfile format ‘/orabak/stanby.ctl’;
在备库恢复之前,把主库的备份集信息注册到备库中:
$ rman target /
RMAN> CATALOG START WITH ‘/orabak';
using target database control file instead of recovery catalog
searching for all files that match the pattern /lisgpfs/zaibei2017
List of Files Unknown to the Database
=====================================
File Name: /lisgpfs/zaibei2017/4567
File Name: /lisgpfs/zaibei2017/backup_20170823.log
File Name: /lisgpfs/zaibei2017/backup_incr.sh
File Name: /lisgpfs/zaibei2017/dg_7mrsnu6s_1_1
File Name: /lisgpfs/zaibei2017/dg_7nrsnu6s_1_1
File Name: /lisgpfs/zaibei2017/dg_7orso1ji_1_1
File Name: /lisgpfs/zaibei2017/dg_7prso1jk_1_1
File Name: /lisgpfs/zaibei2017/nohup.out
File Name: /lisgpfs/zaibei2017/standby_20170823.ctl
Do you really want to catalog the above files (enter YES or NO)? yes
4)在备库执行恢复数据库:
$ORACLE_HOME/bin/rman target / log=/orabak/recover_20170823.log <<EOF
run
{
allocate channel t1 type disk;
allocate channel t2 type disk;
recover database noredo;
release channel t1;
release channel t2;
}
EOF
5)备库收集数据文件路径信息
备库恢复完数据库后,备库使用当前的控制文件收集备库的数据文件路径信息
select file#,name from v$datafile;
-----------------------------------------------------------
1 '+DATA/xxxxxxx/datafile/*******.dbf;
2 '+DATA/xxxxxxx/datafile/*******.dbf;
3 '+DATA/xxxxxxx/datafile/*******.dbf;
4 '+DATA/xxxxxxx/datafile/*******.dbf;
5 '+DATA/xxxxxxx/datafile/*******.dbf;
......
150 '+DATA/xxxxxxx/datafile/*******.dbf;
可以看到备库当前控制文件保存的数据文件指针只有150个,而主库的数据文件已经为155个数据文件。
6)备库恢复控制文件
备库收集完数据文件路径信息后,需要恢复一下备库的控制文件,即此控制文件是从主库备份过来的控制文件,为最新的控制文件:
shut immediate;
startup nomount
rman target /
restore controlfile from '/lisgpfs/zaibei2017/standby.ctl';
alter database mount;
7)备库使用catalog datafilecopy命令扫描数据文件
为了使备库新恢复的控制文件能够有原来备库上的数据文件信息(由于启用了OMF,主备库的数据文件名是不一致的),所以,需要使用3.5步中收集的数据文件信息来编辑下面脚本中catalog datafilecopy后面的信息,将备库数据文件路径和名称注册到新的控制文件中。
当主库与备库的数据文件存储方式为ASM, 并且ASM管理数据文件名称的机制为OMF时, 会导致主备库的文件名称不一致。
......
catalog datafilecopy'+DATA/xxxxxxx/datafile/ *******.dbf;
8)备库使用set newname 命令修改数据文件路径
如果不使用catalog datafilecopy 命令扫描数据文件,直接set newname命令会报如下错误:
using target database control file instead of recovery catalog
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of switch command at 08/23/2017 21:27:12
RMAN-20230: datafile copy not found in the repository
RMAN-06015: error while looking up datafile copy name: +DATA/xxxxxxx/datafile/*******.dbf
使用set newname命令:
rman target /
run {
set newname for datafile 1 to '+DATA/xxxxxxx/datafile/*******.dbf;
set newname for datafile 2 to '+DATA/xxxxxxx/datafile/*******.dbf';
set newname for datafile 3 to '+DATA/xxxxxxx/datafile/*******.dbf';
set newname for datafile 4 to '+DATA/xxxxxxx/datafile/*******.dbf';
......
set newname for datafile 150 to '+DATA/xxxxxxx/datafile/*******.dbf’;
switch datafile all;
}
备库开启同步机制:
ALTER DATABASE recover managed standby DATABASE disconnect FROM SESSION;
备库alert警告日志报找不到151、152、153、154、155号数据文件
9)主库备份缺失的数据文件
在主库备份151、152、153、154、155号数据文件:
rman target /
backup datafile 151,152,153,154,155;
把备份集复制到备库
scp datafile_151.dbf 16.1.14.201: /oradata
10)备库恢复新增加的数据文件
备库恢复151,152,153,154,155号数据文件:
rman target /
CATALOG START WITH '/oradata';
restore datafile 151,152,153,154,155;
11)开启DG同步机制
备库开启恢复:
ALTER DATABASE recover managed standby DATABASE using current logfile disconnect FROM SESSION;
小结
Oracle datagurad是Oracle数据库最常用构建灾备数据库的手段,建议多从运维角度定期检查DataGuard的运行情况。此外在删除备机归档等非常规操作时,应确认dataguard的相关状态,以避免产生Gap导致的一系列问题。
如果字段的最大可能长度超过255字节,那么长度值可能…
只能说作者太用心了,优秀
感谢详解
一般干个7-8年(即30岁左右),能做到年入40w-50w;有…
230721