Oracle 11g DataGuard 搭建指南

Oracle 11g DataGuard 搭建指南

这是一套可完整复现的Oracle 11g物理备库(ADG)部署笔记,基于VirtualBox虚拟机,rhel6环境,覆盖核心原理、标准化搭建等内容。无需丰富的Linux或Oracle经验,跟着步骤操作即可成功搭建。如有错误,欢迎批评指正。


一、环境准备

1.1 VirtualBox 配置

打开 VirtualBox,进入「管理 → 主机网络管理器」,创建 Host-Only 网卡,默认网段为 192.168.56.1/24,关闭DHCP服务器,用于主机与虚拟机、主备虚拟机之间通信。

1.2 软件清单

提前下载以下文件,放在宿主机易访问目录(如 D:\software\):

文件名 说明
rhel-server-6.10-x86_64-dvd.iso RHEL 6.10 操作系统镜像
p13390677_112040_Linux-x86-64_1of7.zip Oracle 11g 数据库安装包分卷1
p13390677_112040_Linux-x86-64_2of7.zip Oracle 11g 数据库安装包分卷2
rlwrap-0.42-1.el6.x86_64.rpm sqlplus/rman 命令行增强工具(可选)

1.3 网络规划

采用 Host-Only + NAT 双网卡模式:

  • 主库:主机名primary,Host-Only IP 192.168.56.101/24
  • 备库:主机名standby,Host-Only IP 192.168.56.102/24
  • NAT网卡:自动获取IP,用于外网下载依赖包

1.4 磁盘与内存规划

  • 单节点内存:3072MB(3GB),双节点总占用6GB

  • 单节点系统盘:60GB 固定大小VMDK虚拟磁盘

  • 单节点分区方案:

    挂载点 大小 文件系统 核心用途
    /boot 1GB ext4 系统引导与内核文件
    swap 4GB swap 虚拟内存换页空间
    / 15GB ext4 系统根目录
    /u01 40GB ext4 Oracle软件与数据存储

二、创建虚拟机与安装系统

核心思路:先制作通用模板虚拟机,完成通用配置与Oracle软件安装,再完整克隆生成主备库,仅修改差异化参数,减少重复操作。

2.1 创建虚拟机

  1. 打开 VirtualBox,点击「新建」,名称设为primary,选择RHEL 6.10镜像
  2. 内存分配3072MB,创建60GB固定大小VMDK虚拟磁盘
  3. 启动顺序:硬盘优先,移除软驱

2.2 虚拟机硬件配置

  • 存储:挂载RHEL 6.10 ISO镜像
  • 网络:网卡1为Host-Only,网卡2为NAT

2.3 安装 RHEL 6.10

  1. 启动虚拟机,加载ISO,语言选English,时区Asia/Shanghai
  2. 软件选择:带GUI的服务器
  3. 按1.4章节分区方案手动分区
  4. 网络配置:主机名primary,Host-Only静态IP192.168.56.101/24
  5. 设置root密码为oracle,关闭Kdump,完成安装并重启

三、模板机系统通用前置配置(root用户执行)

3.1 网络与主机名配置

bash 复制代码
# 修改主机名
hostname primary
sed -i 's/HOSTNAME=.*/HOSTNAME=primary/' /etc/sysconfig/network

# 重启网络服务
service network restart

# 配置hosts解析,添加主备库映射
cat >> /etc/hosts <<EOF
# DG主备库解析
192.168.56.101  primary
192.168.56.102  standby
EOF

# 验证网络连通性
ping -c 3 primary

# 关闭NetworkManager服务
service NetworkManager stop
chkconfig NetworkManager off

3.2 关闭防火墙与SELinux

bash 复制代码
# 临时关闭iptables防火墙
service iptables stop
# 永久关闭防火墙开机自启
chkconfig iptables off

# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 验证SELinux状态,预期输出Disabled
getenforce

3.3 创建Oracle用户与用户组

bash 复制代码
# 创建用户组
groupadd -g 1000 oinstall
groupadd -g 1031 dba
groupadd -g 1032 oper

# 创建oracle用户,加入用户组
useradd -u 1101 -g oinstall -G dba,oper oracle

# 设置oracle用户密码(统一为oracle)
echo "oracle" | passwd --stdin oracle

# 验证用户创建成功
id oracle

3.4 创建Oracle安装目录并授权

bash 复制代码
# 创建基础目录、软件目录、通用数据目录、归档目录
mkdir -p /u01/app/oracle/product/11.2.0.4/db_1
mkdir -p /u01/app/oracle/oradata
mkdir -p /u01/app/oracle/arch
mkdir -p /u01/app/oracle/admin/adump
mkdir -p /u01/app/oraInventory
mkdir -p /soft

