oracle
NinGoo's blog

关于ORA_ROWSCN

Oracle10g引入了一个新的ORA_ROWSCN的伪列,可以查询表中记录最后变更的SCN。这个新的伪列在某些环境下会非常有用,比如执行乐观锁定,或者增量数据抽取的时候。但是,默认情况下,每行记录的ORA_ROWSCN是基于Block的,除非在建表的时候执行开启行级跟踪(create table … rowdependencies)。

先来简单理解一下ORA_ROWSCN的实现原理。我们知道,每个Block在头部是记录了该block最近事务的SCN的,所以默认情况下,只需要从block头部直接获取这个值就可以了,不需要其他任何的开销,Oracle就能做到这一点。但是这明显是不精确的,一个block中会有很多行记录,每次事务不可能影响到整个block中所有的行,所以这是一个非常不精准的估算值,同一个block的所有记录的ORA_ROWSCN都会是相同的,基本上没有多大的使用价值。

如果在建表的时候开启行级跟踪选项,Oracle则可以为每一行记录精确的SCN,那么显然不能再直接从block头部获取。要获得足够的信息,肯定要付出一定的代价,Oracle必须为每一行实际的存储这个SCN。所以这个行级跟踪的选项,只能在建表的时候指定,而不能通过alter table来修改现有的表,否则需要修改每一行记录的物理存储格式,代价是可想而知的。

简单的做个实验就可以知道开启行级跟踪以后块记录格式的不同。建两个表,一个norowdependencies(默认),一个rowdependencies,然后分别dump出相应的数据块:

create table t1(i int);
insert into t1 values(1);
insert into t1 values(2);
commit;
create table t2 rowdependencies as select * from t1;

norowdependencies

block_row_dump:
tab 0, row 0, @0x1f9a
tl: 6 fb: –H-FL– lb: 0×1 cc: 1
col 0: [ 2] c1 02
tab 0, row 1, @0x1f94
tl: 6 fb: –H-FL– lb: 0×1 cc: 1
col 0: [ 2] c1 03
end_of_block_dump

rowdependencies

block_row_dump:
tab 0, row 0, @0x1f7c
tl: 12 fb: –H-FL– lb: 0×0 cc: 1
dscn 0×0000.00029ae4
col 0: [ 2] c1 02
tab 0, row 1, @0x1f6d
tl: 12 fb: –H-FL– lb: 0×0 cc: 1
dscn 0×0000.00029ae4
col 0: [ 2] c1 03
end_of_block_dump

得到行的SCN后,通过SCN_TO_TIMESTAMP函数可以转化为时间:

SQL>  select SCN_TO_TIMESTAMP(ora_rowscn) from t2 where rownum<2;

SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------------------------------------------------------------------------
06-JAN-09 05.31.20.000000000 PM

乐观锁和ORA_ROWSCN
需要select ... for update做悲观锁定的时候,通过使用ORA_ROWSCN可以改成乐观锁定。一开始select数据的时候将ORA_ROWSCN查出来,修改后如果要写回数据库之前再比对下最新的ORA_ROWSCN就可以知道这期间数据是否有发生变化。这个Tom在他的大著《Expert Oracle Database Architecture 9i and 10g Programming Techniques and Solutions 》中也是有提到的。

增量数据抽取和ORA_ROWSCN
每次抽取后记录最大的ORA_ROWSCN,下次抽取再基于上一次的SCN来获得最近修改过的数据即可。在10g之前,很多系统要实现增量数据抽取,要么通过解析日志,要么加触发器,要么就在表上加一个时间截字段。ORA_ROWSCN其实就是第三种方式,只是这个字段由Oracle来维护,这样可以避免一些应用绕过时间截去更新其他字段带来的问题。不过,如果系统中使用了逻辑备库或者streams等逻辑复制的方案,而数据抽取又是基于逻辑备库的话,ORA_ROWSCN就可能对抽取后的数据分析有影响了,因为通过这个得到的时间是逻辑备库上记录变更的时间,而不是源库的时间了。当然,如果纯粹只是做数据抽取,而不需要使用这个时间来做分析,还是问题不大的,但还是要考虑一旦逻辑备库出现故障需要重做的,则这个增量抽取要怎么来处理的问题。

