一 描述
架构说明
为了简单明了的描述生产库、本地容灾、异地容灾三者之间的架构关系以及搭建步骤,现分别用以A 机、B 机、C 机来表示。 本地主库服务器:A 机 本地备库服务器:B 机 异地备库服务器:C 机
硬件环境
以下为方案编写时采用的测试环境,DataGuard 搭建需要在同平台同版本前提下实现,且更多是数据库层面的参数设置,对使用何种操作系统关系不大。 A 机规划:
|
主机名 |
IP |
型号 |
操作系统版本 |
数据库版本 |
|
oracledb01 |
192.168.200.71 |
X86 |
RHEL6.4 |
11.2.0.4 |
B 机规划:
|
主机名 |
IP |
型号 |
操作系统版本 |
数据库版本 |
|
oracledb02 |
192.168.200.75 |
X86 |
RHEL6.4 |
11.2.0.4 |
C 机规划:
|
主机名 |
IP |
型号 |
操作系统版本 |
数据库版本 |
|
oracledb03 |
192.168.200.67 |
X86 |
RHEL6.4 |
11.2.0.4 |
1.3 DataGuard 切换说明
在异常情况下,本地主库异常宕机,若主库重启之后,能正常使用,只需确保DataGuard 环境保持同步即可;若本地主库,在异常情况下,不可用或暂不可用,为保证业务的连续性,采用DataGuard 切换方案。 本文档针对异常情况发生,主库不可用或暂不可用的场景下,给出的各种切换方案以及主库正常后回切方案。
二 同时搭建本地& 异地备库
搭建步骤
|
步骤 |
内容 |
|
Step 1 |
主库参数配置 |
|
Step 2 |
本地备库参数文件配置 |
|
Step 3 |
本地备库数据同步 |
|
Step 4 |
异地备库参数文件配置 |
|
Step 5 |
异地备库数据同步 |
主库参数配置
主库参数配置包括确认归档是否打开,force_logging 是否打开,修改主库参数文件,添加网络连接串等等一系列的主库配置信息。
归档开启
确认归档是否开启:
|
[root@oracledb01 ~]# su - oracle [oracle@oracledb01 ~]$ sqlplus "/ as sysdba"SQL*Plus: Release 11.2.0.4.0 Production on Wed Aug 5 10:56:20 2015Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,Data Mining and Real Application Testing options SQL> archive log listDatabase log mode Archive Mode Automatic archival Enabled Archive destination /oradata/test/archOldest online log sequence 82Next log sequence to archive 0Current log sequence 83SQL> |
以上说明归档已经开启,如果没有开启请参照一下方法开启归档:
|
[root@oracledb01 ~]# su - oracle[oracle@oracledb01 ~]$ sqlplus "/ as sysdba"SQL> alter system set log_archive_dest_1='location=/oradata/test/arch' scope =both sid='*'; 关闭数据库:SQL>shutdown immediate; 实例启动:SQL>startup mount;SQL> alter database archivelog ;Database altered.SQL> alter database open;Database altered |
打开数据库force_logging
|
检查是否打开了force_logging :SQL> SELECT FORCE_LOGGING FROM V$DATABASE;FOR--- YES// 如果状态为YES ,则已经打开,如果状态为NO ,则参考下面步骤:SQL> ALTER DATABASE FORCE LOGGING; |
添加网络连接串
网络连接串用于连接主备两端数据库,传输归档等作用,具体需要配置如下几个:主库连接串,本地备库连接串,异地备库连接串,详细配置信息如下:
|
su – oraclecd $ORACLE_HOME/network/admin vi tnsnames.ora 添加如下信息:(如果已经存在以下连接串,酌情考虑添加删除)###################A 机连接串#########################test = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.71)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test) ) ) ###################B 机连接串#########################local = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.75)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test) ) ) ###################C 机连接串######################### remote = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.67)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test) ) ) |
修改主库参数文件
备份参数文件:(方便修改参数出现问题及时回退)
|
[root@oracledb01 ~]# su - oracle[oracle@oracledb01 ~]$ sqlplus "/ as sysdba" SQL> create pfile='/tmp/inittest20170809.ora' from spfile;File created. |
主库需要修改的参数如下:
|
参数 |
阀值 |
定义 |
|
standby_file_management |
AUTO |
primary 数据库数据文件发生修改(如新建,重命名等)则按照本参数的设置在standby 中做相应修改。 |
|
log_archive_dest_2 |
'SERVICE=local arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'; |
归档文件的生成路径,location代表本地机上,service指明在另一台机器上 |
|
log_archive_dest_3 |
'SERVICE=remote arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'; |
归档文件的生成路径,location代表本地机上,service指明在另一台机器上 |
|
fal_server |
local,remote |
备库端的参数,给出Oracle网络服务名,通常为指向主库的连接串 |
|
fal_client |
test |
备库端的参数,给出Oracle网络服务名,通常为指向备库的连接串 |
|
db_file_name_convert |
'/oradata/test/', '/oradata/test/' |
数据库和备用数据库的数据文件转换目录对映 |
|
log_file_name_convert |
'/oradata/test/', '/oradata/test/' |
指明主数据库和备用数据库的log文件转换目录对映 |
|
LOG_ARCHIVE_DEST_STATE_1 |
ENABLE |
激活或者不激活定义的归档日志目录,允许redo 传输服务传输redo数据到指定的路径 |
|
LOG_ARCHIVE_DEST_STATE_2 |
ENABLE |
激活或者不激活定义的归档日志目录,允许redo 传输服务传输redo数据到指定的路径 |
|
LOG_ARCHIVE_DEST_STATE_3 |
ENABLE |
激活或者不激活定义的归档日志目录,允许redo 传输服务传输redo数据到指定的路径 |
具体设置如下:
|
SQL>alter system set standby_file_management=auto scope=both sid='*'; SQL>alter system set log_archive_dest_2='SERVICE=local arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test' scope=both sid='*'; SQL>alter system set log_archive_dest_3='SERVICE=remote arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test' scope=both sid='*'; SQL>alter system set db_file_name_convert ='/oradata/test/','/oradata/test/' scope=spfile sid='*'; SQL>alter system set log_file_name_convert='/oradata/test/','/oradata/test/' scope=spfile sid='*'; SQL>ALTER SYSTEM set LOG_ARCHIVE_DEST_STATE_1=ENABLE scope=both sid='*'; SQL>ALTER SYSTEM set LOG_ARCHIVE_DEST_STATE_2=ENABLE scope=both sid='*'; SQL>ALTER SYSTEM set LOG_ARCHIVE_DEST_STATE_3=ENABLE scope=both sid='*'; |
创建standby redo log 文件
standby redo log 作用在备库,用于接收从主库传过来的日志信息,在主库部署主要是为了方便日后的主备切换
创建适当数量的 Standby Redo Log 组数
公式如下 :
1. 如果主库是单实例数据库 :Standby Redo Log 组数 = 主库日志组总数 +1
2. 如果主库是RAC数据库:Standby Redo Log组数=(所有节点中日志组数最大值 + 1) * RAC节点数
3. 大小和生产库redo日志组大小一致
|
alter database add standby logfile ('/oradata/test/std_redo01.log') size 500m; alter database add standby logfile ('/oradata/test/std_redo02.log') size 500m; alter database add standby logfile ('/oradata/test/std_redo03.log') size 500m; alter database add standby logfile ('/oradata/test/std_redo04.log') size 500m; |
主库收集相关文件
1. 创建备库所需参数文件#mkdir –p /backup#chown oracle:oinstall /backup#chmod 775 /backup
|
sqlplus "/ as sysdba"SQL> create pfile='/backup/inittest.ora' from spfile; |
2. 创建standby 控制文件:
|
sqlplus "/as sysdba"SQL> alter database create standby controlfile as '/backup/control01.ctl'; |
3. 拷贝tnsnames.ora 文件:
|
su – oraclecd $ORACLE_HOME/network/admincp tnsnames.ora /backup |
4. 拷贝密码文件:
|
su – oraclecd $ORACLE_HOME/dbscp orapwtest /backup |
主库相关文件拷贝至备库( 包括本地和异地)
|
# su – oracle$ cd /backup$ scp * oracle@192.168.200.75:/backup$ scp * oracle@192.168.200.63:/backup |
备库( 包括本地与异地) 参数配置
环境确认
备库需要确认如下信息:
1. 数据库软件已经正常安装,版本和生产保持一致
2. 监听已经启动
3. 将2.2 章节中备份出来的/backup 下面的文件拷贝到备库指定位置
修改备库参数文件
将从生产库拷贝过来的参数文件进行编辑,在保证主库中3.2.4 修改主库参数文件章节中的参数已经确认生效的情况下,修改以下参数 本地备库 需要调整的参数如下:
|
参数 |
阀值 |
定义 |
|
log_archive_dest_2 |
'SERVICE=remote arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'; |
归档文件的生成路径,location代表本地机上,service指明在另一台机器上 |
|
log_archive_dest_3 |
'SERVICE=test arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'; |
归档文件的生成路径,location代表本地机上,service指明在另一台机器上 |
|
db_file_name_convert |
'/oradata/test/', '/oradata/test/' |
数据库和备用数据库的数据文件转换目录对映 |
|
log_file_name_convert |
'/oradata/test/', '/oradata/test/' |
指明主数据库和备用数据库的log文件转换目录对映 |
|
control_files |
'/oradata/test/control01.ctl' |
控制文件指向最新的路径 |
本地备库 初始化参数修改
|
*.audit_file_dest='/oracle/app/admin/test/adump'*.audit_trail='db'*.compatible='11.2.0.4.0' *.control_files='/oradata/test/control01.ctl'*.db_block_size=8192*.db_domain='' *.db_file_name_convert='/oradata/test/','/oradata/test/'*.db_name='test'*.diagnostic_dest='/oracle/app'*.dispatchers='(PROTOCOL=TCP) (SERVICE=testXDB)'*.log_archive_dest_1='location=/oradata/test/arch' *.log_archive_dest_2='SERVICE=remote ARCH ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test' *.log_archive_dest_3='SERVICE=test ARCH ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'*.log_archive_dest_state_2='ENABLE'*.log_archive_dest_state_3='ENABLE' *.log_file_name_convert='/oradata/test/','/oradata/test/'*.open_cursors=300*.pga_aggregate_target=825229312*.processes=150*.remote_login_passwordfile='exclusive'*.sga_target=2475687936 *.standby_file_management='AUTO'*.undo_tablespace='UNDOTBS1' |
异地备库 需要调整的参数如下:
|
参数 |
阀值 |
定义 |
|
log_archive_dest_2 |
'SERVICE=test arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'; |
归档文件的生成路径,location代表本地机上,service指明在另一台机器上 |
|
db_file_name_convert |
'/oradata/test/', '/oradata/test/' |
数据库和备用数据库的数据文件转换目录对映 |
|
log_file_name_convert |
'/oradata/test/', '/oradata/test/' |
指明主数据库和备用数据库的log文件转换目录对映 |
|
control_files |
'/oradata/test/control01.ctl' |
控制文件指向最新的路径 |
异地备库 初始化参数修改
|
*.audit_file_dest='/oracle/app/admin/test/adump'*.audit_trail='db'*.compatible='11.2.0.4.0' *.control_files='/oradata/test/control01.ctl'*.db_block_size=8192*.db_domain='' *.db_file_name_convert='/oradata/test/','/oradata/test/'*.db_name='test'*.diagnostic_dest='/oracle/app'*.dispatchers='(PROTOCOL=TCP) (SERVICE=testXDB)'*.log_archive_dest_1='location=/oradata/test/arch' *.log_archive_dest_2='SERVICE=test ARCH ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'*.log_archive_dest_state_2='ENABLE' *.log_file_name_convert='/oradata/test/','/oradata/test/'*.open_cursors=300*.pga_aggregate_target=825229312*.processes=150*.remote_login_passwordfile='exclusive'*.sga_target=2475687936 *.standby_file_management='AUTO'*.undo_tablespace='UNDOTBS1' |
拷贝文件到备库指定位置
将之前从生产库/backup 指定文件拷贝到指定路径下面: 参数文件: 拷贝到$ORACLE_HOME/dbs 控制文件: 拷贝到/oradata/test 下面tnsnames.ora: 拷贝到$ORACLE_HOME/network/admin/ 密码文件:拷贝到$ORACLE_HOME/dbs
启动数据库
启动备端数据库到mount 状态:
|
su – oracleSQL>create spfile from pfile;SQL>startup mount; |
主库开启日志传输
主库激活RFS
|
su - oraclesqlplus "/ as sysdba"SQL>alter system set log_archive_dest_state_2=defer;SQL>alter system set log_archive_dest_state_2=enable;SQL>alter system set log_archive_dest_state_3=defer;SQL>alter system set log_archive_dest_state_3=enable; |
检查日志传输是否报错:
|
su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error from v$archive_dest where dest_id=2 or dest_id=3; 检查是否存在报错,如果有报错,检查报错原因 |
备库全量同步
主库rman 全库备份
|
su - oracle $ rman target / RMAN> backup database format '/backup/fulldb_test_%U.bak'; |
将主库/backup/ 中的fulldb_test* 文件拷贝到备库服务器/backup 备库全量还原
|
$ rman target /RMAN>catalog backuppiece '/backup/fulldb_test_09sbfbg8_1_1.bak';RMAN>catalog backuppiece '/backup/fulldb_test_0asbfbhl_1_1.bak';RMAN>restore database; |
备库增量同步
备库开启MRP 进程,进行增量同步
|
su - oraclesqlplus "/ as sysdba"SQL>alter database recover managed standby database disconnect from session 或者SQL> alter database recover managed standby database using current logfile disconnect from session; |
备库确认日志传输和应用是否正常
|
su - oraclesqlplus "/ as sysdba"SQL>select process,status from v$managed_standby;SQL>select thread#,max(sequence#) from v$archived_log group by thread#;SQL>select thread#,max(sequence#) from v$archived_log where applied='YES' group by thread#; |
备库检查alert 日志输出是否正常
|
$ tail -f /oracle/app/diag/rdbms/test/test/trace/alert_test.log |
三 本地备库切换成主库
本地备库强制切换成主库
在异常情况下,主库不可用,需要将本地备库强制切换成主库
|
su - oracle$ sqlplus "/ as sysdba"SQL> recover managed standby database cancel;SQL> recover managed standby database finish;SQL> select name,open_mode,database_role,switchover_status from v$database;SQL> alter database commit to switchover to primary;SQL> shutdown immediate;SQL> startup; |
机主库与C 机备库数据同步
B 机主库激活RFS ,进行日志传输
|
su - oraclesqlplus "/ as sysdba"SQL>alter system set log_archive_dest_state_2=defer;SQL>alter system set log_archive_dest_state_2=enable; |
B 机主库检查日志传输是否报错:
|
su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error from v$archive_dest where dest_id=2; 检查是否存在报错,如果有报错,检查报错原因 |
C 机备库确认日志传输和应用是否正常
|
su - oraclesqlplus "/ as sysdba"SQL>select process,status from v$managed_standby;SQL>select thread#,max(sequence#) from v$archived_log group by thread#;SQL>select thread#,max(sequence#) from v$archived_log where applied='YES' group by thread#; |
C 机备库检查alert 日志输出是否正常
|
$ tail -f /oracle/app/diag/rdbms/test/test/trace/alert_test.log |
机主库与A 机备库数据同步
A 机修复后,继续以下操作。B 机主库激活RFS ,进行日志传输
|
su - oraclesqlplus "/ as sysdba"SQL>alter system set log_archive_dest_state_3=defer;SQL>alter system set log_archive_dest_state_3=enable; |
B 机主库检查日志传输是否报错:
|
su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error from v$archive_dest where dest_id=3; 检查是否存在报错,如果有报错,检查报错原因 |
A 机备库确认日志传输和应用是否正常
|
su - oraclesqlplus "/ as sysdba"SQL>select process,status from v$managed_standby;SQL>select thread#,max(sequence#) from v$archived_log group by thread#;SQL>select thread#,max(sequence#) from v$archived_log where applied='YES' group by thread#; |
A 机备库检查alert 日志输出是否正常
|
$ tail -f /oracle/app/diag/rdbms/test/test/trace/alert_test.log |
机主库与A 机备库进行主备切换
B 机主库切换成physical standby 角色
|
su - oraclesqlplus "/ as sysdba"SQL> select name,open_mode,database_role,switchover_status from v$database;SQL> alter database commit to switchover to physical standby;SQL> shutdown immediate;SQL> startup mount;SQL> recover managed standby database disconnect from session; |
A 机备库切换成primary 角色
|
su - oraclesqlplus "/ as sysdba"SQL> select name,open_mode,database_role,switchover_status from v$database;SQL> alter database commit to switchover to primary;SQL> shutdown immediate;SQL> startup; |
此时 A 机是主库, B 机是备库 。A 机主库检查日志传输是否报错:
|
su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error from v$archive_dest where dest_id=2; 检查是否存在报错,如果有报错,检查报错原因 |
B 机备库确认日志传输和应用是否正常
|
su - oraclesqlplus "/ as sysdba"SQL>select process,status from v$managed_standby;SQL>select thread#,max(sequence#) from v$archived_log group by thread#;SQL>select thread#,max(sequence#) from v$archived_log where applied='YES' group by thread#; |
B 机备库检查alert 日志输出是否正常
|
$ tail -f /oracle/app/diag/rdbms/test/test/trace/alert_test.log |
机主库与C 机备库数据同步
A 机主库激活RFS ,进行日志传输
|
su - oraclesqlplus "/ as sysdba"SQL>alter system set log_archive_dest_state_3=defer;SQL>alter system set log_archive_dest_state_3=enable; |
A 机主库检查日志传输是否报错:
|
su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error from v$archive_dest where dest_id=3; 检查是否存在报错,如果有报错,检查报错原因 |
C 机备库确认日志传输和应用是否正常
|
su - oraclesqlplus "/ as sysdba"SQL>select process,status from v$managed_standby;SQL>select thread#,max(sequence#) from v$archived_log group by thread#;SQL>select thread#,max(sequence#) from v$archived_log where applied='YES' group by thread#; |
C 机备库检查alert 日志输出是否正常
|
$ tail -f /oracle/app/diag/rdbms/test/test/trace/alert_test.log |
四 异地备库切换成主库
异地备库强制切换成主库
在异常情况下,主库、本地备库均不可用,需要将异地备库强制切换成主库
|
su - oracle$ sqlplus "/ as sysdba"SQL> recover managed standby database cancel;SQL> recover managed standby database finish;SQL> select name,open_mode,database_role,switchover_status from v$database;SQL> alter database commit to switchover to primary; |
机主库部署A 机及B 机数据同步
此过程可参照步骤二
机主库与A 机备库进行主备切换
C 机主库切换成standby 角色
|
su - oracle$ sqlplus "/ as sysdba"SQL> select name,open_mode,database_role,switchover_status from v$database;SQL> alter database commit to switchover to physical standby;SQL> shutdown immediate;SQL> startup mount;SQL> recover managed standby database disconnect from session; |
A 机备库切换成primary 角色
|
su - oracle$ sqlplus "/ as sysdba"SQL> recover managed standby database cancel;SQL> select name,open_mode,database_role,switchover_status from v$database;SQL> alter database commit to switchover to primary;SQL> shutdown immediate;SQL> startup; |
此时 A 机是主库, C 机是备库。A 机主库检查日志传输是否报错:
|
su - oraclesqlplus "/ as sysdba"SQL> select dest_name,status,error from v$archive_dest where dest_id=3; 检查是否存在报错,如果有报错,检查报错原因 |
C 机备库确认日志传输和应用是否正常
|
su - oraclesqlplus "/ as sysdba"SQL>select process,status from v$managed_standby;SQL>select thread#,max(sequence#) from v$archived_log group by thread#;SQL>select thread#,max(sequence#) from v$archived_log where applied='YES' group by thread#; |
C 机备库检查alert 日志输出是否正常
|
$ tail -f /oracle/app/diag/rdbms/test/test/trace/alert_test.log |
机主库与B 机备库数据同步
A 机主库激活RFS ,进行日志传输
|
su - oraclesqlplus "/ as sysdba"SQL>alter system set log_archive_dest_state_2=defer;SQL>alter system set log_archive_dest_state_2=enable; |
A 机主库检查日志传输是否报错:
|
sqlplus "/ as sysdba"SQL> select dest_name,status,error from v$archive_dest where dest_id=2; 检查是否存在报错,如果有报错,检查报错原因 |
B 机备库确认日志传输和应用是否正常
|
su - oraclesqlplus "/ as sysdba"SQL>select process,status from v$managed_standby;SQL>select thread#,max(sequence#) from v$archived_log group by thread#;SQL>select thread#,max(sequence#) from v$archived_log where applied='YES' group by thread#; |
B 机备库检查alert 日志输出是否正常
|
$ tail -f /oracle/app/diag/rdbms/test/test/trace/alert_test.log |