# 递归授权目录给oracle用户
chown -R oracle:oinstall /u01
chown -R oracle:oinstall /soft

# 统一权限为775(Oracle官方标准)
chmod -R 775 /u01
chmod -R 775 /soft

3.5 配置系统内核参数(3GB内存)

bash 复制代码
# 编辑内核参数配置文件
cat >> /etc/sysctl.conf <<EOF

# Oracle 11g 核心内核参数(3G内存)
kernel.shmmax = 1610612736  # 物理内存的50%,1.5GB,适配AMM自动内存管理
kernel.shmall = 2097152
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
# DG稳定性增强参数
kernel.panic_on_oops = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
EOF

# 注销掉原先的kernel配置
vi /etc/sysctl.conf

# 使内核参数立即生效
sysctl -p

3.6 /dev/shm临时文件系统调整(适配3GB内存)

/dev/shm是Oracle AMM自动内存管理的核心,必须调整到不小于AMM内存最大值,否则数据库启动会报错。

bash 复制代码
# 编辑/etc/fstab配置文件
vi /etc/fstab

# 找到tmpfs对应的行,修改为以下内容(无则直接在末尾追加)
tmpfs                   /dev/shm                tmpfs   defaults,size=2000M        0 0

# 重新挂载生效,无需重启系统
mount -o remount /dev/shm

# 验证配置生效,预期输出大小为2G左右
df -h /dev/shm

3.7 配置Oracle用户资源限制

bash 复制代码
# 修改nproc配置,避免覆盖limits.conf
vi /etc/security/limits.d/90-nproc.conf
# 将* soft nproc 1024改为
*          soft    nproc     16384

# 添加Oracle用户官方要求的资源限制
cat >> /etc/security/limits.conf <<EOF
# Oracle用户资源限制(官方强制要求)
oracle  soft    nproc   2047
oracle  hard    nproc   16384
oracle  soft    nofile  1024
oracle  hard    nofile  65536
oracle  soft    stack   10240
oracle  hard    stack   32768
EOF

# 配置login文件,启用资源限制
cat >> /etc/pam.d/login <<EOF
session required pam_limits.so
EOF

# 配置profile全局用户资源限制
cat >> /etc/profile <<EOF
if [ \$USER = "oracle" ]; then
    if [ \$SHELL = "/bin/ksh" ]; then
        ulimit -p 16384
        ulimit -n 65536
    else
        ulimit -u 16384 -n 65536
    fi
    umask 022
fi
EOF

# 使配置生效
source /etc/profile

3.8 安装Oracle 11g必备依赖包

bash 复制代码
# 挂载系统光盘
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom

# 配置本地YUM源
cat > /etc/yum.repos.d/local.repo <<EOF
[local]
name=Local RHEL 6.10 DVD
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
EOF

yum clean all
yum repolist

# 批量安装依赖
yum install -y binutils compat-libcap1 compat-libstdc++-33 \
elfutils-libelf-devel gcc gcc-c++ glibc glibc-devel ksh libaio \
libaio-devel libgcc libstdc++ libstdc++-devel libXext libXtst \
libX11 libXau libXi make sysstat unixODBC unixODBC-devel libaio.i686 libaio-devel.i686

# 安装rlwrap工具(需要先传上去)
yum localinstall -y /soft/rlwrap-0.42-1.el6.x86_64.rpm

# 验证依赖包安装完整性,无输出则表示全部安装成功
rpm -q binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat unixODBC unixODBC-devel | grep "not installed"

3.9 配置Oracle用户通用环境变量

模板机配置通用环境变量,克隆后仅需修改差异化参数即可。

bash 复制代码
# 切换到oracle用户
su - oracle

# 编辑环境变量文件
cat >> ~/.bash_profile <<'EOF'

# Shell基础配置
PS1="[\u@\h:\w]\$ "
alias sqlplus="rlwrap sqlplus"
alias rman="rlwrap rman"
export PS1

# Oracle核心环境变量
export LANG=en_US
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_HOSTNAME=primary
export ORACLE_UNQNAME=primdb
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0.4/db_1
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORACLE_SID=primdb
export ORACLE_TERM=xterm

# 字符集
export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS"
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

# 路径
export PATH=$ORACLE_HOME/bin:.:$PATH:$HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
umask 022
EOF

# 使环境变量生效
source ~/.bash_profile

# 验证环境变量
echo $ORACLE_HOME
echo $PATH

3.10 安装Oracle 11.2.0.4软件(仅安装软件,不建库)

  1. 上传Oracle 11.2.0.4安装包到模板机/soft目录,执行解压:
bash 复制代码
su - oracle
cd /soft
# 解压两个分卷压缩包(自动合并生成 database 文件夹)
unzip -o p13390677_112040_Linux-x86-64_1of7.zip
unzip -o p13390677_112040_Linux-x86-64_2of7.zip

