|
Oracle physical dataguard文档 |
|
|
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;
主数据库和备用数据库需要使用相同或者相近的硬件
|
|
|
|
|
|
|
|
|
|
|