Metalink上搜一下ORA_ROWSCN可以看到不少相关的bug,所以在生产系统中使用的时候要小心。例如,我在Linux64平台上的一台测试库中,执行以下语句就会碰到ORA-07445的错误:

SQL> select ora_rowscn from x$bh where rownum<2;
select ora_rowscn from x$bh where rownum<2
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel

ORA-07445: exception encountered: core dump [qkafix()+212]
[SIGSEGV] [Address not mapped to object] [0x000000004] [] []

Oracle10gR2 Logical Standby(七)日常管理与优化

有一段时间没怎么写技术性的文章了,继续前面的逻辑备库系列,这是第七篇。

对于逻辑备库来说,日常管理主要需要关注SQL Apply。切换是很少发生的动作,而logminer的速度相对于sql apply来说是很快的,恢复的进度主要还是取决于SQL Apply的进度。

一、SQL Apply进程

SQL Apply实际上是一组后台并行进程,包括reader,preparer,builder,analyzer,coordinator,applier 六种不同作用的进程:

  • reader:读取redo记录传递给preparer进程
  • preparer: 根据redo记录和数据字典信息生成LCR
  • builder: 将同一个事务的LCR打包。对于大事务(eager transaction),可能被打成多个事务包(transaction chunk),那么可能有些包里是不包含commit的,每一个事务包都可能交给不同的applier进程。
  • analyzer:分析事务包之间的依赖关系
  • coordinator:将分析好的事务包交给applier进程
  • applier:将事务包应用,如果事务包依赖其他事务包,则需要等待相应的事务包完成。事务能否commit,可能还需要根据不同的情况从coordinator获得相应的信息。

[继续阅读全文]

Oracle如何设置备用归档路径

Oracle可以设置备用归档路径,如果首要归档路径不可用,可以自动切换到备用路径,而平时备用路径不启用,这在一些对高可用要求比较高的环境中还是有实用价值,无法正确归档将会导致数据库挂起。启用该特性需要配置的参数如下:

log_archive_dest_1='location=/arc/archive/test alternate=log_archive_dest_2 noreopen'
log_archive_dest_2='location=/arc1/archive/test'
log_archive_dest_state_1=enable
log_archive_dest_state_2=alternate
 

log_archive_dest_1需要设置noeopen或者reopen=0属性,否则无法迅速切换到备用路径,可能导致数据库无法归档。

此时归档路径状态如下:

SQL> select dest_name,destination,status,error from v$archive_dest;
DEST_NAME            DESTINATION        STATUS     ERROR
-------------------- ------------------ ---------- ---------------------
LOG_ARCHIVE_DEST_1   /arc/archive/test   VALID
LOG_ARCHIVE_DEST_2   /arc1/archive/test  ALTERNATE
LOG_ARCHIVE_DEST_3   standby            VALID
LOG_ARCHIVE_DEST_4                      INACTIVE
LOG_ARCHIVE_DEST_5                      INACTIVE
LOG_ARCHIVE_DEST_6                      INACTIVE
LOG_ARCHIVE_DEST_7                      INACTIVE
LOG_ARCHIVE_DEST_8                      INACTIVE
LOG_ARCHIVE_DEST_9                      INACTIVE
LOG_ARCHIVE_DEST_10                     INACTIVE

[继续阅读全文]

你的数据库使用了哪些特性?

Oracle10g中增加了一张叫做DBA_FEATURE_USAGE_STATISTICS的视图,只要你使用过的一些特性都会记录下来,而且这些信息可能在一些trace文件比如RDA收集的结果中存在,没买license而使用了这些特性的要注意了。不过透过这个视图,也能了解到系统的很多情况,或许很多东西都是作为DBA的你都不曾注意到的吧,呵呵

SQL> select name,detected_usages as "usage",currently_used,first_usage_date,last_usage_date
  2  from dba_feature_usage_statistics;
