暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

网易Oracle DG Broker系列:切换自如

DBA天团 2021-02-05
1347








上一篇文章我们简单介绍了一下 DG Broker 及简单配置,本篇文章先展示一下它切库到底有多方便,之后的文章再具体介绍管理功能。


1


配置静态监听


配置静态监听是DG Broker 切库中非常重要的一个步骤,这里重点强调一下。且少静态监听切换过程中会报错,文章后面会讲,我们先按照要求来~~


修改主库监听

SID_LIST_LISTENER=

加入:

(SID_LIST=

(SID_DESC=(GLOBAL_DBNAME=test_pri_DGMGRL)

(ORACLE_HOME=/home/oracle/app/product/11.2.0/db_1)

(SID_NAME=test)) )


修改备库监听

SID_LIST_LISTENER=

加入:

  (SID_LIST=

  (SID_DESC=(GLOBAL_DBNAME=test_std_DGMGRL)

  (ORACLE_HOME=/home/oracle/app/product/11.2.0/db_1)

  (SID_NAME=test)))


格式为:db_unique_name  +  '_DGMGRL'

修改完成后需要lsnrctl reload 生效。


以主库为例,查看lsnrctl status 出现test_pri_dgmgrl


Services Summary...

Service "TEST_PRI" has 1 instance(s).

Instance "test", status READY, has 1 handler(s) for this service...

Service "TEST_PRI_DGB" has 1 instance(s).

Instance "test", status READY, has 1 handler(s) for this service...

Service "test" has 1 instance(s).

Instance "test", status READY, has 1 handler(s) for this service...

Service "testXDB" has 1 instance(s).

Instance "test", status READY, has 1 handler(s) for this service...

Service "test_pri_dgmgrl" has 1 instance(s).

Instance "test", status UNKNOWN, has 1 handler(s) for this service...

Service "test_std" has 1 instance(s).

Instance "test", status READY, has 1 handler(s) for this service...

The command completed successfully



2


Switchover切换



使用SWITCHOVER命令切换主备库的角色,一条命令搞定,但是执行切换前,确认以下几点:


1) 主备库状态分别为TRANSPORT-ON  APPLY-ON

  • 查看配置状态:为success

DGMGRL> SHOW CONFIGURATION;

Configuration - test

Protection Mode: MaxPerformance

Databases:

TEST_PRI - Primary database

test_std - Physical standby database


Fast-Start Failover: DISABLED

Configuration Status:

SUCCESS


  • 查看主库状态:

DGMGRL> show database verbose 'TEST_PRI';

Database - TEST_PRI

Role:            PRIMARY

Intended State:  TRANSPORT-ON

Instance(s):

test

Properties:

DGConnectIdentifie= 'test_pri'

ObserverConnectIdentifier= ''

LogXptMode= 'ASYNC'

DelayMins= '0'

Binding= 'optional'


MaxFailure= '0'

MaxConnections = '1'

ReopenSecs= '120'

NetTimeout= '30'

RedoCompression= 'DISABLE'

LogShipping= 'ON'

PreferredApplyInstance= ''

ApplyInstanceTimeout= '0'

ApplyParallel            = 'AUTO'

StandbyFileManagement    = 'MANUAL'

ArchiveLagTarget         = '0'

LogArchiveMaxProcesses   = '4'


LogArchiveMinSucceedDest = '1'

DbFileNameConvert        = ''

LogFileNameConvert       = ''

FastStartFailoverTarget  = ''

InconsistentProperties   = '(monitor)'

InconsistentLogXptProps  = '(monitor)'

SendQEntries= '(monitor)'

LogXptStatus= '(monitor)'

RecvQEntries= '(monitor)'

ApplyLagThreshold= '0'

TransportLagThreshold= '0'

TransportDisconnectedThreshold= '30'

SidName= 'test'

StaticConnectIdentifier= '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.22)(PORT=9539))(CONNECT_DATA=(SERVICE_NAME=TEST_PRI_DGMGRL)(INSTANCE_NAME=test)(SERVER=DEDICATED)))'


StandbyArchiveLocation = '/home/oracle/arch'

AlternateLocation= ''

LogArchiveTrace= '0'

LogArchiveFormat= 'test_%t_%s_%r.arc'

TopWaitEvents= '(monitor)'

Database Status:

SUCCESS


  • 查看备库状态:

 

DGMGRL> show database verbose 'test_std';

Database - test_std

Role:            PHYSICAL STANDBY

Intended State:  APPLY-ON

Transport Lag:   0 seconds (computed 0 seconds ago)

Apply Lag:       0 seconds (computed 0 seconds ago)

Apply Rate:      37.00 KByte/s

Real Time Query: ON

Instance(s):

test

Properties:

DGConnectIdentifier = 'test_std'

ObserverConnectIdentifier = ''

