Oracle-DG2

DATA GUARD 简介(第二版)

ORACLE DataGuard 是一种数据库级别的HA方案,最主要功能是容灾、数据保护、故障恢复等
在生产数据库的”事务一致性” 时,使用生产库的物理全备份(或物理 COPY )创建备库,备库会通过生产库传输过来的归档日志(或重做条目)自动维护备用数据库。将重做数据应用到备库。本文介绍使用 RMAN 备份创建备库 (dataguard)

配置前检查

Dataguard 设置为默认的 MAXIMIZE PERFORMANCE 模式

1.主节点必须运行在归档模式下:

以下命令检查数据库是否为归档日志(archive log)模式:

1
SQL> archive log list

以下命令为开启 archive log,数据库要在 mount 状态

1
SQL> alter database archivelog;

以下命令为关闭 archive log,数据库要在 mount 状态

1
SQL> alter database noarchivelog;

2.主库必须为 force logging 模式

1
SQL>alter database force logging

3.主备库 SID 与 UNIQUE_NAME 配置

注意:主库和备库之间 unique_name 要不同,SID 要相同

主库

SID  orcl
UNIQUE_NAME  primary

备库

SID  orcl
UNIQUE_NAME  standby01

4.主库与备库的网络配置

主备库网络配置 注意这里需要配置静态监听,我这里配置了 dns,也可以配置 /etc/hosts 文件

主库

IP:192.168.20.11 primary.example.com

监听 注意:我这里配置的实例名都是一样的,所以主库和备库的监听也是一样的

tnsname配置 该配置也是主备都一样

备库

IP:192.168.20.12 standby01.example.com

监听 注意:我这里配置的实例名都是一样的,所以主库和备库的监听也是一样的

备库配置orawp 密码文件,注:这里的文件一定要与主库的密码一样
方法一、可以从主库的 $ORACLE_HOME/dbs/orapworcl 文件复制过来
方法二、 创建密码文件

1
2
cd $ORACLE_HOME/dbs/
orapwd file=orapwprimary password=oracle format=12 force=y

修改参数文件所需要知道关于参数的含义

LGWR 还分为 LGWR ASYNC (异步) 和 LGWR SYNC (同步) 两种

最大保护 最大可用 最大性能
进程 LGWR LGWR LGWR或ARCH
网络传输模式 SYNC SYNC LGWR时设置ASYNC
磁盘写操作 AFFIRM AFFIRM NOAFFIRM
备用日志 YES 物理备用需要 LGWR和物理备用时需要
备用库类型 物理 Standby 物理或逻辑 物理或逻辑

你是主库,就填写:

fal_server=从库

从库上就反过来:

fal_server=主库 

注意:FAL_CLIENT 在 11g 中已经废弃,虽然可以配置但是已经不起作用了。
当 primary 切换为 standby 角色后,需要增加修改以下参数,注意这里配置的是 TNS name

修改主备库参数文件

1.修改主库的 pfile 参数文件 initorcl.ora

方法一、sqlplus 进入 修改文件参数并创建 pfile 文件

1
2
3
4
5
6
7
alter system set db_unique_name='primary' scope=spfile;
alter system set log_archive_config='DG_CONFIG=(primary,standby01)' scope=spfile;
alter system set fal_server='standby01' scope=spfile;
alter system set fal_client='primary' scope=spfile;

alter system set db_file_name_convert='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl'
alter system set log_file_name_convert='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl'

注:
1、这一步非常关键如果不配置主库传到备库的文件目录,rman 传递过去会失败
2、就算文件主库和备库的文件路径名一样也要配置(某些 oracle 版本会报错)
3、若是传到 ASM 磁盘,建议是传到以备库 unique_name 命名的 ASM 磁盘路径

1
2
alter system set log_archive_dest_1='location=/u01/app/oracle/arch valid_for=(all_logfiles,all_roles)  db_unique_name=primary' scope=spfile;
alter system set log_archive_dest_2='service=standby01 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=standby01' scope=spfile;

注:
1、这一步:service=standby01 这里 standby01 为 tnsname 中配置的
2、如果不加入 lgwr async 不能使备库时时同步
3、官方文档里说使用 valid_for=(online_logfiles, all_roles),这将导致备库无法归档备用日志文件,因为 它们不是在线日志。但如果使用 all_logfiles 选项,主备库将都能归档在线以及备用日志。如果你想在备库进行 备份,并同时备份归档日志的话,必须使用 all_logfiles。

1
2
alter system set log_archive_dest_state_1=enable scope=spfile;
alter system set log_archive_dest_state_2=enable scope=spfile;

注:
该参数为使上面的archive 生效

1
2
3
4
alter system set log_archive_format='%t_%s_%r.arc' scope=spfile;
alter system set log_archive_max_processes=30 scope=spfile;
alter system set remote_login_passwordfile=EXCLUSIVE scope=spfile;
alter system set standby_file_management=auto scope=spfile;

