Oracle10gR2 Logical Standbygood.docx
- 文档编号:10495549
- 上传时间:2023-02-14
- 格式:DOCX
- 页数:14
- 大小:23.20KB
Oracle10gR2 Logical Standbygood.docx
《Oracle10gR2 Logical Standbygood.docx》由会员分享,可在线阅读,更多相关《Oracle10gR2 Logical Standbygood.docx(14页珍藏版)》请在冰豆网上搜索。
Oracle10gR2LogicalStandbygood
Oracle10gR2LogicalStandby
(一)概念与原理
作者:
NinGoo|【转载时请务必以超链接形式标明文章原始出处和作者信息】
从Oracle9i开始支持逻辑Standby,通过logminer从日志中挖掘出sql语句重新在备库应用,来达到主备库数据冗余的目的。
由于逻辑备库在应用sql的同时是处于open状态了,那么除了可以利用其冗余数据的特性来做冗灾之外,考虑得更多的可能是利用其做为报表查询库,或者做为读写分离的一种解决方案来分担整个系统的负载,可以充分利用做为备库的主机和存储资源。
但是9i的逻辑备库有很多不成熟的地方,实际使用的案例也不多。
Oracle10g对于DataGuard在易用性和稳定性方面做出了不少的改进。
本系列文章打算简单介绍一下10gR2的逻辑备库。
逻辑备库的架构说起来十分的简单,首先利用主库的一个备份来建立逻辑备库,然后主库将日志传递到备库,备库利用logminer从主库的日志中解析出主库所执行过的SQL,然后重新跑一边,从而使得主备库的数据一致。
由于Oracle的联机日志是半逻辑半物理结构,所以从日志中解析出来的SQL,只是逻辑上和主库上的等效,而不是完全相同的语句。
比如主库执行一条insert语句插入了10条记录,在备库解析出来将是10条insert语句,每条语句插入一条记录。
从上面的描述,我们可以发现逻辑备库和downstream方式的Streams非常的相似,不同的是,Streams可以更灵活,可以方便的过滤数据,也可以在第三方库执行日志解析的工作。
但是逻辑备库的实现和维护比起Streams来都要方便很多,因为捕获和应用都是在同一个库中,就不需要使用到AQ(高级队列),从而使得整个数据流变得简单,在高负荷的系统中,越简单的产品越实用。
逻辑备库需要一系列的进程来完成日志的捕获和应用工作。
执行捕获任务的进程主要有:
∙READER进程从主库传过来的归档或者standbyredologfile中解析重做记录(redorecord)
∙PREPARER进程负责将READER进程解析到的重做记录转换为LCR(Logicalchangerecord)。
可以开启多个PREPARER进程。
解析出来的LCR存放在sharedpool的一个叫做LCRcache的区域中。
∙BUILDER进程将LCR打包成事务。
另外还负责管理LCRcache,执行重启SQLApply所需要的checkpoint(这个在后面的文章中会介绍),以及过滤不需要数据等任务。
执行应用日志的进程主要有:
∙ANALYZER进程检查一组LCR中包含的事务片段,过滤掉不需要应用的事务,检查不同事务的依赖关系等
∙COORDINATOR进程分配事务给APPLIER进程,监控事务依赖关系和协调调度,确认逻辑备库的提交
∙APPLIER进程将LCR应用到备库,和COORDINATOR进程交互确认事务的依赖关系并提及事务。
上面提到的这些进程,都可以从V$LOGSTDBY_PROCESS视图中获得他们的信息
SYS@standby>selectsid,type,status_code,statusfromv$logstdby_process;
SIDTYPE STATUS_CODESTATUS
---------------------------------------------------------------------
143COORDINATOR 16116ORA-16116:
noworkavailable
141READER 16240ORA-16240:
Waitingforlogfile(thread#1,sequence#54)
140BUILDER 16116ORA-16116:
noworkavailable
139PREPARER 16116ORA-16116:
noworkavailable
137ANALYZER 16116ORA-16116:
noworkavailable
136APPLIER 16116ORA-16116:
noworkavailable
135APPLIER 16116ORA-16116:
noworkavailable
134APPLIER 16116ORA-16116:
noworkavailable
133APPLIER 16116ORA-16116:
noworkavailable
132APPLIER 16116ORA-16116:
noworkavailable
10rowsselected.
呵呵,我的试验库太闲了,除了READER进程在等待主库传日志外,其他的都没事干啦^_^
通过v$logstdby_stats视图可以查看逻辑备库的一些统计信息
SYS@standby>select*fromv$logstdby_stats;
NAME VALUE
------------------------------------------------------------
numberofpreparers 1
numberofappliers 5
maximumSGAforLCRcache 30
parallelserversinuse 9
maximumeventsrecorded 100
preservecommitorder TRUE
transactionconsistency FULL
recordskiperrors Y
recordskipDDL Y
recordappliedDDL N
recordunsupportedoperations N
coordinatorstate IDLE
transactionsready 8
transactionsapplied 8
coordinatoruptime 410
realtimelogmining N
applydelay 0
LogMinersessionID 1
txnsdeliveredtoclient 1649
DMLtxnsdelivered 316
DDLtxnsdelivered 7
CTAStxnsdelivered 1
Recursivetxnsdelivered 1326
Rolledbacktxnsseen 1
LCRsdeliveredtoclient 5762
bytesofredoprocessed 8944996
bytespagedout 0
secondsspentinpageout 0
bytescheckpointed 0
secondsspentincheckpoint 0
bytesrolledback 0
secondsspentinrollback 0
secondssystemisidle 334
33rowsselected.
Oracle10gR2LogicalStandby
(二)配置前需要考虑的问题
作者:
NinGoo|【转载时请务必以超链接形式标明文章原始出处和作者信息】
逻辑备库只是对于主库的一个逻辑意义上的数据冗余,不像物理备库能够在block级别上和主库保持一致。
所以有其优点,也有其缺点。
比如主库的一个datafile损坏,可以从物理备库拷贝对应的文件过来然后recoverdatafile就可以恢复,逻辑备库则无法实现这样保护了。
由于是SQLAPPLY,对于一些数据类型也是有限制的。
不支持的数据类型
Oracle10gR2的logicalstandby已经能支持大多数的数据类型了,包括CLOB/BLOB/LONG等,但还是有几种类型是不支持的。
如果主库中有使用到这些数据类型,则需要使用其他方式进行处理。
BFILE
Collections(includingVARRAYSandnestedtables)
Encryptedcolumns
Multimediadatatypes(includingSpatial,Image,andContext)
ROWID,UROWID
User-definedtypes
XMLType
可以通过查询DBA_LOGSTDBY_UNSUPPORTED视图来查看当前库中是否有table包含了这些不支持的数据类型
NING@ning>selectdistinctowner,table_namefromDBA_LOGSTDBY_UNSUPPORTED;
norowsselected
如果发现有不支持的table,则可以进一步查询得到不支持的是哪些列和列的类型。
此外,压缩段存储是不支持的。
需要修改系统元数据的PL/SQL过程如DBMS_JAVA,DBMS_REGISTRY,DBMS_ALERT,DBMS_SPACE_ADMIN,DBMS_REFRESH,DBMS_REDEFINITION,DBMS_SCHEDULER,andDBMS_AQ也是不支持的,也就是说,这些包在主库可以执行,但是不会将相应的改变传递到备库去。
但有一个例外,就是DBMS_JOB。
使用DBMS_JOB提交的Job会复制到备库,但是在备库的job是不会调度运行的,只有在切换后,原来的备库变成新的主库,这些Job会根据原来主库执行的情况自动启动。
这个我在测试的时候碰到在主库提交一个Job,在备库看不到,直到在主库remove后,在备库的dba_jobs中才能查到该Job的记录,比较奇怪。
先记录下来,以后再详细测试。
默认不复制的schema
对于一些系统schema,逻辑备库默认是忽略其实际变更的。
逻辑备库和主库只是逻辑意义上也就是用户数据保持一致,元数据自然是不应该复制的,否则就乱套了。
SYS@ning>selectowner,namefromDBA_LOGSTDBY_SKIP;
OWNER NAME
------------------------------------------------------------
SYSTEM %
SYS %
DIP %
OUTLN %
WMSYS %
DBSNMP %
不支持的语句
以下语句在主库执行时不会应用到备库。
基本上,只影响元数据的东西都是不会在备库应用的。
ALTERDATABASE
ALTERMATERIALIZEDVIEW
ALTERMATERIALIZEDVIEWLOG
ALTERSESSION
ALTERSYSTEM
CREATECONTROLFILE
CREATEDATABASE
CREATEDATABASELINK
CREATEPFILEFROMSPFILE
CREATEMATERIALIZEDVIEW
CREATEMATERIALIZEDVIEWLOG
CREATESCHEMAAUTHORIZATION
CREATESPFILEFROMPFILE
DROPDATABASELINK
DROPMATERIALIZEDVIEW
DROPMATERIALIZEDVIEWLOG
EXPLAIN
LOCKTABLE
SETCONSTRAINTS
SETROLE
SETTRANSACTION
此外,我们也可以通过DBMS_LOGSTDBY.SKIP过程指定某些对象的数据不在备库应用,这些对象也可以在DBA_LOGSTDBY_SKIP视图中查到。
如果在主库执行了这些不支持的DDL,在备库的alert中会做做如下记录:
LOGSTDBYstmt:
ALTERDATABASEOPEN
ORA-16226:
DDLskippedduetolackofsupport
LOGSTDBYid:
XID0×0002.01b.00000064,hSCN0×0000.000314d7,lSCN0×0000.000314d7,Thread1,RBA0×0041.00000050.174,txnCscn0×0000.000314da,PID2180,ORACLE.EXE(P004)
主键和唯一键约束
前面也有提到,由于Oracle的日志是半逻辑半物理结构的,主库的redo在备库解析出来后,每一行数据的变更都会生成一条SQL。
这样要求在备库能够唯一区别出一行数据。
由于主备库只是逻辑上一致,其ROWID属于物理结构,是不一样的。
所以最好能在主库的表上有主键或者唯一键约束。
如果没有,则需要在日志中记录发生变化的数据行的所有列(除了LONG,LOB,LONGRAW,objecttype,andcollections等类型的列),这样就需要在主库生成许多额外的日志量,在备库解析和应用日志时也需要占用更多的资源,对性能造成一定的压力。
当然如果应用能确保表中某些列的数据是唯一的,也不一定需要在主库创建实际生效的约束,使用RELYDISABLE关键字来创建约束,然后在备库对应列上创建一个索引就可以了。
这样主库也就不需要为维护唯一约束付出代价。
可以通过查询DBA_LOGSTDBY_NOT_UNIQUE视图来获得系统中没有主键或者唯一键的表的情况
SYS@ning>selectowner,table_namefromDBA_LOGSTDBY_NOT_UNIQUE;
OWNER TABLE_NAME
------------------------------------------------------------
NING TEST2
Oracle10gR2LogicalStandby(三)配置逻辑备库
作者:
NinGoo|【转载时请务必以超链接形式标明文章原始出处和作者信息】
Oracle10gR2在管理方面比起Oracle9i来说,有了相当大的改进,很多组件的安装配置过程都被简化了。
简单的操作能够减少很多不必要的失误,对于提高系统的可用性也是很有帮助的。
LogicalStandby现在能够由physicalstandby直接转化而来,这一点改进很重要,不但简化了配置的过程,也为Oracle11g利用physicalstandby做滚动升级打下了基础,滚动升级的另外一个基础是Flashbackdatabase。
Oracle很多特性在刚推出的时候看是改进不大,但真正产生化学作用往往会在更新的版本中体现。
一、创建物理备库
关于物理备库的创建,已经有过很多文章了,所以这里就不打算再重复整个过程了。
可以参考我以前做试验的时候一点记录
利用rman创建standby
(一)
利用rman创建standby
(二)
上面两篇文章试验的版本都是9201的,但是物理备库在9i和10g的配置过程基本一致。
不同的是,Oracle10g引入了一些新的参数和属性,可以简化switchover操作。
所以参数的设置我这里再贴一个例子。
主库:
*.db_name=’ning’
*.db_unique_name=’NING’
*.fal_client=’NING’
*.fal_server=’STANDBY’
*.log_archive_dest_1=’location=f:
\oracle\arch\ningvalid_for=(all_logfiles,all_roles)db_unique_name=ning’
*.log_archive_dest_2=’service=standbyvalid_for=(online_logfiles,primary_role)db_unique_name=ning’
*.log_archive_dest_state_2=’ENABLE’
备库:
*.db_name=’STANDBY’
*.db_unique_name=’standby’
*.fal_client=’standby’
*.fal_server=’ning’
*.log_archive_dest_1=’location=f:
\oracle\arch\standbyvalid_for=(all_logfiles,all_roles)db_unique_name=standby’
*.log_archive_dest_2=’service=ningvalid_for=(online_logfiles,primary_role)db_unique_name=standby’
*.log_archive_dest_state_2=’ENABLE’
Oracle9i的lock_name_space参数主要用在主备库在同一台server的时候用来区分instance的,因为物理备库的db_name和主库需要保持一致的。
这个参数在Oracle10g中已经废弃,使用db_unique_name替代。
但是db_unique_name的作用已经被放大,即使主备库在不同的server上,也建议设置,这样通过在归档路径参数中设置valid_for和db_unique_name属性,可以做到switchover后,即使主备角色转换,还是可以使用同一套参数文件。
至于控制文件,转换为逻辑备库的时候,会根据主库的控制文件参数重设。
二、转换物理备库为逻辑备库
首先停止物理备库的redoapply
alterdatabaserecovermanagedstandbydatabasecancel;
然后在主库为logminer生成数据字典信息到日志中,这个步骤需要使用闪回查询技术对数据字典信息执行一致性读,故undo_retention需要设置时间长一些,不然可能碰到ora-01555。
execdbms_logstdby.build;
归档主库当前日志,确保包含数据字典信息的归档传递到备库
altersystemarchivelogcurrent;
执行转换语句,逻辑备库的db_name不需要和主库保持一致,所以这里可以根据需要选择备库的名字。
如果使用的是spfile,还会自动修改db_name参数。
alterdatabaserecovertologicalstandbytest;
重启逻辑备库
shutdownimmediate;
startupmount;
alterdatabaseopenresetlogs;
启动sqlapply
alterdatabasestartlogicalstandbyapply;
如果要启动实时应用特性,需要先在备库添加standbyredologfile
alterdatabaseaddstandbylogfile'f:
\oracle\oradata\standby\standbyredo01.log'size10m;
alterdatabaseaddstandbylogfile'f:
\oracle\oradata\standby\standbyredo02.log'size10m;
alterdatabaseaddstandbylogfile'f:
\oracle\oradata\standby\standbyredo03.log'size10m;
alterdatabaseaddstandbylogfile'f:
\oracle\oradata\standby\standbyredo04.log'size10m;
启动realtimesqlapply
alterdatabasestoplogicalstandbyapply;
alterdatabase
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle10gR2 Logical Standbygood
![提示](https://static.bdocx.com/images/bang_tan.gif)