# 删除压缩包
rm p13390677_112040_Linux-x86-64_1of7.zip
rm p13390677_112040_Linux-x86-64_2of7.zip

# 重启
exit
reboot
  1. 切换到图形化界面,执行安装程序:
bash 复制代码
su - oracle
cd /soft/database
export DISPLAY=192.168.56.1:0.0
./runInstaller
  1. 安装向导关键配置步骤: a. 配置安全更新:取消勾选「我希望通过My Oracle Support接收安全更新」,点击下一步,弹窗选择「是」 b. 安装选项:选择「仅安装数据库软件」,点击下一步 c. 网格安装选项:选择「单实例数据库安装」,点击下一步 d. 产品语言:默认English,可额外添加简体中文,点击下一步 e. 数据库版本:选择「企业版」,点击下一步 f. 安装位置:ORACLE_BASEORACLE_HOME自动识别环境变量,无需修改,点击下一步 g. 特权操作系统组:数据库管理员组选择dba,数据库操作员组选择oper,点击下一步 h. 先决条件检查:忽略swap警告,勾选「全部忽略」,点击下一步 i. 概要:核对所有配置无误后,点击「完成」,开始安装 j. 安装完成后,按提示切换到root用户执行2个脚本:

    bash 复制代码
    /u01/app/oraInventory/orainstRoot.sh
    /u01/app/oracle/product/11.2.0.4/db_1/root.sh

    k. 脚本执行完成后,点击「关闭」,完成Oracle软件安装

3.11 模板机清理与封装(为克隆做准备,关键!)

bash 复制代码
# 清除所有 ifcfg 文件中的 HWADDR 行
sed -i '/^HWADDR=/d' /etc/sysconfig/network-scripts/ifcfg-eth[0-1]

# 清理网卡规则,避免克隆后网卡无法启动
rm -rf /etc/udev/rules.d/70-persistent-net.rules

# 关闭模板虚拟机
shutdown -h now

# VirtualBox中移除模板机挂载的ISO镜像,避免克隆后重复挂载

四、克隆生成主备库虚拟机与差异化配置

4.1 VirtualBox完整克隆操作

  1. VirtualBox中选中主库primary,右键选择「复制」
  2. 新虚拟机名称:standby(备库),文件夹选择对应路径
  3. 勾选「重新初始化所有网卡的MAC地址」(必须勾选,否则MAC地址冲突导致网络不通)
  4. 克隆类型:选择「完整克隆」,点击下一步
  5. 硬盘分配:选择「为所有虚拟硬盘生成新的UUID」,点击「复制」

4.2 备库(standby)差异化配置

4.2.1 网络与主机名配置(root用户执行)
bash 复制代码
# 修改主机名
hostname standby
sed -i 's/HOSTNAME=.*/HOSTNAME=standby/' /etc/sysconfig/network

# 配置网卡IP,编辑Host-Only网卡配置文件(ifcfg-eth0)
sed -i 's/^IPADDR=.*/IPADDR=192.168.56.102/' /etc/sysconfig/network-scripts/ifcfg-eth0

# 重启网络服务
service network restart

# 检查hosts解析,和主库完全一致
cat /etc/hosts

# 验证主备网络互通
ping -c 3 primary
ping -c 3 standby
4.2.2 Oracle环境变量差异化修改(oracle用户执行)
bash 复制代码
su - oracle
# 编辑.bash_profile,修改以下核心参数
sed -i 's/^export ORACLE_HOSTNAME=.*/export ORACLE_HOSTNAME=standby/' ~/.bash_profile
sed -i 's/^export ORACLE_UNQNAME=.*/export ORACLE_UNQNAME=standb/' ~/.bash_profile
sed -i 's/^export ORACLE_SID=.*/export ORACLE_SID=standb/' ~/.bash_profile

# 使配置生效
source ~/.bash_profile

# 验证
echo $ORACLE_SID
4.2.3 备库专属目录创建(oracle用户执行)
bash 复制代码
# 创建审计目录、数据目录、归档目录
mkdir -p /u01/app/oracle/admin/standb/adump
mkdir -p /u01/app/oracle/oradata/standb
mkdir -p /u01/app/oracle/arch

# 递归授权整个Oracle目录
chown -R oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/app/oracle
4.2.4 备库自启动配置(root用户执行)

备库不能OPEN,必须:启动监听 → 启动到MOUNT → 启动MRP同步进程

bash 复制代码
# 给 rc.local 加执行权限
chmod +x /etc/rc.d/rc.local

vi /etc/rc.d/rc.local
# 在文件最后一行添加:
# 备库 Oracle 开机自启(DG专用)
su - oracle -c "/u01/app/oracle/product/11.2.0.4/db_1/bin/lsnrctl start"
su - oracle -c "/u01/app/oracle/product/11.2.0.4/db_1/bin/sqlplus / as sysdba <<EOF
startup mount;
alter database recover managed standby database disconnect from session;
exit;
EOF"

