配色: 字号:
Oracle physical dataguard文档
2016-10-18 | 阅:  转:  |  分享 
  
Oracle同步方案dataguard(dg):

dg同步一般分为physical同步(物理同步)和logical同步(逻辑同步),主要用于容灾,备份。

OraclePhysicalDATAGUARD配置详解

条件:

本测试两台服务器,采用centos6.,主库安装oracle并创建实例,sid:orcl,从库只安装oralcle,未创建实例:

主库:主机名centosorcl,ip:192.168.193.100

备库:主机名centosorcl_dg,ip192.168.193.110

Orcl:主库(192.168.193.100)的tnsnames串

Orcl_dg:备库(192.168.193.110)的tnsnames串





主库:

1设置数据库归档模式

检查是否处于归档模式:

SQL>archiveloglist





如果不是归档模式则设置归档模式,需要关闭数据库并置为mount状态

SQL>shutdownimmediate

SQL>startupmount

SQL>alterdatabasearchivelog



再执行查询发现已经为归档模式,见上图



2设置数据库为forcelogging模式

SQL>alterdatabaseforcelogging有一些DDLNOLOGGING子句的方式避免写REDO,指定数据库为Force?Logging模式后,数据库将会记录除临时表空间或临时回滚段外所有的操作,而忽略类似NOLOGGING



ORA-12920:说明已经设置为forceloggging模式,Force?Logging如果要停止forcelogging,则执行SQL>alterdatabasenoforcelogging

3创建standby数据库控制文件

SQL>alterdatabasecreatestandbycontrolfile

as‘/opt/oracle/oradata/orcl/standby.ctl’;

文件名随便取(sql中的文件名与下图sql中不一致,特说明)



SQL>alterdatabaseopen



4配置主库监听listenter.ora和tnsnames.ora

4.1配置Listener.ora:

增加SID_LIST



Tnsnames.ora

增加ORCL_DG)配置





4.将Tnsnames.ora和listenter.ora传输至备库对应位置



传送至standby数据库的对应位置

如:

$scp$ORACLE_HOME/network/admin/listener.ora

oracle@192.168.193.110:/opt/oracle/11.2/network/admin/



注:IP可用主机名代替,需在/etc/hosts文件中配置standby的ip与主机名对应

并修改listener.ora中的主机名HOST,更改为本机ip,tnsnames.ora不用更改

SID_NAME与主服务器一样



4.备库上测试配置是否正确



因为standby服务器没有创建数据库实例,可以连接主库的数据库,测试上述配置是否准确

$sqlplus/nolog

SQL>connsystem@manager@orcl(或者SQL>tnspingorcl/tnspingorcl_dg)



启动监听

$lsnrctlstart

查看监听

$ps-ef|greptns



5创建primary数据库客户端初始化文件和密码文件

SQL>createpfilefromspfile

在/opt/oracle/product/11.2.0/db_1/dbs($ORACLE_HOME/dbs)目录下将多出一个init+SID.ora的文件



将该文件复制一份,作为恢复初始化数据库备份(可省略)

$cpinitorcl.orainitorcl.ora.bak



修改客户端初始化文件

$viinitorcl.ora

底部增加如下:

DB_UNIQUE_NAME=orcl

LOG_ARCHIVE_CONFIG=’DG_CONFIG=(orcl,orcl_dg)’

LOG_ARCHIVE_DEST_1=’LOCATION=/opt/oracle/oradata/archiveVALID_FOR=(ALL_LOGFILES,ALL_ROLES)DB_UNIQUE_NAME=orcl’

LOG_ARCHIVE_DEST_2=’SERVICE=orcl_dgLGWRASYNCVALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)DB_UNIQUE_NAME=orcl_dg’

LOG_ARCHIVE_FORMAT=’%t_%s_%r.arc’

LOG_ARCHIVE_DEST_STATE_1=ENABLE

LOG_ARCHIVE_DEST_STATE_2=ENABLE

LOG_FILE_NAME_CONVERT=’/opt/oracle/oradata/archive’,’/opt/oracle/oradata/archive’

log_archive_max_processes=4

FAL_SERVER=orcl_dg

FAL_CLIENT=orcl

STANDBY_FILE_MANAGEMENT=AUTO



注:/opt/oracle/oradata/archive为归档目录,此目录没有则创建

创建密码文件

$orapwd?file=/opt/oracle/product/11.20/db_1/dbs/orapworcl?password=verysafe?entries=30

密码文件名格式:orapw+SID(UNIX),不然报ORA-01031insufficientprivileges,主库备库密码文件需要一致.WINDOWS系统(pwd+SID)

6将主库数据拷贝至standby库

主要拷贝的地方:

位置1:$ORACLE_BASE/oradata

$

Scp-r/opt/oracle/oradata/orcl

192.168.193.110:/opt/oracle/oradata/

位置2:$ORACLE_BASE/admin

$scp-r/opt/oracle/admin/orcl

