前言
Oracle Data Guard 是 Oracle 数据库的高可用性解决方案,通过主库(Primary Database)与备库(Standby Database)的日志同步,实现数据冗余和故障切换能力。本文基于 Oracle Linux 7.8 和 Oracle 19c 数据库,详细讲解单实例主库与单实例备库的 Data Guard 搭建过程,适合 DBA 工程师参考实践。
一、环境准备
1.1 软硬件环境
| 组件 | 主库(Primary) | 备库(Standby) |
|---|---|---|
| 操作系统 | Oracle Linux 7.8 | Oracle Linux 7.8 |
| Oracle 版本 | 19c(19.3.0.0) | 19c(19.3.0.0) |
| 主机名 | primary.db.com | standby.db.com |
| IP 地址 | 192.168.1.101 | 192.168.1.102 |
| 数据库名(DB_NAME) | orcl | orcl(与主库一致) |
| 数据库唯一名 | orcl_primary | orcl_standby |
| 实例名 | orcl | orcl |
1.2 前置操作(主备库均执行)
1.2.1 关闭防火墙与 SELinux
bash
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭 SELinux
setenforce 0
# 永久关闭 SELinux(重启生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
1.2.2 配置主机名与 hosts 文件
bash
# 设置主机名(主库)
hostnamectl set-hostname primary.db.com
# 设置主机名(备库)
hostnamectl set-hostname standby.db.com
# 配置 /etc/hosts(主备库均添加)
cat >> /etc/hosts << EOF
192.168.1.101 primary.db.com primary
192.168.1.102 standby.db.com standby
EOF
1.2.3 安装依赖包
bash
# 安装 Oracle 19c 依赖包
yum install -y oracle-database-preinstall-19c
# 安装额外工具
yum install -y net-tools vim lrzsz
1.2.4 创建目录与权限
bash
# 创建 Oracle 安装目录
mkdir -p /u01/app/oracle/product/19c/dbhome_1
mkdir -p /u01/app/oraInventory
mkdir -p /u01/app/oracle/oradata
mkdir -p /u01/app/oracle/archivelog
mkdir -p /u01/app/oracle/fast_recovery_area
# 创建 oracle 用户与组(预安装包已创建,此处确认)
id oracle # 若不存在,执行:useradd -m -g oinstall -G dba,asmdba,oper oracle
# 设置权限
chown -R oracle:oinstall /u01
chmod -R 775 /u01
1.2.5 配置 oracle 用户环境变量
切换到 oracle 用户,编辑 ~/.bash_profile:
bash
su - oracle
vim ~/.bash_profile
添加以下内容(主库与备库的 ORACLE_SID 和 DB_UNIQUE_NAME 需区分):
bash
# 主库环境变量
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19c/dbhome_1
export ORACLE_SID=orcl
export DB_UNIQUE_NAME=orcl_primary
export PATH=$ORACLE_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
# 备库环境变量(仅备库修改)
# export ORACLE_SID=orcl
# export DB_UNIQUE_NAME=orcl_standby
生效环境变量:
bash
source ~/.bash_profile
二、主库(Primary)安装与配置
2.1 安装 Oracle 19c 软件
-
将 Oracle 19c 安装包(
LINUX.X64_193000_db_home.zip)上传至主库/tmp目录,解压至ORACLE_HOME:bash
unzip /tmp/LINUX.X64_193000_db_home.zip -d $ORACLE_HOME -
执行安装脚本,选择「仅安装数据库软件」(后续手动建库):
bash
cd $ORACLE_HOME ./runInstaller- 安装选项:「Set Up Software Only」
- 数据库类型:「Single instance database installation」
- 其他按默认配置,完成后执行 root 脚本:
bash
sudo /u01/app/oraInventory/orainstRoot.sh sudo /u01/app/oracle/product/19c/dbhome_1/root.sh
2.2 创建主库数据库(DBCA)
bash
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbname orcl -sid orcl -responseFile NO_VALUE \
-characterSet AL32UTF8 \
-sysPassword Oracle123 \
-systemPassword Oracle123 \
-createAsContainerDatabase false \
-databaseType MULTIPURPOSE \
-datafileDestination /u01/app/oracle/oradata \
-redoLogFileSize 50 \
-archiveLogMode yes \
-recoveryAreaDestination /u01/app/oracle/fast_recovery_area \
-totalMemory 2048 \
-storageType FS \
-emConfiguration NONE
- 说明:
-archiveLogMode yes确保主库默认开启归档模式。
2.3 主库参数配置(关键)
登录主库 SQL*Plus,修改 Data Guard 相关参数:
bash
sqlplus / as sysdba
sql
-- 1. 开启强制日志(必选)
ALTER DATABASE FORCE LOGGING;
-- 2. 配置归档日志路径(本地归档)
ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/app/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_primary';
-- 3. 配置 Data Guard 主备库标识(DG_CONFIG 包含主备库唯一名)
ALTER SYSTEM SET log_archive_config='DG_CONFIG=(orcl_primary,orcl_standby)';
-- 4. 配置备库日志传输目标(dest_2 指向备库)
ALTER SYSTEM SET log_archive_dest_2='SERVICE=standby ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_standby';
-- 5. 配置归档日志删除策略(备库应用后删除)
ALTER SYSTEM SET log_archive_delete_delay_mins=0;
ALTER SYSTEM SET log_archive_max_processes=4;
-- 6. 配置备库角色转换参数(切换后生效)
ALTER SYSTEM SET fal_server=standby; -- FAL(Fetch Archive Log)服务器指向备库
ALTER SYSTEM SET db_file_name_convert='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl' scope=spfile; -- 数据文件路径转换(若主备路径一致可省略)
ALTER SYSTEM SET log_file_name_convert='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl' scope=spfile; -- 日志文件路径转换(若主备路径一致可省略)
ALTER SYSTEM SET standby_file_management=AUTO; -- 备库文件自动管理
-- 7. 重启主库使参数生效(scope=spfile 的参数需重启)
SHUTDOWN IMMEDIATE;
STARTUP;
2.4 配置主库 TNS 连接
编辑 $ORACLE_HOME/network/admin/tnsnames.ora(主备库均需配置):
bash
vim $ORACLE_HOME/network/admin/tnsnames.ora
添加主备库 TNS 条目:
plaintext
PRIMARY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = primary.db.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
STANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = standby.db.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
测试主库到备库的 TNS 连接(备库安装完成后测试):
bash
tnsping standby
2.5 复制密码文件到备库
Oracle 密码文件用于主备库间的认证,主备库密码文件必须一致:
bash
# 主库执行,复制密码文件到备库
scp $ORACLE_HOME/dbs/orapworcl oracle@standby.db.com:$ORACLE_HOME/dbs/
三、备库(Standby)安装与配置
3.1 安装 Oracle 19c 软件(与主库步骤一致)
-
上传并解压安装包:
bash
unzip /tmp/LINUX.X64_193000_db_home.zip -d $ORACLE_HOME -
执行安装脚本,选择「仅安装数据库软件」:
bash
cd $ORACLE_HOME ./runInstaller(步骤同主库,完成后执行 root 脚本)
3.2 创建备库初始化参数文件
备库需基于主库的参数文件创建 spfile,步骤如下:
-
在备库创建
pfile临时文件:bash
vim $ORACLE_HOME/dbs/initorcl.ora添加以下内容(仅保留关键参数,其他参数可通过主库复制后修改):
plaintext
db_name=orcl db_unique_name=orcl_standby control_files='/u01/app/oracle/oradata/orcl/control01.ctl' # 后续会通过 RMAN 复制 memory_target=2048M processes=300 audit_file_dest='/u01/app/oracle/admin/orcl/adump' audit_trail='db' db_block_size=8192 db_domain='' db_recovery_file_dest='/u01/app/oracle/fast_recovery_area' db_recovery_file_dest_size=20G diagnostic_dest='/u01/app/oracle' dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' enable_pluggable_database=false open_cursors=300 remote_login_passwordfile='EXCLUSIVE' undo_tablespace='UNDOTBS1' -
启动备库到
nomount状态:bash
sqlplus / as sysdba STARTUP NOMOUNT PFILE='$ORACLE_HOME/dbs/initorcl.ora';
3.3 通过 RMAN 复制主库数据到备库
在备库主机上,使用 RMAN 连接主库和备库,执行 duplicate 命令复制数据(无需手动备份主库):
-
启动 RMAN 并连接主库和备库:
bash
rman target sys/Oracle123@primary auxiliary / -
执行 duplicate 命令(备库会自动从主库复制数据文件、控制文件、日志文件):
rman
duplicate target database for standby from active database spfile set db_unique_name='orcl_standby' set log_archive_dest_1='LOCATION=/u01/app/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_standby' set log_archive_dest_2='SERVICE=primary ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_primary' set fal_server='primary' set db_file_name_convert='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl' set log_file_name_convert='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl' set standby_file_management='AUTO' nofilenamecheck;- 说明:
nofilenamecheck用于忽略主备库文件路径一致性检查(若路径一致可省略)。
- 说明:
3.4 备库参数补充配置
复制完成后,备库会自动处于 mount 状态,补充配置参数:
sql
-- 登录备库 SQL*Plus
sqlplus / as sysdba
-- 配置 DG 标识(与主库对应)
ALTER SYSTEM SET log_archive_config='DG_CONFIG=(orcl_primary,orcl_standby)';
-- 重启备库使参数生效
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
3.5 配置备库监听与 TNS
-
备库监听配置(
$ORACLE_HOME/network/admin/listener.ora):bash
vim $ORACLE_HOME/network/admin/listener.ora添加:
plaintext
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = standby.db.com)(PORT = 1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1) (SID_NAME = orcl) ) ) -
启动监听:
bash
lsnrctl start lsnrctl status # 确认监听正常 -
备库 TNS 配置(与主库一致,参考 2.4 节),测试到主库的连接:
bash
tnsping primary
四、启动 Data Guard 日志应用
4.1 主库添加 standby redo log(可选但推荐)
Standby redo log 用于实时接收主库的在线日志,提高同步效率,建议组数比主库在线日志多 1 组:
sql
-- 主库查询在线日志组数和大小
SELECT group#, bytes/1024/1024 AS size_mb FROM v$log;
-- 假设主库有 3 组 50MB 日志,备库添加 4 组 standby redo log
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/standby_redo04.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/standby_redo05.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/standby_redo06.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/standby_redo07.log') SIZE 50M;
4.2 备库启动日志应用
在备库启动 MRP(Managed Recovery Process)进程,应用主库传输的日志:
sql
-- 实时应用(推荐,需 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 进程,不占用当前会话。
五、Data Guard 状态验证
5.1 主库状态检查
sql
-- 1. 查看主库角色和切换状态
SELECT database_role, switchover_status FROM v$database;
-- 正常输出:DATABASE_ROLE='PRIMARY',SWITCHOVER_STATUS='TO STANDBY'
-- 2. 查看归档日志传输状态
SELECT dest_id, status, error, log_sequence FROM v$archive_dest WHERE dest_id=2;
-- 正常输出:STATUS='VALID',ERROR 为空,LOG_SEQUENCE 递增
5.2 备库状态检查
sql
-- 1. 查看备库角色和切换状态
SELECT database_role, switchover_status FROM v$database;
-- 正常输出:DATABASE_ROLE='PHYSICAL STANDBY',SWITCHOVER_STATUS='TO PRIMARY'
-- 2. 查看 MRP 进程状态
SELECT process, status, sequence# FROM v$managed_standby;
-- 正常输出:PROCESS='MRP0',STATUS='APPLYING_LOG',SEQUENCE# 与主库同步
-- 3. 查看 standby redo log 状态
SELECT group#, status FROM v$standby_log;
-- 正常输出:部分日志状态为'ACTIVE'(正在接收主库日志)
5.3 数据同步测试
在主库创建测试表并插入数据,验证备库是否同步:
sql
-- 主库执行
CREATE TABLE test_dg (id NUMBER, name VARCHAR2(20));
INSERT INTO test_dg VALUES (1, 'Data Guard Test');
COMMIT;
ALTER SYSTEM SWITCH LOGFILE; -- 强制日志切换,触发归档传输
在备库查询数据(需将备库临时切换为只读模式,不影响日志应用):
sql
-- 备库执行
ALTER DATABASE OPEN READ ONLY;
SELECT * FROM test_dg; -- 应能查询到主库插入的数据
六、常见问题排查
-
日志传输失败:检查
v$archive_dest.error字段,常见原因:TNS 配置错误、防火墙未关闭、密码文件不一致。 -
备库 MRP 进程未启动:执行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE ...重启 MRP,查看 alert 日志定位错误。 -
主备库数据不一致:检查
v$archive_gap视图是否存在日志间隙,若有,手动复制缺失的归档日志到备库并注册:sql
ALTER DATABASE REGISTER PHYSICAL LOGFILE '/u01/app/oracle/archivelog/xxxx.arc';
总结
本文通过详细步骤讲解了 Oracle Linux 7.8 上 Oracle 19c Data Guard 的搭建过程,核心包括环境准备、主备库参数配置、RMAN 数据复制、日志应用启动及状态验证。实际生产环境中,需根据硬件资源调整参数(如内存、日志大小),并定期测试 switchover 确保故障切换能力。
如需进一步优化,可配置实时同步(SYNC)、启用闪回数据库(Flashback)或结合 Oracle Data Guard Broker 简化管理。
参考文档:
- Oracle 19c Data Guard 官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/
1063

被折叠的 条评论
为什么被折叠?



