DATAGUARD实际的应用场景

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文主要讨论以下几个问题 1、在线建立DATAGUARD备库 2、使用日RMAN异机恢复来保护DATAGUARD切换可能出现的问题。 3、切换和失败切换 首先查看DATAGUARD中参数哪些是静态,哪些是动态的,动态的可以再不停机的情...

本文主要讨论以下几个问题
1、在线建立DATAGUARD备库
2、使用日RMAN异机恢复来保护DATAGUARD切换可能出现的问题。
3、切换和失败切换


首先查看DATAGUARD中参数哪些是静态,哪些是动态的,动态的可以再不停机的情况下直接修改
先看一下主库需要设置的参数,然后我们在数据库中查一下
DB_UNIQUE_NAME=testdg1
LOG_ARCHIVE_CONFIG='DG_CONFIG=(testdg1,tsetdg2)'
LOG_ARCHIVE_DEST_1='LOCATION=/oradata/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testdg1'
LOG_ARCHIVE_DEST_2='SERVICE=testdg2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=testdg2'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
LOG_ARCHIVE_MAX_PROCESSES=2
STANDBY_FILE_MANAGEMENT='AUTO'
FAL_SERVER=testdg2
FAL_CLIENT=testdg1


select NAME,VALUE,ISSYS_MODIFIABLE
  from v$parameter2
 where upper(name) in ('DB_UNIQUE_NAME',
                        'LOG_ARCHIVE_CONFIG',
                        'LOG_ARCHIVE_DEST_2',
                        'LOG_ARCHIVE_DEST_1',
                        'LOG_ARCHIVE_DEST_STATE_1',
                        'LOG_ARCHIVE_DEST_STATE_2',
                        'REMOTE_LOGIN_PASSWORDFILE',
                        'LOG_ARCHIVE_FORMAT',
                        'LOG_ARCHIVE_MAX_PROCESSES',
                        'FAL_SERVER',
                        'FAL_CLIENT',
                        'STANDBY_FILE_MANAGEMENT');


NAME                             VALUE                                ISSYS_MODIFIABLE
-------------------------------- ------------------------------------ ----------------
log_archive_config                                                    IMMEDIATE
log_archive_dest_1               LOCATION=/home/oracle/archive        IMMEDIATE
log_archive_dest_2                                                    IMMEDIATE
log_archive_dest_state_1         enable                               IMMEDIATE
log_archive_dest_state_2         enable                               IMMEDIATE
log_archive_max_processes        2                                    IMMEDIATE
log_archive_format               %t_%s_%r.dbf                         FALSE
fal_client                                                            IMMEDIATE
fal_server                                                            IMMEDIATE
remote_login_passwordfile        EXCLUSIVE                            FALSE
db_unique_name                   test                                 FALSE
 
可以看到如果要动态的配置DATAGUARD,remote_login_passwordfile参数不能设置NONE,db_unique_name 也必须提前设置好
其他的参数都可以通过动态进行修改
 alter system set db_unique_name='testdg1' scope=spfile;
然后重启数据库,如果在规划时就确定这个数据库以后可能是要做DATAGUARD,可以提前设置好这个参数。
这样其实主库环境就准备好了,我们配置的是最大性能模式LGWR ASYNC模式。

1、设置主库FORCE LOGGING属性
 ALTER DATABASE FORCE LOGGING;
2、复制主库的SPFILE到备库,并且在备库使用spfile建立pfile,修改pfile参数文件加入或者更改


DB_UNIQUE_NAME=testdg2
LOG_ARCHIVE_CONFIG='DG_CONFIG=(testdg1,testdg2)'
LOG_ARCHIVE_DEST_1='LOCATION=/home/oracle/archive  VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testdg2'
LOG_ARCHIVE_DEST_2='SERVICE=testdg1 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=testdg1'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
LOG_ARCHIVE_MAX_PROCESSES=2
STANDBY_FILE_MANAGEMENT='AUTO'
FAL_SERVER=testdg1
FAL_CLIENT=testdg2


3、进行NET配置,主库备库均进行配置,备库的LSTENER可以先启动,保证都能TSNPING通

主库:
testdg2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.171)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = testdg2)
    )
  )
备库:
testdg1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.170)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = testdg1)
    )
  )
4、主库进行RMAN备份,然后备份STANDBY CONTROLFILE,随后传输密码文件,备份文件,STANDBY控制文件到备库
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/boston.ctl';
5、恢复控制文件,然后恢复数据文件

[oracle@dg2 test]$ scp /home/oracle/boston.ctl control01.ctl
[oracle@dg2 test]$ scp /home/oracle/boston.ctl control02.ctl
[oracle@dg2 test]$ scp /home/oracle/boston.ctl control03.ctl
然后mount下恢复数据文件


