【环境说明-虚机】
主库:10.1.1.11 ygdg(oracle 11.2.0.4)
备库:10.1.1.12 ygdgbk(oracle 11.2.0.4)
【创建主库】
1、创建pfile
cat init.oragrep -v ^#grep -v ^$ >initygdg.ora
db_name='ygdg'
memory_target=1024M
processes=150
audit_file_dest='/u01/app/oracle/admin/ygdg/adump'
audit_trail='db'
db_block_size=8192
db_domain=''
diagnostic_dest='/u01/app/oracle'
dispatchers='(PROTOCOL=TCP)(SERVICE=ygdgXDB)'
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
control_files='/u01/app/oracle/oradata/ygdg/control01.ctl'
compatible='11.2.4.0'
解释:
$ORACLE_HOME/dbs该目录下有init.ora,将其当成一个创建pfile模板
过滤#和空行 cat init.oragrep -v ^#grep -v ^$ >initSID.ora
如果不是很放心的话,可以根据已有数据库的spfile来进行更改
pfile越简单,出错的概率越小
memory_target=1024M 看业务情况是80%or60%
processes=150 启动进程个数
audit_file_dest='$ORACLE_BASE/admin/SID/adump' 审计存在位置
audit_trail='db' 审计内容
db_block_size=8192 数据块大小
diagnostic_dest='$ORACLE_BASE' 诊断目录位置,告警文件、trace文件等
dispatchers='(PROTOCOL=TCP)(SERVICE=ORCLXDB)' 共享server建立调度器
open_cursors=300 打开游标个数
remote_login_passwordfile='EXCLUSIVE' sys用户远程连接认证,用口令文件,EXCLUSIVE代表允许远程登录
undo_tablespace='UNDOTBS1'
control_files='/u01/app/oracle/oradata/SID/control01.ctl' 刚开始建立时建一个就好了
compatible='11.2.0'
其中$ORACLE_BASE/admin/SID/adump和/u01/app/oracle/oradata/SID这两个目录可能没有
用oracle用户 mkdir -p /u01/app/oracle/oradata/SID生成
mkdir -p不用逐级创建
2、创建口令文件
/u01/app/oracle/product/11.2.0/db_1/dbs目录下
orapwd file=orapwygdg entries=3 password=oracle
解释:
利用orapwd工具创建
/u01/app/oracle/product/11.2.0/db_1/dbs目录下
orapwd file=orapwSID entries=3(几个用户可以访问) password=oracle
3、启动实例
export ORACLE_SID=ygdg
sqlplus / as sysdba
startup nomount;
show parameter name;
show parameter spfile;
create spfile from pfile;
startup force nomount;
4、创建database
cd /home/oracle
vi cr_ygdg.sql
create database ygdg
USER SYS IDENTIFIED BY oracle
USER SYSTEM IDENTIFIED BY oracle
LOGFILE GROUP 1 ('/u01/app/oracle/oradata/ygdg/redo01a.log') SIZE 100M BLOCKSIZE 512,
GROUP 2 ('/u01/app/oracle/oradata/ygdg/redo02a.log') SIZE 100M BLOCKSIZE 512
MAXLOGFILES 3
MAXLOGMEMBERS 2
MAXLOGHISTORY 1
MAXDATAFILES 100
CHARACTER SET zhs16gbk
EXTENT MANAGEMENT LOCAL
DATAFILE '/u01/app/oracle/oradata/ygdg/system01.dbf' SIZE 1G REUSE
SYSAUX DATAFILE '/u01/app/oracle/oradata/ygdg/sysaux01.dbf' SIZE 325M REUSE
DEFAULT TABLESPACE users DATAFILE '/u01/app/oracle/oradata/ygdg/users01.dbf' SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
DEFAULT TEMPORARY TABLESPACE tempts1 TEMPFILE '/u01/app/oracle/oradata/ygdg/temp01.dbf' SIZE 20M REUSE
UNDO TABLESPACE undotbs1 DATAFILE '/u01/app/oracle/oradata/ygdg/undotbs01.dbf' SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
注意:
建库前期做好存储规划,原则数据文件、redo日志文件、归档日志文件
尽量不要放在相同存储上,不管是从安全还是从性能考虑
解释:
MAXLOGFILES指定重做日志文件的最大个数,最少2个;
MAXLOGMEMBERS指定重做日志文件中每个组的成员的最大个数,2个绰绰有余,但每组成员尽量放不同存储上,组越多,消耗IO越多;
MAXLOGHISTORY指定控制文件可记载的重做日志历史的最大个数;
MAXDATAFILES指定数据文件的最大个数;
CHARACTER SET zhs16gbk支持语言,根据要访问的客户端来选择;
EXTENT MANAGEMENT LOCAL区的管理方式为本地管理;
UNDO TABLESPACE undotbs1,其中undotbs1要跟pfile里面名一致
5、启动数据库
sqlplus / as sysdba
select status from v$instance;
status:started
@/home/oracle/cr_ygdg.sql
select status from v$instance;
status:open
解释:此时库创建成功,但不能用,只是骨架
6、创建数据字典
vi cr_dict.sql
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
conn system/oracle
@?/sqlplus/admin/pupbld.sql
exit
export ORACLE_SID=ygdg
sqlplus / as sysdba
select status from v$instance;
运行@/home/oracle/cr_dict.sql
解释:
数据字典是整个数据库的核心
@?/rdbms/admin/catalog.sql
--creates the data dictionary and public synonyms for many of its views, and grants PUBLIC access to the synonyms
@?/rdbms/admin/catproc.sql
--runs all scripts required for or used with PL/SQL.
conn system/oracle
@?/sqlplus/admin/pupbld.sql
--install the SQL*Plus PRODUCT_USER_PROFILE tables
过程中会报错,完了后测试下:desc product_user_profile;
如果要使用默认用户scott,则还需要运行下面脚本:@?/rdbms/admin/utlsampl.sql
测试:conn scott/tiger
user_< all_< dba_
user_:数据字典表,只是该用户所拥有的对象信息
all_:该用户有权限访问的所有对象信息,包括自己拥有的和别人赋权给它的
dba_:数据字典表所有对象信息,只有sys用户能访问
熟悉数据库要学会访问各种数据字典表,其主要由表和视图组成。
desc dict:可以查看数据库所有数据字典信息select * from dict;
【DG搭建—配置主库】
1、主库设为归档模式
SQL> archive log list;
数据库日志模式存档模式
2、配置主库为force logging
SQL> alter database force logging;
Database altered.
3、为主库添加standby redo log
standby redo log创建原则:
a)确保standby redo log的大小与主库online redo log的大小一致
b)主库为单实例数据库:standby redo log组数=主库日志组总数+1
SQL> select group#,THREAD#,MEMBERS,BYTES from v$log;
GROUP# THREAD# MEMBERS BYTES
-----------------------------------------------------
alter database add standby logfile group 3 ('/u01/app/oracle/oradata/ygdg/redo03a.log') size 100m;
alter database add standby logfile group 4 ('/u01/app/oracle/oradata/ygdg/redo04a.log') size 100m;
alter database add standby logfile group 5 ('/u01/app/oracle/oradata/ygdg/redo05a.log') size 100m;
4、修改主库参数文件
SQL> show parameter name;
NAMETYPE VALUE
---------------------------------------------------------------
cell_offloadgroup_namestring
db_file_name_convertstring
db_namestring ygdg
db_unique_namestring ygdg
global_namesboolean FALSE
instance_namestring ygdg
lock_name_spacestring
log_file_name_convertstring
processor_group_namestring
service_namesstring ygdg
alter system set db_unique_name='ygdg' scope=spfile;
alter system set log_archive_config='DG_CONFIG=(ygdg,ygdgbk)';
alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/oradata/ygdg/arch db_unique_name=ygdg valid_for=(ALL_LOGFILES,ALL_ROLES)';
alter system set log_archive_dest_2='SERVICE=ygdgbk LGWR ASYNC db_unique_name=ygdgbk valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE)'; alter system set log_archive_dest_state_1=enable;
alter system set log_archive_dest_state_2=enable;
alter system set remote_login_passwordfile='EXCLUSIVE' scope=spfile;
alter system set db_file_name_convert='/u01/app/oracle/oradata/ygdgbk/','/u01/app/oracle/oradata/ygdg' scope=spfile;
alter system set log_file_name_convert='/u01/app/oracle/oradata/ygdgbk/','/u01/app/oracle/oradata/ygdg' scope=spfile;
alter system set standby_file_management='AUTO';
alter system set fal_server='ygdgbk';
alter system set fal_client='ygdg';
解释:
log_archive_config先自己后对端
log_archive_dest_1指的是本地日志位置
log_archive_dest_2指的是对端
db_file_name_convert中数据文件位置要尽可能相同
log_file_name_convert中日志文件位置要尽可能相同
fal_server指对端
fal_client指自己
5、主库创建监听
cd /u01/app/oracle/product/11.2.0/db_1/network/admin
[oracle@DB4-dg admin]$ vim listener.ora
(SID_DESC=
(GLOBAL_DBNAME=ygdg)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)
(SID_NAME=ygdg))
(SID_DESC=
(SID_NAME=ygdg)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.11)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
[oracle@DB4-dg admin]$ lsnrctl stop
[oracle@DB4-dg admin]$ lsnrctl start
6、主库配置TNSNAME
cd /u01/app/oracle/product/11.2.0/db_1/network/admin
[oracle@DB4-dg admin]$ vim tnsnames.ora
添加
ygdg =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.11)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ygdg)
)
)
ygdgbk =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.12)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ygdgbk)
)
)
【DG搭建—配置备库】
1、创建监听
[oracle@DB3-ogg admin]$ vim listener.ora
(SID_DESC=
(GLOBAL_DBNAME=ygdgbk)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME=ygdgbk))
(SID_DESC=
(SID_NAME=ygdgbk)
(ORACLE_HOME=/u01/app/oracle/product/
11.2.0/dbhome_1)
))
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.12)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
[oracle@DB3-ogg dbs]$ lsnrctl stop
[oracle@DB3-ogg dbs]$ lsnrctl start
2、配置TNSNAME
[oracle@DB3-ogg admin]$ pwd
/u01/app/oracle/product/11.2.0/dbhome_1/network/admin
[oracle@DB3-ogg admin]$ vim tnsnames.ora
添加
ygdgbk =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.12)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ygdgbk)
)
)
ygdg =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.11)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ygdg)
)
)
3、测试tns
主库
[oracle@DB4-dg admin]$ tnsping ygdgbk
备库
[oracle@DB3-ogg admin]$ tnsping ygdg
4、配置备库路径
mkdir -p /u01/app/oracle/admin/ygdgbk/adump
mkdir -p /u01/app/oracle/oradata/ygdgbk
5、配置密码文件
[root@DB3-ogg ygtest]#cd /u01/app/oracle/product/11.2.0/dbhome_1/dbs
[root@DB3-ogg ygtest]#orapwd file=orapwygdgbk entries=3 password=oracle
6、配置备库pfile文件并启动到nomount状态
主库
SQL> create pfile='/u01/media/init.ora' from spfile;
[oracle@DB4-dg media]$ scp init.ora 10.1.1.12:/u01/ygtest
备库
[oracle@DB3-ogg ygtest]$ cat init.ora
*.audit_file_dest='/u01/app/oracle/admin/ygdgbk/adump'
*.audit_trail='db'
*.compatible='11.2.0'
*.control_files='/u01/app/oracle/oradata/ygdgbk/control01.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_file_name_convert='/u01/app/oracle/oradata/ygdg','/u01/app/oracle/oradata/ygdgbk/'
*.db_name='ygdg'
*.db_unique_name='ygdgbk'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ygdgbkXDB)'
*.fal_client='ygdgbk'
*.fal_server='ygdg'
*.log_archive_config='DG_CONFIG=(ygdgbk,ygdg)'
*.log_archive_dest_1='LOCATION=/u01/app/oracle/oradata/ygdgbk/arch db_unique_name=ygdgbk valid_for=(ALL_LOGFILES,ALL_ROLES)'
*.log_archive_dest_2='SERVICE=ygdg LGWR ASYNC db_unique_name=ygdg valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE)'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_file_name_convert='/u01/app/oracle/oradata/ygdg','/u01/app/oracle/oradata/ygdgbk/'
*.memory_target=1G
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'
[root@DB3-ogg ygtest]# mv init.ora /u01/app/oracle/product/11.2.0/dbhome_1/dbs/initygdgbk.ora
export ORACLE_SID=ygdgbk
sqlplus / as sysdba
startup nomount;
show parameter name;
show parameter spfile;
create spfile from pfile;
startup force nomount;
SQL> select status from v$instance;
STATUS
------------
STARTED
7、恢复备库
rman target sys/oracle@ygdg auxiliary sys/oracle@ygdgbk
RMAN>duplicate target database for standby from active database nofilenamecheck;
8、备库打开并同步
SQL> alter database open;
SQL>alter database recover managed standby database using current logfile disconnect from session;
9、验证DG
查看日志有没有报错
SQL>select dest_name,error from v$archive_dest;
查询主库最大归档序号,一致即归档同步成功。
主库上执行:
SQL>select max(sequence#) from v$archived_log;
备库上操作:
SQL>select max(sequence#) from v$archived_log;
主库上执行日志切换
SQL>alter system archive log current;
主库上执行:
SQL>select max(sequence#) from v$archived_log;
备库上再次验证:
SQL>select max(sequence#) from v$archived_log;
查看主备库状态
主库上执行:
SQL>select switchover_status,database_role from v$database;
备库上执行:
SQL>select switchover_status,database_role from v$database;
【DG切换与恢复】
DG切换测试1:switchover
switchover是用户有计划的进行停机切换,能够保证不丢失数据
主库:
select switchover_status,database_role from v$database;
注意:上面查询结果为TO STANDBY 或 SESSIONS ACTIVE表明可以进行切换
alter database commit to switchover to physical standby with session shutdown;
startup mount;
select database_role from v$database;
备库上操作:
select switchover_status,database_role from v$database;
注意:上面查询结果显示为TO PRIMARY 或 SESSIONS ACTIVE表明可以切换成主库;
alter database commit to switchover to primary with session shutdown;
alter database open;
select switchover_status,database_role,open_mode from v$database;
主库:
alter database open;
alter database recover managed standby database using current logfile disconnect from session;
再次查询主备库状态:
select switchover_status,database_role from v$database;
DG切换测试2:failover
failover是当主库真正出现严重系统故障,如数据库宕机,软硬件故障导致主库不能支持服务,从而进行的切换动作。
注意:为了能够在failover后能够恢复DG,需要在主库上开启flashback,如果不开启flashback的话,DG就可能需要重新搭建
由于主库已经不可访问,下面所有的操作都在备库完成:
SQL> alter database recover managed standby database cancel;#停止实时同步
SQL> alter database recover managed standby database finish force;
SQL> select database_role from v$database;
DATABASE_ROLE
-------------------------------
PHYSICAL STANDBY
SQL> alter database commit to switchover to primary with session shutdown; 加上finish force是将备库强制切换为主库
SQL> alter database open;
SQL> select switchover_status,database_role,open_mode from v$database;
SWITCHOVER_STATUS DATABASE_ROLE OPEN_MODE
------------------------------------------------------------------------------------------
RESOLVABLE GAP PRIMARY READ WRITE
至此failover操作完成,原来的备库已经切换为主库,可以给业务提供服务了。
failover恢复:利用flashback database来重构
在新的主库上执行:
SQL> select to_char(standby_became_primary_scn) from v$database;
TO_CHAR(STANDBY_BECAME_PRIMARY_SCN)
----------------------------------------
977458
在之前的主库上,也就是现在的备库上执行下面的操作:
SQL> startup mount
SQL> flashback database to scn 977458; #这个值为在新主库上查询到的SCN值
Flashback complete.
SQL> alter database convert to physical standby;
Database altered.
SQL> shutdown immediate
SQL> startup
SQL> alter database recover managed standby database using current logfile disconnect from session;
到此failover 恢复已经完成
Failover是Dataguard的一个重要功能特性。经过Failover,我们认为Primary站点其实已经不能作为HA架构成员了。
重新让Primary加入进去的方法有三个:
第一个是利用RMAN备份将Primary恢复到failover之前,重新进行日志弥补、角色切换;
第二个是利用Flashback Database策略,将数据库恢复到failover之前的时间点;
第三个是删除Primary数据库,重新利用新Primary搭建standby。
我们在这用了第二种方法,其他的可以参考https://www.cnblogs.com/lhrbest/p/4680273.html?from=singlemessage
注意:角色转换决策应该考虑的点
角色转换(switchover&failover)的最终目的是尽快地使主库在线,而同时尽量减少数据损失或者是实现无数据损失。尽量选择宕机时间最短,同时数据损失最小的策略。总之在失败切换前,应该先考虑修复主数据库或者进行无数据损失的角色转换。
即使使用无数据损失的备库方案,修复主库可能会比切换到备库更快点。如果修复了主库,那么就不需要修改客户端的连接。但是如果修复工作导致了任何的数据损失,那么可能需要重新创建所有的备用数据库。
通常情况下,最合适切换的备库为已经应用了最多的归档日志的备用数据库。
【Snapshot Standby】
Oracle 11g的Data Guard不仅仅带给我们的是Active Data Guard实时查询特性,同时还带来了另外一个新特性,这便是Snapshot Standby数据库功能,此项功能可将备库置身于“可读写状态”用于不方便在生产环境主库中测试的内容,比如模拟上线测试等任务。当备库读写状态下任务完成后,可以非常轻松的完成Snapshot Standby数据库角色切换回备库角色,恢复与主库数据同步。在Snapshot Standby数据库状态下,备库是可以接收主库传过来的日志,但是不能对日志进行应用。
1、查看主备库状态是否正常并根据实际情况考虑备库是否需要手动注册归档日志
主库
SQL> select name,database_role,protection_mode from v$database;
NAME DATABASE_ROLE PROTECTION_MODE
------------------------------------------------------------------------
PROD PRIMARY MAXIMUM PERFORMANCE
SQL>select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
536
备库
SQL> select name,database_role,protection_mode from v$database;
NAME DATABASE_ROLE PROTECTION_MODE
----------------------------------------------------------------------------------
PROD PHYSICAL STANDBY MAXIMUM PERFORMANCE
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
536
根据实际情况考虑备库是否需要手动注册归档日志:
RMAN> catalog start with '/归档日志路径/' (一定要用/结尾,不然找不到真实路径)
这个命令的作用是将最新的备份集以及归档日志文件列表导入到控制文件中。
如果archivelog太多,会导致control较大,所以建议将过期的archivelog删除后,重新手动注册下归档日志,减小control大小;controlfile里初始化参数control_file_record_keep_time,设置备份信息保存时间,到规定时间就自动清除以前的备份信息。但是有时会出现archivelog信息本身较小,不会删除的情况。
2、切换备库到Snapshot Standby
(1)停止Redo Apply,如果备库正处于Redo Apply过程,需要先取消
SQL> alter database recover managed standby database cancel;
Database altered.
(2)确保闪回恢复区已指定
注意:实现Snapshot Standby数据库功能并不需要开启主库和备库的闪回数据库(Flashback Database)功能,与是否开启闪回数据库无关。
SQL> show parameter recover
NAME TYPE VALUE
----------------------------------------------------------------
db_recovery_file_dest string
db_recovery_file_dest_size big integer 0
recovery_parallelism integer 0
SQL> alter system set db_recovery_file_dest_size=2g;
alter system set db_recovery_file_dest='/u01/app/oracle/flash_recovery_area';
确认主库闪回功能并未开启
SQL> select FLASHBACK_ON from v$database;
FLASHBACK_ON
------------------
NO
确认备库闪回功能并未开启
SQL> select FLASHBACK_ON from v$database;
FLASHBACK_ON
------------------
NO
(3)调整备库到Snapshot Standby数据库状态
SQL> alter database convert to snapshot standby;
SQL> select database_role,open_mode from v$database;
DATABASE_ROLE OPEN_MODE
---------------------------------------------------
SNAPSHOT STANDBY MOUNTED
(4)将备库置于对外可读写状态
SQL> alter database open;
Database altered.
SQL> select database_role,open_mode from v$database;
DATABASE_ROLE OPEN_MODE
---------------------------------------------------
SNAPSHOT STANDBY READ WRITE
3、测试备库处于Snapshot Standby数据库对主库日志的接收
主库:
SQL> alter system switch logfile;
System altered.
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
539
备库:
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
539
或者查看主库和备库归档目录下的日志文件内容:
主库归档日志文件
$ ls -ltr
total 879M
……省略其他……
备库归档日志文件
$ ls -ltr
total 847M
……省略其他……
可见,备库已经接受到主库发过来的日志,这时备库是一个可任意修改和调整的状态,也就是我们要的“READ WRITE”可读写状态。
特别注意的是,原理上实现Snapshot Standby数据库功能是基于闪回数据原理的,因此任何导致闪回数据库无法回退的动作在这里也要规避,否则Snapshot Standby数据库将无法回到曾经的备库恢复状态。
4、恢复Snapshot Standby数据库为Physical Standby数据库
重启备库到MOUNTED状态
SQL> shutdown immediate;
SQL> startup mount;
SQL> select database_role,open_mode from v$database;
DATABASE_ROLE OPEN_MODE
--------------------------------------------------
SNAPSHOT STANDBY MOUNTED
转换到Physical Standby
SQL> alter database convert to physical standby;
此时数据库处于NOMOUNTED状态,需要重新启动数据库
SQL> shutdown immediate;
SQL> startup mount;
查看V$ARCHIVED_LOG动态性能视图查看日志应用情况
SQL> select sequence#, first_time, next_time, applied from v$archived_log order by sequence#;
5、开启备库到READ ONLY状态,验证之前在Snapshot Standby数据库上的操作已撤销
SQL> alter database recover managed standby database cancel;
Database altered.
SQL> alter database open read only;
Database altered.
SQL> select database_role,open_mode from v$database;
DATABASE_ROLE OPEN_MODE
-------------------------------------------------
PHYSICAL STANDBY READ ONLY
根据测试情况进行相应的验证
领取专属 10元无门槛券
私享最新 技术干货