4.3 主库(primary)差异化配置

4.3.1 主库专属目录创建(oracle用户执行)
bash 复制代码
mkdir -p /u01/app/oracle/oradata/primdb
mkdir -p /u01/app/oracle/admin/primdb/adump
mkdir -p /u01/app/oracle/admin/primdb/dpdump
chown -R oracle:oinstall /u01/app/oracle/oradata/primdb
chown -R oracle:oinstall /u01/app/oracle/admin
chmod -R 775 /u01/app/oracle/oradata/primdb
chmod -R 775 /u01/app/oracle/admin
4.3.2 主库自启动配置(root用户执行)

主库需要:启动监听 → 启动数据库到OPEN状态

bash 复制代码
# 给 rc.local 加执行权限
chmod +x /etc/rc.d/rc.local

vi /etc/rc.d/rc.local
# 在文件最后一行添加:
# 主库 Oracle 开机自启
su - oracle -c "/u01/app/oracle/product/11.2.0.4/db_1/bin/lsnrctl start"
su - oracle -c "/u01/app/oracle/product/11.2.0.4/db_1/bin/sqlplus / as sysdba <<EOF
startup;
exit;
EOF"

五、DG主库核心配置(oracle用户,主库执行)

5.1 主库监听配置与数据库实例创建

5.1.1 创建监听

图形化界面执行netca,按照向导创建默认监听LISTENER,端口1521:

bash 复制代码
su - oracle
cd $ORACLE_HOME
export DISPLAY=192.168.56.1:0.0
netca

# 启动监听
lsnrctl start

# 验证监听状态
lsnrctl status
5.1.2 DBCA创建主库实例
bash 复制代码
su - oracle
cd $ORACLE_HOME
export DISPLAY=192.168.56.1:0.0
dbca

图形化界面执行dbca,创建数据库实例,核心配置步骤:

  1. 操作:选择「创建数据库」,点击下一步
  2. 模板:选择「一般用途或事务处理」,点击下一步
  3. 数据库标识:全局数据库名primdb,SIDprimdb,点击下一步
  4. 管理选项:取消勾选「配置Enterprise Manager」,减少资源占用,点击下一步
  5. 数据库凭据:为所有账户使用同一管理口令,设置密码oracle,点击下一步
  6. 存储选项:选择「文件系统」,点击下一步
  7. 数据库文件位置:选择「使用模板中的数据库文件位置」,路径为/u01/app/oracle/oradata/primdb,点击下一步
  8. 恢复配置:勾选「指定快速恢复区」,勾选「启用归档」,点击下一步
  9. 数据库内容:仅保留勾选Oracle Text、Sample Schemas,取消勾选其他非必要组件,点击下一步
  10. 初始化参数:
    • 内存:勾选Typical,内存大小设置为2048MB,勾选「Use Automatic Memory Management (AMM)」
    • 字符集:选择「AL32UTF8 - Unicode UTF-8 Universal Character Set」
    • 块大小:保持默认8192 Bytes(8K),Processes保持默认150
    • 连接模式:勾选「Dedicated Server Mode(专用服务器模式)」
  11. 数据库存储:无需修改,点击下一步
  12. 创建选项:仅保留勾选「创建数据库」,点击完成
  13. 概要:核对所有配置无误后,点击「确定」开始建库
  14. 建库完成后,点击「退出」

5.2 开启主库强制日志模式

强制日志模式下,数据库所有操作都会记录redo日志(包括nologging操作),确保备库能完全同步主库数据,DG搭建必须开启。

sql 复制代码
sqlplus / as sysdba

-- 查询当前强制日志状态
select force_logging from v$database;

-- 开启强制日志模式
alter database force logging;

-- 再次验证,预期输出YES
select force_logging from v$database;
exit

5.3 验证归档模式开启状态

DBCA建库时已开启归档,执行以下命令验证:

sql 复制代码
sqlplus / as sysdba

-- 查询归档模式
archive log list;
select log_mode from v$database;
-- 预期输出:Archive Mode
exit

⚠️ 若未开启归档,执行以下命令开启:

sql 复制代码
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

5.4 配置DG核心参数

所有修改spfile的参数,需重启数据库生效;scope=both的参数,当前实例和spfile同时生效。

sql 复制代码
sqlplus / as sysdba

-- 1. 设置db_unique_name,主库唯一标识
alter system set db_unique_name='primdb' scope=spfile sid='*';

-- 2. 配置DG集群节点列表,必须包含主备库的db_unique_name
alter system set log_archive_config='DG_CONFIG=(primdb,standb)' scope=spfile sid='*';

