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 IP192.168.56.101/24 - 备库:主机名
standby,Host-Only IP192.168.56.102/24 - NAT网卡:自动获取IP,用于外网下载依赖包
1.4 磁盘与内存规划
-
单节点内存:3072MB(3GB),双节点总占用6GB
-
单节点系统盘:60GB 固定大小VMDK虚拟磁盘
-
单节点分区方案:
挂载点 大小 文件系统 核心用途 /boot1GB ext4 系统引导与内核文件 swap4GB swap 虚拟内存换页空间 /15GB ext4 系统根目录 /u0140GB ext4 Oracle软件与数据存储
二、创建虚拟机与安装系统
核心思路:先制作通用模板虚拟机,完成通用配置与Oracle软件安装,再完整克隆生成主备库,仅修改差异化参数,减少重复操作。
2.1 创建虚拟机
- 打开 VirtualBox,点击「新建」,名称设为
primary,选择RHEL 6.10镜像 - 内存分配3072MB,创建60GB固定大小VMDK虚拟磁盘
- 启动顺序:硬盘优先,移除软驱
2.2 虚拟机硬件配置
- 存储:挂载RHEL 6.10 ISO镜像
- 网络:网卡1为Host-Only,网卡2为NAT
2.3 安装 RHEL 6.10
- 启动虚拟机,加载ISO,语言选English,时区Asia/Shanghai
- 软件选择:带GUI的服务器
- 按1.4章节分区方案手动分区
- 网络配置:主机名
primary,Host-Only静态IP192.168.56.101/24 - 设置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软件(仅安装软件,不建库)
- 上传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
- 切换到图形化界面,执行安装程序:
bash
su - oracle
cd /soft/database
export DISPLAY=192.168.56.1:0.0
./runInstaller
-
安装向导关键配置步骤: a. 配置安全更新:取消勾选「我希望通过My Oracle Support接收安全更新」,点击下一步,弹窗选择「是」 b. 安装选项:选择「仅安装数据库软件」,点击下一步 c. 网格安装选项:选择「单实例数据库安装」,点击下一步 d. 产品语言:默认English,可额外添加简体中文,点击下一步 e. 数据库版本:选择「企业版」,点击下一步 f. 安装位置:
ORACLE_BASE和ORACLE_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.shk. 脚本执行完成后,点击「关闭」,完成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完整克隆操作
- VirtualBox中选中主库
primary,右键选择「复制」 - 新虚拟机名称:
standby(备库),文件夹选择对应路径 - 勾选「重新初始化所有网卡的MAC地址」(必须勾选,否则MAC地址冲突导致网络不通)
- 克隆类型:选择「完整克隆」,点击下一步
- 硬盘分配:选择「为所有虚拟硬盘生成新的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,创建数据库实例,核心配置步骤:
- 操作:选择「创建数据库」,点击下一步
- 模板:选择「一般用途或事务处理」,点击下一步
- 数据库标识:全局数据库名
primdb,SIDprimdb,点击下一步 - 管理选项:取消勾选「配置Enterprise Manager」,减少资源占用,点击下一步
- 数据库凭据:为所有账户使用同一管理口令,设置密码
oracle,点击下一步 - 存储选项:选择「文件系统」,点击下一步
- 数据库文件位置:选择「使用模板中的数据库文件位置」,路径为
/u01/app/oracle/oradata/primdb,点击下一步 - 恢复配置:勾选「指定快速恢复区」,勾选「启用归档」,点击下一步
- 数据库内容:仅保留勾选Oracle Text、Sample Schemas,取消勾选其他非必要组件,点击下一步
- 初始化参数:
- 内存:勾选Typical,内存大小设置为2048MB,勾选「Use Automatic Memory Management (AMM)」
- 字符集:选择「AL32UTF8 - Unicode UTF-8 Universal Character Set」
- 块大小:保持默认8192 Bytes(8K),Processes保持默认150
- 连接模式:勾选「Dedicated Server Mode(专用服务器模式)」
- 数据库存储:无需修改,点击下一步
- 创建选项:仅保留勾选「创建数据库」,点击完成
- 概要:核对所有配置无误后,点击「确定」开始建库
- 建库完成后,点击「退出」
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
⚠️ 若未开启归档,执行以下命令开启:
sqlshutdown 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
⚠️ 关键注意事项:
log_archive_dest_2中的SERVICE=standby必须和后续tnsnames.ora中的备库别名完全一致db_file_name_convert和log_file_name_convert参数顺序不能写反- 若主备库数据文件、日志文件路径完全一致,可省略这两个参数
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 备库创建前置检查
- 主库处于open状态,实例运行正常
- 备库处于nomount状态,实例运行正常
- 主备库监听均正常启动,静态监听配置正确
- 主备库TNS连通性正常,sysdba远程认证通过
- 主备库密码文件完全一致,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)配置原则
- SRL组数量 = 主库在线redo组数量 + 1
- 每个SRL的大小和主库在线redo日志完全一致
- 主库和备库都需要创建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是主备角色互换的无损切换,无数据丢失,用于日常运维、数据库版本升级、机房割接等场景。 切换前提:
- 主备库同步正常,无日志GAP
- 主库处于open状态,备库处于
READ ONLY WITH APPLY状态 - 主备库均已配置Standby Redo日志
- 主库的
switchover_status为TO STANDBY或SESSIONS 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;