ITPub博客

首页 > 数据库 > Oracle > 物理Data Guar维护篇(一)

物理Data Guar维护篇(一)

原创 Oracle 作者:静以致远√团团 时间:2014-02-28 20:57:57 0 删除 编辑

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中的LAGLog 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)、物理standbyfailover(一般是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数据库的小,需将多出的归档文件copystandby数据库的归档路径下

 


先停止当前活动的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博客 ” ,链接:http://blog.itpub.net/29320885/viewspace-1097335/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
每个人都有梦想,去实现吧!

注册时间:2013-11-14

  • 博文量
    164
  • 访问量
    2103462