-- 3. 配置本地归档路径
alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primdb' scope=both sid='*';

-- 4. 配置备库远程归档路径
alter system set log_archive_dest_2='SERVICE=standby LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standb' scope=both sid='*';

-- 5. 启用归档路径
alter system set log_archive_dest_state_1=ENABLE scope=both sid='*';
alter system set log_archive_dest_state_2=ENABLE scope=both sid='*';

-- 6. 配置备库数据文件路径转换(主库:备库路径在前,主库路径在后)
alter system set db_file_name_convert='/u01/app/oracle/oradata/standb','/u01/app/oracle/oradata/primdb' scope=spfile sid='*';

-- 7. 配置备库日志文件路径转换
alter system set log_file_name_convert='/u01/app/oracle/oradata/standb','/u01/app/oracle/oradata/primdb' scope=spfile sid='*';

-- 8. 配置备库文件自动管理
alter system set standby_file_management=AUTO scope=spfile sid='*';

-- 9. 配置FAL客户端和服务端
alter system set fal_client='primary' scope=both sid='*';
alter system set fal_server='standby' scope=both sid='*';

-- 10. 配置远程登录密码文件
alter system set remote_login_passwordfile='EXCLUSIVE' scope=spfile sid='*';

-- 重启数据库使所有spfile参数生效
shutdown immediate;
startup;

-- 验证参数配置是否生效
show parameter db_unique_name;
show parameter log_archive_config;
exit

⚠️ 关键注意事项:

  1. log_archive_dest_2中的SERVICE=standby必须和后续tnsnames.ora中的备库别名完全一致
  2. db_file_name_convertlog_file_name_convert参数顺序不能写反
  3. 若主备库数据文件、日志文件路径完全一致,可省略这两个参数

5.5 配置主库静态监听

数据库nomount状态下,PMON进程无法动态注册监听,必须配置静态监听才能远程连接到实例。

bash 复制代码
# 编辑监听配置文件
vi $ORACLE_HOME/network/admin/listener.ora

写入以下内容:

ini 复制代码
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = primary)(PORT = 1521))
    )
  )

# 静态监听配置
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = primdb)
      (SID_NAME = primdb)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0.4/db_1)
    )
  )

ADR_BASE_LISTENER = /u01/app/oracle

重启监听使配置生效:

bash 复制代码
lsnrctl stop
lsnrctl start

# 验证监听状态,预期看到primdb服务READY/UNKNOWN
lsnrctl status

5.6 配置主库TNS网络服务名

主备库的tnsnames.ora文件内容完全一致。

bash 复制代码
# 编辑TNS配置文件
vi $ORACLE_HOME/network/admin/tnsnames.ora

写入以下内容:

ini 复制代码
# 主库本地别名
primary =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = primary)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = primdb)
    )
  )

# 备库远程别名
standby =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = primdb)
    )
  )

⚠️ 备库的SERVICE_NAME必须和主库的db_name一致(primdb),不能写备库的db_unique_name


六、DG备库核心前置配置

6.1 同步主库密码文件

主备库之间的远程sysdba认证,依赖密码文件,主备库sys用户密码必须完全一致。

bash 复制代码
# 主库执行:scp拷贝密码文件到备库
su - oracle
cd $ORACLE_HOME/dbs
scp orapwprimdb oracle@standby:$ORACLE_HOME/dbs/

# 备库执行:重命名密码文件为备库的ORACLE_SID对应名称
su - oracle
cd $ORACLE_HOME/dbs
mv orapwprimdb orapwstandb

# 验证密码文件权限,必须是640,属主oracle:oinstall
ls -l orapwstandb

6.2 创建备库参数文件并启动到nomount状态

bash 复制代码
# 1. 主库执行:生成pfile参数文件
sqlplus / as sysdba
SQL> create pfile from spfile;
exit

# 2. 主库执行:拷贝pfile文件到备库
cd $ORACLE_HOME/dbs
scp initprimdb.ora oracle@standby:$ORACLE_HOME/dbs/

# 3. 备库执行:重命名pfile文件为备库ORACLE_SID对应名称
su - oracle
cd $ORACLE_HOME/dbs
mv initprimdb.ora initstandb.ora

# 4. 备库执行:编辑pfile文件,修改核心参数
cat > initstandb.ora <<'EOF'
memory_target=1216M
memory_max_target=1216M
compatible=11.2.0.4.0
*.audit_file_dest='/u01/app/oracle/admin/standb/adump'
*.db_name='primdb'
*.db_unique_name='standb'
*.db_file_name_convert='/u01/app/oracle/oradata/primdb','/u01/app/oracle/oradata/standb'
*.log_file_name_convert='/u01/app/oracle/oradata/primdb','/u01/app/oracle/oradata/standb'
*.control_files='/u01/app/oracle/oradata/standb/control01.ctl','/u01/app/oracle/oradata/standb/control02.ctl'
*.log_archive_config='DG_CONFIG=(primdb,standb)'
*.log_archive_dest_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standb'
*.log_archive_dest_2='SERVICE=primary LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primdb'
*.fal_client='standb'
*.fal_server='primary'
*.standby_file_management='AUTO'
*.remote_login_passwordfile='EXCLUSIVE'
*.processes=150
EOF

