切换前的准备工作。
1.对比standby与primary的data guard的init_(SID)文件的参数设置是否合理,或者是否有不对的地方。
可以先分别在主被两个库上面create pfile from spfile命令dump出来目前dg系统的文件。
例如在primary库上面:
*.fal_server = dev10g_p
*.fal_client = dev10g_s
|
在standby库上面:
*.fal_server = dev10g_s
*.fal_client = dev10g_p
|
还有
log_archive_config=
'DG_CONFIG(dev10g_p,dev10g_s)'
|
2.关闭主服务器的对外服务监听端口。
比如本次dwapp切换就是1522(lsnrctl stop LISTENER2)
开始切换。
1.以sys身份连接到主库,切换3次联机日志,做一次完全检查点,保证数据启动恢复时间最短。
alter system
switch
logfile;
alter system
switch
logfile;
alter system
switch
logfiel;
alter system checkpoint;
|
2.关闭主数据库,通过操作系统命令cp备份原来的spfile,然后从配置好的pfile 建立spfile。
cp spfile<SID>.ora spfile<SID>.ora.bak
shutdown immediate;
create spfile from pfile;
startup;
SQL> select name, open_mode, protection_mode, database_role, switchover_status, current_scn, db_unique_name from v$database;
NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE SWITCHOVER_STATUS CURRENT_SCN DB_UNIQUE_NAME
\--------\- \---------\- \-------------------\- \---------------\- \-------------------\- \----------\- \-----------------------------\-
DWAPP READ WRITE MAXIMUM AVAILABILITY PRIMARY SESSIONS ACTIVE
60247213254
dwapp_p
|
3.执行命令将主库切换成为standby状态。
alter database commit to switchover to physical standby with session shutdown;(主库)
|
4.执行命令将被库切换成为primary状态。
SQL> select name, open_mode, protection_mode, database_role, switchover_status, current_scn, db_unique_name from v$database;
NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE SWITCHOVER_STATUS CURRENT_SCN DB_UNIQUE_NAME
\--------\- \---------\- \-------------------\- \---------------\- \-------------------\- \----------\- \-----------------------------\-
DWAPP MOUNTED MAXIMUM AVAILABILITY PHYSICAL STANDBY SESSIONS ACTIVE
60247213254
dwapp_s
|
alter database commit to switchover to primary with session shutdown;(被库)
alter database open;(被库)
alter database recover managed standby database using current logfile disconnect from session;(主库)
|
5.现在新的主库应该是原来的被库(dwapp_s),新的被库应该是原来的主库(dwapp_p)
切换完成,验证切换结果
1.在新的主库上面创建一个表
create table t1 (id number);
insert into t1 values (
1
);
commit;
|
2.切换日志,让主库的操作应用到被库(如果前面是recover standby using current logfile那么没有必要做这一步,直接跳到第3步)
alter system
switch
logfile;
alter system
switch
logfile;
alter system
switch
logfile;
|
3.将新的被库open然后查看是否有记录。
alter database recover managed standby database cancel;
alter database open;
select * from t1;
|
4.如果有表,有记录,那么证明切换完全成功,再将新被库切换回standby状态即可。
shutdown immediate;
startup mount;
alter database recover managed standby database using current logfile disconnect with session shutdown;
|
5.打开新的主库的对外服务监听。(不要打开被库的对外服务监听,因为以前默认链接的是它,监听通过了,就会尝试连接数据库,但是它现在是备用库,处于mount and recover状态,所以回报database not open错误)
lsnrctl start LISTENER2 (新的主库上面)
|
后续还有部署db级别的监控等等。