192.168.193.110:/opt/oracle/admin/

位置3:$ORACLE_HOME/dbs

$scp$ORACLE_HOME/dbs/initorcl.ora

192.168.193.110:$ORACLE_HOME/dbs/

$scp$ORACLE_HOME/dbs/orapworcl.ora

oracle@192.168.193.110:$ORACLE_HOME/dbs/

注:拷贝时保持目录结构相同

7修改刚才拷贝至standby服务器的文件

$cd/opt/oracle/oradata/orcl

将control01.ctl删除,将standby.ctl改名为control01.ctl,并复制一份contro02.ctl



$rmcontrol01.ctl

$mvstandby.ctlcontrol01.ctl



7.2$vi$ORACLE_HOME/dbs/initorcl.ora修改初始化文件(红色部分)

DB_UNIQUE_NAME=orcl_dg

LOG_ARCHIVE_CONFIG=’DG_CONFIG=(orcl_dg,orcl)’

LOG_ARCHIVE_DEST_1=’LOCATION=/opt/oracle/oradata/archiveVALID_FOR=(ALL_LOGFILES,ALL_ROLES)DB_UNIQUE_NAME=orcl_dg’

LOG_ARCHIVE_DEST_2=’SERVICE=orclLGWRASYNCVALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)DB_UNIQUE_NAME=orcl’

LOG_ARCHIVE_FORMAT=''%t_%s_%r.arc''

LOG_FILE_NAME_CONVERT=’/opt/oracle/oradata/archive’,’/opt/oracle/oradata/archive’

LOG_ARCHIVE_DEST_STATE_1=ENABLE

LOG_ARCHIVE_DEST_STATE_2=ENABLE

FAL_SERVER=orcl

FAL_CLIENT=orcl_dg

log_archive_max_processes=4

STANDBY_FILE_MANAGEMENT=AUTO

注:

1,注意参数controlfiles为上面创建的控制文件control01.ctl和control02.ctl的路径,可调整,如相关目录存在,需创建错误详见10.2

2,db_recovery_file_dest参数目录需要存在,不然会10.1的错



8启动主库

删除$ORACLE_HOME/dbs/spfileorcl.ora

$rmspfileorcl.ora#今日该文件目录

$sqlplu/nolog

SQL>conn/assysdba

SQL>createspfilefrompfile#创建spfile文件

$startup



9standby数据库创建spfile

$sqlplu/nolog

SQL>conn/assysdba

SQL>createspfilefrompfile

SQL>quit



查看SID是否与主库一样

$ps-ef|grepSID

$env|grepSID







10验证备库能否启动

10.1

$sqlplus/nolog

SQL>conn/assysdba

SQL>startupnomount



报错如下没有找到db_recovery_file_dest目录





找到查看$ORACLE_HOME/dbs/initorcl.ora



然后创建此目录再执行SQL>startupnomount,成功



10.2

SQL>ALTERdatabasemountstandbydatabase

报错:





根据日志查看是找不到:

/opt/oracle/flash_recovery_area/orcl/control02.ctl

然后将

/opt/oracle/oradata/orcl/conrol01.ctl拷贝过来并改名control02.ctl

再次执行SQL>ALTERdatabasemountstandbydatabase成功





11.1

SQL>selectname,database_rolefromv$database

主库查询结果



Standby库查询结果



11.2stanby数据库准备接受主库redo数据

SQL>Alterdatabaserecovermanagedstandbydatabasedisconnectfromsession;

提?示DISCONNECT?FROM?SESSION子句并非必需,该子句的作用呢,是指定启动完应用后自动退出到命令操作符前。如果不指定该子句的话,当前SESSION就会一直停留处理REDO应用,如果想做其他操作,就只能新建一个连接

11.3切换日志,传输数据到备库在primary库执行

创建表并插入测试数据后执行转换日志

SQL>Altersystemswitchlogfile;



standby数据库查看归档日志

SQL>selectsequence#,first_time,next_timefromv$archived_logorderbysequence#;



说明日志已经传输到standby了



在standby上执行

SQL>selectsequence#,appliedfromv$archived_logorderbysequence#;





发现上图NO全部变成YES了。(前提执行altersystemswitchlogfile)

如果还是NO,就只能查看日志来判断错误信息。

日志路径(oracle11g):

$ORACLE_BASE/diag/rdbms/orcl_dg/orcl/alert

$ORACLE_BASE/diag/rdbms/orcl_dg/orcl/trace



11.6取消日志应用,检查同步数据是否完成

SQL>alterdatabaserecovermanagedstandbydatabasecancel;

SQL>ALTERDATABASEOPENREADONLY;

SQL>selectfromdgtest;#dgtest需要同步的表



SQL>Alterdatabaserecovermanagedstandbydatabasedisconnectfromsession;

备库就可以继续接收主库的传输数据了



至此,physicaldataguard就配置结束了,默认为最大性能模式。



可执行