# 5. 备库执行:通过pfile创建spfile,启动数据库到nomount状态
sqlplus / as sysdba
-- 通过pfile创建spfile
create spfile from pfile;
-- 启动数据库到nomount状态
startup nomount;
-- 验证数据库状态,预期输出STARTED
select status from v$instance;
exit

6.3 配置备库静态监听

bash 复制代码
# 编辑监听配置文件
vi $ORACLE_HOME/network/admin/listener.ora

写入以下内容:

ini 复制代码
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))
    )
  )

# 静态监听配置
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = primdb)
      (SID_NAME = standb)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0.4/db_1)
    )
  )

ADR_BASE_LISTENER = /u01/app/oracle

重启监听使配置生效:

bash 复制代码
lsnrctl stop
lsnrctl start

# 验证监听状态
lsnrctl status

6.4 配置备库TNS网络服务名

备库的tnsnames.ora文件和主库完全一致,直接从主库拷贝即可:

bash 复制代码
# 主库执行:拷贝tnsnames.ora到备库
scp $ORACLE_HOME/network/admin/tnsnames.ora oracle@standby:$ORACLE_HOME/network/admin/

# 备库验证文件内容
cat $ORACLE_HOME/network/admin/tnsnames.ora

6.5 主备库连通性与远程认证验证

这一步是DG搭建的核心卡点,必须确保主备库之间的TNS通信和sysdba远程认证完全正常。

bash 复制代码
# 1. tnsping网络连通性测试
# 主库执行,预期均输出OK
tnsping primary
tnsping standby

# 备库执行,预期均输出OK
tnsping primary
tnsping standby

# 2. sysdba远程登录认证测试
# 主库执行,远程登录备库
sqlplus sys/oracle@standby as sysdba
SQL> select status from v$instance;
SQL> exit

# 备库执行,远程登录主库
sqlplus sys/oracle@primary as sysdba
SQL> select status from v$instance;
SQL> exit

⚠️ 若连接失败,优先检查:密码文件一致性、静态监听配置、TNS配置、防火墙、hosts解析。


七、RMAN duplicate创建物理备库

Oracle 11g提供的from active database特性,可直接通过网络从主库复制数据文件、控制文件到备库,无需手动备份还原。

7.1 备库创建前置检查

  1. 主库处于open状态,实例运行正常
  2. 备库处于nomount状态,实例运行正常
  3. 主备库监听均正常启动,静态监听配置正确
  4. 主备库TNS连通性正常,sysdba远程认证通过
  5. 主备库密码文件完全一致,sys用户密码相同

7.2 执行RMAN duplicate创建备库

bash 复制代码
# 备库执行,连接主库为target,备库为auxiliary
rman target sys/oracle@primary auxiliary sys/oracle@standby nocatalog

# 核心命令,创建物理备库
RMAN> duplicate target database for standby from active database nofilenamecheck;

命令说明:

  • for standby:创建的是备库控制文件,而非普通克隆库
  • from active database:直接从运行中的主库复制数据,无需提前备份
  • nofilenamecheck:跳过文件名一致性检查,已配置db_file_name_convert时必须添加

该命令执行时长取决于主库数据文件大小,执行完成后,备库会自动启动到mount状态。

7.3 备库创建完成状态验证

sql 复制代码
-- 备库执行,验证数据库角色和状态
sqlplus / as sysdba
select open_mode,database_role from v$database;
exit

预期输出:

diff 复制代码
OPEN_MODE            DATABASE_ROLE
-------------------- ----------------
MOUNTED              PHYSICAL STANDBY

八、Standby Redo日志配置与实时同步开启

8.1 Standby Redo日志(SRL)配置原则

  1. SRL组数量 = 主库在线redo组数量 + 1
  2. 每个SRL的大小和主库在线redo日志完全一致
  3. 主库和备库都需要创建SRL(主备切换后使用)

8.2 主库创建Standby Redo日志

sql 复制代码
-- 主库执行,查询在线redo日志组数量和大小
sqlplus / as sysdba
select group#,bytes/1024/1024 as size_m,status from v$log;

