环境说明
-
主库: 10.250.10.11
-
备库: 10.250.10.12
-
数据库版本: 11g, 12c, 18c, 21c, 23ai
-
数据库名称: orcl
-
DB_UNIQUE_NAME: primary (主库), standby (备库)
1. Oracle 11g 主备搭建
1.1 主库准备 (10.250.10.11)
# 1. 检查数据库状态
sqlplus / as sysdba
SELECT name, log_mode, open_mode FROM v$database;
# 2. 启用归档模式(如未启用)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
# 3. 启用强制日志记录
ALTER DATABASE FORCE LOGGING;
# 4. 配置归档参数
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;
# 5. 创建Standby Redo Logs (建议比Online Redo Logs多1个组)
SELECT group#, bytes FROM v$log; -- 查看当前redo log大小
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/srl4a.rdo') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/srl5a.rdo') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/srl6a.rdo') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/srl7a.rdo') SIZE 50M;
# 6. 备份数据库(为11g的基于备份的duplicate准备)
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
# 7. 创建密码文件(如不存在)
orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle entries=10
# 8. 配置监听器和tnsnames.ora
# listener.ora 添加:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = orcl)
)
)
# tnsnames.ora 添加:
primary =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.250.10.11)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
standby =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.250.10.12)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
1.2 备库初始化 (10.250.10.12)
# 1. 创建必要的目录结构
mkdir -p /u01/app/oracle/admin/orcl/adump
mkdir -p /u01/app/oracle/oradata/orcl
mkdir -p /u01/app/oracle/fast_recovery_area/orcl
# 2. 手动复制密码文件从主库
scp oracle@10.250.10.11:$ORACLE_HOME/dbs/orapworcl $ORACLE_HOME/dbs/
# 3. 手动创建参数文件(基于主库spfile创建pfile并修改)
sqlplus sys/oracle@primary as sysdba
CREATE PFILE='/tmp/init_orcl.ora' FROM SPFILE;
# 修改参数文件关键参数:
*.db_unique_name='standby'
*.log_archive_dest_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
*.fal_server='primary'
*.standby_file_management='AUTO'
# 4. 复制修改后的参数文件到备库
scp /tmp/init_orcl.ora oracle@10.250.10.12:$ORACLE_HOME/dbs/initorcl.ora
# 5. 配置备库网络(与主库类似的tnsnames.ora和listener.ora)
1.3 备库应用配置与验证
# 1. 启动备库到nomount状态
export ORACLE_SID=orcl
sqlplus / as sysdba
STARTUP NOMOUNT PFILE='$ORACLE_HOME/dbs/initorcl.ora'
# 2. 使用RMAN执行Duplicate(基于备份的方式)
rman target sys/oracle@primary auxiliary sys/oracle@standby
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY NOFILENAMECHECK;
# 3. 启动MRP进程
sqlplus / as sysdba
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
# 4. 验证备库状态
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;
SELECT DATABASE_ROLE, OPEN_MODE, PROTECTION_MODE FROM V$DATABASE;
2. Oracle 12c 主备搭建
2.1 主库准备 (10.250.10.11)
# 1. 基础配置(同11g,但使用12c的ORACLE_HOME)
# 启用归档、强制日志等步骤相同
# 2. 12c 新特性:使用PDB(可选)
CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdbadmin IDENTIFIED BY oracle;
# 3. 配置12c特定的归档参数
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' SCOPE=BOTH;
2.2 备库初始化 (10.250.10.12)
# 1. 创建目录(同11g)
mkdir -p /u01/app/oracle/oradata/orcl/pdb1
# 2. 启动到nomount状态(无需手动复制参数文件)
sqlplus / as sysdba
STARTUP NOMOUNT;
2.3 备库应用配置与验证
# 1. 使用12c增强的DUPLICATE命令
rman target sys/oracle@primary auxiliary sys/oracle@standby
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY
FROM ACTIVE DATABASE
PASSWORD FILE
SPFILE
SET db_unique_name='standby'
SET log_archive_dest_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
SET fal_server='primary'
NOFILENAMECHECK;
# 2. 启动MRP进程
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
# 3. 12c新特性:实时应用验证
SELECT * FROM V$DATAGUARD_STATS;
3. Oracle 18c 主备搭建
3.1 主库准备 (10.250.10.11)
# 1. 18c 新特性:配置自动备库创建优化
ALTER SYSTEM SET STANDBY_MAX_DATA_DELAY=30 SCOPE=BOTH;
# 2. 确保使用本地UNDO表空间(18c默认)
SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE CONTENTS='UNDO';
3.2 备库初始化 (10.250.10.12)
# 1. 18c 简化了目录创建,部分目录可自动创建
# 只需确保ORACLE_BASE相关目录存在即可
# 2. 直接启动到nomount
STARTUP NOMOUNT;
3.3 备库应用配置与验证
# 1. 使用18c优化的DUPLICATE命令
rman target sys/oracle@primary auxiliary sys/oracle@standby
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY
FROM ACTIVE DATABASE
USING COMPRESSED BACKUPSET
PASSWORD FILE
SPFILE
SET db_unique_name='standby'
SET log_archive_dest_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
SET db_recovery_file_dest_size='50G'
NOFILENAMECHECK
SECTION SIZE 1G;
# 2. 18c新特性:使用Far Sync实例(如配置)
# 3. 验证18c的Active Data Guard增强功能
SELECT * FROM V$STANDBY_EVENT_HISTOGRAM;
4. Oracle 21c 主备搭建
4.1 主库准备 (10.250.10.11)
# 1. 21c 新特性:配置Block Change Tracking优化
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING;
# 2. 使用21c的自动化调优特性
ALTER SYSTEM SET STANDBY_NOLOGGING_MODE=OPTIMIZE;
4.2 备库初始化 (10.250.10.12)
# 1. 21c 支持更灵活的存储配置
# 可考虑使用ASM或云存储
# 2. 启动到nomount状态
STARTUP NOMOUNT;
4.3 备库应用配置与验证
# 1. 使用21c增强的DUPLICATE命令
rman target sys/oracle@primary auxiliary sys/oracle@standby
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY
FROM ACTIVE DATABASE
PASSWORD FILE
SPFILE
SET db_unique_name='standby'
SET log_archive_dest_2='SERVICE=primary LGWR ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
SET "_exadata_feature_on"=TRUE
NOFILENAMECHECK
PARALLEL 4;
# 2. 验证21c新特性
SELECT * FROM V$DG_BROKER_CONFIG;
5. Oracle 23ai 主备搭建
5.1 主库准备 (10.250.10.11)
# 1. 23ai 新特性:配置AI驱动的优化
ALTER SYSTEM SET "_optimizer_adaptive_plans"=TRUE;
# 2. 确保使用最新安全特性
ALTER SYSTEM SET SQLNET.ENCRYPTION_SERVER=REQUIRED;
5.2 备库初始化 (10.250.10.12)
# 1. 23ai 支持完全的自动化配置
# 使用DBCA或Cloud Control可进一步简化
# 2. 启动到nomount状态
STARTUP NOMOUNT;
5.3 备库应用配置与验证
# 1. 使用23ai最简化的DUPLICATE命令
rman target sys/oracle@primary auxiliary sys/oracle@standby
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY
FROM ACTIVE DATABASE
PASSWORD FILE
SPFILE
NOFILENAMECHECK;
# 2. 23ai 自动化程度最高,很多参数可自动识别
# 3. 验证23ai的Active Data Guard增强
SELECT * FROM V$DG_STANDBY_FAST_START_FAILOVER;
6. 通用验证步骤(所有版本)
6.1 主备同步状态验证
-- 在主库检查
SELECT sequence#, applied FROM v$archived_log ORDER BY sequence# DESC;
-- 在备库检查
SELECT process, status, sequence#, block# FROM v$managed_standby;
SELECT database_role, open_mode, protection_mode FROM v$database;
-- 测试数据同步
-- 在主库创建测试表
CREATE TABLE dg_test (id NUMBER, data VARCHAR2(50));
INSERT INTO dg_test VALUES (1, 'Data Guard Test');
COMMIT;
-- 在备库查询(需要先启用实时查询)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN READ ONLY;
SELECT * FROM dg_test;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
6.2 切换测试
-- 主库切换为备库
ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY;
-- 备库切换为主库
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
7. 搭建过程相关问题详解
7.1. Oracle 11g 是否支持不基于备份的 DUPLICATE?
是的,Oracle 11g 也支持不基于备份的 Active Database Duplicate,但有局限性。
11g 的 Active Duplicate 命令:
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY
FROM ACTIVE DATABASE
NOFILENAMECHECK;
但是需要注意:
-
11g 的 Active Duplicate 功能相对不够成熟稳定,在大型生产环境中可能出现问题
-
对网络要求极高,必须保证在整个复制过程中网络绝对稳定
-
对主库性能影响更大,因为是实时传输所有数据文件
为什么教程中推荐基于备份的方式:
-- 先备份
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
-- 再基于备份duplicate
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY NOFILENAMECHECK;
优势:
-
更稳定可靠,适合生产环境
-
网络中断可以重试,不会从头开始
-
对主库影响相对较小
结论:在 11g 中,生产环境推荐使用基于备份的方式,12c 及以后版本再使用 Active Duplicate。
7.2. 密码文件密码设置问题
orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle entries=10
密码设置原则:
-
password=oracle不是随便设置的,需要遵循安全规范 -
实际生产环境:必须使用强密码(大小写字母+数字+特殊字符,至少8位)
-
测试环境:可以使用简单密码,但要确保安全
- 密码必须与sys用户密码一致
重要规则:
-
主库和备库的 SYS 密码必须一致
-
如果有其他 SYSDBA 用户,他们的密码在主备库也要一致
-
entries=10 表示密码文件最多可以存储10个用户(包括SYS)
生产环境推荐:
# 生产环境应该这样创建
orapwd file=$ORACLE_HOME/dbs/orapworcl password='MyStrongPass123!' entries=20
7.3. RMAN 连接参数详解
rman target sys/oracle@primary auxiliary sys/oracle@standby
参数分解:
-
target:指定主库(源数据库)的连接信息-
sys/oracle:用户名/密码 -
@primary:主库的TNS别名(在tnsnames.ora中定义)
-
-
auxiliary:指定备库(辅助实例)的连接信息-
sys/oracle:用户名/密码(必须与主库sys密码一致) -
@standby:备库的TNS别名
-
连接过程说明:
-
RMAN 首先连接到 target(主库),获取数据库结构和数据文件信息
-
然后连接到 auxiliary(备库),在备库上执行恢复操作
-
两个连接必须同时成功,否则duplicate会失败
验证连接:
在执行duplicate前,建议先测试连接:
# 测试主库连接
sqlplus sys/oracle@primary as sysdba
# 测试备库连接
sqlplus sys/oracle@standby as sysdba
7.4. 归档参数配置详解
问题分析:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' SCOPE=BOTH;
这个参数不是Data Guard专用的,但是必须配置的。
参数作用分解:
LOG_ARCHIVE_DEST_1(本地归档):
-
作用:指定归档日志的本地存储位置
-
必要性:无论是否搭建DG,只要启用归档模式就必须配置
-
参数说明:
-
LOCATION=USE_DB_RECOVERY_FILE_DEST:使用快速恢复区存储归档日志 -
VALID_FOR=(ALL_LOGFILES,ALL_ROLES):在任何角色下都对所有日志文件有效
-
LOG_ARCHIVE_DEST_2(远程归档 - DG专用):
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby' SCOPE=BOTH;
-
作用:指定归档日志传输到备库
-
这才是Data Guard的核心参数
为什么需要两个destinations:
| Destination | 用途 | 是否必须 |
|---|---|---|
| DEST_1 | 本地归档:保证主库本地的归档日志完整性,用于主库自己的恢复 | ✅ 必须 |
| DEST_2 | 远程传输:将重做日志实时传输到备库,用于数据同步 | ✅ Data Guard必须 |
完整的最小化配置示例:
-- 1. 本地归档(所有数据库都需要)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' SCOPE=BOTH;
-- 2. 远程归档(Data Guard专用)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby' SCOPE=BOTH;
-- 3. DG配置
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)' SCOPE=BOTH;
7.5. 问题总结
-
11g的DUPLICATE:生产环境推荐基于备份的方式更稳定
-
密码文件:生产环境必须使用强密码,主备库密码一致
-
RMAN连接:理解target和auxiliary的区别很重要
-
归档参数:DEST_1是基础归档配置,DEST_2才是DG专用的同步参数
8. 总结
通过以上详细的步骤,您可以清晰地看到从Oracle 11g到23ai在Data Guard搭建方面的演进:
-
11g: 大量手动操作,需要复制密码文件和参数文件
-
12c: 引入
PASSWORD FILE和SPFILE自动化,简化流程 -
18c: 优化网络传输和压缩,提升大数据库复制效率
-
21c: 进一步增强自动化和云集成
-
23ai: 实现最高程度的自动化,智能配置
每个新版本都在简化操作、提升性能和增强可靠性方面做出了重要改进。
posted on
浙公网安备 33010602011771号