Oracle Data Guard是由Oracle公司提供的一套高可用性数据库解决方案。Data Guard可以确保企业数据的高可用性,并实现数据保护和灾难恢复。Data Guard提供了一套综合创建、维护、管理和监视一个或多个备用数据库的服务,使得用户能够轻松地应对Oracle生产数据库的灾难发生和数据损坏。Data Guard将维护的备用数据库保持为和主数据库(生产数据库)的数据和事物的一致性,当主数据库意外当机或者不可用时,Data Guard可以将任何一台备用数据库切换为主数据库,从而最大限度的减少数据库服务器当机的时间。
Data Guard原理
利用重做日志实现从生产库(主)到备用数据库的实时备份(备库通过应用主库上的数据变化来保持数据的同步),主备服务器可以互相切换(即将其中一台提升为主服务器)。
Data Guard架构
-
Primary Database(主数据库): 即一个生产数据库,在Data Guard中其主要角色的作用,是大多数应用程序访问的数据库。
-
Standby Database(备数据库): Standby数据库是主数据的备份副本,备用数据库可以是物理备用数据库或逻辑备用数据库,即以下两种类型
- Physical standby database: 物理备用数据库(使用Redo Apply技术),主要用于灾难恢复。
- Logical standby database: 逻辑备用数据库(使用SQL Apply技术),除了用于灾难恢复外,还可以提供数据查询、分析等服务
Data Guard数据保护模式
Data Guard可以运行以三种不同的模式运行。
Maximum protection(最大保护): 确保主数据库发生故障时不会发生数据丢失。在所有重做数据写入到本地在线重做日志和至少一个备用数据库的备用重做日志之前,不允许事务的提交。如果由于故障不能将主数据库的重做日志写入到至少一个备用数据库的备用重做日志,则主数据库将关闭。
Maximum availability(最高可用性): 提供*别的数据保护,而不会影响主数据库的可用性。与最大保护模式一样,在恢复事物所需的重做日志写入本地联机重做日志和至少一个备用数据库的备用重做日志之前,事务不会提交。最大保护模式不同的是,在主数据库发生故障时不会将其重做日志写入备用数据库的重做日志。相反,主数据库以最大的性能模式下运行。
Maximum performance(最高性能): 默认模式。提供*别的数据保护,但不影响主数据库的性能。
环境准备
在我的测试环境中,我准备了两台CentOS7.4虚拟机,并同时都安装了Oracle11gR2的11.2.0.4.0企业版的数据库软件,其中只有主服务器创建一个数据库实例,备用服务器仅安装Oracle数据库软件。
主数据库:
OS: CentOS7.4
Hostname: hmdb11dg-db1
Oracle Version: 11.2.0.4.0
Oracle SID: HMDG(使用DBCA工具创建的一个数据库)
备数据库:
OS: CentOS7.4
Hostname: hmdb11dg-db2
Oracle Version: 11.2.0.4.0
Oracle SID: HMDG2
注意: 在开始之前,备用服务上还没有将要与主服务器同步备份的数据库实例
主数据库的设置
1. 启用归档日志
检查主数据是否处于归档日志模式
1
2
3
4
5
|
SQL> SELECT log_mode FROM v$ database ;
LOG_MODE ------------ ARCHIVELOG |
如果是NOARCHIVELOG模式,则将其修改为ARCHIVELOG模式
1
2
3
4
|
SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP MOUNT; SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN ;
|
2. 启用强制日志
1
2
3
4
5
6
|
SQL> ALTER DATABASE FORCE LOGGING;
SQL> SELECT name ,force_logging FROM v$ database ;
NAME FOR
--------- --- HMDG YES |
3. 创建密码文件
如果密码文件不存在,则创建一个密码文件,备用服务器使用主服务器的密码文件。Data Guard配置中的每个数据库的所有用户密码必须完全相同。
1
|
$ orapwd file = /tmp/orapwHMDG password=hm_201802 entries=20
|
4. 创建备用重做日志
备用重做日志文件的大小要与当前主数据库的在线重做日志文件大小完全匹配。
确定备用重做日志文件组的数量,建议的数量:(每个线程最大的日志数 + 1) * 最大线程数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
SQL> SELECT * FROM v$log;
GROUP # THREAD# SEQUENCE # BYTES BLOCKSIZE MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- --- STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME ---------------- ------------- --------- ------------ --------- 1 1 40 104857600 512 1 YES
INACTIVE 769491 06-FEB-18 813871 07-FEB-18 2 1 41 104857600 512 1 NO
CURRENT 813871 07-FEB-18 2.8147E+14
3 1 39 104857600 512 1 YES
INACTIVE 742672 06-FEB-18 769491 06-FEB-18 #下面创建8组备用重做日志 SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 '/u01/app/oracle/oradata/HMDG/redo04.log' SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 '/u01/app/oracle/oradata/HMDG/redo05.log' SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 '/u01/app/oracle/oradata/HMDG/redo06.log' SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 '/u01/app/oracle/oradata/HMDG/redo07.log' SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 8 '/u01/app/oracle/oradata/HMDG/redo08.log' SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 9 '/u01/app/oracle/oradata/HMDG/redo09.log' SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 '/u01/app/oracle/oradata/HMDG/redo10.log' SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 '/u01/app/oracle/oradata/HMDG/redo11.log' SIZE 500M;
#验证 SQL> SELECT GROUP #,THREAD#, SEQUENCE #,ARCHIVED,STATUS FROM V$STANDBY_LOG;
GROUP # THREAD# SEQUENCE # ARC STATUS
---------- ---------- ---------- --- ---------- 4 0 0 YES UNASSIGNED
5 0 0 YES UNASSIGNED
6 0 0 YES UNASSIGNED
7 0 0 YES UNASSIGNED
8 0 0 YES UNASSIGNED
9 0 0 YES UNASSIGNED
10 0 0 YES UNASSIGNED
11 0 0 YES UNASSIGNED
8 rows selected.
|
5. 开启闪回日志
1
2
3
4
5
6
|
SQL> alter database flashback on ;
SQL> select flashback_on from v$ database ;
FLASHBACK_ON ------------------ YES |
6. Oracle监听配置
主备数据库必须配置注册静态监听服务(listener.ora配置)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#主数据库 $ cat /u01/app/oracle/product/11 .2.0 /db_1/network/admin/listener .ora
LISTENER = (DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hmdb11dg-db1)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER = (SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = HMDG.DB)
(ORACLE_HOME = /u01/app/oracle/product/11 .2.0 /db_1 )
(SID_NAME = HMDG)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
#备数据库 $ cat /u01/app/oracle/product/11 .2.0 /db_1/network/admin/listener .ora
LISTENER = (DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hmdb11dg-db2)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER = (SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = HMDG2.DB)
(ORACLE_HOME = /u01/app/oracle/product/11 .2.0 /db_1 )
(SID_NAME = HMDG2)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
|
7. 主备数据库TNS别名连接信息配置
修改两台服务器上的$ORACLE_HOME/network/admin/tnsnames.ora配置文件,主备使用相同的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
HMDG = (DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hmdb11dg-db1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = HMDG.DB)
)
)
HMDG2 = (DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hmdb11dg-db2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = HMDG2.DB)
)
)
|
8. 测试使用TNS别名连接数据库
1
2
3
4
5
6
7
8
9
10
11
12
|
[oracle@hmdb11dg-db1 ~]$ sqlplus system /hm_123456 @HMDG
SQL*Plus: Release 11.2.0.4.0 Production on Wed Feb 7 16:07:54 2018 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> |
9. 主数据库初始化参数设置
检查DB_NAME和DB_UNIQUE_NAME参数设置,在我的例子中,主数据库的DB_NAME和DB_UNIQUE_NAME值都为HMDG。DB_NAME是主备所有节点都使用相同的值,即使用主的DB_NAME值,DB_UNIQUE_NAME必须是全局唯一的值,即每一个节点值都不同
1
2
3
4
5
6
7
8
9
10
11
12
13
|
SQL> SHOW PARAMETER DB_NAME NAME TYPE VALUE
------------------------------------ ----------- ------------------------------ db_name string HMDG SQL> SHOW PARAMETER DB_UNIQUE_NAME NAME TYPE VALUE
------------------------------------ ----------- ------------------------------ db_unique_name string HMDG #设置DB_UNIQUE_NAME参数值 SQL> ALTER SYSTEM SET DB_UNIQUE_NAME=HMDG SCOPE=SPFILE;
|
确定备库的DB_UNIQUE_NAME之后,接下来首先我们设置LOG_ARCHIVE_CONFIG参数
1
|
SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG= 'DG_CONFIG=(HMDG,HMDG2)' SCOPE=SPFILE;
|
配置主数据库本地归档日志的位置和远程备用数据重做日志的位置,注意LOG_ARCHIVE_DEST_1为本地的参数设置,LOG_ARCHIVE_DEST_2为远程节点的设置
1
2
3
|
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1= 'LOCATION=/u01/app/oracle/oradata/HMDG VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=HMDG' SCOPE=SPFILE;
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2= 'SERVICE=HMDG2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=HMDG2' SCOPE=SPFILE;
|
设置LOG_ARCHIVE_DEST_STATE_1和LOG_ARCHIVE_DEST_STATE_2的值为ENABLE
1
2
|
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE SCOPE=SPFILE;
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=SPFILE;
|
设置LOG_ARCHIVE_FORMAT和LOG_ARCHIVE_MAX_PROCESSES参数为合适的值,并且REMOTE_LOGIN_PASSWORDFILE必须设置为'EXCLUSIVE'
1
2
3
|
SQL> ALTER SYSTEM SET LOG_ARCHIVE_FORMAT = '%t_%s_%r.arc' SCOPE = SPFILE;
SQL> ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES = 30 SCOPE = SPFILE;
SQL> ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE SCOPE = SPFILE;
|
接下来设置与备用数据库相关的参数值,确保主数据库已经准备好切换为备数据库
1
2
3
4
5
|
SQL> ALTER SYSTEM SET FAL_SERVER=HMDG2 SCOPE = SPFILE;
SQL> ALTER SYSTEM SET FAL_CLIENT=HMDG SCOPE = SPFILE;
SQL> ALTER SYSTEM SET DB_FILE_NAME_CONVERT= 'HMDG2' , 'HMDG' SCOPE = SPFILE;
SQL> ALTER SYSTEM SET LOG_FILE_NAME_CONVERT= '/u01/app/oracle/oradata/HMDG2/' , '/u01/app/oracle/oradata/HMDG/' SCOPE = SPFILE;
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE = SPFILE;
|
设置完主数据库初始化参数后,需要重新启动数据库配置才生效
1
2
3
4
5
6
7
8
|
SQL> shutdown immediate SQL> startup SQL> show parameter standby_file_management NAME TYPE VALUE
------------------------------------ ----------- ------------------------------ standby_file_management string AUTO |
10. 生成一个PFILE参数文件