Centos系统搭建ADG
参考:https://blog.csdn.net/demonson/article/details/79277380
参考:https://www.cnblogs.com/Sunnor/p/4515242.html
参考:https://www.cnblogs.com/yaoyangding/p/12181733.html(含dg工作原理和初始参数解释)
部署环境:
主库:192.168.1.102 实例(SID):orclpr
备库:192.168.1.106 实例(SID):orcldg
VirtualBox部署CentOS7.5虚拟机(备库机直接复制的主库机)
原理架构图:

一、前提检查
1.主库设置为归档模式
2.很多人说11g有了active dataguard(ADG),逻辑standby实际上已经没什么用处了
3.主从库硬件最好一致,oracle版本需要一致
内存检查项:
#grep MemTotal /proc/meminfo
交换分区检查项:如果内存在1-2G,swap是1.5倍;2-16G,1倍;大于16G,设置为16G即可
#grep SwapTotal /proc/meminfo
查看共享内存
#df -h /dev/shm
查看系统处理器架构,与oracle安装包一致(64位还是32位)
#uname -m
临时空间 /tmp必须大于1G
#df -h /tmp
4.配置环境数据库用户必须有sysdba权限
二、主库配置
2.1判断DG是否已经安装:
SQL>select * from v$option where parameter = 'Oracle Data Guard';
如果是true表示已经安装可以配置,否则需要安装相应组件。
2.2设置主库为强制记录日志:
默认情况下数据库操作会记录redo log,但是在一些特定的情况下可以使用nologging来不生成redo信息,以下:
(1)表的批量INSERT(通过/*+APPEND */提示使用“直接路径插入“。或采用SQL*Loader直接路径加载)。表数据不生成redo,但是
所有索引修改会生成redo,但是所有索引修改会生成redo(尽管表不生成日志,但这个表上的索引却会生成redo!)。
(2)LOB操作(对大对象的更新不必生成日志)。
(3)通过CREATE TABLE AS SELECT创建表
(4)各种ALTER TABLE操作,如MOVE和SPLIT
(5)在一些表迁移和表空间迁移中,可以使用alter table a nologging;或者alter tablespace snk nologging;在操作完成后再修改回logging状态。
这里需要多说一句,如果你使用nologging导入大批量数据,以后对这些数据的修改会在redo或者archive log中,但是基准的数据是没有的,所以一旦介质损坏是无法完全恢复的,必须在使用nologging完成切换回logging后,做一次全备或者0级备份。
(1)强制记录日志:
sql>alter database force logging;
(2)检查状态(YEs为强制):
sql>select name,force_logging from v$database;
(3)如果需要在主库添加或者删除数据文件时,这些文件也会在备份添加或删除,使用如下:
sql>alter system set standy_file_management='AUTO';
默认此参数是manual手工方式
sql>show parameter standby
2.3开启主库的归档模式
SQL> alter database archivelog; --修改数据库为归档模式,因为dg是通过传送归档日志到备库然后应用来保证主备库一致的。 Database altered.
2.4创建standby log files(备用日志文件)
从库使用standby log files来保存从主库接收到的重做日志。既然主要是从库在使用,那为什么需要在主库上也建立
standby log files?原因主要由两个:一是主库可能转换为备库,而备库是需要有standby log files的 二是如果主库
建立了standby log files那备库会自动建立。
建立standby如要注意以下几点:
<1>standby log files的大小和redo log files一样。
查询redo log files文件大小(默认50M,3个):select group#,bytes/1024/1024 as M from v$log
<2>一般而言, standbyredo 日志文件组数要比 primary 数据库的 online redo 日志文件组数至少多一个。
推荐 standbyredo 日志组数量基于 primary 数据库的线程数(这里的线程数可以理解为 rac 结构中的 rac
节点数)。
有一个推荐的公式可以做参考:(每线程的日志组数+1)*最大线程数
假设现在节点是1个,则=(3+1)*1=4
如果是双节点 则=(3+1)*2=8
这里我们创建4个standby logfile:
另:不建议组号group#紧挨着redo,因为后续redo有可能调整
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/redo04.log') size 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/redo05.log') size 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/redo06.log') size 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/redo07.log') size 50M;
Database altered.
SQL> select group#,type,member from v$logfile;
GROUP# TYPE MEMBER
---------- ------- --------------------------------------------------
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log
2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log
1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log
4 STANDBY /u01/app/oracle/oradata/orcl/redo04.log
5 STANDBY /u01/app/oracle/oradata/orcl/redo05.log
6 STANDBY /u01/app/oracle/oradata/orcl/redo06.log
7 STANDBY /u01/app/oracle/oradata/orcl/redo07.log
若删除组:
SQL>alter database drop standby logfile group x;
查看standy日志组的信息:
SQL> select group#,sequence#,status, bytes/1024/1024 from v$standby_log; GROUP# SEQUENCE# STATUS BYTES/1024/1024 ---------- ---------- ---------- --------------- 4 0 UNASSIGNED 50 5 0 UNASSIGNED 50 6 0 UNASSIGNED 50 7 0 UNASSIGNED 50
2.5创建主库归档目录
[oracle@oracledb orcl]$ mkdir archivelog --建立这个目录是为了存放主库的归档日志文件,并且这个目录会和其他数据文件等等一起拷贝到备库。 [oracle@oracledb orcl]$ cd archivelog/ [oracle@oracledb archivelog]$ ls [oracle@oracledb archivelog]$ pwd /u01/app/oracle/oradata/orcl/archivelog
2.6配置spfile文件
SQL> create pfile from spfile;--这里创建pfile是为了做一些主库参数的配置,并且还得拷贝到备库再次修改成备库的配置。 File created. SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down.
修改pfile配置
主库参数详解:
保持同一个Data Guard中所有的DB_NAME相同
DB_NAME=ora11g
为一个数据库指定一个唯一的名称,该参数一经指定就不会发生改动除非DBA主动改动
DB_UNIQUE_NAME=ora11g_primary
初始化参数LOG_ARCHIVE_CONFIG用于控制发送归档日志到远程位置、接收远程归档日志,并指定Data Guard配置的惟一数据库名,默认值为SEND,RECEIVE,NODG_CONFIG。
当设置该参数为SEND时,会激活发送归档日志到远程位置;当设置该能数为NOSEND时,会禁止发送归档日志到远程位置;当设置该参数为RECEIVE时,会激活接收远程归档日志;当设置该参数
为NORECEIVE时,会禁止接收远程归档日志;当设置该参数为DG_CONFIG时,可以最多指定9个惟一数据库名;当设置该参数为NODG_CONFIG时,会禁止指定惟一数据库名。
LOG_ARCHIVE_CONFIG='DG_CONFIG=(ora11g_primary ,ora11g_standby)'
指定本地归档的路径
LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ora11g_primary'
指定远端备库的归档路径
LOG_ARCHIVE_DEST_2='SERVICE=ora11g_standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ora11g_standby'
LOG_ARCHIVE_DEST_n(从1到10)定义redo文件路径。该参数必须通过location或service指定归档文件路径。location表示本地路径,service通常是net service name,即接收redo数据的
standby数据库。
注意:每一个LOG_ARCHIVE_DEST_n都有一个对应的LOG_ARCHIVE_DEST_STATE_n参数,该参数拥有以下4个属性值:
ENABLE:默认值,表示允许传输服务
DEFER: 指定对应的log_archive_dest_n参数有效,但暂不使用
ALTERNATE:禁止传输,但是如果其他相关的目的地的连接通通失败,则它将变成enable
RESET:功能与DEFER类似,不过如果传输目的地之前有过错误,它会清除所有错误信息
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
远程登录设置独享模式(z注意保证主备库密码相同)
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
%s log sequence number
%S log sequence number, zero filled %t thread number, RAC的节点中设有THREAD参数, 就是这个值了
%T thread number, zero filled
------其中这前4项是可以用在 9I 中的
%a activation ID
%d database ID
%r resetlogs ID that ensures unique names are constructed for the archived log files across multiple incarnations of the database
Oracle 10g开始,log_archive_format初始化参数必须包含%s, %t 和 %r,以确保生成的归档重做日志名称唯一。
(原因:10g能做穿越resetlog的恢复,所以要加%r.而9i的不能做穿越resetlog的恢复,所以没有%r的参数)
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
当Primary Database的某些日志没有发送到Standby Database 这时候发生归档裂缝(Archive Gap)
缺失的日志就是裂缝(GAP)。Data Guard 能够自动检测,解决归档裂缝,不需要DBA的介入。这需要配置
FAL_CLIENT,FAL_SERVER这两个参数(FAL:Fetch Archive Log)
从FAL这个名字可以看出,这个过程是 Standby Database 主动发起的取日志的过程,Standby Database 就是
FAL_CLIENT,它是从FAL_SERVER