前言
请先参照文章《ADG架构搭建1–Oracle安装》完成第三台服务器的Oracle安装。
本文将完成的ADG架构为:一个主库(ruiadg1)和两个备库(ruiadg2、ruiadg3).
正文
一、修改主备库的tnsnames.ora和listener文件
1.修改主备库tnsnames.ora文件
$ vi $ORACLE_HOME/network/admin/tnsnames.ora
已知服务器 ruiadg1 和 ruiadg2 的ip地址分别为192.168.10.13 和 192.168.10.14 ,假设服务器ruiadg3的ip地址为192.168.10.15。
添加ORCL_STANDBY的相关配置:
ruiadg1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.13)(PORT = 1521))
)
(CONNECT_DATA =
(SID = ruiadg)
)
)
ruiadg2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.14)(PORT = 1521))
)
(CONNECT_DATA =
(SID = ruiadg)
)
)
ruiadg3 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.15)(PORT = 1521))
)
(CONNECT_DATA =
(SID = ruiadg)
)
)
2.修改备库2(ruiadg3)listener.ora文件
在《ADG架构搭建2 – 搭建一主一备ADG架构》中已修改主库(ruiadg1)和备库1(ruiadg2)的listener.ora文件,此处只需修改备库2(ruiadg3)的listener.ora文件。
$ vi $ORACLE_HOME/network/admin/listener.ora
添加静态监听:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ruiadg)
(ORACLE_HOME = /oracle/app/product/12.1.0/dbhome_1)
(SID_NAME = ruiadg)
)
)
listener.ora修改完成后,需重启监听:
$ lsnrctl stop
$ lsnrctl start
二、修改备库2(ruiadg3)归档模式
1.查看归档模式
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 7
Current log sequence 9
2.修改归档模式
若当前为非归档模式,需要修改为归档模式。方法如下:
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 4999610368 bytes
Fixed Size 3721080 bytes
Variable Size 1090521224 bytes
Database Buffers 3892314112 bytes
Redo Buffers 13053952 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 8
Next log sequence to archive 10
Current log sequence 10
三、设置主库(ruiadg1)为强制归档
SQL> alter database force logging;
因主库出现故障后,可能会遇到将备库2切换为主库的情况,所以这里把备库2设置为强制归档。
四、配置参数
说明:
ADG架构的日志传输方式有3种:ARCH方式,LGWR SYNC方式,LGWR ASYNC(默认)方式。
若要了解更多请移步《Oracle Data Guard详解》。
这里我们配置ARCH方式。
1.简易版
修改主库(ruiadg1)参数
SQL> alter system set log_archive_dest_1='location=/oradata/arch';
SQL> alter system set log_archive_dest_2='service=ruiadg2 ARCH SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg’;
SQL> alter system set log_archive_dest_3='service=ruiadg3 ARCH SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg';
[1] /oradata/arch 目录的创建:
# cd /
# mkdir -p /oradata/arch
# chown oracle:oinstall /oradata/arch
修改备库1(ruiadg2)参数
SQL> alter system set fal_client=ruiadg2;
SQL> alter system set fal_server='ruiadg1','ruiadg3';
SQL>alter system set standby_archive_dest='/oradata/archlog';
修改备库2(ruiadg3)参数
SQL> alter system set fal_client=ruiadg3;
SQL>alter system set fal_server='ruiadg1','ruiadg2';
SQL>alter system set standby_archive_dest='/oradata/archlog';
2.完整版
配置完成上述的主备库参数,已经可以实现ADG的配置了。
但是为了便于ADG架构主备库的切换,最好将主备库参数配置如下:
修改主库(ruiadg1)参数
SQL> alter system set fal_client=ruiadg1;
SQL>alter system set fal_server='ruiadg2','ruiadg3';
SQL>alter system set standby_archive_dest='/oradata/archlog';
SQL>alter system set standby_archive_dest='/oradata/archlog';
SQL> alter system set log_archive_dest_1='location=/oradata/arch';
SQL> alter system set log_archive_dest_2='service=ruiadg2 ARCH SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg’;
SQL> alter system set log_archive_dest_3='service=ruiadg3 ARCH SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg';
修改备库1(ruiadg2)参数
SQL> alter system set fal_client=ruiadg2;
SQL> alter system set fal_server='ruiadg1','ruiadg3';
SQL>alter system set standby_archive_dest='/oradata/archlog';
SQL> alter system set log_archive_dest_1='location=/oradata/arch';
SQL> alter system set log_archive_dest_2='service=ruiadg1 ARCH SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg’;
SQL> alter system set log_archive_dest_3='service=ruiadg3 ARCH SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg';
修改备库2(ruiadg3)参数
SQL> alter system set fal_client=ruiadg3;
SQL> alter system set fal_server='ruiadg1','ruiadg2';
SQL>alter system set standby_archive_dest='/oradata/archlog';
SQL> alter system set log_archive_dest_1='location=/oradata/arch';
SQL> alter system set log_archive_dest_2='service=ruiadg1 ARCH SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg’;
SQL> alter system set log_archive_dest_3='service=ruiadg2 ARCH SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg';
补充:
若要设置为其他两种日志传输方式,只需修改log_archive_dest_2参数的值。
LGWR SYNC:
主库(ruiadg1)
SQL> alter system set log_archive_dest_2='service=ruiadg2 LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg ';
备库(ruiadg2)
SQL> alter system set log_archive_dest_2=‘service=ruiadg1 LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg’;
LGWR ASYNC:
主库(ruiadg1)
SQL> alter system set log_archive_dest_2=‘service=ruiadg2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg ';
备库(ruiadg2)
SQL> alter system set log_archive_dest_2=‘service=ruiadg1 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg’;
由于LGWR ASYNC 是默认方式,故可简写如下:
主库(ruiadg1)
SQL> alter system set log_archive_dest_2=‘service=ruiadg2 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg ';
备库(ruiadg2)
SQL> alter system set log_archive_dest_2=‘service=ruiadg1 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=ruiadg’;
五、数据同步
在备库(ruiadg2,ruiadg3)执行
--将备库启动至nomount状态
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.
Total System Global Area 4999610368 bytes
Fixed Size 3721080 bytes
Variable Size 1090521224 bytes
Database Buffers 3892314112 bytes
Redo Buffers 13053952 bytes
--从主库同步数据至备库
$ rman target sys/rui@ruiadg1 auxiliary sys/rui@ruiadg2 --前面是主库,后面是辅库
Recovery Manager: Release 12.1.0.2.0 - Production on Thu Aug 26 14:23:52 2021
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
connected to target database: RUIADG (DBID=3080921516)
connected to auxiliary database: RUIADG (not mounted)
RMAN> DUPLICATE TARGET DATABASE for standby FROM ACTIVE DATABASE nofilenamecheck;
Recovery Manager: Release 12.1.0.2.0 - Production on Thu Aug 26 14:23:52 2021
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
connected to target database: RUIADG (DBID=3080921516)
connected to auxiliary database: RUIADG (not mounted)
RMAN> DUPLICATE TARGET DATABASE for standby FROM ACTIVE DATABASE nofilenamecheck;
Starting Duplicate Db at 26-AUG-21
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=249 device type=DISK
contents of Memory Script:
{
backup as copy reuse
targetfile '/oracle/app/product/12.1.0/dbhome_1/dbs/orapwruiadg' auxiliary format
'/oracle/app/product/12.1.0/dbhome_1/dbs/orapwruiadg' ;
}
executing Memory Script
Starting backup at 26-AUG-21
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=26 device type=DISK
Finished backup at 26-AUG-21
contents of Memory Script:
{
restore clone from service 'ruiadg1' standby controlfile;
}
executing Memory Script
Starting restore at 26-AUG-21
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ruiadg1
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/oracle/app/oradata/ruiadg/control01.ctl
output file name=/oracle/app/fast_recovery_area/ruiadg/control02.ctl
Finished restore at 26-AUG-21
contents of Memory Script:
{
sql clone 'alter database mount standby database';
}
executing Memory Script
sql statement: alter database mount standby database
contents of Memory Script:
{
set newname for tempfile 1 to
"/oracle/app/oradata/ruiadg/temp01.dbf";
switch clone tempfile all;
set newname for datafile 1 to
"/oracle/app/oradata/ruiadg/system01.dbf";
set newname for datafile 3 to
"/oracle/app/oradata/ruiadg/sysaux01.dbf";
set newname for datafile 4 to
"/oracle/app/oradata/ruiadg/undotbs01.dbf";
set newname for datafile 6 to
"/oracle/app/oradata/ruiadg/users01.dbf";
restore
from service 'ruiadg1' clone database
;
sql 'alter system archive log current';
}
executing Memory Script
executing command: SET NEWNAME
renamed tempfile 1 to /oracle/app/oradata/ruiadg/temp01.dbf in control file
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
Starting restore at 26-AUG-21
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ruiadg1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /oracle/app/oradata/ruiadg/system01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ruiadg1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00003 to /oracle/app/oradata/ruiadg/sysaux01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ruiadg1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00004 to /oracle/app/oradata/ruiadg/undotbs01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service ruiadg1
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00006 to /oracle/app/oradata/ruiadg/users01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 26-AUG-21
sql statement: alter system archive log current
contents of Memory Script:
{
switch clone datafile all;
}
executing Memory Script
datafile 1 switched to datafile copy
input datafile copy RECID=1 STAMP=1081607081 file name=/oracle/app/oradata/ruiadg/system01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=2 STAMP=1081607081 file name=/oracle/app/oradata/ruiadg/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=3 STAMP=1081607081 file name=/oracle/app/oradata/ruiadg/undotbs01.dbf
datafile 6 switched to datafile copy
input datafile copy RECID=4 STAMP=1081607081 file name=/oracle/app/oradata/ruiadg/users01.dbf
Finished Duplicate Db at 26-AUG-21
RMAN>
--启动备库
SQL> alter database open;
Database altered.
SQL> alter database recover managed standby database disconnect from session;
Database altered.
命令摘要:
– 启动备库至nomount状态
SQL> shutdown immediate
SQL> startup nomount
– 同步数据
$ rman target sys/rui@ruiadg1 auxiliary sys/rui@ruiadg2
RMAN> DUPLICATE TARGET DATABASE for standby FROM ACTIVE DATABASE nofilenamecheck;
– 启动备库并应用日志
SQL> alter database open;
SQL> alter database recover managed standby database disconnect from session;
六、测试ADG有效性
1.在主库(ruiadg1)建表并插入数据
SQL> create table test1 (name varchar(20),age int);
SQL> insert into test1 values ('rui',22);
SQL> commit;
2.在主库手动切log
SQL> alter system switch logfile;
3.在备库(ruiadg2,ruiadg3)查看数据同步状况
select * from test1;
到这里,我们已经完成了一主一备ADG架构的搭建,是不是很开心?