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;
相关推荐
希望永不加班3 小时前
SpringBoot 缓存一致性:缓存与数据库双写策略
数据库·spring boot·后端·缓存·oracle
淘矿人4 小时前
2026大模型API中转平台深度评测:weelinking领衔五大服务商横向实测与选型指南
开发语言·人工智能·python·oracle·数据挖掘·php·pygame
逻辑驱动的ken20 小时前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
下地种菜小叶21 小时前
定时任务系统怎么设计?一次讲清任务注册、分布式调度、幂等执行与失败补偿
java·开发语言·数据库·oracle·rabbitmq
-XWB-1 天前
【Oracle】Oracle诊断系列(5/6):统计信息与执行计划——优化器的“大脑”管理
数据库·oracle
大江东去浪淘尽千古风流人物1 天前
【cuVSLAM】项目解析:一套偏工程实战的 GPU 紧耦合视觉惯性 SLAM
数据库·人工智能·python·机器学习·oracle
oradh1 天前
Oracle数据库视图概述
数据库·oracle·数据库视图·oracle基础·oracle入门
爱学的小码1 天前
MySQL(进阶)--存储过程和触发器
数据库·oracle
懒铭心1 天前
RHEL 7 + Oracle 19.3.0 单实例部署指南
oracle