6、在备库建立STANDBY LOGFILE 组为LOGFILE +1

alter database add standby logfile group 4  '/oracle/app/oracle/oradata/test/sredo04.log' size 50m;
alter database add standby logfile group 5  '/oracle/app/oracle/oradata/test/sredo05.log' size 50m;
alter database add standby logfile group 6  '/oracle/app/oracle/oradata/test/sredo06.log' size 50m;
alter database add standby logfile group 7  '/oracle/app/oracle/oradata/test/sredo07.log' size 50m;


到这里备库就算做完了。以下输主库

7、接下来我们来动态更改主库的参数。


DB_UNIQUE_NAME=testdg1  --已经更改
LOG_ARCHIVE_CONFIG='DG_CONFIG=(testdg1,testdg2)' --需要更改
LOG_ARCHIVE_DEST_1='LOCATION=/home/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testdg1' -需要更改
LOG_ARCHIVE_DEST_2='SERVICE=testdg2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=testdg2' -需要更改
LOG_ARCHIVE_DEST_STATE_1=ENABLE -可以更改
LOG_ARCHIVE_DEST_STATE_2=ENABLE -可以更改
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE --已经更改
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc --不能更改
LOG_ARCHIVE_MAX_PROCESSES=2 --可以更改
STANDBY_FILE_MANAGEMENT='AUTO' --必须修改
FAL_SERVER=testdg2 --需要更改
FAL_CLIENT=testdg1 --需要更改

alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(testdg1,testdg2)'  scope=both;
alter system set LOG_ARCHIVE_DEST_1='LOCATION=/home/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testdg1'  scope=both;
alter system set LOG_ARCHIVE_DEST_2='SERVICE=testdg2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=testdg2'  scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_1=ENABLE scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_2=ENABLE scope=both;
alter system set LOG_ARCHIVE_MAX_PROCESSES=2 scope=both;
alter system set FAL_SERVER=testdg2 scope=both;
alter system set FAL_CLIENT=testdg1 scope=both;
alter system set STANDBY_FILE_MANAGEMENT='AUTO' scope=both;
8、确认配置成功
在主库进行一次日志切换来激活LSN和RFS进程,主库日志如下:
******************************************************************
LGWR: Setting 'active' archival for destination LOG_ARCHIVE_DEST_2
******************************************************************
Wed Mar 12 01:22:22 CST 2014
Thread 1 advanced to log sequence 6 (LGWR switch)
  Current log# 3 seq# 6 mem# 0: /oracle/app/oracle/oradata/test/redo03.log
Wed Mar 12 01:22:22 CST 2014
LNS: Standby redo logfile selected for thread 1 sequence 6 for destination LOG_ARCHIVE_DEST_2
Wed Mar 12 01:22:22 CST 2014
ARC1: Standby redo logfile selected for thread 1 sequence 5 for destination LOG_ARCHIVE_DEST_2
9、开启日志应用,当然也可以开启实时日志应用如下:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

10、最后在主库也建立相应多的standby logfile

alter database add standby logfile group 4  '/oracle/app/oracle/oradata/test/sredo04.log' size 50m;
alter database add standby logfile group 5  '/oracle/app/oracle/oradata/test/sredo05.log' size 50m;
alter database add standby logfile group 6  '/oracle/app/oracle/oradata/test/sredo06.log' size 50m;
alter database add standby logfile group 7  '/oracle/app/oracle/oradata/test/sredo07.log' size 50m;

11、只读方式打开

当备数据库当前执行重做应用时打开以用于只读访问:
1. 取消重做应用:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
2.打开数据库以用于只读访问:
SQL> ALTER DATABASE OPEN;

如果重新
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
恢复到正常模式


12、一些视图
访问V$MANAGED_STANDBY固定视图
访问V$ARCHIVE_DEST_STATUS固定视图
访问V$ARCHIVED_LOG固定视图
访问V$LOG_HISTORY固定视图
访问V$DATAGUARD_STATUS固定视图


13、切换
首先检查 备库
SQL> select name,value from v$dataguard_stats;

NAME                             VALUE
-------------------------------- ----------------------------------------------------------------
transport lag                    +00 00:00:00
apply lag                        +00 00:00:00
apply finish time                +00 00:00:00.000
estimated startup time           13


transport lag                    +00 00:00:00
apply lag                        +00 00:00:00
apply finish time                +00 00:00:00.000
都为0

1、主库执行
SELECT SWITCHOVER_STATUS FROM V$DATABASE
如果是SESSIONS ACTIVE和to standby
执行
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
2、关闭主库
shutdown immediate
如果关闭报错可以不理会,查看一下进程是否存在
ps -ef|grep LGWR
如果不存在即可
3、启动主库到MOUNT
startup mount
4、在备库执行
 SELECT SWITCHOVER_STATUS FROM V$DATABASE;
 如果是SESSIONS ACTIVE和to primary
 执行
 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
