一、环境规划
项目 | 主库 Primary | 备库 Standby |
---|---|---|
操作系统 | CentOS Linux 7.9.2009 | CentOS Linux 7.9.2009 |
数据库版本 | 11.2.0.4 | 11.2.0.4 |
IP地址 | 192.168.10.101 | 192.168.10.102 |
db_name | orcl | orcl |
instance_name | orcl | orcl |
db_unique_name | orcl_pri | orcl_sby |
tnsname | orcl_pri | orcl_sby |
service_names(服务名) | orcl | orcl |
提前准备 | 安装数据库软件、DBCA建库、监听 | 只安装数据库软件 |
DataGuard主从库的命名通常遵循以下规则(参考):
主库(Primary Database):通常命名为primary或pri。
备库(Standby Database):通常命名为standby或sby。
说明
- 主库和备库建议采用相同服务器配置。
- 主库和备库建议采用相同操作系统版本。
- 主库和备库需要采用相同数据库版本(含 PSU)。
db_name
相同。db_unique_name
不同。
二、主库参数配置
1. 启用强制记录日志 (Force Logging)
-
查看:
SELECT log_mode, force_logging FROM v$Database;
-
启用:
ALTER DATABASE FORCE LOGGING;
2. 启用归档模式
-
查看:
ARCHIVE LOG LIST; SELECT log_mode FROM v$database;
-
启用:
SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER SYSTEM SET log_archive_dest_1='location=/u01/archivelog/orcl'; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN;
3. 配置主库监听和 TNS
监听器配置
-
监听文件默认路径:
$ORACLE_HOME/network/admin/listener.ora
-
配置静态监听,增加
SID_LIST_LISTENER
部分,然后使用lsnrctl reload
重新加载监听器配置。 -
示例配置:
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.101)(PORT = 1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) -- GLOBAL_DBNAME 对应监听里的服务名 (SID_NAME = orcl) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) ) ) ADR_BASE_LISTENER = /u01/app/oracle
TNS 配置
-
TNS 文件默认路径:
$ORACLE_HOME/network/admin/tnsnames.ora
-
方便主备切换服务名设置相同,配置如下:
orcl_pri = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.101)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) orcl_sby = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.102)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )
4. 配置主库参数
-
修改归档文件名后缀为
.arc
(可选):ALTER SYSTEM SET log_archive_format='%t_%s_%r.arc' SCOPE=SPFILE;
-
检查
db_unique_name
:SHOW PARAMETER db_unique_name; ALTER SYSTEM SET db_unique_name='orcl_pri' SCOPE=SPFILE;
-
修改
log_archive_config
参数,括号中为主备库的db_unique_name
:ALTER SYSTEM SET log_archive_config='DG_CONFIG=(orcl_pri,orcl_sby)' SCOPE=BOTH;
-
配置
log_archive_dest_1
,主库归档位置:ALTER SYSTEM SET log_archive_dest_1='LOCATION=/u01/archivelog/orcl VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_pri' SCOPE=BOTH;
-
配置
log_archive_dest_2
,备库归档位置,采用 LGWR 异步传输方式:ALTER SYSTEM SET log_archive_dest_2='SERVICE=orcl_sby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_sby' SCOPE=BOTH;
-
修改归档日志进程的最大数量(可选):
ALTER SYSTEM SET log_archive_max_processes=30 SCOPE=BOTH; SHOW PARAMETER log_archive_max_processes;
-
检查数据库口令文件的使用模式:
SHOW PARAMETER remote_login_passwordfile; ALTER SYSTEM SET remote_login_passwordfile=EXCLUSIVE SCOPE=SPFILE;
-
修改
/etc/hosts
文件,追加主备库 IP 与主机名对应关系,备库同样配置:echo "192.168.10.101 db1" >> /etc/hosts echo "192.168.10.102 db2" >> /etc/hosts
-
修改
db_file_name_convert
参数,主备库数据文件名称和路径对应关系:ALTER SYSTEM SET db_file_name_convert='/oracle/app/oracle/oradata/orcl_sby', '/oradata/datafile/orcl/' SCOPE=SPFILE;
-
修改
log_file_name_convert
参数,主备库日志文件名称和路径对应关系:ALTER SYSTEM SET log_file_name_convert='/u01/app/oracle/oradata/orcl_sby', '/oradata/datafile/orcl/' SCOPE=SPFILE;
-
设置
standby_file_management
为自动:ALTER SYSTEM SET standby_file_management=auto;
-
修改
fal_client
及fal_server
:ALTER SYSTEM SET fal_client='orcl_pri' SCOPE=BOTH; -- 本地 TNS ALTER SYSTEM SET fal_server='orcl_sby' SCOPE=BOTH; -- 备库 TNS
三、备库配置
1. 密码文件
-
主库和备库的 SYS 密码必须一致:
-
方式 1:使用
orapwd
设置相同密码:orapwd file=orapworcl password=<password>
-
方式 2:将主库密码文件复制到备库
$ORACLE_HOME/dbs
目录下,并修改密码文件名为orapworcl
:scp <主库密码文件> <备库用户>@<备库IP>:/u01/app/oracle/product/11.2.0/db_1/dbs/orapworcl
-
2. 设置 pfile 文件并启动到 nomount 状态
-
在
dbs
目录下创建initorcl.ora
并参考主库添加参数:db_name='orcl' service_names='orcl' db_unique_name='orcl_sby' pga_aggregate_target=191889408 -- 设置跟主库一样 sga_target=575668224 -- 设置跟主库一样 audit_file_dest='/u01/app/oracle/admin/orcl/adump' -- 创建这个路径 compatible='11.2.0.4.0' -- 兼容性参数 主备库要保持一致 log_archive_format='%t_%s_%r.arc' control_files='/u01/app/oracle/oradata/orcl/control01.ctl', '/u01/app/oracle/oradata/orcl/control02.ctl' -- 注意修改文件路径中的实例名 log_archive_config='DG_CONFIG=(orcl_pri,orcl_sby)' log_archive_dest_1='LOCATION=/u01/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_sby' log_archive_dest_2='SERVICE=orcl_pri LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_pri' -- 日志传输为 LGWR ASYNC 异步传输 db_file_name_convert='/oradata/datafile/orcl/', '/u01/app/oracle/oradata/orcl' -- 前面是对方的,后面是本地的 log_file_name_convert='/oradata/datafile/orcl/', '/u01/app/oracle/oradata/orcl' fal_client='orcl_sby' -- 该参数与主库设置相反 fal_server='orcl_pri' -- 该参数与主库设置相反 standby_file_management='AUTO'
-
使用刚才编辑的 pfile 创建 spfile:
STARTUP NOMOUNT PFILE='/u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora'; CREATE SPFILE FROM PFILE;
-
关闭数据库正常启动到 nomount 状态:
SHUTDOWN IMMEDIATE; STARTUP NOMOUNT;
-
查看是否使用 spfile 启动:
SHOW PARAMETER spfile;
3. 备库配置监听与 TNS
监听器配置
-
监听文件默认路径:
$ORACLE_HOME/network/admin/listener.ora
-
配置静态监听,增加
SID_LIST_LISTENER
部分,然后使用lsnrctl reload
重新加载监听器配置。 -
示例配置:
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.102)(PORT = 1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) (SID_NAME = orcl_sby) (ORACLE_HOME = /oracle/app/oracle/product/11.2.0/db_1) ) ) ADR_BASE_LISTENER = /u01/app/oracle DIAG_ADR_ENABLED_LISTENER = OFF
TNS 配置
-
TNS 文件默认路径:
$ORACLE_HOME/network/admin/tnsnames.ora
-
方便主备切换服务名设置相同,配置如下:
ORCL_PRI = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.101)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) ORCL_SBY = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.102)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )
4. 测试 TNS
-
主库和备库分别测试:
tnsping orcl_pri tnsping orcl_sby sqlplus sys/oracle@orcl_pri as sysdba sqlplus sys/oracle@orcl_sby as sysdba
-
注意:如果出现 TNS-12543 错误,关闭防火墙再试。如果
tnsping
出现 ORA-12541 错误,检查一下hosts
文件里面是否配置正常,备库也要配置好。
四、使用 Duplicate 创建物理 Standby
备库执行
-
连接 RMAN 并连接辅助(auxiliary)实例,备库目前是 nomount 状态:
rman target sys/oracle@orcl_pri auxiliary sys/oracle@orcl_sby
-
执行复制:
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE NOFILENAMECHECK;
-
注意:
- 第一次 duplicate 时遇到 ORA-17628 错误,排查后发现为需要提前创建的文件夹没有创建。
- 之前设置过
db_file_name_convert
和log_file_name_convert
,这里就会按照设置的地址拷贝。
五、添加 Standby 日志组并开启同步
1. 主备库添加 Standby 日志组
-
standby 日志组数量:redo 日志组数量 + 1
-
添加前需要查看已有的日志组号:
SELECT * FROM v$log;
-
主库添加:
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/oradata/datafile/orcl/sby_redo05.log') SIZE 500M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/oradata/datafile/orcl/sby_redo06.log') SIZE 500M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/oradata/datafile/orcl/sby_redo07.log') SIZE 500M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 8 ('/oradata/datafile/orcl/sby_redo08.log') SIZE 500M;
-
备库添加:
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/oracle/app/oracle/oradata/orcl/sby_redo05.log') SIZE 500M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/oracle/app/oracle/oradata/orcl/sby_redo06.log') SIZE 500M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/oracle/app/oracle/oradata/orcl/sby_redo07.log') SIZE 500M; ALTER DATABASE ADD STANDBY LOGFILE GROUP 8 ('/oracle/app/oracle/oradata/orcl/sby_redo08.log') SIZE 500M;
-
查看 standby 日志:
SELECT * FROM v$standby_log;
-
打开备库:
ALTER DATABASE OPEN;
2. 设置同步
-
开启实时同步(启动 MRP 进程),备库操作:
-- 开启 real time apply ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT; -- 简写
-
开启同步,日志切换才会同步:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
-
停止同步(关闭 MRP 进程):
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
3. 主备库检查模式
-
查询主备库状态:
SELECT open_mode, database_role, protection_mode, protection_level FROM v$database;
-
备库显示:
open_mode
:备库标识为READ ONLY WITH APPLY
,表示应用了日志。如果关闭同步则这里只有READ ONLY
。database_role
:标识为主库还是备库,此时为物理备库。protection_mode
和protection_level
此时标识都是最大性能模式。
六、总结
通过以上步骤,可以成功搭建一个稳定的 Data Guard 环境,确保数据的一致性和高可用性。