导读
作者:杨漆
16年关系型数据库管理,从oracle 9i 、10g、11g、12c到Mysql5.5、5.6、5.7、8.0 到TiDB获得3个OCP、2个OCM;运维路上不平坦,跌过不少坑、熬过许多夜。把工作笔记整理出来分享给大伙儿,希望帮到大家少走弯路、少熬夜。
提问:
如果您的生产环境为3节点的Rac+ASM,10T以上数据,业务对主库有极高性能要求,不能占用主库资源、通道、带宽,且主库归档日志每4小时会定时删除一次(归档存储空间有限,且无法扩容),现有备库上的归档每小时不定期自动删除(第三方软件,且要求不能停),在这种极端情况下怎样才能再新部署一套Adg ?
答:
1.Duplicate Target 方式是彻底无望了!
2.传统的Rman备份出全量数据传输到备库后启动Adg从主库自动拉归档方式也不可能(10T数据备份时间 + 传输时间 + 恢复时间 > 4小时)
3.Rman备份出全量数据传到备库恢复,备份同时主库定时转储归档传到备库register (主库当前环境为三节点Rac,归档存放在ASM上,你能知道归档的正确顺序,并按顺序正确register到新的dg端?)
4.Rman备份出全量数据传到备库恢复,备份同时从现有一备库端定时转储归档传到备库register(第三方软件每小时内不定期删除归档日志,你怎么确保高频产生的归档全部转储成功,一个不丢失不损坏?)
以上的四种方案全无法通过!
可上级的要求无法违背。怎样在这样极端恶劣的环境下新部署一套Adg库?
解决方案如下:
1.在主库端制作standby控制文件
2.在现有备库端备份全量数据
3.搭建第二新备库并用备库端传来的全量数据恢复
4.read only方式开打新备库读出Gap点的scn
5.根据Gap点scn在旧有备库上做好增量备份
6.用增备恢复第二新备库
7.启用dg让新备库自动抓取主库端4小时内的归档,恢复追平主库
8.启动Adg验证有效性
步骤:
1.保持与主库操作系统一致,在Adg Server上部署Redhat7.2的OS,本机存储空间分配足够(20T),保证主备库间带宽畅通;
2.在standby部署好Oracle12C的software、空库并启动到nomount状态 ;
3.将旧有备库上的密码文件、静态参数文件传输到新的Adg端(参数文件根据主/备环境做对应修改配置);
4.选择非业务高峰时段对主库spfile用命令动态修改;
5.在主库上创建备库控制文件并传输到备库对应目录;
6.旧备库外挂NAS存储(移动式),rman备份完全量数据后将此NAS快速搬迁到异地机房并挂载到新备库端;
7.用主库制作的standby controlfile启动新备库到mount状态;
8.用外挂NAS存储上的全量备份集恢复新备库;
9.只读方式开打新备库读出Gap点的scn(找最小点的scn);
10.根据Gap点scn在旧有备库上做好增量备份,用增备恢复第二新备库;
11.启用dg让新备库自动抓取主库端4小时内的归档,恢复追平主库;
12.启动Adg 验证主、备库数据一致性;
################## 以下为具体执行手顺
主库执行:
TNS:
orcldg2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.5)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcldg2)
(UR=A)
)
)
#!/bin/bash
sqlplus sys/ as sysdba
>result.log<<EOF
##alter database create standby controlfile as ‘/home/oracle/control01_sty.ctl’;
alter system set log_archive_config=‘DG_CONFIG=(orcl,orcldg1,orcldg2)’;
alter system set log_archive_dest_4=‘SERVICE=orcldg2 LGWR ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcldg2’ scope=both sid=’*’;
alter system set log_archive_dest_state_4=enable;
alter system set standby_file_management=‘AUTO’;
exit
EOF
##在主库上创建备库控制文件并传输到备库对应目录
sqlplus sys/ as sysdba
>result.log<<EOF
alter database create standby controlfile as ‘/mnt/backup/control01_sty.ctl’
exit
EOF
scp -r /mnt/backup/control01_sty.ctl 10.10.10.18:/home/oracle/
全备Standby库+归档、并行
旧备库端执行:
su - oracle
vi rman_database_backup.sh
#!/bin/sh
echo “start full database backup !”
rman target / log /mnt/backup/datbase_backup.log <<EOF
run {
configure channel device type disk format ‘/mnt/backup/full_%U_%d’;
configure device type disk parallelism 10; ## 自动分配10路并行备份通道,无需再手动指定
delete backupset all completed before ‘sysdate-7’;
crosscheck archivelog all;
delete noprompt expired archivelog all;
backup database plus archivelog;
}
exit;
EOF
echo “finished full database backup !!!”
##备份集的实际路径、备份集名需按实际情况调整
scp -r /mnt/backup/full_database 10.10.10.18:/u01/backup/full_database
全量恢复
新备库执行:
rman target / log /home/oracle/rman_recover.log<<END
run{
startup nomount;
restore controlfile from ‘/home/oracle/control01_sty.ctl’;
sql ‘alter database mount standby database’;
catalog start with ‘/mnt/backup/’; ##备份集的实际路径、备份集名需按实际情况调整
configure device type disk parallelism 10;
restore database;
recover database;
}
exit;
END
###基于gap点拉增量备份
select * from v$archive_gap;
##查看standby端最小 scn
col min(checkpoint_change#) for 999999999999
col current_scn for 999999999999
set numwidth 20
select min(checkpoint_change#) from v$datafile_header; ## 两条sql 二选一就好,用下面这条更省力
select min(fhscn) from x$kcvfh;
MIN(FHSCN)
20172508017
select current_scn from v$database;
CURRENT_SCN
20203151960
选择较小SCN号(20172508017)去主库拉增备
查出主库在standby端current_scn后产生的新数据文件,根据文件号(file#)在主库端做Rman数据文件备份
select file#,name from vKaTeX parse error: Expected 'EOF', got '#' at position 31: …creation_change#̲>=(select curre…database); ## 极端情况下使用,大多数时候不用这样做
################################## 拉增备的scn号用下面查出来最小的号
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
2164433