Oracle 12c 新特性 --- 在角色转换过程中保持Physical Standby 会话

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leo__1990/article/details/90057125

概念

Currently, when a role change occurs and an Active Data Guard standby becomes the primary, all read-only user connections are disconnected and must reconnect, losing their state information. This feature enables a role change to occur without disconnecting the read-only user connections. Instead, the read-only user connections experience a pause while the state of the standby database is changed to primary. Read-only user connections that use a service designed to run in both the primary and physical standby roles are maintained. Users connected through a physical standby only role continue to be disconnected.
当前,当角色更改发生时,一个活动的数据保护备份成为主服务器,所有只读的用户连接都断开连接,必须重新连接,失去它们的状态信息。该特性允许在不断开只读用户连接的情况下进行角色更改。相反,只读的用户连接经历了暂停,而备用数据库的状态被更改为primary。只读用户连接使用设计在主和物理备用角色中运行的服务。通过物理备用服务器连接的用户只能继续断开连接。
This feature improves the user experience and facilitates improved reporting and query capabilities on an Active Data Guard standby during role transitions.

该特性改善了用户体验,并有助于在角色转换过程中,在活动的数据守护程序上改进报告和查询功能。
在Oracle Database 12c Release 2(12.2.0.1)中,当一个物理备用数据库被转换为一个主服务器时,您可以选择在切换/故障转移期间保持任何连接到物理备用系统的会话,而不需要中断。当数据库重新被重新打开时,暂停的会话恢复操作,好像什么都没有发生。如果数据库(或单个PDB)未在主要角色中打开,会话将被终止。
为了启用这个特性,可以使用备用侧的STANDBY_DB_PRESERVE_STATES初始化参数。这个参数可以有以下值:
NONE — No sessions on the standby are retained during a switchover/failover.
SESSION or ALL — User sessions are retained during switchover/failover.
实现这个功能要修改参数STANDBY_DB_PRESERVE_STATES,参数的详细内容参考文档:
http://docs.oracle.com/database/122/REFRN/STANDBY_DB_PRESERVE_STATES.htm#BEGIN

实验

1)连接备库,查看备库pdbcndba_c会话ID,db_unique_name及参数值standby_db_preserve_states
[[email protected] ~]$ sqlplus /nolog

SQL*Plus: Release 12.2.0.1.0 Production on Thu Aug 17 16:36:35 2017

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

SQL> conn /as sysdba
Connected.
SQL> col username for a10
SQL> select username,sid, serial# from v$session where sid=SYS_CONTEXT('USERENV','SID');

USERNAME	  SID	   SERIAL#
---------- ---------- ----------
SYS		    1	   46422

SQL> show parameter db_unique_name

NAME				          TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_unique_name			          string  pdbcndba_c

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ ONLY WITH APPLY

SQL> show parameter standby_db_preserve_states;

NAME				           TYPE	 VALUE
------------------------------------ ----------- ------------------------------
standby_db_preserve_states	          string NONE
2)连接主库pdbcndba_p进行switchover,
--主库切换
SQL>  show parameter standby_db_preserve_states;

NAME				             TYPE	 VALUE
------------------------------------ ----------- ------------------------------
standby_db_preserves_states	             string	 NONE
SQL> ALTER DATABASE SWITCHOVER TO pdbcndba_c VERIFY;

Database altered.

SQL> ALTER DATABASE SWITCHOVER TO pdbcndba_c;

Database altered.
--因为参数standby_db_preserve_states=none 所以会话会断开,重新连接将新备库打开
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-03135: connection lost contact
Process ID: 4325
Session ID: 53 Serial number: 32984

SQL> conn /as sysdba
Connected.

SQL> alter database open;

Database altered.

SQL> alter pluggable database all open;

Pluggable database altered.
3) 在原备库pdbcndba_c原来的会话中查询语句结果提示失去连接 SQL> select username,sid, serial# from v$session where sid=SYS_CONTEXT('USERENV','SID');
select username,sid, serial# from v$session where sid=SYS_CONTEXT('USERENV','SID')
*
ERROR at line 1:
ORA-03135: connection lost contact
Process ID: 3801
Session ID: 1 Serial number: 46422
--重新连接即可,会话ID改变。
SQL> conn /as sysdba
Connected.
SQL> show parameter db_unique_name

NAME				                      TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_unique_name			                 string	 pdbcndba_c

SQL> select username,sid, serial# from v$session where sid=SYS_CONTEXT('USERENV','SID');

USERNAME	  SID	 SERIAL#
---------- ---------- ----------
SYS		   60	   62330

4)在新备库pdbcndba_p修改参数standby_db_preserve_states=all SQL> alter system set standby_db_preserve_states=all scope=spfile;

System altered.
--重启成效
SQL> shutdown immedaite
SP2-0717: illegal SHUTDOWN option
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1593835520 bytes
Fixed Size		    8793256 bytes
Variable Size		 1023411032 bytes
Database Buffers	  553648128 bytes
Redo Buffers		    7983104 bytes
Database mounted.
Database opened.
SQL> alter pluggable database all open;

Pluggable database altered.

SQL> alter database recover managed standby database disconnect from session;

Database altered.
5)在新备库pdbcndba_p另开一个会话查看会话ID,db_unique_name及参数值standby_db_preserve_states [[email protected] ~]$ sqlplus /nolog

SQL*Plus: Release 12.2.0.1.0 Production on Thu Aug 17 16:23:12 2017

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

SQL> conn /as sysdba
Connected.
SQL> col username for a10
SQL> select username,sid, serial# from v$session where sid=SYS_CONTEXT('USERENV','SID');

USERNAME	  SID	  SERIAL#
---------- ---------- ----------
SYS		  52	   33361

SQL> show parameter db_unique_name

NAME				         TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_unique_name			        string	 pdbcndba_p
SQL> show parameter standby_db_preserve_states

NAME				         TYPE	 VALUE
------------------------------------ ----------- ------------------------------
standby_db_preserve_states	        string	  ALL
6)在新主库pdbcndba_c进行switchover SQL> ALTER DATABASE SWITCHOVER TO pdbcndba_p VERIFY;

Database altered.


SQL> ALTER DATABASE SWITCHOVER TO pdbcndba_p;                                           

Database altered.


SQL> alter database open;

Database altered.

SQL> alter pluggable database all open;

Pluggable database altered.

7)pdbcndba_p 从备库又变成主库,在会话52 窗口继续执行查询,会话ID 不变。 正如预期的那样,在切换结束后,我看到我的会话仍然与相同的SID和序列号连接在一起。实际上,用户会话是保留的,当数据库重新打开时,暂停的会话恢复操作,就好像什么都没有发生过一样。
SQL> show parameter db_unique_name

NAME				                    TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_unique_name			                string	     pdbcndba_p


SQL> select username,sid, serial# from v$session where sid=SYS_CONTEXT('USERENV','SID');

USERNAME	  SID	  SERIAL#
----------      ---------- ----------
SYS		   52	   33361

猜你喜欢

转载自blog.csdn.net/leo__1990/article/details/90057125
今日推荐