在 Oracle Linux 7.8 上搭建 Oracle 19c Data Guard 详细指南

前言

Oracle Data Guard 是 Oracle 数据库的高可用性解决方案,通过主库(Primary Database)与备库(Standby Database)的日志同步,实现数据冗余和故障切换能力。本文基于 Oracle Linux 7.8 和 Oracle 19c 数据库,详细讲解单实例主库与单实例备库的 Data Guard 搭建过程,适合 DBA 工程师参考实践。

一、环境准备

1.1 软硬件环境

组件主库(Primary)备库(Standby)
操作系统Oracle Linux 7.8Oracle Linux 7.8
Oracle 版本19c(19.3.0.0)19c(19.3.0.0)
主机名primary.db.comstandby.db.com
IP 地址192.168.1.101192.168.1.102
数据库名(DB_NAME)orclorcl(与主库一致)
数据库唯一名orcl_primaryorcl_standby
实例名orclorcl

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 软件

  1. 将 Oracle 19c 安装包(LINUX.X64_193000_db_home.zip)上传至主库 /tmp 目录,解压至 ORACLE_HOME

    bash

    unzip /tmp/LINUX.X64_193000_db_home.zip -d $ORACLE_HOME
    
  2. 执行安装脚本,选择「仅安装数据库软件」(后续手动建库):

    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 软件(与主库步骤一致)

  1. 上传并解压安装包:

    bash

    unzip /tmp/LINUX.X64_193000_db_home.zip -d $ORACLE_HOME
    
  2. 执行安装脚本,选择「仅安装数据库软件」:

    bash

    cd $ORACLE_HOME
    ./runInstaller
    

    (步骤同主库,完成后执行 root 脚本)

3.2 创建备库初始化参数文件

备库需基于主库的参数文件创建 spfile,步骤如下:

  1. 在备库创建 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'
    
  2. 启动备库到 nomount 状态:

    bash

    sqlplus / as sysdba
    STARTUP NOMOUNT PFILE='$ORACLE_HOME/dbs/initorcl.ora';
    

3.3 通过 RMAN 复制主库数据到备库

在备库主机上,使用 RMAN 连接主库和备库,执行 duplicate 命令复制数据(无需手动备份主库):

  1. 启动 RMAN 并连接主库和备库:

    bash

    rman target sys/Oracle123@primary auxiliary /
    
  2. 执行 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

  1. 备库监听配置($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)
        )
      )
    
  2. 启动监听:

    bash

    lsnrctl start
    lsnrctl status  # 确认监听正常
    
  3. 备库 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;  -- 应能查询到主库插入的数据

六、常见问题排查

  1. 日志传输失败:检查 v$archive_dest.error 字段,常见原因:TNS 配置错误、防火墙未关闭、密码文件不一致。

  2. 备库 MRP 进程未启动:执行 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE ... 重启 MRP,查看 alert 日志定位错误。

  3. 主备库数据不一致:检查 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 简化管理。

参考文档

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值