LogXptMode = 'ASYNC'

DelayMins = '0'

Binding = 'OPTIONAL'

MaxFailure = '0'

MaxConnections = '1'

ReopenSecs  = '120'

NetTimeout = '30'

RedoCompression = 'DISABLE'

LogShipping = 'ON'

PreferredApplyInstance = ''

ApplyInstanceTimeout= '0'

ApplyParallel = 'AUTO'

StandbyFileManagement = 'AUTO'

ArchiveLagTarget = '0'

LogArchiveMaxProcesses = '4'

LogArchiveMinSucceedDest        = '1'

DbFileNameConvert               = '/, '

LogFileNameConvert              = '/, '

FastStartFailoverTarget         = ''

InconsistentProperties          = '(monitor)'

InconsistentLogXptProps         = '(monitor)'

SendQEntries                    = '(monitor)'

LogXptStatus                    = '(monitor)'

RecvQEntries                    = '(monitor)'

ApplyLagThreshold               = '0'

TransportLagThreshold           = '0'

TransportDisconnectedThreshold  = '30'

SidName                         = 'test'

StaticConnectIdentifier         = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.10.21)(PORT=9539))(CONNECT_DATA=(SERVICE_NAME=test_std_DGMGRL)(INSTANCE_NAME=test)(SERVER=DEDICATED)))'

StandbyArchiveLocation          = '/home/oracle/arch/'

AlternateLocation               = ''

LogArchiveTrace                 = '0'

LogArchiveFormat                = '%t_%s_%r.dbf'

TopWaitEvents                   = '(monitor)'

Database Status:


SUCCESS

如果上述状态中出现警告和错误、请在切换前解决。


2) 确认监听静态注册dgmgrl服务


lsnrctl status确认dgmgrl服务已经注册成功。否则,在switchover时会遇到以下报错和警告:


切换到test_std备库后,需要手工启动旧主库的实例。

DGMGRL> switchover to 'test_std';

Performing switchover NOW, please wait...

Operation requires a connection to instance "test" on database "test_std"

Connecting to instance "test"...

Connected.

New primary database "test_std" is opening...

Operation requires startup of instance "test" on database "TEST_PRI"

Starting instance "test"...

Unable to connect to database

ORA-12514: TNS:listener does not currently know of service requested in connect descriptor


Failed.

Warning: You are no longer connected to ORACLE.


Please complete the following steps to finish switchover:

start up instance "test" of database "TEST_PRI"


切换失败,因为没有静态监听无法连接到oracle,提示需要在test_pri上启动test实例完成switchover切换。


3) 确保主库上有standby redo log

4) 检查redo传输和应用服务的参数

传输参数比如LogXptMode, NetTimeout, StandbyArchiveLocation, and AlternateLocation

应用参数比如DelayMins

5) 确保临时表空间和文件在备库存在,和主库一致

6) 发起切换命令

DGMGRL> switchover to 'test_std';

Performing switchover NOW, please wait...

Operation requires a connection to instance "test" on database "test_std"

Connecting to instance "test"...

Connected.

New primary database "test_std" is opening...

Operation requires startup of instance "test" on database "TEST_PRI"

Starting instance "test"...

ORACLE instance started.

Database mounted.

Database opened.

Switchover succeeded, new primary is "test_std"


切换成功。

7) 确认切换后状态:

DGMGRL> SHOW CONFIGURATION;


Configuration - test

Protection Mode: MaxPerformance

Databases:

test_std - Primary database

TEST_PRI - Physical standby database


Fast-Start Failover: DISABLED

Configuration Status:

SUCCESS


8) 主库、物理备、逻辑备系统下的主备(物理)切换

主库和物理备库切换

当前TEST_PRI为主库:

DGMGRL> show configuration;


Configuration - test


Protection Mode: MaxPerformance

Databases:

TEST_PRI - Primary database

test_std - Physical standby database

test_his - Logical standby database


Fast-Start Failover: DISABLED


Configuration Status:

SUCCESS


切换物理备库test_std为主库:

DGMGRL> switchover to 'test_std';

Performing switchover NOW, please wait...

Operation requires a connection to instance "test" on database "test_std"

Connecting to instance "test"...

Connected.

New primary database "test_std" is opening...

Operation requires startup of instance "test" on database "TEST_PRI"

Starting instance "test"...

ORACLE instance started.

Database mounted.

Database opened.

Switchover succeeded, new primary is "test_std"


确认,这时test_std为主库,逻辑备库test_his可用。

DGMGRL> show configuration;


Configuration - test


Protection Mode: MaxPerformance

Databases:

test_std - Primary database

TEST_PRI - Physical standby database

test_his - Logical standby database


Fast-Start Failover: DISABLED


Configuration Status:

SUCCESS


如果将逻辑备库切换为主库,则DG系统内所有的物理备库和快照备库失效,必须重建。



