امروز تو یکی از سایتهام به مشکل زیر در DGMGRL خوردم

DGMGRL for Linux: Version 11.2.0.4.0 - 64bit Production
Copyright (c) 2000, 2009, Oracle. All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected.
DGMGRL> show configuration;
Configuration - primary
Protection Mode: MaxAvailability
Databases:
orcl - Primary database
orcldg - Physical standby database
Warning: ORA-16826: apply service state is inconsistent with the DelayMins property

Fast-Start Failover: DISABLED
Configuration Status:

WARNING

دلایل

  • این مشکل ممکنه بخاطر این به وجود بیاد که apply service بدون مشخص کردن آپشن REAL-TIME یا NODELAY تو وضعیتی که DelayMins رو 0 گذاشتیم اجرا شده باشه
  • یا ممکنه بخاطر این موضوع باشه که apply service با آپشن REAL-TIME یا NODELAY اجرا شده باشه ولی DelayMins عددی بیشتر از 0 گذاشته شده باشه

خب تو اولین قدم ما باید مقدار DelayMins رو چک کنیم پس با دستور <show database verbose <tns_name اینکارو انجام میدیم

DGMGRL> show database verbose orcldg;

Database - orcldg
Role: PHYSICAL STANDBY
Intended State: APPLY-ON
Transport Lag: 0 seconds (computed 1 second ago)
Apply Lag: 8 minutes 59 seconds (computed 1 second ago)
Apply Rate: (unknown)
Real Time Query: ON
Instance(s):
bcg
Database Warning(s):
ORA-16826: apply service state is inconsistent with the DelayMins property
Properties:
DGConnectIdentifier = 'orcldg'
ObserverConnectIdentifier = ''
LogXptMode = 'SYNC'
DelayMins = '0'
Binding = 'OPTIONAL'
MaxFailure = '0'
MaxConnections = '1'
ReopenSecs = '300'
NetTimeout = '30'
RedoCompression = 'DISABLE'
LogShipping = 'ON'
PreferredApplyInstance = ''
ApplyInstanceTimeout = '0'
ApplyParallel = 'AUTO'
StandbyFileManagement = 'AUTO'
ArchiveLagTarget = '0'
LogArchiveMaxProcesses = '9'
LogArchiveMinSucceedDest = '1'
DbFileNameConvert = '+DATA/orcldg/DATAFILE, +DATA/orcl/DATAFILE'
LogFileNameConvert = '+DATA/orcldg/ONLINELOG, +DATA/orcl/ONLINELOG'
FastStartFailoverTarget = ''
InconsistentProperties = '(monitor)'
InconsistentLogXptProps = '(monitor)'
SendQEntries = '(monitor)'
LogXptStatus = '(monitor)'
RecvQEntries = '(monitor)'
ApplyLagThreshold = '0'
TransportLagThreshold = '0'
TransportDisconnectedThreshold = '30'
SidName = 'bcg'
StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.211.36)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcldg_DGMGRL)(INSTANCE_NAME=bcg)(SERVER=DEDICATED)))'
StandbyArchiveLocation = '+FRA'
AlternateLocation = ''
LogArchiveTrace = '0'
LogArchiveFormat = 'archive_%s_%t.%r'
TopWaitEvents = '(monitor)'

Database Status:

WARNING

همونطور که می‌بینید اینجا DelayMins صفر هستش پس بدون شک apply service بدون آپشن REAL-TIME یا NODELAY اجرا شده

خب تو مرحله بعد باید redo apply mode رو چک کنیم

کوئری زیر رو روی دیتابیس primary اجرا کنید:

SELECT DEST_NAME,RECOVERY_MODE,DATABASE_MODE,TYPE,STATUS,DESTINATION FROM V$ARCHIVE_DEST_STATUS;

نتیجه این کوئری تو این مورد به این صورته:

LOG_ARCHIVE_DEST_1 IDLE OPEN LOCAL VALID +FRA
LOG_ARCHIVE_DEST_2 MANAGED OPEN_READ-ONLY PHYSICAL VALID orcldg

همونطور که می‌بینید RECOVERY_MODE روی حالت MANAGED هستش تو این حالت ما باید به صورت دستی روی سرور primary بیایم و با دستور زیر سوییچ لاگ رو انجام بدیم:

ALTER SYSTEM SWITCH LOGFILE;

برای اینکه اینکار به صورت خودکار و REAL-TIME اتفاق بیوفته باید RECOVERY_MODE روی حالت MANAGED REAL TIME APPLY باشه

با دستورات زیر بر روی ماشین STANDBY می‌تونید این کانفیگ رو لحاظ کنید:

SQL> alter database recover managed standby database cancel;
Database altered.
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
Database altered.
یا برای بردن روی حالت NODELAY
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT NODELAY;