首页 > 数据库 > Oracle > 物理Data Guar维护篇(一)
1、物理standby数据库的启动REDO应用过程:
主库中加入测试数据库:
primary > select * from scott.dg_test;
no rows selected
primary > insert into scott.dg_test
2 values('DG_TEST_1')
3 /
1 row created.
primary > select * from scott.dg_test;
ID
----------
DG_TEST_1
primary > commit;
Commit complete.
切换归档日志,查看归档号情况
primary > archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/arch
Oldest online log sequence 8
Next log sequence to archive 10
Current log sequence 10
备库上打开数据库,此时应该看不到新数据传输过来
standby > select * from scott.dg_test;
no rows selected
启动standby数据库mount状态,启动REDO应用(注意直接关闭standby数据库容易造成primary数据库的关闭,这里是测试环境,真实环境中不建议这样做的)
standby > shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
standby > startup mount
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 62916852 bytes
Database Buffers 100663296 bytes
Redo Buffers 2973696 bytes
Database mounted.
在进入mount模式时,standby数据库就开始接收paimary数据库传过来的REDO数据,开启REDO应用,使用这些REDO应用
standby > alter database recover managed standby database disconnect from session;
Database altered.
其中discnnect from session并不是必需的,不加上该字句会一直停留在该回话中,要想执行情况其他操作,不得不打开心的连接
要想打开数据库,别忘了先取消REDO应用
standby > alter database recover managed standby database cancel;
Database altered.
standby > alter database open;
Database altered.
再次查看测试表,会发现数据已经传输过来了
standby > select * from scott.dg_test;
ID
----------
DG_TEST_1
2、启动关闭物理standby 数据库的方法
在standby数据库到mount状态时,primary数据库就开始想standby数据库传输REDO数据,若是直接关闭standby数据库,某些情况下会造成primary数据库的关闭,尤其是在最大保护模式的DG环境中。
(1)在真实环境中建议先关闭primary数据库,再去关闭standby数据库。
(2)在有些环境中,我们不希望关闭primary数据库,比如版本的升级,我们可以先关闭standby数据库,对其进行升级,再开启后切换主备库,再对primary数据库升级,此时我们就要先关闭primary数据库的日志传输功能
primary > alter system set log_archive_dest_state_2=defer;
System altered.
为了看看在下次开启REDO传输功能时,在关闭状态primary数据库的数据更改能否同步到standby数据库,此时我们可以加入一些测试数据:
primary > insert into scott.dg_test
2 values('DG_TEST_2')
3 /
1 row created.
primary > select * from scott.dg_test;
ID
----------
DG_TEST_1
DG_TEST_2
primary > commit;
Commit complete.
别忘了切换一下归档日志
primary >alter system switch logfile;
System altered.
现在可以关闭standby数据库了
standby > shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
再次打开数据库到mount,并启动REDO应用,打开到open状态查看测试数据是否存在
standby >recover database managed standby database disconnect from session;
Media recovery complete.
standby >recover database managed standby database cancel;
Media recovery complete.
standby >alter database open;
Database altered.
standby >select * from scott.dg_test;
ID
----------
DG_TEST_1
我们会发现,此时的数据仍然是上次启动REDO应用时的数据,由于新的REDO数据没能传输过来,所以看不到新的变化
priamry再次开启REDO传输功能,看在关闭期间的REDO数据能否传输到standby数据库
primary >alter system set log_archive_dest_state_2=enable;
System altered.
启动standby数据库的REDO应用
standby > startup mount
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 62916852 bytes
Database Buffers 100663296 bytes
Redo Buffers 2973696 bytes
Database mounted.
standby > recover database managed standby database disconnect from session;
Media recovery complete.
standby > recover database managed standby database cancel;
Media recovery complete.
standby > alter database open;
Database altered.
standby > select * from scott.dg_test;
ID
----------
DG_TEST_1
DG_TEST_2
新的数据已经传输过来,DG中的LAG(Log Apply Services)服务能对主备库间的归档日志进行检查,若不一致,主库的归档日志将自动传输到备库中。
3、主备库的转换
(1)、首先是无损转换(switchover),即正常的人工的去装换主备库,往往需求在硬件升级时采用滚动升级SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
此为正常状态
primary > select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE
此状态证明有连接在primary数据库上,需要在切换角色时加上with session shutdown子句来断开连接的会话
主库上切换主备库角色
SQL> alter database commit to switchover to physical standby;
Database altered.
细心的话在primary库上转换角色的同时,赶紧切换到备库,会发现
standby > select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
NOT ALLOWED
standby > select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
SWITCHOVER PENDING
重启primary数据库到mount,查看此时主库的角色状态
SQL> startup mount
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 71305460 bytes
Database Buffers 92274688 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
查看备库的转换状态
standby > select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
SWITCHOVER PENDING
正常情况下应该是TO PRIMARY状态,若为SWITCHOVER PENDING需要先进行一下回复操作
standby > alter database recover managed standby database disconnect from session;
Database altered.
standby > alter database recover managed standby database cancel;
alter database recover managed standby database cancel
*
ERROR at line 1:
ORA-16136: Managed Standby Recovery not active
这里取消REDO应用时报了错,无需进行取消,看来oracle10g已经修改,在主备库转换过程中不用取消REDO应用,自动取消了?(个人感觉,有待考证,无伤大雅)
再次查看数据库的switchover_status状态
standby > select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
成功编程了TO PRIMARY状态,开始将备库转换成主库
standby > alter database commit to switchover to primary;
Database altered.
打开新的primary库
standby > alter database open;
Database altered.
验证一下:
primary > select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
13
primary > insert into scott.dg_test
2 values('DG_TEST_3')
3 /
1 row created.
primary > select * from scott.dg_test;
ID
----------
DG_TEST_1
DG_TEST_2
DG_TEST_3
primary > commit;
Commit complete.
primary > alter system switch logfile;
System altered.
primary > select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
14
备库上接受数据并查看(要稍等一小会,不让可能由于你的网速问题,REDO数据还未传输到standby数据库,影响实验结果)
standby > select status from v$instance;
STATUS
------------
MOUNTED
standby > select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
14
standby > alter database recover managed standby database disconnect from session;
Database altered.
standby > alter database recover managed standby database cancel;
Database altered.
standby > alter database open;
Database altered.
SQL> select * from scott.dg_test;
ID
----------
DG_TEST_1
DG_TEST_2
DG_TEST_3
witchover模式的转换成功!
(2)、物理standby的failover(一般是primary数据库无法启动)
为了模拟损坏,先在primary数据库中插入一些测试数据
primary > insert into scott.dg_test
2 select * from scott.dg_test
3 /
3 rows created.
primary > commit;
Commit complete.
primary > shutdown abort
ORACLE instance shut down.
这样以来,primary数据库有提交的事务刚写入REDO,并且以abort模式关闭数据库,启动时需要实例恢复,现在启动到mount状态,是为了方便以后查询相关参数,如果对数据库结构较为熟悉,无需启动。
查看standby数据库是否有归档连接
SQL> select thread#,low_sequence#,high_sequence# from v$archive_gap;
no rows selected
这里没又发现有归档连接,若发现有归档连接,则需安序列号将连接着的归档文件复制到standby数据库的归档路径下,复制完成后需将该归档文件加入数据字典
SQL> alter database register physical logfile 'filenme';
查询standby数据库的最大归档序号
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
15
损害的主库上查看最大归档号,当然也可自己去归档路径下查看
primary > select distinct thread#,max(sequence#) over(partition by thread#) a from v$archived_log;
THREAD# A
---------- ----------
1 15
若发现,standby数据库的日志序列号比primary数据库的小,需将多出的归档文件copy到standby数据库的归档路径下
先停止当前活动的RFS进程
SQL> alter database recover managed standby database finish force;
开始切换standby数据库为primary
SQL> alter database commit to switchover to primary;
Database altered.
转换完成后将数据库打开到open状态即可
SQL> alter database open;
Database altered.
转换完成,后续工作要么重新添加一个standby’数据,要么尝试去修复原有的praimay数据库,具体的要看实际情况来定夺了~
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29320885/viewspace-1097335/ ,如需转载,请注明出处,否则将追究法律责任。