-- 示例:3组在线redo日志,每组50M,创建4组SRL
alter database add standby logfile group 4 ('/u01/app/oracle/oradata/primdb/stredo04.log') size 50M;
alter database add standby logfile group 5 ('/u01/app/oracle/oradata/primdb/stredo05.log') size 50M;
alter database add standby logfile group 6 ('/u01/app/oracle/oradata/primdb/stredo06.log') size 50M;
alter database add standby logfile group 7 ('/u01/app/oracle/oradata/primdb/stredo07.log') size 50M;

-- 验证SRL创建成功
select group#,bytes/1024/1024 as size_m,status from v$standby_log;
exit

8.3 备库创建Standby Redo日志

sql 复制代码
-- 备库执行,创建SRL
sqlplus / as sysdba
alter database add standby logfile group 4 ('/u01/app/oracle/oradata/standb/stredo04.log') size 50M;
alter database add standby logfile group 5 ('/u01/app/oracle/oradata/standb/stredo05.log') size 50M;
alter database add standby logfile group 6 ('/u01/app/oracle/oradata/standb/stredo06.log') size 50M;
alter database add standby logfile group 7 ('/u01/app/oracle/oradata/standb/stredo07.log') size 50M;

-- 验证SRL创建成功
select group#,bytes/1024/1024 as size_m,status from v$standby_log;
exit

8.4 备库只读打开与实时同步开启

Oracle 11g支持ADG(Active Data Guard)功能,备库可在只读打开的同时应用redo日志,实现读写分离。

sql 复制代码
-- 1. 备库执行,打开数据库到只读状态
sqlplus / as sysdba
alter database open;

-- 验证打开模式,预期输出READ ONLY
select open_mode from v$database;

-- 2. 备库执行,开启实时应用模式
alter database recover managed standby database using current logfile disconnect from session;
exit

8.5 实时同步状态最终验证

验证1:备库核心状态查询

sql 复制代码
sqlplus / as sysdba
select open_mode,database_role,protection_mode,protection_level from v$database;
exit

预期输出(实时同步正常):

sql 复制代码
OPEN_MODE            DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL
-------------------- ---------------- -------------------- --------------------
READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE

验证2:MRP进程状态查询

sql 复制代码
sqlplus / as sysdba
select process,status,thread#,sequence#,block# from v$managed_standby;
exit

预期输出关键片段:

bash 复制代码
PROCESS   STATUS          THREAD#  SEQUENCE#     BLOCK#
--------- ------------ ---------- ---------- ----------
MRP0      WAIT_FOR_LOG          1          0          0
RFS       IDLE                  1         10        120

验证3:主备确认无延迟

sql 复制代码
sqlplus / as sysdba
select name,value from v$dataguard_stats where name in ('apply lag','transport lag');
exit

正常结果:

diff 复制代码
NAME                  VALUE
--------------------- --------------------
transport lag         +00 00:00:00
apply lag             +00 00:00:00

验证4:数据同步测试

sql 复制代码
-- 主库执行,创建测试表并插入数据
sqlplus / as sysdba
create table test_dg(id number,name varchar2(50));
insert into test_dg values(1,'DG同步测试成功');
insert into test_dg values(2,'Oracle 11g ADG实时同步');
commit;

-- 手动切换日志,触发同步
alter system archive log current;
exit

-- 备库执行,查询测试表
sqlplus / as sysdba
select * from test_dg;
exit

恭喜:至此,Oracle 11g DataGuard物理备库已完整搭建完成,主备库实时同步正常!


九、DG高级特性与生产最佳实践

9.1 DG三种数据保护模式

Oracle DG提供3种保护模式,适配不同的RPO/RTO要求,可在线切换。

保护模式 核心特点 数据丢失风险 性能影响 适用场景
最大性能模式 (Max Performance) 默认模式,主库提交事务无需等待备库确认,redo异步传输 极端情况有少量数据丢失 几乎无性能影响 绝大多数生产环境,优先保证业务性能
最大可用模式 (Max Availability) 主库提交事务需等待备库接收redo确认,备库故障时自动降级 正常情况零数据丢失,备库故障时降级有风险 轻微性能影响 兼顾数据安全和业务连续性,同城容灾
最大保护模式 (Max Protection) 最高安全级别,主库提交事务必须等待备库写入redo确认,备库故障时主库立即宕机 零数据丢失 显著性能影响,依赖低延迟网络 金融、支付等核心业务,数据零丢失要求

保护模式切换操作:

sql 复制代码
-- 1. 切换为最大可用模式(主库执行)
shutdown immediate;
startup mount;
alter database set standby database to maximize availability;
alter database open;

-- 2. 切换为最大保护模式(主库执行)
shutdown immediate;
startup mount;
alter database set standby database to maximize protection;
alter database open;

-- 3. 切回默认最大性能模式(主库执行)
shutdown immediate;
startup mount;
alter database set standby database to maximize performance;
alter database open;