3


手动failover切换


1) 开启数据库级别闪回

在所有主备库都开启数据库级别的闪回功能,这样在failover到物理备库后,可以将其他库修复重新加入DG,避免重建。


2) 连接到目标备库,查看配置状态

DGMGRL> connect sys@test_std;

Password:******

Connected.

DGMGRL> show configuration;

Configuration - test

Protection Mode: MaxPerformance

Databases:

TEST_PRI - Primary database

test_std - Physical standby database

test_his - Logical standby database

Fast-Start Failover: DISABLED

Configuration Status:

SUCCESS


3) 执行failover命令

DGMGRL> FAILOVER TO 'test_std';

Performing failover NOW, please wait...

Failover succeeded, new primary is "test_std"

切换成功,新主库是test_std


4) 查看配置状态

DGMGRL> show configuration;

Configuration - test

Protection Mode: MaxPerformance

Databases:

test_std - Primary database

TEST_PRI - Physical standby database (disabled)

ORA-16661: the standby database needs to be reinstated

test_his - Logical standby database (disabled)

ORA-16661: the standby database needs to be reinstated

Fast-Start Failover: DISABLED

Configuration Status:

SUCCESS

 原主库和逻辑备库状态都是disabled,需要修复。


5) 查看新主库状态

DGMGRL> show database 'test_std';

Database - test_std

Role:            PRIMARY

Intended State:  TRANSPORT-ON

Instance(s):

test

Database Status:

SUCCESS


6) 查看旧主库和逻辑备库状态

DGMGRL> show database 'TEST_PRI';

Database - TEST_PRI

Role:            PHYSICAL STANDBY

Intended State:  APPLY-ON

Transport Lag:   (unknown)

Apply Lag:       (unknown)

Apply Rate:      (unknown)

Real Time Query: OFF

Instance(s):

test

Database Status:

ORA-16661: the standby database needs to be reinstated

DGMGRL> show database 'test_his';

Database - test_his

Role:            LOGICAL STANDBY

Intended State:  APPLY-ON

Transport Lag:   (unknown)

Apply Lag:       (unknown)

Apply Rate:      (unknown)

Instance(s):

test

Database Status:

ORA-16661: the standby database needs to be reinstated


7) 修复旧主库

     需要先将旧主库启动到mount状态。

     然后发起修复命令

DGMGRL> REINSTATE DATABASE 'TEST_PRI';

Reinstating database "TEST_PRI", please wait...

Operation requires shutdown of instance "test" on database "TEST_PRI"

Shutting down instance "test"...

ORA-01109: database not open

Database dismounted.

ORACLE instance shut down.

Operation requires startup of instance "test" on database "TEST_PRI"

Starting instance "test"...

ORACLE instance started.

Database mounted.

Continuing to reinstate database "TEST_PRI" ...

Reinstatement of database "TEST_PRI" succeeded


DGMGRL> show configuration;

Configuration - test

Protection Mode: MaxPerformance

Databases:

test_std - Primary database

TEST_PRI - Physical standby database

test_his - Logical standby database (disabled)

ORA-16661: the standby database needs to be reinstated

Fast-Start Failover: DISABLED

Configuration Status:

SUCCESS


8) 修复逻辑备库

     需要先将逻辑备库启动到mount状态。

     然后发起修复命令

DGMGRL> REINSTATE DATABASE 'test_his';

Reinstating database "test_his", please wait...

Operation requires shutdown of instance "test" on database "test_his"

Shutting down instance "test"...

ORA-01109: database not open

Database dismounted.

ORACLE instance shut down.

Operation requires startup of instance "test" on database "test_his"

Starting instance "test"...

ORACLE instance started.

Database mounted.

Continuing to reinstate database "test_his" ...

Reinstatement of database "test_his" succeeded


DGMGRL> show configuration;

Configuration - test

Protection Mode: MaxPerformance

Databases:

test_std - Primary database

TEST_PRI - Physical standby database

test_his - Logical standby database

Fast-Start Failover: DISABLED

Configuration Status:

SUCCESS


你看,不管是 switchover 、 failover 还是 failover 后修复 DG 成员,DG Broker 都是一条命令搞定,是不是真的很方便?不过有的同学就说了,我一条命令都不想敲~有木有办法可以自动切,不用我们管?这位同学,我非常欣赏你,你的懒惰是我们前进的动力,我们下回聊~




推荐阅读

(点击图片即可阅读全文)



欢迎分享


网易乐得DBA组负责网易乐得电商、网易邮箱、网易技术部数据库日常运维,负责数据库私有云平台的开发和维护,负责数据库及数据库中间件的开发和测试等,分享最前沿实用数据库干货,关注网易乐得DBA,精修数据库功底。


最后修改时间:2021-02-05 14:37:30
文章转载自DBA天团,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论