Oracle物理DataGuard最大性能模式通过异步传输redo日志实现主备数据同步,对主库性能影响极小,适合大多数生产场景的容灾需求。下面介绍完整的部署步骤。

环境准备
部署前需要确认以下基础条件:
- 主备库服务器硬件配置相近,操作系统版本一致,建议均为Linux x86_64环境
- 主备库Oracle数据库版本相同,均为企业版,且主库开启归档模式
- 主备库之间网络连通,建议带宽不低于100Mbps,防火墙开放1521端口
- 主备库均安装相同路径的Oracle软件,备库无需提前创建数据库实例
主库配置步骤
1. 开启强制日志
强制日志确保所有操作都会记录redo日志,避免DataGuard同步遗漏:
-- 查看当前强制日志状态 SELECT force_logging FROM v$database; -- 开启强制日志 ALTER DATABASE FORCE LOGGING;
2. 配置主库参数
修改主库spfile参数,添加DataGuard相关配置:
-- 设置数据库唯一名称,主备库名称不能相同 ALTER SYSTEM SET db_unique_name='primary_db' SCOPE=SPFILE; -- 开启归档 ALTER SYSTEM SET log_archive_start=TRUE SCOPE=SPFILE; -- 配置本地归档路径 ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary_db' SCOPE=SPFILE; -- 配置远程归档路径,指向备库,最大性能模式使用ASYNC异步传输 ALTER SYSTEM SET log_archive_dest_2='SERVICE=standby_db LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db' SCOPE=SPFILE; -- 开启归档目标 ALTER SYSTEM SET log_archive_dest_state_2=ENABLE SCOPE=SPFILE; -- 配置fal客户端和服务器 ALTER SYSTEM SET fal_client='primary_db' SCOPE=SPFILE; ALTER SYSTEM SET fal_server='standby_db' SCOPE=SPFILE; -- 配置备库文件路径转换,若主备库数据文件路径不同才需要设置 -- ALTER SYSTEM SET db_file_name_convert='/u01/app/oracle/oradata/standby','/u01/app/oracle/oradata/primary' SCOPE=SPFILE; -- ALTER SYSTEM SET log_file_name_convert='/u01/app/oracle/oradata/standby','/u01/app/oracle/oradata/primary' SCOPE=SPFILE;
3. 配置网络监听
修改主库listener.ora和tnsnames.ora,添加备库连接信息:
-- listener.ora配置,添加静态注册
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = primary_db)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
(SID_NAME = primary)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521))
)
)
-- tnsnames.ora配置,添加主备库连接串
primary_db =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = primary_db)
)
)
standby_db =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = standby_db)
)
)重启主库监听使配置生效:
lsnrctl stop lsnrctl start
4. 生成备库控制文件
主库生成用于备库的控制文件,后续会传输到备库使用:
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/standby_control01.ctl';
5. 拷贝文件到备库
将主库的数据文件、参数文件、密码文件、生成的备库控制文件拷贝到备库对应目录:
# 拷贝数据文件 scp -r /u01/app/oracle/oradata/primary/* 192.168.0.2:/u01/app/oracle/oradata/standby/ # 拷贝参数文件 scp /u01/app/oracle/product/19.3.0/dbhome_1/dbs/spfileprimary.ora 192.168.0.2:/u01/app/oracle/product/19.3.0/dbhome_1/dbs/spfilestandby.ora # 拷贝密码文件 scp /u01/app/oracle/product/19.3.0/dbhome_1/dbs/orapwprimary 192.168.0.2:/u01/app/oracle/product/19.3.0/dbhome_1/dbs/orapwstandby # 拷贝备库控制文件 scp /tmp/standby_control01.ctl 192.168.0.2:/u01/app/oracle/oradata/standby/control01.ctl scp /tmp/standby_control01.ctl 192.168.0.2:/u01/app/oracle/oradata/standby/control02.ctl
备库配置步骤
1. 修改备库参数
备库使用拷贝过来的参数文件启动到nomount状态,修改DataGuard相关参数:
-- 启动到nomount状态 STARTUP NOMOUNT PFILE='/u01/app/oracle/product/19.3.0/dbhome_1/dbs/initstandby.ora'; -- 修改备库参数 ALTER SYSTEM SET db_unique_name='standby_db' SCOPE=SPFILE; ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby_db' SCOPE=SPFILE; ALTER SYSTEM SET log_archive_dest_2='SERVICE=primary_db LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary_db' SCOPE=SPFILE; ALTER SYSTEM SET fal_client='standby_db' SCOPE=SPFILE; ALTER SYSTEM SET fal_server='primary_db' SCOPE=SPFILE; -- 若主备库文件路径不同,配置路径转换参数 -- ALTER SYSTEM SET db_file_name_convert='/u01/app/oracle/oradata/primary','/u01/app/oracle/oradata/standby' SCOPE=SPFILE; -- ALTER SYSTEM SET log_file_name_convert='/u01/app/oracle/oradata/primary','/u01/app/oracle/oradata/standby' SCOPE=SPFILE; -- 重启备库使参数生效 SHUTDOWN IMMEDIATE; STARTUP MOUNT PFILE='/u01/app/oracle/product/19.3.0/dbhome_1/dbs/initstandby.ora';
2. 配置备库网络监听
修改备库listener.ora和tnsnames.ora,配置和主库类似的连接信息:
-- listener.ora配置
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = standby_db)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
(SID_NAME = standby)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))
)
)
-- tnsnames.ora配置和主库保持一致即可重启备库监听:
lsnrctl stop lsnrctl start
3. 开启备库应用日志
备库处于mount状态后,开启redo日志应用:
-- 开启实时应用日志,最大性能模式也可以使用普通应用 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
同步验证
1. 检查归档传输状态
在主库执行以下SQL,查看归档是否成功传输到备库:
SELECT dest_id, status, error FROM v$archive_dest_status WHERE dest_id=2;
如果status显示为VALID,说明归档传输正常,error字段为空则无错误。
2. 检查备库同步进度
在备库执行以下SQL,查看日志应用情况:
SELECT sequence#, applied FROM v$archived_log ORDER BY sequence# DESC FETCH FIRST 10 ROWS ONLY;
如果applied字段显示为YES,说明对应sequence的归档日志已经在备库应用。
3. 主备数据一致性验证
在主库创建测试表插入数据,提交后查看备库是否同步:
-- 主库执行 CREATE TABLE test_dg(id NUMBER, name VARCHAR2(20)); INSERT INTO test_dg VALUES(1, 'test_data'); COMMIT; -- 备库执行,需先取消日志应用再打开只读查看 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ALTER DATABASE OPEN READ ONLY; SELECT * FROM test_dg; -- 查看完成后重新开启日志应用 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
若备库能查询到主库插入的数据,说明DataGuard最大性能模式部署成功。