5、关闭备库
shutdown immediate
如果关闭报错可以不理会,查看一下进程是否存在
ps -ef|grep LGWR
如果不存在即可
6、启动备库
startup
7、源主库执行,启动日志应用进程
alter database open;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

这样完成了主库备库互相切换

最后检查新的备库及源主库
SQL> select name,value from v$dataguard_stats;


NAME                             VALUE
-------------------------------- ----------------------------------------------------------------
transport lag                    +00 00:00:00
apply lag                        +00 00:00:00
apply finish time                +00 00:00:00.000
estimated startup time           13

transport lag                    +00 00:00:00
apply lag                        +00 00:00:00
apply finish time                +00 00:00:00.000

都为0

如果切换有问题请参考
Oracle Data Guard
Concepts and Administration
10gRelease 2 (10.2)
B14239-04

14、使用RMAN来保护可能在切换中的问题。
虽然说切换失败也有办法来进行回退,至少官方有文档说明,但是为了保障切换万无一失,我们可以简单的
是有RMAN异机来进行连续的恢复,如果有问题也不会导致数据丢失,比如典型的应用可能是我们进行服务器修理
从而保证业务的连续性。

简单的在主库进行RMAN备份包含控制文件然后拷贝到异机,进行restore,

保证应用已经停止没有数据更改后进行日志切换,然后拷贝可能的归档日志到恢复端
这里可能需要进行CATALOG ,我们使用CATALOG START WITH进行注册就行了
我这里记录的SEQ是39
所以恢复为recover database until logseq 40 ( 然后模拟的我们进行一次切换,切换步骤参考上面,如果切换有问题我们就用我们异机恢复的数据库,
如果没有问题,我们就可以关闭主数据库进行修理了。
一旦修理完成,我们想切换回主机,我们就需要再次上面的步骤
首先停止应用来确定,没有数据修改,然后我们进行几次切换保证所有的修改都进入了归档。
最后拷贝这些日志到异机。这里可能的需要进行一次CATALOG;
然后recover database until logseq
然后我们进行切换回主机即可,即使有问题也可以使用异机进行恢复



15、进行失败切换
先确认是否有日志GAP先确认是否有日志GAP
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
对于使用ARCHIVE进行传输的模式,需要拷贝当前日志文件到目标端,并且进行注册
ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1'; 
(需要测试)
需要根据ALTER日志来判断最后的当前日志文件。
保证任何可能的断点都不存在


然后再备库进行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;来关闭RFS接收进程
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; 确实数据没有丢失
(如果此两步有问题不能修复直接ACTIVE 备库,这代表有数据丢失 
ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;)
查看
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
进程转换
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
SHUTDOWN IMMEDIATE; 
STARTUP 来启动数据库


实际上failover分为2种:
1、主库还可以到mount
2、主库不能到mount

1、如果主库可以到mount
--确认gap情况
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
--保证备库的mrp进程启动
--ALTER SYSTEM FLUSH REDO TO 'target_db_name';
这一步保证了所有的redo传输到备库,注意如果备库mrp进程没有启动当前日志将不能传输。
--ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;关闭备库mrp进程
--ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;保证备库接收的日志应用完成
--确认可以进行切换了
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
---------------------------
TO PRIMARY
--ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;进行切换
--ALTER DATABASE OPEN;启动数据库

2、主库不能到mount
主库不能到mount自然就不能ALTER SYSTEM FLUSH REDO TO
那么这一步我们需要手动完成
---确认gap
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
--将任何差值的archive log拷贝到备库进行注册
ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1'; 
--查看mrp进程是否应用了这些注册的归档
select * from v$managed_standby;
--关键一步需要恢复current_log
这一步是为了保证最小的日志丢失,查看alert日志,来找到current log,传输到备库,可以重命名为
归档的格式
然后 recover standby database(until cancel)
;
--完成了这一步只能进行active备库了
ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
--alter database open;

当然任何错误的情况下都可以activate physical standby database激活备库。

 作者微信号:

          

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
191 64
|
Oracle 容灾 安全
实战篇:生产库升级,容灾库 Oracle DataGuard 如何升级?
实战篇:生产库升级,容灾库 Oracle DataGuard 如何升级?
实战篇:生产库升级,容灾库 Oracle DataGuard 如何升级?
|
SQL Oracle 网络协议
实战不停机搭建ORACLE DataGuard
一、基础信息 操作系统:Red Hat Enterprise Linux Server release 6.3 (Santiago) 数据库:11.
1054 1
|
存储 监控 关系型数据库
|
Oracle 关系型数据库 Unix