首页 > 数据库 > Oracle > oracle adg手工搭建+dg broker
概述:
本文就oracle 19c 4节点adg的搭建进行过程描述,切换测试。通过手工创建明晰过程各个环节,使用工具data guard broker简化操作维护,
使用far sync搭建更高效简洁的灾备环境。下面就详细内容进行描述。
文章目录
基础环境信息:
一、oracle环境准备:
二、ADG安装(physical standby):
1、主库(Primary)配置
1.1 开启归档
1.2 附加日志 强制日志开启
1.3 配置主备库tns ,静态监听
1.4 dg相关的参数设置
1.5 复制密码文件、参数文件到备库
2、备库(physical Standby)安装与配置
2.1 准备目录 尽量保持和主库一致
2.2 启动到nomout
2.3 从主库克隆到备库
3、启动 Data Guard 日志应用
3.1 主库添加 standby redo log(可选但推荐)
3.2 备库启动日志应用
4、Data Guard 状态检查验证
5、切换演练
5.1 switchover无损切换
5.2 Dataguard的强制切换 failover
5.3 Dataguard模式切换
5.4 物理备库、快照备库的相互转换
5.5 物理备库转逻辑备库
6、Data Guard Broker
6.1 配置管理:
6.2 redo流转规则配置
6.3 配置查看
6.4 DG角色切换
6.5 切换到不同保护模式:
6.6 Data Guard Broker常用命令:
6.7 常见错误解决:
7、Far Sync 功能
方法一:手动配置(传统方式)
方法二:使用 Data Guard Broker方式
基础环境信息:
hostname IP dbname db_unique_name tns role
racnode1 192.168.11.21 orcl orcl21 orcl21 primary
racnode2 192.168.11.22 orcl orcl22 orcl22 physical standby sync
racnode3 192.168.11.23 orcl orcl23 orcl23 phy standby async
racnode4 192.168.11.24 orcl orcl24 orcl24 phy std async cascading
orcl21 <-> orcl22
-> orcl23 -> orcl24
os: CentOS Linux release 7.6.1810 (Core)
oracle版本: 19c
一、oracle环境准备:
主库安装数据库并建库(安装单机库即可) 参考: itpub页面
备库只要安装完数据软件即可,本次dg主备库基础环境一致的情况下,也可以从主库打包解压到备库。
数据库的主目录为:
echo $ORACLE_HOME
/u01/app/oracle/product/19.3.0/db
二、ADG安装(physical standby):
######################################################################
1.主库(Primary)配置
1.1 开启归档
普通DB:
archive log list;
mkdir -p /u01/app/oracle/archive /u01/app/oracle/archive/ORCL/
chown -R oracle:oinstall /u01/app/oracle/archive
chmod -R 777 /u01/app/oracle/archive
##--SQL
show parameter recovery
alter system set db_recovery_file_dest_size=10g;
alter system set db_recovery_file_dest='/u01/app/oracle/archive';
shutdown immediate
startup mount
alter database archivelog;
alter database open;
archive log list;
alter system switch logfile; --【alter system archive log current; 】
alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/archive/ORCL/' scope=both;
alter system set log_archive_format='ARCH_%t_%s_%r.arc' scope=spfile;
alter system set log_archive_max_processes=5 scope=both;
#检查下归档日志,归档日志正常切换说明就成功了
SQL> alter system switch logfile;
1.2 附加日志 强制日志开启
1.2.1 开启强制日志(必选)
alter database force logging;
select force_logging from v$database;
1.2.2 开启辅助日志
--此处注意物理dg不需要开启附加补充日志,直接redo就可以搭建,当然如搭建逻辑dg需要开启
--开启辅助日志期间需要申请X锁(database级别申请tx锁, 表级开启申请x锁),繁忙时段会长时间等待。
--如果数据库是生产环境请慎重,挑负载低使用量少时执行,如果命令卡住,去数据库看等待事件,解决掉后才能成功。建议尽量在变更时段执行
--ogg也是解析redo日志,原理与逻辑dg差不多,辅助日志的要求也差不多(pk+uk)。但是ogg更灵活可以表级 add trandata; / schema级别 add schematrandata; 添加。
alter database add supplemental log data; --min级别
--ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; --ALL级别
--19c+
ALTER PLUGGABLE DATABASE pdbname ADD SUPPLEMENTAL LOG DATA SUBSET DATABASE REPLICATION;
--开启最小补充日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
--开启主键和唯一索引的补充日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE) COLUMNS;
--开启全列补充日志(谨慎使用)
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
--如果需要强制所有列都被记录,可以使用
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL, PRIMARY KEY, UNIQUE) COLUMNS;
--关闭补充日志需要遵循严格的顺序,顺序弄错会导致命令执行失败。必须先关闭所有“标识键日志”(如 PK, UK, ALL),最后才能关闭“最小补充日志”
--先关闭ALL补充日志
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
--再关闭主键补充日志
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
--然后再关闭唯一键补充日志
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
--最后关闭最小补充日志
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA;
查看配置结果
select log_mode,supplemental_log_data_min min,supplemental_log_data_pk pk,supplemental_log_data_ui ui,
supplemental_log_data_fk fk,supplemental_log_data_all allc,force_logging from v$database;
1.3 配置主备库tns ,静态监听
#################################### listener.ora
vi $ORACLE_HOME/network/admin/listener.ora
添加:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/db)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = orcl22) ##此处为db_unique_name 见开篇基础环境信息部分
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/db)
(SID_NAME = orcl)
)
)
#################################### tnsnames.ora
vi $ORACLE_HOME/network/admin/tnsnames.ora
添加:(依据 开篇基础环境信息部分 配置 )
orcl21 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.11.21)(PORT = 1521))
(CONNECT_DATA =
(SID = orcl)
)
)
orcl22 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.11.22)(PORT = 1521))
(CONN CT_DATA =
(SID = orcl)
)
)
orcl23 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.11.23)(PORT = 1521))
(CONNECT_DATA =
(SID = orcl)
)
)
orcl24 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.11.24)(PORT = 1521))
(CONNECT_DATA =
(SID = orcl)
)
)
1.4 dg相关的参数设置
##node1
ALTER SYSTEM SET log_archive_config='DG_CONFIG=(orcl21,orcl22,orcl23,orcl24)' scope=both;
ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/app/oracle/archive/ORCL/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl21' scope=both;
--dest_2 dest_3指向备库不成功,可以在备库启动后在补上
alter system set log_archive_dest_2='SERVICE=orcl22 LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl22' scope=both;
alter system set log_archive_dest_3='SERVICE=orcl23 LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl23' scope=both;
ALTER SYSTEM SET standby_file_management=AUTO scope=both;
alter system set FAL_SERVER=orcl22,orcl23 scope=both;
alter system set FAL_CLIENT=orcl21 scope=both;
ALTER SYSTEM SET db_unique_name='orcl21' scope=spfile;
ALTER SYSTEM set LOG_ARCHIVE_DEST_STATE_1=enable scope=both;
ALTER SYSTEM set LOG_ARCHIVE_DEST_STATE_2=enable scope=both;
ALTER SYSTEM set LOG_ARCHIVE_DEST_STATE_3=enable scope=both;
--scope=spfile 的参数需重启生效
SHUTDOWN IMMEDIATE;
STARTUP;
1.5 复制密码文件、参数文件到备库
su - oracle
echo "
*.db_name='orcl'
*.db_unique_name='orcl21'" > ~/init.ora
--scp 参数文件 密码文件 listener tnsnames 到racnode2
scp ~/init.ora racnode2:~
scp $ORACLE_HOME/dbs/orapworcl racnode2:$ORACLE_HOME/dbs/
scp $ORACLE_HOME/network/admin/listener.ora racnode2:$ORACLE_HOME/network/admin/
scp $ORACLE_HOME/network/admin/tnsnames.ora racnode2:$ORACLE_HOME/network/admin/
--修改其中的orcl21 racnode1 为正确的值,下述脚本仅供参考
hname=$(hostname)
echo ${hname: -1}
sed -i -e "s/orcl21/orcl2${hname: -1}/g" ~/init.ora
sed -i -e "s/orcl21/orcl2${hname: -1}/g" -e "s/racnode1/racnode${hname: -1}/g" $ORACLE_HOME/network/admin/listener.ora
sed -i -e "s/racnode1/racnode${hname: -1}/g" $ORACLE_HOME/network/admin/tnsnames.ora
--racnode3 racnode4类似
######################################################################
2、备库(physical Standby)安装与配置
2.1 准备目录 尽量保持和主库一致
#racnode2、racnode3、racnode4节点,均用root执行
mkdir -p /u01/app/oracle/archive /u01/app/oracle/archive/ORCL/ /oradata/ORCL/
mkdir -p /u01/app/oracle/admin/orcl/adump /u01/app/oracle/admin/orcl/adump/dpdump /u01/app/oracle/admin/orcl/adump/pfile
chown -R oracle:oinstall /u01/app/oracle/archive /oradata/ /u01/app/oracle/admin/orcl
chmod -R 777 /u01/app/oracle/archive
2.2 启动到nomout
--注意 /home/oracle/init.ora 为1.5节从主库scp
sqlplus / as sysdba
STARTUP NOMOUNT PFILE='/home/oracle/init.ora';
2.3 从主库克隆到备库
#racnode2
rman<<_EOF
connect target sys/oracle@orcl21
connect auxiliary sys/oracle@orcl22
run {
allocate channel t1 type disk;
allocate channel t2 type disk;
allocate auxiliary channel a1 type disk;
allocate auxiliary channel a2 type disk;
duplicate target database for standby from active database nofilenamecheck
dorecover
spfile
set db_unique_name='orcl22'
set log_archive_dest_1='LOCATION=/u01/app/oracle/archive/ORCL/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl22'
set log_archive_dest_2='SERVICE=orcl21 SYNC LGWR AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl21'
set log_archive_dest_3='SERVICE=orcl23 SYNC LGWR AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl23'
set fal_server='orcl21','orcl23'
set fal_client='orcl22'
set db_file_name_convert='/oradata/ORCL/','/oradata/ORCL/'
set standby_file_management='MANUAL'
;
sql channel t1 "alter system archive log current";
sql channel a1 "alter system set standby_file_management='AUTO'";
}
_EOF
#racnode3
rman<<_EOF
connect target sys/oracle@orcl21
connect auxiliary sys/oracle@orcl22
run {
allocate channel t1 type disk;
allocate channel t2 type disk;
allocate auxiliary channel a1 type disk;
allocate auxiliary channel a2 type disk;
duplicate target database for standby from active database nofilenamecheck
dorecover
spfile
set db_unique_name='orcl23'
set log_archive_dest_1='LOCATION=/u01/app/oracle/archive/ORCL/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl23'
set log_archive_dest_2='SERVICE=orcl24 ASYNC LGWR VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=orcl24'
set log_archive_dest_3=''
set fal_server='orcl21'
set fal_client='orcl23'
set db_file_name_convert='/oradata/ORCL/','/oradata/ORCL/'
set standby_file_management='MANUAL'
;
sql channel t1 "alter system archive log current";
sql channel a1 "alter system set standby_file_management='AUTO'";
}
_EOF
#racnode4
rman<<_EOF
connect target sys/oracle@orcl21
connect auxiliary sys/oracle@orcl22
run {
allocate channel t1 type disk;
allocate channel t2 type disk;
allocate auxiliary channel a1 type disk;
allocate auxiliary channel a2 type disk;
duplicate target database for standby from active database nofilenamecheck
dorecover
spfile
set db_unique_name='orcl24'
set log_archive_dest_1='LOCATION=/u01/app/oracle/archive/ORCL/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl24'
set log_archive_dest_2=''
set log_archive_dest_3=''
set fal_server='orcl23'
set fal_client='orcl24'
set db_file_name_convert='/oradata/ORCL/','/oradata/ORCL/'
set standby_file_management='MANUAL'
;
sql channel t1 "alter system archive log current";
sql channel a1 "alter system set standby_file_management='AUTO'";
}
_EOF
3、启动 Data Guard 日志应用
3.1 主库添加 standby redo log(可选但推荐)
Standby redo log 用于实时接收主库的在线日志,提高同步效率,组数比主库在线日志多 1 组:
-- 主库查询在线日志组数和大小
SQL> SELECT group#, bytes/1024/1024 AS size_mb FROM v$log;
GROUP# SIZE_MB
---------- ----------
1 20
2 20
3 20
-- 主库有 3 组 20MB 日志,备库添加 4 组 standby redo log
ALTER DATABASE ADD STANDBY LOGFILE thread 1 group 11 ('/oradata/ORCL/standby_redo11.log') SIZE 20M;
ALTER DATABASE ADD STANDBY LOGFILE thread 1 group 12 ('/oradata/ORCL/standby_redo12.log') SIZE 20M;
ALTER DATABASE ADD STANDBY LOGFILE thread 1 group 13 ('/oradata/ORCL/standby_redo13.log') SIZE 20M;
ALTER DATABASE ADD STANDBY LOGFILE thread 1 group 14 ('/oradata/ORCL/standby_redo14.log') SIZE 20M;
.2 备库启动日志应用
在备库启动 MRP(Managed Recovery Process)进程,应用主库传输的日志:
-- 实时应用(推荐,需 standby redo log)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
recover managed standby database using current logfile disconnect FROM SESSION;
-- 或仅应用归档日志(非实时)
-- ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
-- DISCONNECT FROM SESSION:后台运行 MRP 进程,不占用当前会话。
##备机由mount切换到open read only
--alter database recover managed standby database cancel;
--ALTER DATABASE OPEN READ ONLY;
--ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
4. Data Guard 状态验证
4.1 主库状态检查
-- 1. 查看主库角色和切换状态 (dg默认的保护模式 最大性能)
SYS@orcl SQL> select OPEN_MODE,DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL,SWITCHOVER_STATUS from v$database;
OPEN_MODE DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL SWITCHOVER_STATUS
-------------------- ---------------- -------------------- -------------------- --------------------
READ WRITE PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE TO STANDBY
-- 正常输出:DATABASE_ROLE='PRIMARY',SWITCHOVER_STATUS='TO STANDBY'
-- 2. 查看归档日志传输状态
SELECT dest_id, status, error, log_sequence FROM v$archive_dest;
SYS@orcl SQL> SELECT dest_id, status, error, log_sequence FROM v$archive_dest;
DEST_ID STATUS ERROR LOG_SEQUENCE
---------- --------- ----------------------------------------------------------------- ------------
1 VALID 33
2 VALID 34
3 VALID 34
-- 正常输出:STATUS='VALID',ERROR 为空,LOG_SEQUENCE 递增
4.2 备库状态检查
-- 1. 查看备库角色和切换状态
SELECT name,open_mode,database_role, switchover_status FROM v$database;
SYS@orcl SQL> SELECT name,open_mode,database_role, switchover_status FROM v$database;
NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS
--------- -------------------- ---------------- --------------------
ORCL READ ONLY WITH APPLY PHYSICAL STANDBY NOT ALLOWED
-- 正常输出:DATABASE_ROLE='PHYSICAL STANDBY',SWITCHOVER_STATUS='NOT ALLOWED'
-- 在switchover切换的时候 SWITCHOVER_STATUS='TO PRIMARY' ,此时表明没有primary存在可以切主
-- 2. 查看 MRP 进程状态
SELECT process, status, sequence# FROM v$managed_standby where PROCESS LIKE 'MRP%';
PROCESS STATUS SEQUENCE#
--------- ------------ ----------
MRP0 APPLYING_LOG 34
-- 正常输出:PROCESS='MRP0',STATUS='APPLYING_LOG',SEQUENCE# 与主库同步
-- 3. 查看 standby redo log 状态
SELECT group#, status FROM v$standby_log;
-- 正常输出:部分日志状态为'ACTIVE'(正在接收主库日志)
4.3 数据同步测试
在主库创建测试表并插入数据,验证备库是否同步:
-- 主库执行
CREATE TABLE dg19_vertify (id NUMBER, name VARCHAR2(30));
INSERT INTO dg19_vertify VALUES (1, 'Data Guard 19 vertify1');
INSERT INTO dg19_vertify VALUES (2, 'Data Guard 19 vertify2');
INSERT INTO dg19_vertify VALUES (3, 'Data Guard 19 vertify3');
INSERT INTO dg19_vertify VALUES (4, 'Data Guard 19 vertify4');
INSERT INTO dg19_vertify VALUES (5, 'Data Guard 19 vertify5');
INSERT INTO dg19_vertify VALUES (6, 'Data Guard 19 vertify6');
COMMIT;
ALTER SYSTEM SWITCH LOGFILE; -- 强制日志切换,触发归档传输
在备库查询数据(需将备库临时切换为只读模式,不影响日志应用):
-- 备库执行
ALTER DATABASE OPEN READ ONLY;
SELECT * FROM test_dg; -- 应能查询到主库插入的数据
################################################################################################
5. 切换演练
################################################################################################
5.1 switchover无损切换
切换DG步骤(无损切换 该过程中 主库orcl21关闭一次,备库orcl22可不关库, orcl23 orcl24保持原状)
关闭:先主库,后备机,开启的时候先开备库启动备库监听,再开主库
切换前: 主库orcl21 <--> 备库orcl22
--> orcl23备库 --> orcl24级联备库
5.1.1 先将主库orcl21切换成备库,然后将原主库启动到物理库的状态
##查看确认主节点状态
SELECT name,open_mode,database_role, switchover_status FROM v$database;
NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS
--------- -------------------- ---------------- --------------------
ORCL READ WRITE PRIMARY TO STANDBY
--#如果switchover_status为SESSIONS ACTIVE 则需要关闭会话, 此时需要带上with session shutdown;
--Alter database commit to switchover to physical standby;
--Alter database commit to switchover to physical standby with session shutdown;
SQL> Alter database commit to switchover to physical standby with session shutdown;
--5.1.2.关闭主库 (11.2.0.4以后自动关闭 可忽略)
--SQL> shutdown immediate
5.1.3.打开数据库nomount
SQL> startup nomount
5.1.4.更改主库为备库
SQL> alter database mount standby database;
5.1.5.打开新备库至read only状态
#取消应用日志
alter database recover managed standby database cancel;
#打开数据库
alter database open read only;
--归档同步
SQL> alter database recover managed standby database disconnect from session;
--如果配置了 standby redo log 并需要启用实时同步则执行以下代码
SQL> alter database recover managed standby database using current logfile disconnect from session;
#查看状态
select OPEN_MODE,PROTECTION_MODE,PROTECTION_LEVEL,SWITCHOVER_STATUS from v$database;
5.1.6.将备库orcl22切换成主库
SQL> select OPEN_MODE,PROTECTION_MODE,PROTECTION_LEVEL,SWITCHOVER_STATUS from v$database;
##如果备库还有未应用的日志则执行
SQL> alter database recover managed standby database disconnect from session;
#切主库
SQL> alter database commit to switchover to primary;
##11g 重启备机数据库
--SQL> shutdown immediate
--SQL> startup mount
--ALTER SYSTEM FLUSH REDO TO xxxx;
--alter database open;
##19c 可直接open
SQL> alter database open;
#查看状态
select OPEN_MODE,PROTECTION_MODE,PROTECTION_LEVEL,SWITCHOVER_STATUS from v$database;
切换日志进行检查
SQL> select max(sequence#) from v$log;
SQL>select sequence#,applied from v$archived_log;
SQL> alter system switch logfile;
## 切换后架构
主库orcl22 <--> 备库orcl21
--> orcl23备库 --> orcl24级联备库
## 在反向切一下恢复原状,复用上述步骤 主备节点交换一下,恢复原状.
################################################################################################
5.2 Dataguard的强制切换 failover
Dataguard的从库一般情况下都是用于数据的抽取和查询,但是万一在主库发生故障,就起到容灾冗余的作用了,此时需要备库强制切主库。
这种场景下主库不可用无法操作,所以只需在从库执行以下操作
5.2.1 停止应用恢复模式(强制停止MRP0应用)
alter database recover managed standby database cancel;
--alter database recover managed standby database finish ;
--alter database recover managed standby database finish SKIP STANDBY LOGFILE;
alter database recover managed standby database finish force;
5.2.2 从库切换成主库
alter database commit to switchover to primary;
5.2.3 启动数据库
Alter database open;
-- (重要)重置日志,清除旧DG历史
-- Resetlogs命令表示一个数据库逻辑生存期的结束和另一个数据库逻辑生存期的开始,每次使用Resetlogs命令的时候,SCN不会被重置,不过oracle会重置日志序列号,而且会重置联机重做日志内容。
ALTER DATABASE RESETLOGS;
5.2.4 检查备库的状态
select open_mode,database_role from v$database;
select OPEN_MODE,DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL,SWITCHOVER_STATUS from v$database;
5.2.5 切换完成后,备机IP提供对外服务。
5.2.6 原主库加入DG集群,按照新节点加入处理。
##如开启闪回数据库功能可以闪回到切换前的时间点,借鉴Snapshot Standby的处理方式
##alter database convert to physical standby;
##########################################################################################################################
5.3 Dataguard模式切换
ADG三种模式切换及介绍
5.3.1 MAX PERFORMANCE切换到其他
5.3.1.1 切换到最大保护模式(PERFORMANCE-->PROTECTION)
--主库操作
--切换到PROTECTION需要重启 mount阶段执行
alter database set standby database to maximize protection;
shutdown immediate;
startup mount;
alter database set standby database to maximize protection;
alter database open;
--ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
--主备库都是下面的输出(database_role肯定是有区别的)
select name,protection_mode,database_role,switchover_status from v$database;
--PRIMARY
NAME PROTECTION_MODE DATABASE_ROLE SWITCHOVER_STATUS
--------- -------------------- ---------------- --------------------
ORCL MAXIMUM PROTECTION PRIMARY TO STANDBY
--STANDBY
NAME PROTECTION_MODE DATABASE_ROLE SWITCHOVER_STATUS
--------- -------------------- ---------------- --------------------
ORCL MAXIMUM PROTECTION PHYSICAL STANDBY NOT ALLOWED
为了不重启可以迂回一下:
PERFORMANCE--> AVAILABILITY--> PROTECTION
alter database set standby database to maximize availability;
alter database set standby database to maximize protection;
5.3.1.2 切换到最大可用模式(PERFORMANCE-->AVAILABILITY)
--主库不需要重启
alter database set standby database to maximize availability;
5.3.2 MAX AVAILABILITY切换到其他
5.3.2.1切换到最大性能模式(AVAILABILITY-->PERFORMANCE)
--主库操作
alter database set standby database to maximize performance;
5.3.2.2切换到最大保护模式(AVAILABILITY-->PROTECTION)
--主库操作不需要重启
alter database set standby database to maximize protection;
5.3.3 MAX PROTECTION切换到其他
5.3.3.1切换到最大性能模式(PROTECTION-->PERFORMANCE)
--主库操作
alter database set standby database to maximize performance;
5.3.3.2切换到最大可用模式(PROTECTION-->AVAILABILITY)
--主库操作
alter database set standby database to maximize availability;
总结
只有PERFORMANCE切换到PROTECTION模式的时候需要重启到MOUNT状态,其他的无论怎么切换都不需要重启;
还有就是要注意log_archive_dest_n中的参数,AVAILABILITY PROTECTION一定要是LGWR SYNC AFFIRM,PERFORMANCE可以是LGWR或者ARCH
################################################################################################
5.4 物理备库、快照备库的相互转换
物理备库 (Physical Standby)
物理备库是通过 Redo Apply 技术,在数据块级别与主库保持完全一致的副本。它的核心目的就是灾备和高可用。
工作原理:它持续接收并实时应用从主库传来的 Redo 日志,保持与主库的数据同步。在 Oracle 11g 及以后,它甚至可以在只读打开的情况下,一边提供查询服务,一边应用日志(需 Active Data Guard 许可),这就是常说的“实时查询”功能。
关键特性:数据与主库完全同步,支持快速的角色切换(Switchover/Failover),是灾难恢复的首选方案。
典型用途:作为主库的灾备副本,在计划内或意外宕机时快速接管业务,同时也能分担主库的备份和查询压力。
快照备库 (Snapshot Standby)
快照备库是从物理备库转换而来的一种特殊状态。它最大的特点是可读写,但这一特性也决定了它最主要的用途是开发和测试。
工作原理:快照备库会持续接收来自主库的 Redo 日志,但不会应用它们。这意味着它和主库的数据会渐行渐远。你可以像操作普通数据库一样,在快照备库上进行任意的读写操作。
关键特性:可读写,数据与主库不同步。当你想把它切换回物理备库时,所有在快照期间做的本地修改都会被丢弃,然后它会开始应用之前积压的 Redo 日志,重新与主库同步。
重要前提:要使用快照备库,必须在物理备库上启用闪回数据库(Flashback Database)功能。
典型用途:提供一个与生产环境在某个时间点一致、但可以随意改动的"沙盒"环境,非常适合用来做功能验证、性能测试或在上面运行一些需要读写权限的临时报表。
5.4.1、物理备库切换快照备库
5.4.1.1. 如果正在运行日志应用,先停止
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
5.4.1.2. 确保数据库为MOUNTED状态
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
5.4.1.3. 确保已经配置快速恢复区,但不用开启闪回数据库功能
SHOW PARAMETER db_recovery_file_dest;
#如何没有配置快速恢复区,请使用以下SQL语句配置:
ALTER SYSTEM SET db_recovery_file_dest_size=大小;
ALTER SYSTEM SET b_recovery_file_dest=’目录’;
5.4.1.4. 使用如下SQL语句完成转换
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;
5.4.1.5. 此时数据库为MOUNTED状态,打开可读写数据库
ALTER DATABASE OPEN;
5.4.2、快照备库切换物理备库
5.4.2.1.如果是rac环境,只保留一个实例,关闭其他实例
5.4.2.2.确保数据库状态为MOUNTED
5.4.2.3.使用如下SQL语句完成切换
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
5.4.2.4.切换后数据库状态为DISMOUNT,此时必须重启数据库,也就是SHUT DOWN IMMEDIATE然后再STARTUP.
shutdown immediate;
startup nomount;
##如果直接ALTER DATABASE MOUNT/OPEN,会报ORA-00750错误。
5.4.2.5.物理备库应用日志
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
################################################################################################
5.5 物理备库转逻辑备库 逻辑备库(Logical Standby Database)是 Oracle Data Guard 中一种非常有特色的备库类型。它与物理备库的核心区别在于日志应用方式:物理备库是“块对块”的物理复制,
而逻辑备库则是将 Redo 日志“翻译”成 SQL 语句再执行,实现逻辑层面的数据同步.
核心工作原理:SQL Apply
逻辑备库依赖 SQL Apply 技术。它使用 LogMiner 组件,将接收到的 Redo 日志解析成等价的 SQL 语句,然后在备库上重新执行这些 SQL,从而实现与主库的数据一致。
这个过程由一系列后台进程协同完成,主要包括:
挖掘引擎(Mining Engine):包含 READER、PREPARER、BUILDER 等进程,负责从日志中解析并提取出变更记录。
应用引擎(Apply Engine):包含 ANALYZER、COORDINATOR、APPLIER 等进程,负责将提取出的变更应用到备库,并管理事务的提交顺序
逻辑备库vs物理备库的核心差异
特性 逻辑备库 (Logical Standby) 物理备库 (Physical Standby)
日志应用方式 SQL Apply:将 Redo 转换为 SQL 语句执行。 Redo Apply:在数据块级别直接应用 Redo 变更。
数据库状态 应用日志时,备库处于 OPEN 状态,可以执行查询和报表操作。 应用日志时,通常处于 MOUNT 或只读状态(需 Active Data Guard 许可才能同时查询和应用)。
物理结构 物理结构(如数据文件分布、索引)可以与主库不同。 物理结构必须与主库完全一致。
主要优势 灵活性高:可在备库上创建额外的索引或物化视图来优化查询,业务中断更少。 性能更高:Redo Apply 比 SQL Apply 更高效,支持所有数据类型和操作,是灾难恢复的首选。
主要限制 支持的数据类型和操作有限,存在逻辑不一致风险。 无法在备库上对数据结构进行独立修改。
逻辑备库关键限制与注意事项
由于需要通过 SQL 重新执行变更,逻辑备库存在一些必须注意的限制:
数据类型支持有限:不支持嵌套表、ROWID、BFILE 等复杂或特定类型。可以通过查询 DBA_LOGSTDBY_UNSUPPORTED 视图查看不支持的表的详细信息
表必须能被唯一标识:主库的表必须有主键或唯一索引/约束。否则,Oracle 需要记录额外信息来标识行,这会增加日志开销且效率较低。可以通过 DBA_LOGSTDBY_NOT_UNIQUE 视图检查存在问题的表
部分操作和对象不同步:SYS 用户下的对象不会被同步,并且部分 DDL 语句可能被跳过或不支持
需开启补充日志:逻辑备库正常运行的前提,是主库必须开启主键和唯一索引级别的补充日志(Supplemental Logging),DBMS_LOGSTDBY.BUILD 过程可以自动完成这一设置.
逻辑备库主要通过 DBMS_LOGSTDBY 包进行精细化管理:
配置 SQL Apply:使用 APPLY_SET 过程可调整 APPLY_SERVERS 数量、控制 SGA 使用等参数。
跳过特定操作:使用 SKIP 过程可以让备库不应用某些 DDL 或特定表的变更。
监控状态:通过 V$LOGSTDBY、V$LOGSTDBY_STATS、DBA_LOGSTDBY_PROGRESS 等视图监控日志应用进度和进程状态
总的来说,逻辑备库虽然牺牲了部分性能和数据类型的支持,但换来了更大的灵活性,尤其适合需要备库始终可读并支持定制化查询的场景。同时,了解其限制是成功应用的前提。
5.5.1 物理备库转逻辑备库:
5.5.1.1. 提前准备,
逻辑备库需要在主库做下述变更:
--1). 构建LogMiner字典
--先停用physical备库的MRP进程以避免提前应用含LogMiner字典的REDO数据
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
--主库构建LogMiner字典
create tablespace logmnrtbs datafile '/oradata/ORCL/logmnrtbs.dbf' size 20m autoextend on next 20m maxsize 10240m;
execute dbms_logmnr_d.set_tablespace('logmnrtbs');
exec dbms_logstdby.build;
--2). 开启supplemental日志 (pk + unique级别)
--主库mount阶段修改 开启主键和唯一索引的补充日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE) COLUMNS;
5.5.1.2.物理备库转逻辑备库
shutdown immediate;
startup mount exclusive;
--ALTER DATABASE RECOVER TO LOGICAL STANDBY db_name;
--alter database recover to logical standby orcl25 ; --(数据库名是db_name,很重要一定要弄对)
alter database recover to logical standby KEEP IDENTITY; --11g 版本中引入,保证standby数据库的DB_NAME 和 DBID不变化,从而方便进行rolling upgrade
--由于逻辑standby与primary数据库事务并不一致,因此第一次打开时必须指定resetlogs子句
shutdown immediate;
startup mount;
ALTER DATABASE OPEN RESETLOGS;
–开启实时应用
ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
–开启应用
ALTER DATABASE START LOGICAL STANDBY APPLY;
–关闭应用
ALTER DATABASE STOP LOGICAL STANDBY APPLY;
--查看dg状态
select name,open_mode,database_role,protection_mode from v$database;
5.5.1.3.优化性能
EXECUTE DBMS_LOGSTDBY.APPLY_SET('APPLY_SERVERS',8);
EXECUTE DBMS_LOGSTDBY.APPLY_SET('PREPARE_SERVERS',4);
EXECUTE DBMS_LOGSTDBY.APPLY_SET('APPLY_SERVERS',16);
ALTER DATABASE STOP LOGICAL STANDBY APPLY;
ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
--过滤对于审计表的处理
exec dbms_logstdby.skip('DML','SYS','AUD$');
exec dbms_logstdby.skip('SCHEMA_DDL','SYS','AUD$');
5.5.1.4.逻辑dg的监控SQL
1)、dba_logstdby_events 查看逻辑standby近期操作日志
2)、dba_logstdby_log 记录当前归档日志应用情况
select * from dba_logstdby_events order by event_time
3)、v$logstdby_status 显示LogMiner的统计信息和状态
4)、v$logstdby 显示当前log应用服务的相关信息,常用于诊断日志逻辑应用的性能问题
SELECT type, status, high_scn FROM v$logstdby;
5)、v$logstdby_progress 显示log应用服务当前进行状态
6)、v$logstdby_status 显示sql应用的大致状态
5.5.1.5.逻辑dg转换后,temp表空间可能文件不对或者没有,如果需要处理TEMP就进行TEMP表空间的处理
ALTER DATABASE TEMPFILE '/oradata/ORCL/temp01.dbf' DROP;
create temporary tablespace temp1 tempfile '/oradata/ORCL/temp.dbf' size 20m autoextend on next 20m maxsize unlimited;
################################################################################################
6. Data Guard Broker
################################################################################################
使用Data Guard Broker 的要求
1). 相关DB 使用 SPFILE:必须使用服务器参数文件(Server Parameter File, SPFILE)启动数据库,以便 Broker 能够动态修改并持久化相关参数。
2). 启动 DMON 进程:必须将所有数据库的初始化参数 DG_BROKER_START 设置为 TRUE,这样数据库实例启动时才会自动拉起 DMON 进程。
alter system set DG_BROKER_START=true scope=both;
3). 网络配置:需要正确配置 Oracle Net(tnsnames.ora 和 listener.ora),确保所有数据库之间可以互相通信。
特别是需要为 Broker 的静态连接(如 db_unique_name_DGMGRL)配置监听服务,以便在数据库关闭时仍能通过 DGMGRL 连接并重启它
4). 21c 之前,rman创建辅助库及之前还是要做的。dg相关的配置可以交由broker来进行。21c之后简便到什么程度没用过,有实操经验的请留言。
Data Guard Broker的功能在持续增强。例如从 Oracle 21c 开始,可以使用 PREPARE DATABASE FOR DATA GUARD 命令,
一条语句就能自动完成主库的日志模式、强制日志、快速恢复区等多项基础配置,让部署变得更加简。
################################################################################################
用data guard Broker管理之前手动搭建dg
##################################################
6.1 配置管理:
##################################################
##创建配置及其主备节点加入
CREATE CONFIGURATION 'orcl_dgconf' AS PRIMARY DATABASE IS 'orcl21' CONNECT IDENTIFIER IS 'orcl21'; 创建一个新的 Broker 配置,并指定其中的主数据库
ADD DATABASE 'orcl22' AS CONNECT IDENTIFIER IS 'orcl22' MAINTAINED AS PHYSICAL; 将备库加入已存在的 Broker 配置中
DGMGRL> ADD DATABASE 'orcl22' AS CONNECT IDENTIFIER IS 'orcl22' MAINTAINED AS PHYSICAL;
Database "orcl22" added
DGMGRL> ADD DATABASE 'orcl23' AS CONNECT IDENTIFIER IS 'orcl23' MAINTAINED AS PHYSICAL;
Database "orcl23" added
DGMGRL> ADD DATABASE 'orcl24' AS CONNECT IDENTIFIER IS 'orcl24' MAINTAINED AS PHYSICAL;
Database "orcl24" added
##################################################
6.2 redo流转规则配置
##################################################
##指定将日志发送给谁(orcl21 <-> orcl22 互备 -> orcl23 中间备库 -> orcl24 级联备库)
##传输模式并不是直接默认 SYNC 或 ASYNC,而是默认使用由目标备库的 LogXptMode 属性所指定的模式
##LogXptMode属性默认值是 ASYNC
EDIT DATABASE 'orcl21' SET PROPERTY 'RedoRoutes' = '(LOCAL : orcl22,orcl23)';
DGMGRL> EDIT DATABASE 'orcl21' SET PROPERTY 'RedoRoutes' = '(LOCAL : orcl22,orcl23)';
Property "RedoRoutes" updated
DGMGRL> EDIT DATABASE 'orcl22' SET PROPERTY 'RedoRoutes' = '(LOCAL : orcl21,orcl23)';
Property "RedoRoutes" updated
DGMGRL> EDIT DATABASE 'orcl23' SET PROPERTY 'RedoRoutes' = '(orcl21,orcl22 : orcl24 ASYNC)';
Property "RedoRoutes" updated
EDIT DATABASE 'orcl21' SET PROPERTY 'LogXptMode'='SYNC'; 修改数据库的特定属性,例如日志传输模式,用于调整数据保护级别
DGMGRL> EDIT DATABASE 'orcl21' SET PROPERTY 'LogXptMode'='SYNC';
Property "LogXptMode" updated
ENABLE CONFIGURATION; 启用 Broker 配置,使其开始生效并管理数据库
DGMGRL> ENABLE CONFIGURATION;
Enabled.
##DISABLE CONFIGURATION; 禁用 Broker 配置,停止 Broker 对所有数据库的管理
##REMOVE DATABASE 'orcl24'; 将指定的备库从 Broker 配置中移除
###这样就搭建了上述手动搭建的dg架构
即 orcl21 <-> orcl22 互备 orcl23 中间备库 orcl24 级联备库
##################################################
6.3 配置查看
##################################################
SHOW DATABASE 'orcl21'; 显示指定数据库的详细状态、角色和应用情况
DGMGRL> SHOW DATABASE 'orcl21';
.......
DGMGRL> SHOW DATABASE VERBOSE 'orcl21'; 显示指定数据库的所有可配置属性及其当前值,用于深度排查
##orcl_dgconf结构树
DGMGRL> show configuration;
Configuration - orcl_dgconf
Protection Mode: MaxPerformance
Members:
orcl21 - Primary database
orcl22 - Physical standby database
orcl23 - Physical standby database
orcl24 - Physical standby database (receiving current redo)
Fast-Start Failover: Disabled
Configuration Status:
SUCCESS (status updated 54 seconds ago)
##################################################
6.4 DG角色切换: (主关闭一次,备机升主不用关闭,命令集成化,操作便捷,)
##################################################
SWITCHOVER TO 'orcl22'; 计划内角色切换,将主库和备库角色互换,用于计划内维护,通常无需数据丢失
##注意这里切换原主节点会重启一次,新主节点会从open read only -> mount -> open read write 在此期间会关闭连接会话(CLOSE: all sessions shutdown,不是重启哦),和手动操作保持一致。
DGMGRL> SWITCHOVER TO 'orcl22';
Performing switchover NOW, please wait...
Operation requires a connection to database "orcl22"
Connecting ...
Connected to "orcl22"
Connected as SYSDBA.
New primary database "orcl22" is opening...
Operation requires start up of instance "orcl" on database "orcl21"
Starting instance "orcl"...
Connected to an idle instance.
ORACLE instance started.
Connected to "orcl21"
Database mounted.
Database opened.
Connected to "orcl21"
Switchover succeeded, new primary is "orcl22"
DGMGRL>
###可以看到dg的结构变化了,可与7.3对比一下,当然也可以用相关SQL查询
DGMGRL> show configuration;
Configuration - orcl_dgconf
Protection Mode: MaxPerformance
Members:
orcl22 - Primary database
orcl21 - Physical standby database
orcl23 - Physical standby database
orcl24 - Physical standby database (receiving current redo)
Fast-Start Failover: Disabled
Configuration Status:
SUCCESS (status updated 54 seconds ago)
##################################################
6.5 切换到不同保护模式:
##################################################
--最大性能 此为默认模式
EDIT CONFIGURATION SET PROTECTION MODE AS MAXPERFORMANCE;
--最大可用 (MaxAvailability)
1). 将备库的 LogXptMode 设置为 SYNC ,默认是ASYNC
EDIT DATABASE '备库名' SET PROPERTY 'LogXptMode'='SYNC';
EDIT DATABASE orcl22 SET PROPERTY 'LogXptMode'='SYNC';
EDIT DATABASE orcl23 SET PROPERTY 'LogXptMode'='SYNC';
2). 升级操作,需要备库配置了 Standby Redo Log (参见手动部分增加standby redo log)
略
3). 变更最大可用模式
EDIT CONFIGURATION SET PROTECTION MODE AS MAXAVAILABILITY;
SYS@orcl SQL> select name,open_mode,database_role,protection_mode from v$database;
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
ORCL READ WRITE PRIMARY MAXIMUM PERFORMANCE
-> orcl21 22 23 都变了最大可用 ,24级联未变仍为最大性能
SYS@orcl SQL> /
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
ORCL READ WRITE PRIMARY MAXIMUM AVAILABILITY
--最大保护 (MaxProtection)
1).先按最大可用模式完成切换,再将备库 LogXptMode 设为 SYNC
EDIT DATABASE '备库名' SET PROPERTY 'LogXptMode'='SYNC';
2). 升级操作,需要备库配置了 Standby Redo Log (参见手动部分增加standby redo log)
3). 变更最大可用模式
EDIT CONFIGURATION SET PROTECTION MODE AS MAXAVAILABILITY;
4). 变更最大保护模式( 不能从最大性能直接切换到此模式。此模式下,若无法与备库同步,主库会宕机以保护数据,生产环境慎用 )
EDIT CONFIGURATION SET PROTECTION MODE AS MAXPROTECTION;
-> orcl21 22 23 都变了 ,24级联未变
SYS@orcl SQL> /
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
ORCL READ WRITE PRIMARY MAXIMUM PROTECTION
##如调整LogXptMode 备机保护模式会变化
EDIT DATABASE orcl23 SET PROPERTY 'LogXptMode'='ASYNC';
orcl21 22 未变, orcl23的保护模式变化为:
SYS@orcl SQL> /
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
ORCL READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE
相关的限制和手动操作类同。理解了手动操作的关节,此处确实更便捷。
##################################################
6.6 Data Guard Broker常用命令:
##################################################
会话与脚本控制 CONNECT sys@orcl
HELP failover
@/path/script.dgm 执行一个包含 DGMGRL 和 SQL 命令的脚本文件,可以实现自动化运维,是 12c 引入的重要特性
SPOOL /path/output.log 将当前会话的所有输入和输出记录到日志文件,方便归档和问题追溯
HOST ls -l 或 ! 在不退出 DGMGRL 的情况下执行操作系统命令,提升操作效率
状态监控
SHOW CONFIGURATION; 最核心的监控命令。显示整个 Broker 配置的概览,包括保护模式、成员角色和整体状态是否 SUCCESS
SHOW DATABASE 'orcl'; 显示指定数据库的详细状态、角色和应用情况
SHOW DATABASE VERBOSE 'orcl'; 显示指定数据库的所有可配置属性及其当前值,用于深度排查
SHOW FAST_START FAILOVER; 显示快速启动故障转移(Fast-Start Failover)的配置和状态信息
角色切换与恢复:
SWITCHOVER TO 'orcl_stby'; 计划内角色切换,将主库和备库角色互换,用于计划内维护,通常无需数据丢失
FAILOVER TO 'orcl_stby' IMMEDIATE; 计划外故障切换,在主库故障且无法恢复时,将备库强制提升为新主库,可能导致数据丢失
REINSTATE DATABASE 'orcl'; 在 Failover 完成后,将原主库重新加入配置,恢复其作为备库的身份
关闭数据库:
停止向该备库传输日志(主库操作):
EDIT DATABASE <db_name> SET STATE='TRANSPORT-OFF';
EDIT DATABASE <db_name> SET STATE='TRANSPORT-ON';
##max protection 、MAX AVAILABILITY 不允许执行 ,最大性能可以
EDIT DATABASE orcl21 SET STATE='TRANSPORT-OFF';
EDIT DATABASE orcl21 SET STATE='TRANSPORT-ON';
EDIT DATABASE orcl22 SET STATE='APPLY-OFF';
EDIT DATABASE orcl22 SET STATE='APPLY-ON';
停止备库的日志应用(备库操作):
EDIT DATABASE <db_name> SET STATE='APPLY-OFF';
EDIT DATABASE <db_name> SET STATE='APPLY-ON';
SHUTDOWN 'orcl24';
SHUTDOWN DATABASE 'orcl23';
SHUTDOWN DATABASE 'orcl22';
shutdown;
##################################################
6.7 常见错误解决:
##################################################
1. DGMGRL> ADD DATABASE 'orcl22' AS CONNECT IDENTIFIER IS 'orcl22' MAINTAINED AS PHYSICAL;
Error: ORA-16698: member has a LOG_ARCHIVE_DEST_n parameter with SERVICE attribute set
解决方案:清除冲突的手工配置
核心操作就是,在尝试创建 Broker 配置或添加备库之前,先清除掉备库上所有带有 SERVICE 属性的远程日志归档参数。通常的做法是用空字符串将其置空
-- 主库和备库都需要执行,将远程日志传输目标置空,有的都处理
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_3='' SCOPE=BOTH;
2.Broker 密码验证问题 报错 ora-01017
DGMGRL> SWITCHOVER TO 'orcl22';
Performing switchover NOW, please wait...
Operation requires a connection to database "orcl22"
Connecting ...
ORA-01017:
强制走密码认证通道,确保sys使用的正是密码文件。本地BEQ认证会被拒绝
echo "SQLNET.AUTHENTICATION_SERVICES=(NONE)" > $ORACLE_HOME/network/admin/sqlnet.ora
DGMGRL> connect / as sysdba
Connected to "orcl21"
Connected as SYSDBA.
DGMGRL> VALIDATE STATIC CONNECT IDENTIFIER FOR orcl21;
Oracle Clusterware is not configured on database "orcl21".
Connecting to database "orcl21" using static connect identifier "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=racnode1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl21_DGMGRL)(INSTANCE_NAME=orcl)(SERVER=DEDICATED)(STATIC_SERVICE=TRUE)))" ...
ORA-01017: "invalid username/password; logon denied"
原因是: 此时 DGMGRL 内部没存入正确的SYS用户密码。使用sys用户密码登入即解决(更新DGMGRL中的sys及其口令)
DGMGRL> connect sys/oracle@orcl21 as sysdba
Connected to "orcl21"
Connected as SYSDBA.
DGMGRL>
DGMGRL> VALIDATE STATIC CONNECT IDENTIFIER FOR orcl21;
Oracle Clusterware is not configured on database "orcl21".
Connecting to database "orcl21" using static connect identifier "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=racnode1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl21_DGMGRL)(INSTANCE_NAME=orcl)(SERVER=DEDICATED)(STATIC_SERVICE=TRUE)))" ...
Succeeded.
The static connect identifier allows for a connection to database "orcl21".
################################################################################################
7. Far Sync 功能
################################################################################################
Far Sync 实例是 Oracle 12c 引入的一项 Active Data Guard 功能,它充当一个轻量级、无数据文件的 Redo 日志中转站。
它的核心价值在于在保证零数据丢失的前提下,有效解决了主库与远端备库之间因同步传输(SYNC)带来的提交延迟问题
核心概念
本质:一个仅有控制文件、参数文件和密码文件,但没有用户数据文件的 Oracle 数据库实例。它无法被打开访问,也不能运行 Redo Apply,因此永远无法作为主库或备库角色
作用:它从主库同步接收 Redo,然后异步转发给最终的备库。这使得主库只需与近距离的 Far Sync 实例进行同步传输,从而将网络延迟的影响降到最低。
许可要求:这是 Oracle Active Data Guard 的一项特性,使用需要该功能的许可证
工作机制:为何能兼顾性能与零丢失?
主库提交:事务提交时,主库会同步(SYNC)地将 Redo 发送给本地 Far Sync 实例
Far Sync 确认:Far Sync 实例将 Redo 写入 Standby Redo Log 后,即向主库返回确认(ACK)。由于两者距离近、网络延迟低,主库的提交响应时间大幅缩短
异步转发:Far Sync 实例在收到确认后,立即以异步(ASYNC)方式将 Redo 转发给真正的地理远端备库
这套机制确保了主库性能的同时,也保证了如果主库发生故障,只要 Far Sync 实例同步完成,就不会有数据丢失
支持的配置与使用场景
保护模式:Far Sync 实例支持在 最高可用性(Maximum Availability) 和 最高性能(Maximum Performance) 模式下工作。
典型场景:主要用于跨数据中心的灾备。在“两地三中心”或跨云(如 OCI 与 AWS)的架构中,Far Sync 是实现远距离零数据丢失的关键组件。
级联部署:支持多个 Far Sync 实例形成级联架构,例如从主中心 -> 同城 Far Sync -> 异地 Far Sync -> 最终备库,以实现更复杂的灾备拓扑。
如何创建与管理
根据你的管理工具,主要有两种创建方式:
方法一:手动配置(传统方式)
步骤与创建物理备库类似,区别在于不需要复制和恢复数据文件。
创建控制文件:在主库执行 ALTER DATABASE CREATE FAR SYNC INSTANCE CONTROLFILE AS '/path/control01.ctl'; 生成 Far Sync 控制文件。
准备参数文件:基于主库 PFILE 修改,设置 DB_UNIQUE_NAME、CONTROL_FILES,并正确配置 LOG_ARCHIVE_CONFIG 和 LOG_ARCHIVE_DEST_n 参数。官方文档提供了一个详细示例。
复制文件并启动:将控制文件和密码文件复制到 Far Sync 主机,并启动到 MOUNT 状态。
##################################################
7.1.1 手动配置far sync
##################################################
概要信息如下:
主机名 db_unique comments
racnode31 orcl31 主节点
racnode32 orcl32 far sync节点
racnode33 orcl33 far sync 高可用节点
racnode34 orac34 std节点
##redo流转
orcl31 -> orcl32 -> oracl24
-> orcl33 alternate
7.1.1.1 主节点racnode31:
1. 数据库软件安装 + dbca建库 (略)
2. dg配置参数
ALTER SYSTEM SET log_archive_config='DG_CONFIG=(orcl31,orcl32,orcl33,orcl34)' scope=both;
alter system set log_archive_dest_2='SERVICE=orcl32 lgwr sync AFFIRM valid_for=(ONLINE_LOGFILES,primary_role) db_unique_name=orcl32 GROUP=1 PRIORITY=1' scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_2=ENABLE scope=both;
alter system set log_archive_dest_3='SERVICE=orcl33 lgwr sync AFFIRM valid_for=(ONLINE_LOGFILES,primary_role) db_unique_name=orcl33 GROUP=1 PRIORITY=1' scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_3=ALTERNATE scope=both;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_4='SERVICE=orcl34 ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl34 GROUP=1 PRIORITY=8' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_4='ALTERNATE' SCOPE=BOTH;
alter system set DG_BROKER_START=TRUE scope=both;
alter system set FAL_SERVER=orcl32 scope=both;
3. 准备far sync需要的文件
3.1 准备far sync控制文件
ALTER DATABASE CREATE FAR SYNC INSTANCE CONTROLFILE AS '/home/oracle/control32.ctl';
3.2 以pfile的方式导出db参数文件
create pfile='/home/oracle/init_far.ora' from spfile;
3.3 将 init_far.ora control32.ctl 密码文件以及listener.ora,tnsnames.ora文件复制到 其他节点(racnode32/33/34)
7.1.1.2 racnode32:
1. 数据库软件安装(略)
2. duplicate far sync实例
2.1 修改pfile参数文件中的 DB_UNIQUE_NAME、CONTROL_FILES (sga pga可以调整以节约资源)参数
修改 listener.ora、tnsnames.ora文件
2.2 用pfile文件启动实例到nomount状态
sqlplus / as sysdba
STARTUP NOMOUNT PFILE='/home/oracle/init_far.ora'
2.3 duplicate far sync实例
rman<<_EOF
connect target sys/oracle@orcl31
connect auxiliary sys/oracle@orcl32
run {
allocate channel t1 type disk;
allocate auxiliary channel a1 type disk;
DUPLICATE TARGET DATABASE FOR FARSYNC FROM ACTIVE DATABASE;
}
exit;
_EOF
##19c遇到下述错误
sql statement: alter system archive log current
Oracle error from auxiliary database: ORA-01511: error in renaming log/data files
ORA-01516: nonexistent log file, data file, or temporary file "/oradata/ORCL/redo01.log" in the current container
RMAN-05535: warning: All redo log files were not defined properly.
Oracle error from auxiliary database: ORA-01511: error in renaming log/data files
ORA-01516: nonexistent log file, data file, or temporary file "/oradata/ORCL/redo02.log" in the current container
RMAN-05535: warning: All redo log files were not defined properly.
Oracle error from auxiliary database: ORA-01511: error in renaming log/data files
ORA-01516: nonexistent log file, data file, or temporary file "/oradata/ORCL/redo03.log" in the current container
RMAN-05535: warning: All redo log files were not defined properly.
RMAN-05535: warning: All redo log files were not defined properly.
RMAN-05535: warning: All redo log files were not defined properly.
RMAN-05535: warning: All redo log files were not defined properly.
RMAN-05535: warning: All redo log files were not defined properly.
Finished Duplicate Db at 12-JUL-26
原因:
redo01.log~redo03.log未生成,far sync不需要redo 可以忽略。
standby_redoxx.log 未正确生成, 实际为:/u01/app/oracle/product/19.3.0/db/dbs/broken3~broken6
可能是19c的bug ,看着别扭 不影响测试,如需要调整参考xxx。
3. dg参数
create spfile from pfile='/home/oracle/init_far.ora';
shutdown;
startup mount;
ALTER SYSTEM SET log_archive_config='DG_CONFIG=(orcl31,orcl32,orcl33,orcl34)' scope=both;
ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/app/oracle/archive/ORCL/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl32' scope=both;
ALTER SYSTEM SET log_archive_dest_2='SERVICE=orcl34 ASYNC LGWR VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=orcl34' scope=both;
alter system set log_archive_dest_3='' scope=both;
alter system set FAL_SERVER=orcl31 scope=both;
alter system set FAL_CLIENT=orcl32 scope=both;
7.1.1.3 racnode33:
1. 数据库软件安装(略)
2. duplicate far sync实例
2.1 修改pfile参数文件中的 DB_UNIQUE_NAME、CONTROL_FILES (sga pga可以调整以节约资源)参数
修改 listener.ora、tnsnames.ora文件
2.2 用pfile文件启动实例到nomount状态
sqlplus / as sysdba
STARTUP NOMOUNT PFILE='/home/oracle/init_far.ora'
2.3 duplicate far sync实例
rman<<_EOF
connect target sys/oracle@orcl31
connect auxiliary sys/oracle@orcl33
run {
allocate channel t1 type disk;
allocate auxiliary channel a1 type disk;
DUPLICATE TARGET DATABASE FOR FARSYNC FROM ACTIVE DATABASE;
}
exit;
_EOF
3. dg参数
create spfile from pfile='/home/oracle/init_far.ora';
shutdown;
startup mount;
ALTER SYSTEM SET log_archive_config='DG_CONFIG=(orcl31,orcl32,orcl33,orcl34)' scope=both;
ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/app/oracle/archive/ORCL/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl33' scope=both;
ALTER SYSTEM SET log_archive_dest_2='SERVICE=orcl34 ASYNC LGWR VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=orcl34' scope=both;
alter system set log_archive_dest_3='' scope=both;
alter system set FAL_SERVER=orcl31 scope=both;
alter system set FAL_CLIENT=orcl33 scope=both;
7.1.1.4 racnode34:
1. 数据库软件安装(略)
2. duplicate far sync实例
2.1 该节点dg备节点非far sync节点,上面是运行备数据库的故采用物理备机的方式从主节点拉取文件,只要设置最简pfile启动即可
修改 listener.ora、tnsnames.ora文件
echo "*.db_name='orcl'" >/home/oracle/init.ora
2.2 用pfile文件启动实例到nomount状态
sqlplus / as sysdba
STARTUP NOMOUNT PFILE='/home/oracle/init.ora'
2.3 duplicate standby database实例
rman<<_EOF
connect target sys/oracle@orcl31
connect auxiliary sys/oracle@orcl34
run {
allocate channel t1 type disk;
allocate channel t2 type disk;
allocate auxiliary channel a1 type disk;
allocate auxiliary channel a2 type disk;
duplicate target database for standby from active database nofilenamecheck
dorecover
spfile
set db_unique_name='orcl34'
set log_archive_dest_1='LOCATION=/u01/app/oracle/archive/ORCL/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl34'
set log_archive_dest_2=''
set log_archive_dest_3=''
set fal_server='orcl31','orcl32'
set fal_client='orcl34'
set db_file_name_convert='/oradata/ORCL/','/oradata/ORCL/'
set log_file_name_convert='/oradata/ORCL/','/oradata/ORCL/'
set standby_file_management='MANUAL'
;
sql channel a1 "alter system set standby_file_management='AUTO'";
}
exit;
_EOF
3. dg参数
ALTER SYSTEM SET log_archive_config='DG_CONFIG=(orcl31,orcl32,orcl33,orcl34)' scope=both;
ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/app/oracle/archive/ORCL/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl34' scope=both;
alter system set fal_server='orcl31,orcl32,orcl33' scope=both;
4.备库启动日志应用(far sync不需要启用)
在备库启动 MRP(Managed Recovery Process)进程,应用主库传输的日志:
-- 实时应用(推荐,需 standby redo log)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
-- 或仅应用归档日志(非实时)
-- ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
-- DISCONNECT FROM SESSION:后台运行 MRP 进程,不占用当前会话。
##备机由mount切换到open read only
--alter database recover managed standby database cancel;
--ALTER DATABASE OPEN READ ONLY;
--ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
至此手动搭建far sync完成
7.1.1.5 同步诊断:
##dg同步状态是否正确应用查询
col dest_name for a30;
set linesize 999;
SELECT DEST_NAME,type, STATUS, ERROR, SYNCHRONIZED FROM V$ARCHIVE_DEST_STATUS where status!='INACTIVE';
--主节点初始 同步状态
SQL> SELECT DEST_NAME,type, STATUS, ERROR, SYNCHRONIZED FROM V$ARCHIVE_DEST_STATUS where status!='INACTIVE';
DEST_NAME TYPE STATUS ERROR SYN
------------------------------ ---------------- --------- ----------------------------------------------------------------- ---
LOG_ARCHIVE_DEST_1 LOCAL VALID NO
LOG_ARCHIVE_DEST_2 FAR SYNC VALID YES
LOG_ARCHIVE_DEST_3 UNKNOWN ALTERNATE NO
LOG_ARCHIVE_DEST_4 UNKNOWN ALTERNATE NO
FAR SYNC 切换: (FAR SYNC racnode32重启)
SQL> /
DEST_NAME TYPE STATUS ERROR SYN
------------------------------ ---------------- --------- ----------------------------------------------------------------- ---
LOG_ARCHIVE_DEST_1 LOCAL VALID NO
LOG_ARCHIVE_DEST_2 FAR SYNC ALTERNATE ORA-03113: end-of-file on communication channel NO
LOG_ARCHIVE_DEST_3 FAR SYNC VALID YES
LOG_ARCHIVE_DEST_4 UNKNOWN ALTERNATE NO
##也可以用表变更的方式验证是否正常同步
CREATE TABLE test_dg (id NUMBER, name VARCHAR2(20));
INSERT INTO test_dg VALUES (1, 'Data Guard Test');
INSERT INTO test_dg VALUES (2, 'Data Guard Test2');
INSERT INTO test_dg VALUES (3, 'Data Guard Test3');
INSERT INTO test_dg VALUES (4, 'Data Guard Test4');
INSERT INTO test_dg VALUES (5, 'Data Guard Test5');
INSERT INTO test_dg VALUES (6, 'Data Guard Test6');
INSERT INTO test_dg VALUES (7, 'Data Guard Test7');
COMMIT;
select * from test_dg;
#########################################################################################################
方法二:使用 Data Guard Broker(推荐方式)
利用 DGMGRL 命令行工具可以更自动化地完成创建和配置
在 Broker 配置中,使用 ADD FAR_SYNC 和 ENABLE FAR_SYNC 命令添加实例。
通过 EDIT DATABASE 和 EDIT FAR_SYNC 命令,配置 RedoRoutes 属性,精确控制 Redo 的传输路径。例如:
主库设置 RedoRoutes='(LOCAL : FS1 SYNC)'
Far Sync 设置 RedoRoutes='(North_Sales : South_Sales)'
最后,将保护模式提升为 MaxAvailability 即可
关键注意事项
密码文件同步:由于 Far Sync 实例不运行 Redo Apply,任何对主库具有 SYSDBA/SYSDG 等权限的用户密码变更,都需要手动重新复制密码文件到 Far Sync 实例。
性能考量:虽然 Far Sync 是轻量级实例,但其存储和网络性能同样关键。它需要足够的 I/O 能力来快速写入 Redo 日志,否则依然会拖慢主库的提交响应时间。
高可用部署:为避免 Far Sync 成为单点故障,建议在生产环境中为每个区域部署至少两个 Far Sync 实例,以保证高可用性。
Far Sync 巧妙地平衡了数据保护和主库性能,是现代 Data Guard 架构中应对远距离灾备需求的核心方案。
7.2 配置步骤详解
整个过程可以分为两个阶段:先为每个 Far Sync 实例创建并配置 Wallet,再执行 ADD FAR_SYNC 命令。
7.2.1. 为 Far Sync 实例配置 Wallet 认证
##你需要分别在 orcl32 和 orcl33 所在的主机上执行以下操作。
7.2.1.1 创建 Wallet 目录并设置权限
##选择一个安全的位置来存放 Wallet 文件,例如 $ORACLE_HOME/dbs/wallet。
mkdir -p $ORACLE_HOME/dbs/wallet
chmod 700 $ORACLE_HOME/dbs/wallet
7.2.1.2 创建 Auto-Login Wallet
##使用 mkstore 工具创建 Wallet,并启用自动登录功能,这样后续连接时不需要再输入 Wallet 密码。
mkstore -wrl $ORACLE_HOME/dbs/wallet -create
##命令执行后会提示你设置并确认一个 Wallet 密码,请务必记住。
##PKI-01002: 口令无效。口令至少要有 8 个字符并且应该同时包含字母和数字 (或特殊字符)。
7.2.1.3 将数据库凭证添加到 Wallet
##这一步是让 Wallet 知道如何无密码连接到目标数据库。你需要为 Far Sync 实例本身以及主库 orcl31 添加凭证。以 orcl32 为例:
## 添加 Far Sync 实例自身的凭证
mkstore -wrl $ORACLE_HOME/dbs/wallet -createCredential orcl32 sys
mkstore -wrl $ORACLE_HOME/dbs/wallet -createCredential orcl33 sys
## 添加主库的凭证
mkstore -wrl $ORACLE_HOME/dbs/wallet -createCredential orcl31 sys
mkstore -wrl $ORACLE_HOME/dbs/wallet -createCredential orcl34 sys
##每个命令执行后,都会依次提示你输入:
##"命令行中缺少您的密钥/口令
##请输入您的密钥/口令: #即SYS 用户密码
##请重新输入您的密钥/口令: #重新输入一次
##输入 Wallet 口令: #
##"
注意:一个 Wallet 可以为多个 TNS 别名存储凭证。mkstore 使用的 orcl32 和 orcl31 必须与你 tnsnames.ora 文件中定义的连接标识符完全一致。
##查看已添加的凭证
mkstore -wrl $ORACLE_HOME/dbs/wallet -listCredential
7.2.1.4 修改 sqlnet.ora 文件
##编辑 $ORACLE_HOME/network/admin/sqlnet.ora 文件,添加或修改以下内容,告诉 Oracle 使用 Wallet 进行认证:
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = $ORACLE_HOME/dbs/wallet)))
SQLNET.WALLET_OVERRIDE = TRUE
SQLNET.WALLET_OVERRIDE=TRUE 会强制使用 Wallet 中的凭证进行连接,而忽略其他认证方式。
7.2.1.5 验证 Wallet 认证
##配置完成后,在 Far Sync 主机上测试能否无密码登录主库和本地的 Far Sync 实例。
sqlplus /@orcl31 as sysdba
sqlplus /@orcl32 as sysdba
sqlplus /@orcl33 as sysdba
sqlplus /@orcl34 as sysdba
如果能够成功连接,说明 Wallet 认证配置正确。
7.2.2 第二阶段:执行 ADD FAR_SYNC 命令
##Wallet 配置好之后,就可以在 DGMGRL 中使用 ADD FAR_SYNC 将 orcl32 和 orcl33 加入 Broker 配置了。
##在 orcl32 上启动辅助实例:在 orcl32 所在主机,将 Far Sync 辅助实例启动到 NOMOUNT 状态。
##在 DGMGRL 中添加 orcl32:连接到主库 orcl31 的 Broker。
DGMGRL> ADD FAR_SYNC orcl32 AS CONNECT IDENTIFIER IS 'orcl32';
DGMGRL> ENABLE FAR_SYNC 'orcl32';
重复以上步骤,添加 orcl33。
#通过 EDIT DATABASE 和 EDIT FAR_SYNC 命令,配置 RedoRoutes 属性,精确控制 Redo 的传输路径。例如:
EDIT DATABASE 'orcl31' SET PROPERTY RedoRoutes='(LOCAL : (orcl32 PRIORITY=1, orcl33 PRIORITY=1))';
EDIT FAR_SYNC 'orcl32' SET PROPERTY RedoRoutes='(orcl31 : orcl34 ASYNC)';
EDIT FAR_SYNC 'orcl33' SET PROPERTY RedoRoutes='(orcl31 : orcl34 ASYNC)';
#考虑到切换 调整为
EDIT DATABASE 'orcl31' SET PROPERTY RedoRoutes='(LOCAL : (orcl32 PRIORITY=1, orcl33 PRIORITY=2))';
EDIT DATABASE 'orcl34' SET PROPERTY RedoRoutes='(LOCAL : (orcl32 PRIORITY=1, orcl33 PRIORITY=2))';
EDIT FAR_SYNC 'orcl32' SET PROPERTY RedoRoutes='(orcl31 : orcl34 ASYNC)(orcl34 : orcl31 ASYNC)';
EDIT FAR_SYNC 'orcl33' SET PROPERTY RedoRoutes='(orcl31 : orcl34 ASYNC)(orcl34 : orcl31 ASYNC)';
EDIT CONFIGURATION SET PROTECTION MODE AS MaxPerformance;
EDIT CONFIGURATION SET PROTECTION MODE AS MaxAvailability;
##broker结构如下
DGMGRL> show CONFIGURATION;
Configuration - dg_config
Protection Mode: MaxAvailability
Members:
orcl31 - Primary database
orcl32 - Far sync instance
orcl34 - Physical standby database
Members Not Receiving Redo:
orcl33 - Far sync instance (alternate of orcl32)
Fast-Start Failover: Disabled
Configuration Status:
SUCCESS (status updated 27 seconds ago)
7.2.3 配置验证与保护模式提升
检查配置状态:使用 SHOW CONFIGURATION 确保状态为 SUCCESS
角色切换验证:强烈建议执行 SHOW CONFIGURATION WHEN PRIMARY IS 'orcl34';,检查当 orcl34 成为主库时,RedoRoutes 配置是否正确,避免出现 ORA-16677 警告.
如果当前保护模式为 MaxPerformance,且希望实现零数据丢失(RPO=0),在确认 Far Sync 配置正常后,可以将保护模式提升为 Maximum Availability
DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE AS MaxAvailability;
7.2.4 计划内角色切换 (Switchover)
计划内切换(Switchover)是无数据丢失的角色互换,是首选方式。整个过程可以通过一条 SWITCHOVER TO 命令,由 Broker 自动完成.
7.2.4.1 切换前验证 (关键步骤)
1). 检查整体配置状态:在 DGMGRL 中执行 SHOW CONFIGURATION;,必须确保状态为 SUCCESS。任何 WARNING 或 ERROR 都需要先解决
2). 验证主库状态:执行 VALIDATE DATABASE 'orcl31';,确认输出中的 Ready for Switchover: Yes
3). 验证目标备库状态:执行 VALIDATE DATABASE 'orcl34';,同样确认其 Ready for Switchover: Yes。这同时会检查日志传输和应用延迟,确保没有归档缺口
7.2.4.2 切换
SWITCHOVER TO 'orcl34';
#执行此命令后,Broker 会自动完成关闭旧主库、转换备库、重启并打开新主库等一系列操作
##切换过程节点状态查看
show configuration;
show FAR_SYNC verbose 'orcl32';
show FAR_SYNC verbose 'orcl33';
SHOW FAR_SYNC 'orcl33';
SHOW FAR_SYNC 'orcl32';
VALIDATE FAR_SYNC 'orcl32';
VALIDATE FAR_SYNC 'orcl33';
SHOW database 'orcl31' LogXptStatus;
SHOW database 'orcl34' LogXptStatus ;
VALIDATE FAR_SYNC 'orcl33' WHEN PRIMARY IS 'orcl34';
7.2.5 故障切换 (Failover)
在主库彻底损坏且无法恢复时使用,执行后可能导致数据丢失 。官方建议,在非紧急情况下,应优先考虑 SWITCHOVER
切换命令:
FAILOVER TO 'orcl34' [IMMEDIATE];
#不加 IMMEDIATE:Broker 会尝试应用所有可用的 Redo 日志,尽可能减少数据丢失 。
#加 IMMEDIATE:立即切换,很可能导致数据丢失,仅在紧急状况下使用
重要注意事项
远同步实例密码文件的特殊性:根据 Oracle 官方说明,主库密码文件的自动传播功能不适用于 Far Sync 实例。因此,当主库的 SYS 密码发生变更时,
你必须手动将新的密码文件复制到 orcl32 和 orcl33 的 $ORACLE_HOME/dbs 目录,否则 Redo 传输会因认证失败而中断。
7.2.6 CREATE FAR_SYNC (19c不支持,后续高版本在验证,仅做记录)
CREATE FAR_SYNC 是一个较新的特性,在 Oracle 20c 及更高版本中才引入;是一个用于自动创建一个全新的 Far Sync 实例的命令,它会直接把实例搭好并加入 Broker 配置,和之前的 ADD FAR_SYNC(只负责将已存在的实例加进来)是不同的。
CREATE FAR_SYNC <db_unique_name> AS CONNECT IDENTIFIER IS <connect_identifier>;
CREATE FAR_SYNC orcl32 AS CONNECT IDENTIFIER IS 'orcl32';
执行这个命令需要满足几个硬性前提:
1. Oracle Wallet 认证:必须预先配置好,这是强制性要求
2. 辅助实例已启动:需要在目标主机(例如 orcl33)上,将一个辅助实例(Auxiliary Instance)启动到 NOMOUNT 状态
3. 权限要求:你用来连接的账号需要有 SYSDBA 权限
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15404498/viewspace-3175834/ ,如需转载,请注明出处,否则将追究法律责任。