目 录
1. 在主数据库和备用数据库上启用 Data Guard trc跟踪
2. 在主数据库和备用数据库上启用 Data Guard trc跟踪
DG配置检查
DGbroker配置检查
主库
show parameter dg_broker_start;
show parameter DG_BROKER_CONFIG_FILE1;
show parameter DG_BROKER_CONFIG_FILE2;
备库
show parameter dg_broker_start;
show parameter DG_BROKER_CONFIG_FILE1;
show parameter DG_BROKER_CONFIG_FILE2;
主、备库动态监听配置检查(grid用户)
-主库动态监听配置检查
cat /app/oracle/19c/grid/network/admin/listener.ora
SID_LIST_LISTENER=(SID_LIST=(SID_DESC=(GLOBAL_DBNAME=orcl_DGMGRL)(SID_NAME=orcl)(ORACLE_HOME=/app/oracle/oracle/product/19c/dbhome_1)))
-备库动态监听检查
SID_LIST_LISTENER=(SID_LIST=(SID_DESC=(GLOBAL_DBNAME=orcladg_DGMGRL)(SID_NAME=orcladg)(ORACLE_HOME=/app/oracle/oracle/product/19c/dbhome_1)))
oracle用户
-主备库TNS配置检查
cat $ORACLE_HOME/network/admin/tnsnames.ora
别名配置为动态监听的GLOBAL_DBNAME
orcl_DGMGRL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = VIP)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = VIP)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl_DGMGRL)
)
)
别名配置为动态监听的GLOBAL_DBNAME
orcladg_DGMGRL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = VIP)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = VIP)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcladg_DGMGRL)
)
)
enable configuration;开启broker
show configuration;检查broker配置
show database xxx;检查备库应用状态
switchover to xxx;主备切换
常用命令:
show configuration;
show database xxx;
show database xxx;
show database verbose xxx;
show database verbose xxx;
show instance verbose xxx on database xxx;
show instance verbose xxx on database xxx;
SQLPLUS切换配置检查
核对参数
- 主库
log_archive_dest_2
service="orcldg"','LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="orcldg" net_timeout=30','valid_for=(all_logfiles,primary_role)
log_archive_config dg_config=(orcldg,orcl)
log_archive_dest_state_1 enable
log_archive_dest_state_2 ENABLE
fal_client
fal_server
- 备库
log_archive_dest_2 service="orcl", LGWR ASYNC NOAFFIRM delay=0 optional compression=disable max_failure=0 max_connections=1 reopen=300 db_unique_name="orcl" net_timeout=30, valid_for=(all_logfiles,primary_role)
log_archive_config dg_config=(orcldg,orcl)
log_archive_dest_state_1 enable
log_archive_dest_state_2 ENABLE
fal_client
fal_server
查看主备库tnsnames
cat /app/oracle/product/11.0.4/dbhome_1/network/admin/tnsnames.ora
- 主备库sqlplus 测试服务名连接
sqlplus sys/xxxx@orcl as sysdba
sqlplus sys/xxxx@orcldg as sysdba
使用SQLPLUS进行SWITCHOVER
(1)检查备库中MRP0进程状态
SQL> SELECT PROCESS FROM V$MANAGED_STANDBY WHERE PROCESS LIKE 'MRP%';
(2)主库检查LOG_ARCHIVE_DEST_2 状态
SQL> SELECT RECOVERY_MODE FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID=2;
RECOVERY_MODE
-----------------------
MANAGED REAL TIME APPLY
(3)如果备库MRP0进程为开启,使用以下命令开启。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
(4)检查主备数据库中参数LOG_ARCHIVE_MAX_PROCESSES
SQL> show parameter LOG_ARCHIVE_MAX_PROCESSES (确保该参数大于等于4)
在备用数据库成为主数据库之前,需要清除目标物理备用数据库上的redo日志。尽管这将作为 SWITCHOVER TO PRIMARY 命令的一部分自动发生,但建议在切换之前清除日志。
如果在Broker中设置了物理备用数据库设置了 LogFileNameConvert 属性,当在备用数据库上启动管理恢复时,联机重做日志将被自动清除。
如果数据库使用 Oracle Managed Files (OMF) 或者已经设置了 LogFileNameConvert 属性,跳过此步骤,联机日志文件将始终被自动清除。
例子:
LOG_FILE_NAME_CONVERT=’/oradata/order_db/redo/’,’/oradata/order_db/redo/’
备库不重启可用以下命令进行清除
SQL> SELECT DISTINCT L.GROUP# FROM V$LOG L, V$LOGFILE LF
WHERE L.GROUP# = LF.GROUP# AND L.STATUS
NOT IN ('UNUSED','CLEARING','CLEARING_CURRENT');
替换以上命令返回结果。
SQL> ALTER DATABASE CLEAR LOGFILE GROUP <ORL GROUP# from the query above>;
(1)确定主数据库上每个线程的当前序列号
SQL> SELECT THREAD#, SEQUENCE# FROM V$THREAD;
(2)备库确认无GAP
SQL> SELECT THREAD#, MAX(SEQUENCE#) FROM V$ARCHIVED_LOG
WHERE APPLIED = 'YES'
AND RESETLOGS_CHANGE# = (SELECT RESETLOGS_CHANGE#
FROM V$DATABASE_INCARNATION
WHERE STATUS = 'CURRENT')
GROUP BY THREAD#;
SQL> SELECT * FROM V$ARCHIVE_GAP;
如果存在GAP,并主库不可用时,可用以下命令在备库中修复GAP。
本地归档路径为LOG_ARCHIVE_DEST_1
SQL> SELECT * FROM V$ARCHIVE_GAP;
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN 7 AND 10;
将缺失归档手动复制至备库,并应用。
SQL> ALTER DATABASE REGISTER LOGFILE '/physical_standby1/thread1_dest/arcr_1_7.arc';
再次查询V$ARCHIVE_GAP直到无GAP
SQL> SELECT * FROM V$ARCHIVE_GAP;
以下命名确认每个线程当前只返回一个归档,若出现多个需手动复制并REGISTER。
SQL> COLUMN FILE_NAME FORMAT a55
SQL> SELECT THREAD#, SEQUENCE#, FILE_NAME FROM DBA_LOGSTDBY_LOG L WHERE NEXT_CHANGE# NOT IN (SELECT FIRST_CHANGE# FROM DBA_LOGSTDBY_LOG WHERE L.THREAD# = THREAD#) ORDER BY THREAD#, SEQUENCE#;
(1)验证主、备库temp数据库文件是否与主库匹配
SQL> SELECT TMP.NAME FILENAME, BYTES, TS.NAME TABLESPACE
FROM V$TEMPFILE TMP, V$TABLESPACE TS WHERE TMP.TS#=TS.TS#;
(2)检查所有数据文件online
SQL> SELECT NAME FROM V$DATAFILE WHERE STATUS='OFFLINE';
如果有offline数据文件需online
SQL> ALTER DATABASE DATAFILE '<datafile-name>' ONLINE;
如配置延迟应用,请开启实时应用。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE NODELAY DISCONNECT FROM SESSION;;
(1)检查主库JOB状态
SQL> SELECT * FROM DBA_JOBS_RUNNING;
SQL> SELECT OWNER, JOB_NAME, START_DATE, END_DATE, ENABLED
FROM DBA_SCHEDULER_JOBS WHERE ENABLED='TRUE' AND OWNER <> 'SYS';
SQL> SHOW PARAMETER job_queue_processes
(2)停止JOB
SQL> ALTER SYSTEM SET job_queue_processes=0 SCOPE=BOTH SID='*';
SQL> EXECUTE DBMS_SCHEDULER.DISABLE( <job_name> );
(1)主备库设置每个实例的trc跟踪级别
SQL> SHOW PARAMETER log_archive_trace
SQL> ALTER SYSTEM SET log_archive_trace=8191;
(2)查看日志
tail -f <background_dump_dest location>/alert*
备库操作:
(1)停止备库应用
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
(2)备库创建还原点
SQL> CREATE RESTORE POINT SWITCHOVER_START_GRP GUARANTEE FLASHBACK DATABASE;
(开启备库应用)
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE DISCONNECT;
主库操作:
(1)创建还原点
SQL> CREATE RESTORE POINT SWITCHOVER_START_GRP GUARANTEE FLASHBACK DATABASE;
主库查询switchover状态:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO STANDBY
如果备库为RAC数据库,关闭无MRP0进程的复制实例后在进行切换。
(1)主库切换为备库
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY WITH SESSION SHUTDOWN;
(2)备库库查询switchover状态
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
-----------------
TO PRIMARY
(3)将备用数据库切换为主数据库
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
(4)开启新主库
SQL> ALTER DATABASE OPEN;
(5)重启新备库
SQL> shutdown immediate;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
如果配置延迟应用,使用以下命令开启应用:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
如果为RAC,打开辅助实例。
SQL> startup;
SQL> ALTER SYSTEM SET log_archive_trace=<prior value>;;
SQL> ALTER SYSTEM SET job_queue_processes=<value saved> scope=both sid='*';
SQL> EXECUTE DBMS_SCHEDULER.ENABLE(<for each job name captured>);
SQL> DROP RESTORE POINT SWITCHOVER_START_GRP;
验证切换状态
SQL>alter database switchover to <target standby db_unique_name> verify;
SQL>alter system set log_archive_trace=8191 sid=’*’;
tail –f <alert log of primary>
tail –f <alert log of standby>
主库执行
SQL>alter database switchover to <standby db_unique_name>;
开启新主库
SQL>alter database open;
重启新备库
SQL>shut abort
SQL>startup
SQL>alter database recover managed standby database disconnect;
切换完成后,OCR 中的数据库角色不会自动更改。 需要使用 [srvctl modify database] 根据真实的数据库角色更改 OCR 中的数据库角色。
例:
新主库
#sqlplus / as sysdba
SQL> select DB_UNIQUE_NAME,DATABASE_ROLE from v$database;
DB_UNIQUE_NAME DATABASE_ROLE
------------------------------
chicago PRIMARY
#srvctl config database -db chicago
...
Database Role: PHYSICAL_STANDBY
#srvctl modify database -db chicago -role PRIMARY
新备库:
#sqlplus / as sysdba
SQL> select DB_UNIQUE_NAME,DATABASE_ROLE from v$database;
DB_UNIQUE_NAME DATABASE_ROLE
------------------------------
boston PHYSICAL STANDBY
#srvctl config database -db boston
...
Database Role: PRIMARY
#srvctl modify database -db boston -role PHYSICAL_STANDBY
SQL> alter system set log_archive_trace=0;
新主库
SQL>alter system switch logfile;
SQL>select dest_id,error,status from v$archive_dest where dest_id=<your remote log_archive_dest_<n>>;
SQL>select max(sequence#),thread# from v$log_history group by thread#;
If remote log_Archive_destination is 2 i.e log_archive_dest_2.
SQL>select max(sequence#) from v$archived_log where applied='YES' and
dest_id=2;
新备库:
SQL>select thread#,sequence#,process,status from gv$managed_standby;
SQL>select max(sequence#),thread# from v$archived_log group by thread#;
Oracle 12.2 版,使用 v$dataguard_process 。Oracle 12.2 中弃用的 v$managed_standby
SQL> select name,role,instance,thread#,sequence#,action from gv$dataguard_process;
使用DG Broker进行SWITCHOVER
(1)检查DG Broker配置
DGMGRL> SHOW CONFIGURATION;
(2)检查数据库状态
DGMGRL> SHOW DATABASE 'DBNAME';
DGMGRL> SHOW DATABASE 'ADGDBNAME';
(3)检查LogXptStatus状态(redo传输)
DGMGRL> SHOW DATABASE 'DBNAME' 'LogXptStatus';
(4)检查数据库中的不一致属性
DGMGRL> SHOW DATABASE 'DBNAME' 'InconsistentProperties';
确定内存中属性正确时,使用以下命令可将数据库中内存与spfile和BROKER的不一致属性更新为内存中数据。
例:
DGMGRL> EDIT DATABASE 'North_Sales' SET PROPERTY 'LogArchiveTrace'=511;
(5)检查主备数据库中参数LOG_ARCHIVE_MAX_PROCESSES
SQL> show parameter LOG_ARCHIVE_MAX_PROCESSES (确保该参数大于等于4)
在备用数据库成为主数据库之前,需要清除目标物理备用数据库上的redo日志。尽管这将作为 SWITCHOVER TO PRIMARY 命令的一部分自动发生,但建议在切换之前清除日志。
如果在Broker中设置了物理备用数据库设置了 LogFileNameConvert 属性,当在备用数据库上启动管理恢复时,联机重做日志将被自动清除。
如果数据库使用 Oracle Managed Files (OMF) 或者已经设置了 LogFileNameConvert 属性,跳过此步骤,联机日志文件将始终被自动清除。
使用以下命令在DG Broker中设置LOGFILENAMECONVERT(该参数需要重启备库)
DGMGRL> EDIT DATABASE <standby-db_unique_name> SET PROPERTY 'LOGFILENAMECONVERT'="'/oradata/order_db/redo/','/oradata/order_db/redo/'";
备库不重启可用以下命令进行清楚
SQL> SELECT DISTINCT L.GROUP# FROM V$LOG L, V$LOGFILE LF
WHERE L.GROUP# = LF.GROUP# AND L.STATUS
NOT IN ('UNUSED','CLEARING','CLEARING_CURRENT');
替换以上命令返回结果。
SQL> ALTER DATABASE CLEAR LOGFILE GROUP <ORL GROUP# from the query above>;
(1)确定主数据库上每个线程的当前序列号
SQL> SELECT THREAD#, SEQUENCE# FROM V$THREAD;
(2)备库确认无GAP
SQL> SELECT THREAD#, MAX(SEQUENCE#) FROM V$ARCHIVED_LOG
WHERE APPLIED = 'YES'
AND RESETLOGS_CHANGE# = (SELECT RESETLOGS_CHANGE#
FROM V$DATABASE_INCARNATION
WHERE STATUS = 'CURRENT')
GROUP BY THREAD#;
SQL> SELECT * FROM V$ARCHIVE_GAP;
如果存在GAP,并主库不可用时,可用以下命令在备库中修复GAP。
本地归档路径为LOG_ARCHIVE_DEST_1
SQL> SELECT * FROM V$ARCHIVE_GAP;
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN 7 AND 10;
将缺失归档手动复制至备库,并应用。
SQL> ALTER DATABASE REGISTER LOGFILE '/physical_standby1/thread1_dest/arcr_1_7.arc';
再次查询V$ARCHIVE_GAP直到无GAP
SQL> SELECT * FROM V$ARCHIVE_GAP;
以下命名确认每个线程当前只返回一个归档,若出现多个需手动复制并REGISTER。
SQL> COLUMN FILE_NAME FORMAT a55
SQL> SELECT THREAD#, SEQUENCE#, FILE_NAME FROM DBA_LOGSTDBY_LOG L WHERE NEXT_CHANGE# NOT IN (SELECT FIRST_CHANGE# FROM DBA_LOGSTDBY_LOG WHERE L.THREAD# = THREAD#) ORDER BY THREAD#, SEQUENCE#;
(1)验证主、备库temp数据库文件是否与主库匹配
SQL> SELECT TMP.NAME FILENAME, BYTES, TS.NAME TABLESPACE
FROM V$TEMPFILE TMP, V$TABLESPACE TS WHERE TMP.TS#=TS.TS#;
(2)检查所有数据文件online
SQL> SELECT NAME FROM V$DATAFILE WHERE STATUS='OFFLINE';
如果有offline数据文件需online
SQL> ALTER DATABASE DATAFILE '<datafile-name>' ONLINE;
检查是否配置延迟应用
DGMGRL> SHOW DATABASE <standby-db_unique_name> DELAYMINS;
若配置,需取消延迟应用
DGMGRL> EDIT DATABASE <standby-db_unique_name> SET PROPERTY 'DELAYMINS'='0';
停止主库上的JOB
(1)检查主库JOB状态
SQL> SELECT * FROM DBA_JOBS_RUNNING;
SQL> SELECT OWNER, JOB_NAME, START_DATE, END_DATE, ENABLED
FROM DBA_SCHEDULER_JOBS WHERE ENABLED='TRUE' AND OWNER <> 'SYS';
SQL> SHOW PARAMETER job_queue_processes
(2)停止JOB
SQL> ALTER SYSTEM SET job_queue_processes=0 SCOPE=BOTH SID='*';
SQL> EXECUTE DBMS_SCHEDULER.DISABLE( <job_name> );
(1)检查每个实例的状态
DGMGRL> SHOW DATABASE VERBOSE 'dbname';
DGMGRL> SHOW INSTANCE <SID> LogArchiveTrace;
(2)设置每个实例的trc跟踪级别
DGMGRL> EDIT INSTANCE * ON DATABASE <db_unique_name> SET PROPERTY LogArchiveTrace=8191;
(2)查看日志
tail -f <background_dump_dest location>/dr*
tail -f <background_dump_dest location>/alert*
备库操作:
(1)停止备库应用
DGMGRL> CONNECT SYS/<password>@<standby service>
DGMGRL> EDIT DATABASE <standby-db-unique-name> SET STATE='APPLY-OFF';
(2)创建还原点
DGMGRL> SQL "CREATE RESTORE POINT SWITCHOVER_START_GRP GUARANTEE FLASHBACK DATABASE";
(开启备库应用)
DGMGRL> EDIT DATABASE <standby-db-unique-name> SET STATE='APPLY-ON';
主库操作:
(1)创建还原点
DGMGRL> CONNECT SYS/<password>@<primary service>
DGMGRL> SQL "CREATE RESTORE POINT SWITCHOVER_START_GRP GUARANTEE FLASHBACK DATABASE";.
(1)使用与主数据库和备用数据库上的 sys 用户相同的密码,以 sys 身份使用 DGMGRL 命令行实用程序连接到主数据库。
DGMGRL> CONNECT SYS/<password>@<primary service>
DGMGRL> SWITCHOVER TO <standby database name>;
注意:如果使用主机凭据(仅限“/”)连接到 DGMGRL,则切换将起作用,新的主数据库将准备就绪,但必须手动重新启动旧的主数据库作为备用数据库。
如果使用“/”必须使用相同的SYS密码创建wallet
mkstore -wrl /u01/app/oracle/admin/wallet -createEntry oracle.security.client.default_username SYS
mkstore -wrl /u01/app/oracle/admin/wallet -createEntry oracle.security.client.default_password <sys password>
创建完成后可使用以下命令执行切换
DGMGRL> CONNECT /@<primary service>
(2)switchover切换过程
例:
DGMGRL> switchover to 'South_Sales';
Performing switchover NOW, please wait...
New primary database "South_Sales" is opening...
Operation requires shutdown of instance "north_sales1" on database "North_Sales"
Shutting down instance "north_sales1"...
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
Operation requires startup of instance "north_sales1" on database "North_Sales"
Starting instance "north_sales1"...
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is "South_Sales"
DGMGRL> SHOW CONFIGURATION;
DGMGRL> SHOW DATABASE VERBOSE 'dbname';
DGMGRL> EDIT DATABASE <standby-db-unique-name> SET PROPERTY 'DELAYMINS'='<saved_value>';
DGMGRL> EDIT INSTANCE * ON DATABASE <db-unique-name> SET PROPERTY LogArchiveTrace=<prior_value>;
SQL> ALTER SYSTEM SET job_queue_processes=<value saved> scope=both sid='*';
SQL> EXECUTE DBMS_SCHEDULER.ENABLE(<for each job name captured>);
SQL> DROP RESTORE POINT SWITCHOVER_START_GRP;
DGMGRL>show configuration;
DGMGRL>show database <primary>;
DGMGRL>show database <standby>;
DGMGRL>show database verbose <primary>;
DGMGRL>show database verbose <standby>;
19c以上,验证网络状态:
DGMGRL>validate network configuration for <primary>;
DGMGRL>validate network configuration for <standby>;
验证切换状态
DGMGRL> validate database <primary>
Database Role: Primary database
Ready for Switchover: Yes <-----------Ready for Switchover
Flashback Database Status:
<primary>: Off
DGMGRL> validate database <standby>
Database Role: Physical standby database
Primary Database: <standby>
Ready for Switchover: Yes <--------This confirms Switchover readiness
Ready for Failover: Yes (Primary Running)
Flashback Database Status:
<primary>: Off
<standby>: Off
Future Log File Groups Configuration:
Thread # Online Redo Log Groups Standby Redo Log Groups
<primary> <standby>
1 4 4
显示详细切换状态:
DGMGRL>validate database verbose <primary>
DGMGRL>validate database verbose <standby>
若存在延迟应用,需取消。
DGMGRL>edit database <standby> set property delaymins=0;
DGMGRL> edit configuration set property tracelevel=support;
单机数据库:
DGMGRL> edit database <primary> set property LogArchiveTrace=8191;
DGMGRL> edit database <standby> set property LogArchiveTrace=8191;
RAC数据库:
DGMGRL> EDIT INSTANCE * ON DATABASE '<primary>' SET PROPERTY LogArchiveTrace=8191;
DGMGRL> EDIT INSTANCE * ON DATABASE '<standby>' SET PROPERTY LogArchiveTrace=8191;
tail –f <alert log of primary>
tail –f <alert log of standby>
tail –f <drc<SID> log of primary>
tail –f <drc<SID> log of standby>
使用与主数据库和备用数据库上的 sys 用户相同的密码,以 sys 身份使用 DGMGRL 命令行实用程序连接到主数据库。
DGMGRL> CONNECT SYS/<password>@<primary service>
DGMGRL> switchover to <standby>
例:
DGMGRL> switchover to chicago
Performing switchover NOW, please wait...
Operation requires a connection to instance "chicago" on database "chicago"
Connecting to instance "chicago"...
Connected as SYSDBA.
New primary database "chicago" is opening...
Operation requires startup of instance "boston" on database "boston"
Starting instance "boston"...
ORACLE instance started.
Database mounted.
Database opened.
Switchover succeeded, new primary is "chicago"
DGMGRL> SHOW CONFIGURATION;
DGMGRL> SHOW DATABASE VERBOSE 'dbname';
DGMGRL> edit database <new standby> set property delaymins=<old MRP delay value>;
DGMGRL> edit configuration reset property tracelevel ;
DGMGRL> edit database boston reset property logarchivetrace;
DGMGRL> edit database chicago reset property logarchivetrace;
DGMGRL> SHOW CONFIGURATION;
DGMGRL> SHOW DATABASE VERBOSE 'dbname';