NAME                                                    usage CURRE FIRST_USAGE_ LAST_USAGE_D
-------------------------------------------------- ---------- ----- ------------ ------------
Protection Mode - Maximum Availability                      0 FALSE
Protection Mode - Maximum Performance                      36 TRUE  04-FEB-08    06-OCT-08
Protection Mode - Maximum Protection                        0 FALSE
Protection Mode - Unprotected                               0 FALSE
Real Application Clusters (RAC)                             0 FALSE
Recovery Area                                               0 FALSE
Recovery Manager (RMAN)                                    32 TRUE  03-MAR-08    06-OCT-08
RMAN - Disk Backup                                         32 TRUE  03-MAR-08    06-OCT-08
RMAN - Tape Backup                                          0 FALSE
Resource Manager                                            0 FALSE
Segment Advisor                                            34 TRUE  18-FEB-08    06-OCT-08
Server Parameter File                                      36 TRUE  04-FEB-08    06-OCT-08
Undo Advisor                                                0 FALSE
Virtual Private Database (VPD)                              0 FALSE
Shared Server                                               0 FALSE
Spatial                                                     0 FALSE
SQL Access Advisor                                          0 FALSE
SQL Tuning Advisor                                          0 FALSE
SQL Tuning Set                                              0 FALSE
Standby Archival - LGWR                                    23 TRUE  17-MAR-08    06-OCT-08
Standby Archival - ARCH                                     9 FALSE 03-MAR-08    12-MAY-08
Standby Transmission                                       32 TRUE  03-MAR-08    06-OCT-08
Streams (system)                                           36 TRUE  04-FEB-08    06-OCT-08
Streams (user)                                              0 FALSE
Transparent Gateway                                         0 FALSE
Advanced Replication                                        0 FALSE
Advanced Security                                           0 FALSE
Audit Options                                               0 FALSE
Automatic Database Diagnostic Monitor                       0 FALSE
Automatic Segment Space Management (system)                36 TRUE  04-FEB-08    06-OCT-08
Automatic Segment Space Management (user)                  36 TRUE  04-FEB-08    06-OCT-08
Automatic SQL Execution Memory                             36 TRUE  04-FEB-08    06-OCT-08
Automatic Storage Manager                                   0 FALSE
Automatic Undo Management                                  36 TRUE  04-FEB-08    06-OCT-08
Automatic Workload Repository                               0 FALSE
Change-Aware Incremental Backup                             0 FALSE
Client Identifier                                           0 FALSE
CSSCAN                                                      0 FALSE
Character Semantics                                         0 FALSE
Character Set                                              36 TRUE  04-FEB-08    06-OCT-08
Data Guard                                                 32 TRUE  03-MAR-08    06-OCT-08
Data Guard Broker                                           0 FALSE
Data Mining                                                 0 FALSE
Dynamic SGA                                                 0 FALSE
File Mapping                                                0 FALSE
Flashback Database                                          0 FALSE
Internode Parallel Execution                                0 FALSE
Label Security                                              0 FALSE
Locally Managed Tablespaces (system)                       36 TRUE  04-FEB-08    06-OCT-08
Locally Managed Tablespaces (user)                         36 TRUE  04-FEB-08    06-OCT-08
Messaging Gateway                                           0 FALSE
MTTR Advisor                                               21 FALSE 04-FEB-08    23-JUN-08
Multiple Block Sizes                                        0 FALSE
OLAP - Analytic Workspaces                                  0 FALSE
OLAP - Cubes                                                0 FALSE
Oracle Managed Files                                        0 FALSE
Parallel SQL DDL Execution                                  2 FALSE 17-MAR-08    24-MAR-08
Parallel SQL DML Execution                                  0 FALSE
Parallel SQL Query Execution                               26 TRUE  14-APR-08    06-OCT-08
Partitioning (system)                                      36 TRUE  04-FEB-08    06-OCT-08
Partitioning (user)                                        32 TRUE  03-MAR-08    06-OCT-08
PL/SQL Native Compilation                                   0 FALSE

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.3.0 - Productio
NLSRTL Version 10.2.0.3.0 - Production