selectprotection_mode,protection_levelfromv$database

查看



注:主从复制是采用重做日志(redolog),故复制不是实时的,只有在一个日志文件写满后,才开始复制,若每次新数据都要实时复制的话,需要在主库上更新数据后执行ALTERSYSTEMSWITCHLOGFILE来强制切换日志文件才可以。

监听启动时候先启动从库再启动主库

启动时候先启动从库,再启动主库,关闭时候则相反



二,最大性能模式切换最大可用模式实现实时复制(不需切换日志)

1,更新主库:

更改log_archive_dest_2

SQL>Altersystemsetlog_archive_dest_2=’SERVICE=

orcl_dgOPTIONALLGWRSYNCAFFIRMVALID_FOR=

(ONLINE_LOGFILES,PRIMARY_ROLE)DB_UNIQUE_NAME=orcl_dg’;



SQL>startupmount



转换成最大可用模式或者最大保护模式

SQL>

alterdatabase?set?standby?databaseto?maximize?availability;?

提示:maximize后可跟{PROTECTION|AVAILABILITY|PERFORMANCE},分别对应最大保护,最高可用性及最高性能。

此时SQL>?select?protection_mode,protection_level?from?v$database;??



PROTECTION_LEVEL=RESYNCHRONIZATION此时表示等待,只有从库转化成功后主库此状态才会更改

2,更新从库

2.1,创建standbylogfile?Standbylogfile大小跟redolog大小一致默认有一个推荐的公式可以做参考:(每线程的日志组数+1)最大线程数SQL>?alter?database?add?standby?logfile?group?10?(''/opt/oracle/oradata/orcl/std_redo10.log'')?size?50M;

SQL>?alter?database?add?standby?logfile?group?11?(''/opt/oracle/oradata/orcl/std_redo11.log'')?size?50M;???

SQL>?alter?database?add?standby?logfile?group?12(''/opt/oracle/oradata/orcl/std_redo12.log'')?size?50M;????

SQL>?alter?database?add?standby?logfile?group?13?(''/opt/oracle/oradata/orcl/std_redo13.log'')?size?50M;?

SQL>Altersystemsetlog_archive_dest_2=’SERVICE=

orclOPTIONALLGWRSYNCAFFIRMVALID_FOR=

(ONLINE_LOGFILES,PRIMARY_ROLE)DB_UNIQUE_NAME=orcl’;

查询从库状态

SQL>?selectprotection_mode,protection_level?from?v$database;??

???

PROTECTION_MODE??????PROTECTION_LEVEL??

--------------------?--------------------??

MAXIMUM?AVAILABILITY?MAXIMUM?AVAILABILITY??

???

PROTECTION_LEVEL=MAXIMUMAVALABILITY表示从库已经配置成最大可用,此时再查看主库,发现主库protection_level已经变成MAXIMUM?AVAILABILITY?了



注意:如果始终是RESYNCHRONIZATION查看日志alert_orcl.log发现日志中有下图:



说明重库没有standbylogfile,需执行2.1?



开启接受主库日志

SQL>Alterdatabaserecovermanagedstandbydatabaseusingcurrentlogfiledisconnectfromsession;usingcurrentlogfile的作用是开启实时复制而不是切换日志时候才应用

此时观察主库:

SQL>?selectprotection_mode,protection_level?from?v$database;?

发现PROTECTION_LEVEL已经改变成MAXIMUMAVALABILITY了。

此时主从库就实现实时复制了,可以建表测试。

遇到过的问题:

问题1:

原因可能是init+sid.ora文件中的参数log_archive_dest_2的VALID_FOR后跟等号前有空格,例如:

LOG_ARCHIVE_DEST_2=’SERVICE=orclVALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)DB_UNIQUE_NAME=orcl’

如果配置完全正确,还是不能启动数据库,则重新生成pfile,createpfilefromspfile再检查init+sid.ora,或许真的有重复属性

问题2,ORA-16009:invalidredotransportdestinationPING[ARC2]:Heartbeatfailedtoconnecttostandby''ORCL''.Error

is16009.

selectdest_name,error,status,processfromv$archive_destwhererownum<3;查看

没有影响dg体系结构的运行,而这个错误也是反映在备库的v$archive_dest下,这个因为log_archive_dest_2参数不规范引起的,默认不设置valid_for属性oracle认为是VALID_FOR=(ALL_LOGFILES,ALL_ROLES),

添加上属性VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)



问题3,ORA-19527:必须重命名物理备用重做日志ORA-00312:联机日志1线程1:''C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\REDO01.LOG''

这是因为log_file_name_convert没有设置成对,这样设置就好了,

log_file_name_convert=’/opt/oracle/oradata/arch/’,’/opt/oracle/oradata/arch/’selectprocess,status,sequence#fromv$managed_standby;

主数据库和备用数据库需要使用相同或者相近的硬件

























献花(0)
+1
(本文系樱梦雪苹宝首藏)