Oracle Dg物理备库的搭建及相关理论

环境


SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE    10.2.0.1.0      Production TNS for 32-bit Windows: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production

一、默认搭建过程

简单DG搭建:默认为最大性能,可以不用创建standby redo log

配置主库

1、确认数据库在归档模式(配置好归档路径)、FORCE LOGGING模式。

2、启动到NOMOUNT下,生成initDGDH.ora,修改初始化参数文件,生成两份initDGDH.ora和initDGDHSTB.ora,主要参数如下:

.......
.......
.......
*.db_name='DGDH' 
.......
.......
*.DB_UNIQUE_NAME=DGDH
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(DGDH,DGDHSTB)'
*.LOG_ARCHIVE_DEST_1= 'LOCATION=d:\dir\DGDH VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=DGDH'
*.LOG_ARCHIVE_DEST_2= 'SERVICE=DGDHSTB SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=DGDHSTB'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.fal_server='DGDHSTB'
*.fal_client='DGDH'
*.log_file_name_convert=("D:\oracle\product\10.2.0\oradata\DGDHSTB","D:\oracle\product\10.2.0\oradata\DGDH") 
*.db_file_name_convert=("D:\oracle\product\10.2.0\oradata\DGDHSTB","D:\oracle\product\10.2.0\oradata\DGDH") --用于RMAN复制时重建redo文件
*.standby_file_management=auto   #裸设备,必须将该参数设置为manual。 
----该参数文件里面除了db_name参数值相同,必须取主库的名字,其它参数都要把DGDH和DGDHSTB互换

3、在MOUNT下,生成备库控制文件:以上面配置好的参数文件为基础,启动到MOUNT下,这样数据库才能知道备库的SID

alter database create standby controlfile as 'c:\control01.ctl'

4、配置好主库和备库的静态监听和网络服务

配置备库

1、在备库服务器上,创建实例 oradim -NEW -SID DGDHSTB -STARTMODE manual

2、配置好主库和备库的静态监听和网络服务。         

3、创建目录:admin、oradata下创建对应的目录

4、复制(initDGDHSTB.ora、standby控制文件、数据文件、日志文件、密码文件)到备份服务器相应目录,备库上的控制文件要和主库数量一致

5、启动备库到MOUNT下,以下启动命令

后台自动应用日志 alter database recover managed standby database disconnect from session; 
取消后台自动应用日志 alter database recover managed standby database cancel; 
打开数据库:alter database open [read only]

验证DG

1、查看主库的状态、打开模式、保护模式和角色

SQL>select name,switchover_status,open_mode,protection_mode,database_role from v$database;
  name      switchover_status    open_mode  protection_mode      database_role
  --------- -------------------- ---------- -------------------- ----------------
  dgdh        to standby         read write  maximum performance  primary    

2、查看归档信息

SELECT STATUS,DESTINATION,ERROR FROM V$ARCHIVE_DEST;   ----如果有错误,要排查原因。

3、查看主备库的最大日志序列号,主备查询结果一致。

alter system switch logfile;
select max(sequence#) from v$archived_log;  

4、验证archive log是否接收和 applied.

alter session set nls_datE_format='YYYY-MM-DD HH24:MI:SS';
select SEQUENCE#,DEST_ID,ARCHIVED,APPLIED,DELETED,STATUS,FIRST_TIME from v$archived_log order by SEQUENCE#;

5、查看当前备库里面的进程有哪些

select process,status,thread#,sequence#,client_pid from v$managed_standby; 
这里需要明确的是,当没有开启recover managed standby database,则备库会关掉MRPn进程的。但是RFS进程还是开启的,还在能不停的接受日志写日志。

6、查看主备进程对应关系

SQL>select process,client_process from v$managed_standby;
  PROCESS   CLIENT_PROCESS
  --------- --------------
  ARCH      ARCH    
  ARCH      ARCH
  RFS       LGWR
  RFS       ARCH
  MRP0      N/A

从上面的对应关系可以看出LGWR-->RFS和ARCH-->RFS

至此,最大性能模式的DG搭建完成

 注意:如果在主库执行 alter database clear unarchived logfile或alter database open resetlogs ,则dataguard要重建。

相关视图:
    v$archive_dest
    v$archive_dest_status
    v$log_history
    v$archvied_log
    v$managed_standby
    v$archive_gap


二、最大性能、最大可用、最大保护

前提:必须创建standby redo log,数量=(maximum number of logfiles for each thread + 1) * maximum number of threads

命令:
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;     ----最大性能,默认,无法同步日志时不影响主库
ALTER DATABASE SET STANDBY DATABASE TO MAXISIZE AVAILABILITY;    ----最大可用,无法同步日志时自动切换到最大性能,待可同步时再切换到最大保护
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;      ----最大保护,无法同步日志时主库会shutdown
          
***11G里面怎么是MAXISIZE,而非MAXIMIZE
alter database add standby logfile group 5 ('d:\oracle\product\oradata\dgdhicu\stbredo01.log') size 50M;  
alter database add standby logfile group 4 ('/oracle/dbs/log1c.rdo') size 500m;      ---一主一备的话就应该要创建4个standby redo log
另:*.LOG_ARCHIVE_DEST_2= 'SERVICE=DGDH LGWR SYNC AFFIRM REOPEN=10 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=DGDH'

三、日志发送方式

日志发送方式分为三种:ARCH进程发送日志、LGWR进程的SYNC发送日志、LGWR进程的ASYNC发送日志

参数文件中在此处指定:

*.LOG_ARCHIVE_DEST_2= 'SERVICE=DGDHSTB SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=DGDHSTB'

ARCH 进程:

Primary DB -->Redo log -->Online redo log -->Arch redo log -->RFS -->Arch redo log -->MRP/LSP-->Standby DB
|<-----------------------------primary---------------------------------------------->|<-----standby----->|

注:ARCH进程发送日志,发送的都是归档日志,所以很容易丢失redo log,不建议使用

LGWR进程的SYNC:

datagurd-lgwr-sync.png

1、LGWR 必须等待写入本地日志文件操作和通过LNSn进程的网络传送都成功,Primary DB上的事务才能提交,这也是SYNC的含义所在;

2、Primary DB的日志切换也会触发Standby DB上的日志切换,即Standby DB对Standby Redo Log的归档,然后触发Standby DB的MRP或者LSP进程恢复归档日志;

3、实时应用(Real-Time Apply):

只要RFS把日志写入Standby Redo Log 就会立即进行恢复;归档应用:在完成对Standby Redo Log 归档才触发恢复,默认的恢复方式。

alter database recover managed standby database using current logfile disconnect from session; ---把归档恢复转换为实时应用

4、实时恢复时可以添加time_out参数

alter system set log_archive_dest_2 = 'SERVICE=ST  LGWR  SYNC  NET_TIMEOUT=30' scope=both;


LGWR进程的ASYNC: 

同LGWR(SYNC),主要区别是在于redo log传输为异步



☆☆☆上面讲的三种日志发送方式的具体解释见Data Guard 理论知识。这时有同学要问AFFIRM是什么意思了,其实它决定归档日志写磁盘的方式,AFFIRM同步方式,noAFFIRM异步方式


1)利用LGWR SYNC和时实应用,实现redo(不是日志文件)时实传输与应用

   按照上面的理论,只要主库上配置为LGWR SYNC,那么完成事务后,也即commit后,LGWR会把redo写到online redo log里面,同时会把redo发送到standby,standby的

   RFS进程接收到这个日志后写入standby online redo log,再由MRPn进程立即应用到Standby DB中,这样就OK,不过在主库commit后,要等10s多的样子才能在备库看到