重要特别说明!!!重要特别说明!!!重要特别说明!!!
也就是说 standby_file_management 参数设置 auto 时,对于临时表空间的创建,还是需要手动在 物理 standby 上创建一次
配置完成重启主库、并创建参数文件

1
2
3
4
5
6
shutdown immediate;
startup nomount;
create pfile from spfile;
alter database mount;
alter database archivelog; 如果归档日志没有打开使用该命令
alter database open;

并查看配置文件 pfile,在 $ORACLE_HOME/dbs 中

方法二、手动更改 pfile 文件然后重启数据库,以更改的 pfile 文件来重启
更改的参数为以上以 sqlplus更改的

1
startup nomount pfile=$ORACLE_HOME/dbs/initorcl.ora

2.修改备库的 pfile 参数文件 initorcl.ora 改的并不多只需要把主库的某参数颠倒一下即可。

先把主库的 pfile 文件 copy 到备库中 $ORACLE_HOME/dbs/ 下
修改备库参数文件

1
2
3
4
5
DB_UNIQUE_NMAE='standby01'
FAL_CLIENT='standby01'
FAL_SERVER='primary'
LOG_ARCHIVE_DEST_1='location=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby01'
LOG_ARCHIVE_DEST_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'

3.创建相应的目录,只要 pfile 中写到的目录没有的都要创建,如果不创建 rman 传递过来会失败。(非常重要回踩坑)

若是传到 ASM 磁盘上的话,备库需要 grid 用户执行如下语句
若是传到 ASM 磁盘上的话, ASM 会自动创建一个与备库同名的文件目录

即 grid 的家目录的 bin 下执行

1
cd $ORACLE_HOME/bin

更改 oracle 家目录下的 bin/oracle 的权限,将 oracle 文件属主属组改为:oracle:asmadmin

1
./setasmgidwrap o=/u01/app/oracle/product/12.1.0/db_1/bin/oracle 

需要将 grid 家目录下和 oracle 家目录下的 oracle 文件权限都修改为 6751

1
2
chmod 6751  /u01/app/12.1.0/grid/bin/oracle
chmod 6751 /u01/app/oracle/product/12.1.0/db_1/bin/oracle

4.启动到 nomount 状态创建 spfile 文件

1
2
startup nomount pfile=$ORACLE_HOME/dbs/initorcl.ora
create spfile from pfile;

若是多个备库的话,如:主库:primary 备库:standby01,standby02
主库 primary 配置修改部分:

1
2
3
4
5
alter system set fal_server='standby01','standby02' scope=spfile;
alter system set fal_client='primary' scope=spfile;
alter system set log_archive_config='DG_CONFIG=(primary,standby01,standby02)' scope=spfile;
alter system set log_archive_dest_1='location=/u01/app/oracle/arch valid_for=(all_logfiles,all_roles) db_unique_name=primary' scope=spfile;
alter system set log_archive_dest_3='service=standby01 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=standby02' scope=spfile;

备库 standby01 配置可以和之前一样:

1
2
3
4
5
DB_UNIQUE_NMAE='standby01'
FAL_CLIENT='standby01'
FAL_SERVER='primary'
LOG_ARCHIVE_DEST_1='location=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby01'
LOG_ARCHIVE_DEST_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'

备库 standby02 配置:

1
2
3
4
5
DB_UNIQUE_NMAE='standby02'
FAL_CLIENT='standby02'
FAL_SERVER='primary'
LOG_ARCHIVE_DEST_1='location=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby02'
LOG_ARCHIVE_DEST_3='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'

主库创建 standby control 文件并传递给备库,使备库启动到 mount 状态

1.创建 standby control 并传递到备库

1
2
3
4
SQL>alter database create standby controlfile as '/home/oracle/bak.ctl';
scp -rp /home/oracle/bak.ctl oracle@standby01:/u01/app/oracle/oradata/orcl/control01.ctl
scp -rp /home/oracle/bak.ctl
oracle@standby01:/u01/app/oracle/oradata/orcl/control02.ctl

2.启动备库到 standby mount 状态

1
alter database mount standby database;

主库、备库创建 standby logfile 文件

注:
1、先要查看主库的 redolog 文件、需要了解其数量及大小

1
2
select  * from v$log;
select * from v$logfile;

2、创建的 standby logfile 文件必须比 redo 文件多一组,并且每组的数量相同。
注:standby redo log 的组数参考公式:
(online redo log 组数 + 1) * 数据库线程数;单机线程数为 1,RAC 一般为 2。
3、standby logfile 文件的大小要与 redo log 文件的大小一样
4、主库和备库创建 standby logfile 的文件名最好一样
5、创建语句如下

1
alter database add standby logfile group 6 '/u01/app/oracle/oradata/orcl/std_redo06.log' size 200m;

