08鼠年的最后一周,以dataguard笔记收尾,对我来说意义特别:简单地说丰富完整了我的工作经验,另外很多原来想当然的Oracle概念(现在看原先是模糊的概念,当然将来等RAC做完再回头看可能又有新的体会)全都被颠覆。能想象下蜕皮是什么感觉吗?差不多就是那个意思。
在此首先感谢三思(ITPUB)的三思笔记系列、感谢peter同学在rman以及此次dg实验中给与的帮助。
现在回到正题。
首先来看一段tnsnames.ora的内容
orcl_std =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 219.xxx.x.xx)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl_std)
)
)
这是大家平时再熟悉不过的一段东西,几乎所有的程序、Oracle客户端都会配置。红色字体的“orcl_std”,以前我有时候称为实例名,有时候称之为服务名,还会叫做SID,不管怎么称呼,用DBCA新建一个数据库,全局数据库名那输入一字符串,orcl也好,rwdata也好,下面一行的SID一样设置,客户端也给设置成一样的,就准不会出错。
至于另外一个参数db_name,那个参数是干什么的?之前好像没接触过。
如果你开始有点糊涂了,那请先看下以下2个帖子,均来自ITPUB
1.彻底理解初始化参数SERVICE_NAMES和客户端TNS中的SERVICE_NAME
http://www.itpub.net/viewthread.php?tid=276221&extra=&page=1
2. oracle中*_name*知多少
http://www.itpub.net/viewthread.php?tid=903624&extra=&highlight=&page=1
看完以后,还是有点晕晕的,不过总结一点是
SERVICE_NAMES默认是db_name.db_domain,也就是说如果创建一个新数据库时,全局数据库名那你就打了orcl,domain为空,那tns配置中service_name你就填orcl就可以了,这个orcl其实是orcl.空(空就是数据库域名),如果你全局数据库名打的是orcl.primary(primary是数据库域名),那tns配置中service_name你就要填orcl.primary了。
另外请看链接1的husthxd 版主的结论:
从oracle9i开始,后台进程PMON自动在监听器中注册初始化参数SERVICE_NAMES中定义的服务名,SERVICE_NAMES默认为db_name.db_dimain。客户端tns配置中SERVICE_NAME的名称必须是SERVICE_NAMES或其中的一个NAME。
但是根据我的经验(这个在帖子里面的后面回帖中有说明)在listener.ora中配置一个GLOBAL_DBNAME
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl_std)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
(SID_NAME = orcl)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl_stdtest)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
(SID_NAME = orcl)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl_stdtest2)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = EdmServer1400)(PORT = 1521))
)
)
之后客户端tns配置中service_name为orcl_std,orcl_stdtest,orcl_stdtest2均可。这个称作为静态注册。
为什么要把这个概念放在第一点讲,因为在配置standby时,不管在主库或者是备库,都要设置一个db_unique_name参数,此参数一改,或许你就会发现怎么通过客户端连不上数据库了。嘿嘿~
***************************************************************************************************************************
接下来分别贴上主库、备库的listener.ora,tnsnames.ora以及pfile内容
假设主库IP地址为218.xxx.x.xx,备库IP地址为219.xxx.x.xx
主库的datafile以及online redo目录为'D:\oradata\ORCL\orcl'
备库的datafile以及online redo目录为'D:\oradata\orcl_std'
主库的oracle_base='d:\oracle\product\10.2.0'
备库的oracle_base='E:\oracle\product\10.2.0'
主库和备库的log_archive_dest_1全都设置一样,log_archive_dest_1='LOCATION=E:\archivelog'
主库和备库的rman备份路径也都设置一样,control,datafile,archivelog分别为
E:\arc_backup\control\controlfile\
E:\arc_backup\data\
E:\arc_backup\archivelog\
主库listener.ora
# listener.ora Network Configuration File: d:\oracle\product\10.2.0\db_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = d:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
(SID_DESC=
(GLOBAL_DBNAME=orcl)
(SID_NAME=orcl)
(ORACLE_HOME=d:\oracle\product\10.2.0\db_1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = AEDMSERVER1300Z)(PORT = 1521))
)
)
主库tnsnames.ora
orcl_std =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 219.xxx.x.xx)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl_std)
)
)
orcl_pri =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = AEdmServer1300z)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
主库pfile相关standby部分内容
db_domain=""
db_name=orcl
control_files=("d:\oradata\ORCL\orcl\control01.ctl", "d:\oradata\ORCL\orcl\control02.ctl", "d:\oradata\ORCL\orcl\control03.ctl")
###########################################
# FILE_NAME_convert
###########################################
db_file_name_convert=('D:\oradata\orcl_std','D:\oradata\ORCL\orcl')
log_file_name_convert=('D:\oradata\orcl_std','D:\oradata\ORCL\orcl')
###########################################
# Data Guard
###########################################
db_unique_name=orcl_pri
log_archive_config='DG_CONFIG=(orcl_pri,orcl_std)'
log_archive_dest_1='LOCATION=E:\archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_pri'
log_archive_dest_2='SERVICE=orcl_std arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_std'
--上面蓝色字体标出的orcl_std是在tnsnames里面配置的连接字符串
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=ENABLE
FAL_SERVER=orcl_pri --这里指的是在tnsnames里面配置的连接字符串
FAL_CLIENT=orcl_std
remote_login_passwordfile='EXCLUSIVE'
standby_file_management=AUTO
备库listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl_std)
(ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = EdmServer1400)(PORT = 1521))
)
)
备库tnsnames.ora
ORCL_PRI =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 218.xxx.x.xx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl_pri)
)
)
ORCL_STD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = EdmServer1400)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl_std)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
备库pfile相关standby部分内容
db_domain=""
db_name=orcl
###########################################
# FILE_NAME_convert
###########################################
db_file_name_convert=('D:\oradata\ORCL\orcl','D:\oradata\orcl_std')
log_file_name_convert=('D:\oradata\ORCL\orcl','D:\oradata\orcl_std')
control_files=("d:\oradata\orcl_std\control01.ctl",
"d:\oradata\orcl_std\control02.ctl", "d:\oradata\orcl_std\control03.ctl")
###########################################
# Data Guard
###########################################
db_unique_name=orcl_std
log_archive_config='DG_CONFIG=(orcl_pri,orcl_std)'
log_archive_dest_1='LOCATION=E:\archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES)'
log_archive_dest_2='SERVICE=orcl_pri arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=orcl_pri'
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=ENABLE
FAL_SERVER=orcl_std
FAL_CLIENT=orcl_pri
remote_login_passwordfile='EXCLUSIVE'
standby_file_management=AUTO
假设主库一直在正常业务运行中,不能长时间的停机shutdown,因此我们采用RMAN duplicate来复制数据库,步骤如下
一 主库操作
1.修改主库属性:
SQL>alter database force logging; --查看状态 select FORCE_LOGGING from v$database;
2.修改数据库为归档模式:
SQL>archive log list;
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database archivelog;(alter database noarchivelog;关掉归档模式)
3.修改pfile,重新创建spfile
SQL>create spfile from pfile='D:\oracle\product\10.2.0\admin\orcl\pfile\init.ora.0202009103752';
SQL>startup;
4.对主库进行全库备份
RMAN>run {
configure controlfile autobackup on;
configure controlfile autobackup format for device type disk to 'E:\BACKUP\control\controlfile_%F';
configure backup optimization on;
allocate channel dev1 type disk;
BACKUP DATABASE FORMAT 'E:\BACKUP\data\datafile_%U' PLUS ARCHIVELOG format 'E:\backup\archivelog\archivelog_%U';
release channel dev1;
}
5.创建主库standby control file
SQL>alter database create standby controlfile as 'E:\arc_backup\orcl_std.ctl';
最后将整个'E:\arc_backup\'目录winzip打包并用ftp上传到备库,解压至相同路径,这点非常重要
至此主库操作完毕
二 备库duplicate操作
1.在windows下用oradim创建新实例、密码文件、重启监听
cmd>oradim -new -sid orcl
cmd>set oracle_sid=orcl
cmd>orapwd file=E:\oracle\product\10.2.0\db_1\database\PWDorcl.ora password=orcl_test entries=30
cmd>lsnrctl reload
SQL>create spfile from pfile='E:\oracle\product\10.2.0\admin\orcl\pfile\init.ora';
SQL>startup nomount;
2.用RMAN duplicate复制数据库
C:\Documents and Settings\Administrator>rman
Copyright (c) 1982, 2005, Oracle. All rights reserved.
RMAN> connect auxiliary /
已连接到辅助数据库: ORCL (未装载)
RMAN> connect target sys/orcl_test@orcl_pri;
连接到目标数据库: ORCL (DBID=1204417332)
RMAN> duplicate target database for standby nofilenamecheck;
启动 Duplicate Db 于 23-1月 -09
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: sid=156 devtype=DISK
内存脚本的内容:
{
restore clone standby controlfile;
sql clone 'alter database mount standby database';
}
正在执行内存脚本
启动 restore 于 23-1月 -09
使用通道 ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: 正在复原控制文件
通道 ORA_AUX_DISK_1: 已复制控制文件副本
输出文件名=D:\ORA_CONFIGURE\ORCL_STD.CTL
输出文件名=D:\ORADATA\ORCL_STD\CONTROL01.CTL
输出文件名=D:\ORADATA\ORCL_STD\CONTROL02.CTL
输出文件名=D:\ORADATA\ORCL_STD\CONTROL03.CTL
完成 restore 于 23-1月 -09
sql 语句: alter database mount standby database
释放的通道: ORA_AUX_DISK_1
内存脚本的内容:
{
set newname for tempfile 1 to
"D:\ORADATA\ORCL_STD\TEMP01.DBF";
switch clone tempfile all;
set newname for datafile 1 to
"D:\ORADATA\ORCL_STD\SYSTEM01.DBF";
set newname for datafile 2 to
"D:\ORADATA\ORCL_STD\UNDOTBS01.DBF";
set newname for datafile 3 to
"D:\ORADATA\ORCL_STD\SYSAUX01.DBF";
set newname for datafile 4 to
"D:\ORADATA\ORCL_STD\USERS01.DBF";
restore
check readonly
clone database
;
}
正在执行内存脚本
正在执行命令: SET NEWNAME
临时文件 1 在控制文件中已重命名为 D:\ORADATA\ORCL_STD\TEMP01.DBF
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
启动 restore 于 23-1月 -09
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: sid=156 devtype=DISK
通道 ORA_AUX_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_AUX_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到D:\ORADATA\ORCL_STD\SYSTEM01.DBF
正将数据文件00002恢复到D:\ORADATA\ORCL_STD\UNDOTBS01.DBF
正将数据文件00003恢复到D:\ORADATA\ORCL_STD\SYSAUX01.DBF
正将数据文件00004恢复到D:\ORADATA\ORCL_STD\USERS01.DBF
通道 ORA_AUX_DISK_1: 正在读取备份段 E:\ARC_BACKUP\DATA\DATAFILE_1LK5H4AJ_1_1
通道 ORA_AUX_DISK_1: 已恢复备份段 1
段句柄 = E:\ARC_BACKUP\DATA\DATAFILE_1LK5H4AJ_1_1 标记 = TAG20090123T095011
通道 ORA_AUX_DISK_1: 恢复完成, 用时: 00:00:46
完成 restore 于 23-1月 -09
内存脚本的内容:
{
switch clone datafile all;
}
正在执行内存脚本
数据文件 1 已转换成数据文件副本
输入数据文件副本 recid=18 stamp=676896345 文件名=D:\ORADATA\ORCL_STD\SYSTEM01.DB
F
数据文件 2 已转换成数据文件副本
输入数据文件副本 recid=19 stamp=676896345 文件名=D:\ORADATA\ORCL_STD\UNDOTBS01.D
BF
数据文件 3 已转换成数据文件副本
输入数据文件副本 recid=20 stamp=676896345 文件名=D:\ORADATA\ORCL_STD\SYSAUX01.DB
F
数据文件 4 已转换成数据文件副本
输入数据文件副本 recid=21 stamp=676896345 文件名=D:\ORADATA\ORCL_STD\USERS01.DBF
完成 Duplicate Db 于 23-1月 -09
RMAN>
3.修改备库处于应用归档状态
SQL>startup nomount;
SQL>alter database mount standby database;
--应用归档
SQL>alter database recover managed standby database disconnect from session;
--查看备库角色
SQL> select DATABASE_ROLE from v$database;
--查看归档是否被应用,查看时注意,会略有延迟
SQL> select sequence#, applied from v$archived_log;
--在主库切换日志,同时观察归档是否被应用,如果是yes,则表明成功同步
alter system switch logfile;
三 切换测试
--查看是否可以切换
在主库端
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE
如果是to standby表示可以正常切换,不过这种状态应该是主库的状态未open的情况,如果主库已经打开,一般的状态是SESSIONS ACTIVE
如果是to standby
直接执行 ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;
否则执行: ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
在备库端
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
NOT ALLOWED
如果是primary表示可以正常切换,不过还会遇到NOT ALLOWED和PENDING或者LATENT,实际操作下来如果备库的switchover_status为not allowed或者to primary都可以正常切换
如果是to_primary
执行:ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
否则执行: ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
具体切换的顺序:先从主库到备用,再从备库到主库
主库
SQL>ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
SQL>shutdown immediate;
SQL>startup nomount;
SQL>alter database mount standby database;
备库
SQL>ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
SQL>shutdown immediate;
SQL>startup;
如果实际操作没有成功或者跟上述情况不同
SQL>select message from v$dataguard_status;
原因可能有几种
确保主库和备库登录对方sys用户成功
SQL>connect sys/syspass@ as sysdba
rman备份从主库拷贝到备库需保持路径一致
前面tnsnames,listener.ora,pfile中红色字体标注的内容配置正确
-----------------------------以下部分均来自于peter同学原文笔记,再次感谢
日后维护工作
1.正确的开关机顺序是:
启动的时候,先备库的listener,再启动备库,再启动主库的listener,再启动主库。
关闭的时候,先关闭主库,再关闭备库(先alter database recover managed standby database cancel,再shutdown immediate)。
2.备库启动方法:startup nomount==>alter database mount standby database==>alter database recover managed standby database disconnect from session; --应用归档
3.如果两边的备库相对主库缺少archivelog,可以通过select * from v$archive_gap显示差距的arch log然后
alter database register physical logfile 'd:oracleARC00048_0660047105.001'; --物理注册
alter database recover managed standby database disconnect from session; --应用归档
4.查看select sequence#, applied from v$archived_log;备库归档应用信息如果都没有应用请检查LOG_ARCHIVE_DEST_2参数是否正确
5.如何打开standby:
alter database recover managed standby database cancel;--暂停redo应用以便open 注意,此时只是暂时redo应用,并不是停止Standby数据库,standby仍会保持接收只不过不会再应用接收到的归档,直到你再次启动redo应用为止。
alter database open read only; --打开做报表,此时数据不会实时更新,standby仍会保持接收只不过不会再应用接收到的归档,直到你再次启动redo应用为止(此时open模式)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;--启动应用(此时恢复成mount模式)
如果报错ORA-01153: an incompatible media recovery is active
可以执行 alter database recover managed standby database finish;(failover)
或者cancel掉, alter database recover managed standby database cancel;
6.设置新的数据保护模式并重启数据库 --primary数据库操作
SQL> alter database set standby database to maximize availability;
提示:maximize后可跟{PROTECTION | AVAILABILITY | PERFORMANCE},分别对应最大保护,最高可用性及最高性能。
Down掉数据库,重新启动
7.打开备用库恢复进程
recover managed standby database diconnect from session;
执行上面这条语句,备用库会在主库日志文件切换(备用日志文件切换)归档后,使用归档文件恢复数据库。
recover managed standby database using current logfile disconnect from session;
这条语句与上面不同的是,备用日志文件切换,生成归档日志前,先恢复数据库。
recover managed standby database finish;
这条语句是在做切换时,尽量多的保护数据。从备用日志文件中恢复数据
recover managed standby database cancel;
取消备用库自动恢复
---------------------------------------------相关视图
select OPEN_MODE,PROTECTION_MODE,PROTECTION_LEVEL,SWITCHOVER_STATUS from v$database; --查看数据库的状态
select message from v$dataguard_status; --查看相关错误信息
alter system switch logfile; --切换日志
select DATABASE_ROLE from v$database; --查看当前数据库的角色 Pri/Std
select sequence#, applied from v$archived_log; --查看日志是否被应用
SELECT sid,status,username,action FROM V$SESSION; --查看当前系统的进程
select * from v$logfile;--查看redolog
select first_time,first_change#,next_change#,sequence# from v$log_history; --查询standby库中所有已被应用的归档文件信息(不论该归档文件是否还存在)
SELECT THREAD#, MAX(SEQUENCE#) AS "LAST_APPLIED_LOG" FROM V$LOG_HISTORY GROUP BY THREAD#; --最后一个被应用的log
SELECT LOCAL.THREAD#, LOCAL.SEQUENCE# FROM (SELECT THREAD#, SEQUENCE# FROM V$ARCHIVED_LOG WHERE DEST_ID=1) LOCAL WHERE LOCAL.SEQUENCE# NOT IN
(SELECT SEQUENCE# FROM V$ARCHIVED_LOG WHERE DEST_ID=2 AND THREAD# = LOCAL.THREAD#); --在primary server上查询有哪些日志没有被传输到Standby
------------------------------------------------------------------
二.Failovers的过程:
查询没有应用的日志:
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
Cp过来并register
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
如果備庫有配置standby log,可使用如下命令處理:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
如果備庫沒有配置standby log,可使用如下命令處理:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH
2> SKIP STANDBY LOGFILE;
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
SQL> ALTER DATABASE OPEN;
一旦主数据故障无法使用,就可以迅速激活镜像备份:
1、如果可能,归档主服务器当前重做日志,传送到镜像服务器;
2、使用主服务器的归档日志文件做恢复:
SQL>recover standby database;
3、激活并打开数据库:
SQL>alter database activate standby database;
SQL>alter database mount;
SQL>alter database open;
三.将Failover之后的老的主库 flashback成新primary的standby库:
1. 在新主库查出failover时的SCN:
SQL> SELECT TO_CHAR(STANDBY_BECAME_PRIMARY_SCN) FROM V$DATABASE;
TO_CHAR(STANDBY_BECAME_PRIMARY_SCN)
----------------------------------------
172313
2. 在old primary库上:
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> FLASHBACK DATABASE TO SCN1503389;
SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
----------------------------------------------------
Switchover_Status值
说 明
NOT ALLOWED
当前的数据库不是带有备用数据库的主数据库
PREPARING DICTIONARY
该逻辑备用数据库正在向一个主数据库和其他备用数据库发送它的重做数据,以便为切换做准备
PREPARING SWITCHOVER
接受用于切换的重做数据时,逻辑备用配置会使用它
RECOVERY NEEDED
备用数据库还没有接收到切换请求
SESSIONS ACTIVE
在主数据库中存在活动的SQL会话;在继续执行之前必须断开这些会话
SWITCHOVER PENDING
适用于那些已收到主数据库切换请求但是还没有处理该请求的备用数据库
SWITCHOVER LATENT
切换没有完成并返回到主数据库
TO LOGICAL STANDBY
主数据库已经收到了来自逻辑备用数据库的完整的字典
TO PRIMARY
该备用数据库可以转换为主数据库
TO STANDBY
该主数据库可以转换为备用数据库