-- 验证当前保护模式
select protection_mode,protection_level from v$database;

9.2 主备库角色切换

DG提供两种角色切换方式,分别用于计划内运维和故障应急场景。

9.2.1 Switchover:计划内无损切换

Switchover是主备角色互换的无损切换,无数据丢失,用于日常运维、数据库版本升级、机房割接等场景。 切换前提:

  1. 主备库同步正常,无日志GAP
  2. 主库处于open状态,备库处于READ ONLY WITH APPLY状态
  3. 主备库均已配置Standby Redo日志
  4. 主库的switchover_statusTO STANDBYSESSIONS ACTIVE

切换步骤:

sql 复制代码
-- 步骤1:主库执行,检查切换状态
select switchover_status from v$database;

-- 步骤2:主库执行,切换为备库角色
alter database commit to switchover to physical standby with session shutdown;

-- 步骤3:原主库执行,重启到mount状态
shutdown immediate;
startup mount;

-- 步骤4:原备库执行,检查切换状态
select switchover_status from v$database;

-- 步骤5:原备库执行,切换为主库角色
alter database commit to switchover to primary with session shutdown;

-- 步骤6:新主库执行,打开数据库
alter database open;

-- 步骤7:新备库执行,开启实时同步
alter database recover managed standby database using current logfile disconnect from session;

-- 步骤8:验证角色状态
select database_role from v$database;
9.2.2 Failover:故障应急切换

Failover是主库故障无法恢复时的应急切换,属于计划外切换,可能有数据丢失,仅在主库完全不可用时执行。 切换步骤:

sql 复制代码
-- 步骤1:备库执行,检查日志GAP,尽可能补齐主库未传输的归档日志
select thread#,low_sequence#,high_sequence# from v$archive_gap;
-- 若有GAP,手动拷贝主库归档到备库,注册后应用
-- alter database register physical logfile '/u01/app/oracle/arch/1_10_1234567890.arc';

-- 步骤2:备库执行,结束redo应用
alter database recover managed standby database cancel;

-- 步骤3:备库执行,切换为主库角色
alter database recover managed standby database finish;
alter database commit to switchover to primary;

-- 步骤4:新主库执行,打开数据库
alter database open;

-- 步骤5:验证角色状态
select database_role from v$database;

⚠️ Failover执行后,原主库需重新搭建为备库,无法直接回切。

9.3 DG Broker配置与使用

DG Broker是Oracle官方提供的DG管理工具,可简化主备切换、状态监控、配置管理操作。 核心配置步骤:

sql 复制代码
-- 步骤1:主备库均执行,开启DG Broker启动参数
alter system set dg_broker_start=true scope=both;

-- 步骤2:主备库监听均添加DGMGRL静态服务(listener.ora)
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = primdb)
      (SID_NAME = primdb)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0.4/db_1)
    )
    -- 新增DGMGRL静态服务
    (SID_DESC =
      (GLOBAL_DBNAME = primdb_DGMGRL)
      (SID_NAME = primdb)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0.4/db_1)
    )
  )

-- 主备库重启监听使配置生效
lsnrctl stop
lsnrctl start

-- 步骤3:主库执行,启动DGMGRL工具,连接主库
dgmgrl
DGMGRL> connect sys/oracle@primary

-- 步骤4:创建DG Broker配置
DGMGRL> create configuration 'dg_broker' as primary database is 'primdb' connect identifier is primary;

-- 步骤5:添加备库到配置
DGMGRL> add database 'standb' as connect identifier is standby maintained as physical;

-- 步骤6:启用配置
DGMGRL> enable configuration;

-- 步骤7:查看配置状态
DGMGRL> show configuration;

DG Broker常用命令:

bash 复制代码
# 查看主备库详情
show database verbose primdb;
show database verbose standb;

# 计划内switchover切换
switchover to standb;

# 故障failover切换
failover to standb;

# 禁用/启用配置
disable configuration;
enable configuration;
相关推荐
ClouGence6 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
ClouGence12 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
曹牧13 天前
Oracle EXPLAIN PLAN
数据库·oracle
贤时间13 天前
codex 助力oracle ebs 开发
数据库·oracle
秉承初心13 天前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle
Curvatureflight13 天前
MySQL 深分页越来越慢?从 LIMIT OFFSET 改成游标分页
数据库·oracle
XZ-07000113 天前
MySQL事务
数据库·mysql·oracle
tiancaijiben13 天前
阿里云函数计算FC如何实现网站的定时任务与自动化
数据库·oracle·dba
xfhuangfu13 天前
Oracle 19c 多租户体系架构介绍
数据库·oracle·架构
杨云龙UP13 天前
Spotlight 接入 Oracle 数据库监控操作指南 2026-06-16
数据库·oracle·性能监控·预警·阈值·spotlight·瓶颈分析