2)前人支招:

1、ARCH方式传送日志时,如果主备库密码文件不一致,在重新设置密码文件后,必须重启主库才能使日志传送恢复正常。

2、LGWR方式传送日志时,如果主备库密码文件不一致,在重新设置密码文件后,只需可以重启主库或重启备库就可使日志传送恢复正常。


注意事项:

Arch:传统的日志传送方式。现在只有在最大性能模式时才能采用。归档日志通过primary上的arch进程传送给standby的RFS进程。

LGWR:oracle9i开始可以使用LGWR即时将日志传送到standby,而不再需要等到归档操作时才传送,已减少可能的数据丢失。在三种保护模式下都可使用该方式传送日志。使用LGWR方式传送,在standby必须先建立standby redo logfile

Maximum Availability
Maximum Performance
Maximum Protection
AFFIRM
NOAFFIRM
AFFIRM
SYNC
ASYNC
SYNC
DB_UNIQUE_NAME
DB_UNIQUE_NAME
DB_UNIQUE_NAME

Data Guard     启动顺序:先standby,后primary;

                         关闭顺序:先primary, 后standby;

四、利用RMAN搭建DG

 区别于COPY,不需求创建STANDBY控制文件,RMAN复制会自动创建。 然后,再执行duplicate复制

 1)在主库上先进行来个全备

RMAN> backup full database include current controlfile for standby plus archivelog FORMAT '/u02/backup/orcl_%U_%T'  skip inaccessible filesperset 5 ;

 2)备库在NOMOUNT下,执行duplicate

SQL> rman target system/medical@DGDH auxiliary system/medical@DGDHSTB;   

3)不用duplicate的RMAN

主库:

rman>backup database format='/data/backup/rman_backup/%d_%s.bak';

备库:

rman>restore database;
sys>alter database recover managed standby database disconnect from session;  

五、常见的主库备库上的操作

SQL>startup nomount;
SQL>alter database mount standby database ; 
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 
SQL>alter database recover managed standby database disconnect from session; 


六、主备切换switchover

 主备切换的检查  

SQL> select switchover_status from v$database;        

主库需要注意事项

1)如果switchover_status为TO_STANDBY说明可以转换   直接转换:alter database commit to switchover to physical standby;
2)如果switchover_status为SESSIONS ACTIVE 则关闭会话   alter database commit to switchover to physical standby with session shutdown;

备库需要注意事项

1)如果switchover_status为TO_PRIMARY 说明标记恢复可以直接转换为primary库   alter database commit to switchover to primary
2)如果switchover_status为SESSION ACTIVE 就应该断开活动会话  alter database commit to switchover to primary with session shutdown;
3)如果switchover_status为NOT ALLOWED 说明切换标记还没收到,此时不能执行转换。

切换时如果不满足条件,请检查:    

确认主库和从库间网络连接通畅;

确认没有活动的会话连接在数据库中;

PRIMARY数据库处于打开的状态,STANDBY数据库处于MOUNT状态;

确保STANDBY数据库处于ARCHIVELOG模式;

如果设置了REDO应用的延迟,那么将这个设置去掉;

确保配置了主库和从库的初始化参数,使得切换完成后,DATA GUARD机制可以顺利的运行;

如果是最大保护模式,先变成最大性能模式。


切换的顺序:先从主库到备用,再从备库到主库

注:10.2.0.1备库老是在not allowed状态,可能是BUG吧


未完待续。。。。

1

热门评论