若是ASM磁盘管理,建议创建目录是与备库 unique_name 相同的 +DATA/ORCL/ONLINELOG 下面。

6、删除语句如下

1
alter database drop standby logfile group 6;

复制主库至备库

注:
1、主库得启动到 open 或者 mount
2、备库一定要启动到 nomount 状态下
3、静态监听与 tnsname 一定要配置好,能互相连接

主库上操作

1
rman target sys/oracle auxiliary sys/oracle@standby01

若主库为 RAC,rman 连接为:rman target sys/oracle@orcl auxiliary sys/oracle@standby01

1
rman>duplicate target database for standby from active database nofilenamecheck;

注:
1、这种方式适合白天使用,但是恢复数据库比较慢。主库参数生效后,不需要停主库。
2、另一种方式是将主库 rman 备份后,使用主库的 rman 备份文件恢复备库,但是主库备份完成后需要停止主库。优点是速度比较快,但是主库需要停止。(该方法我将在另一个 DG 文档中总结)

备库上操作

1
2
sql>shutdown immediate;
sql>startup nomount;

注:默认 rman 备份完数据库之后,备库状态是 mount 状态,可以不用重启数据库进行如下操作。

1
2
3
4
5
6
7
8
9
10
11
Sql>alter database mount standby database;
Sql>recover managed standby database disconnect from session;
Sql>alter database recover managed standby database cancel;
Sql>alter database open read only;
Sql>alter database recover managed standby database using current logfile disconnect;

Sql> select open_mode from v$database;
若显示如下,则备库运行正常
OPEN_MODE
--------------------
READ ONLY WITH APPLY

日志的切换:

1
2
3
SQL> alter system archive log current;
SQL> alter system checkpoint;
SQL> alter system archive log current;

主备库的切换

注:切换顺序不能颠倒,必须先把主库切换成备库,即同一时间不能有两个主库共存

1.主库切换成备库 切换库时最好切换下日志

查看主库可切换状态:

1
sql>select switchover_status from v$database;

若显示 SESSIONS ACTIVE 或者 TO STANDBY,则可以开始切换

主库切换

1
2
3
4
5
6
7
8
9
10
11
12
sql>alter database commit to switchover to physical standby with session shutdown;
sql>conn / as sysdba
sql>startup nomount;
sql>alter database mount standby database;
sql>recover managed standby database disconnect from session;
Sql>alter database recover managed standby database cancel;
Sql>alter database open read only;
Sql>alter database recover managed standby database using current logfile disconnect;
sql>select open_mode from v$database;
OPEN_MODE
--------------------
READ ONLY WITH APPLY

2.备库切换为主库

查看备库可切换状态:

1
sql>select switchover_status from v$database;

若显示 SESSIONS ACTIVE 或者 TO PRIMARY,则可以开始切换

备库切换

1
2
3
4
sql>select switchover_status from v$database;
sql>alter database commit to switchover to primary with session shutdown;
sql>shutdown immediate
sql>startup;

3. 主库不可用情况下的备库切换

1
2
3
4
5
sql> recover managed standby database cancel;
sql> alter database recover managed standby database finish;
sql> alter database commit to switchover to primary;
sql> shutdown immediate
sql> startup
Contents
  1. 1. DATA GUARD 简介(第二版)
    1. 1.1. 配置前检查
      1. 1.1.1. 1.主节点必须运行在归档模式下:
      2. 1.1.2. 2.主库必须为 force logging 模式
      3. 1.1.3. 3.主备库 SID 与 UNIQUE_NAME 配置
      4. 1.1.4. 4.主库与备库的网络配置
    2. 1.2. 修改参数文件所需要知道关于参数的含义
    3. 1.3. 修改主备库参数文件
      1. 1.3.1. 1.修改主库的 pfile 参数文件 initorcl.ora
      2. 1.3.2. 2.修改备库的 pfile 参数文件 initorcl.ora 改的并不多只需要把主库的某参数颠倒一下即可。
      3. 1.3.3. 3.创建相应的目录,只要 pfile 中写到的目录没有的都要创建,如果不创建 rman 传递过来会失败。(非常重要回踩坑)
      4. 1.3.4. 4.启动到 nomount 状态创建 spfile 文件
    4. 1.4. 主库创建 standby control 文件并传递给备库,使备库启动到 mount 状态
      1. 1.4.1. 1.创建 standby control 并传递到备库
      2. 1.4.2. 2.启动备库到 standby mount 状态
    5. 1.5. 主库、备库创建 standby logfile 文件
    6. 1.6. 复制主库至备库
    7. 1.7. 主备库的切换
      1. 1.7.1. 1.主库切换成备库 切换库时最好切换下日志
      2. 1.7.2. 2.备库切换为主库
      3. 1.7.3. 3. 主库不可用情况下的备库切换
|