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 | cd $ORACLE_HOME/dbs/ |
修改参数文件所需要知道关于参数的含义
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 | alter system set db_unique_name='primary' scope=spfile; |
注:
1、这一步非常关键如果不配置主库传到备库的文件目录,rman 传递过去会失败
2、就算文件主库和备库的文件路径名一样也要配置(某些 oracle 版本会报错)
3、若是传到 ASM 磁盘,建议是传到以备库 unique_name 命名的 ASM 磁盘路径
1 | alter system set log_archive_dest_1='location=/u01/app/oracle/arch valid_for=(all_logfiles,all_roles) db_unique_name=primary' scope=spfile; |
注:
1、这一步:service=standby01 这里 standby01 为 tnsname 中配置的
2、如果不加入 lgwr async 不能使备库时时同步
3、官方文档里说使用 valid_for=(online_logfiles, all_roles),这将导致备库无法归档备用日志文件,因为 它们不是在线日志。但如果使用 all_logfiles 选项,主备库将都能归档在线以及备用日志。如果你想在备库进行 备份,并同时备份归档日志的话,必须使用 all_logfiles。
1 | alter system set log_archive_dest_state_1=enable scope=spfile; |
注:
该参数为使上面的archive 生效
1 | alter system set log_archive_format='%t_%s_%r.arc' scope=spfile; |
重要特别说明!!!重要特别说明!!!重要特别说明!!!
也就是说 standby_file_management 参数设置 auto 时,对于临时表空间的创建,还是需要手动在 物理 standby 上创建一次
配置完成重启主库、并创建参数文件
1 | shutdown immediate; |
并查看配置文件 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 | DB_UNIQUE_NMAE='standby01' |
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 | chmod 6751 /u01/app/12.1.0/grid/bin/oracle |
4.启动到 nomount 状态创建 spfile 文件
1 | startup nomount pfile=$ORACLE_HOME/dbs/initorcl.ora |
若是多个备库的话,如:主库:primary 备库:standby01,standby02
主库 primary 配置修改部分:
1 | alter system set fal_server='standby01','standby02' scope=spfile; |
备库 standby01 配置可以和之前一样:
1 | DB_UNIQUE_NMAE='standby01' |
备库 standby02 配置:
1 | DB_UNIQUE_NMAE='standby02' |
主库创建 standby control 文件并传递给备库,使备库启动到 mount 状态
1.创建 standby control 并传递到备库
1 | SQL>alter database create standby controlfile as '/home/oracle/bak.ctl'; |
2.启动备库到 standby mount 状态
1 | alter database mount standby database; |
主库、备库创建 standby logfile 文件
注:
1、先要查看主库的 redolog 文件、需要了解其数量及大小
1 | select * from v$log; |
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 | sql>shutdown immediate; |
注:默认 rman 备份完数据库之后,备库状态是 mount 状态,可以不用重启数据库进行如下操作。
1 | Sql>alter database mount standby database; |
日志的切换:
1 | SQL> alter system archive log current; |
主备库的切换
注:切换顺序不能颠倒,必须先把主库切换成备库,即同一时间不能有两个主库共存
1.主库切换成备库 切换库时最好切换下日志
查看主库可切换状态:
1 | sql>select switchover_status from v$database; |
若显示 SESSIONS ACTIVE 或者 TO STANDBY,则可以开始切换
主库切换
1 | sql>alter database commit to switchover to physical standby with session shutdown; |
2.备库切换为主库
查看备库可切换状态:
1 | sql>select switchover_status from v$database; |
若显示 SESSIONS ACTIVE 或者 TO PRIMARY,则可以开始切换
备库切换
1 | sql>select switchover_status from v$database; |
3. 主库不可用情况下的备库切换
1 | sql> recover managed standby database cancel; |