首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

oracle中的scn跟rowid

2012-11-14 
oracle中的scn和rowid首先讲解一下oracle中最重要的两个概念scn和rowidscnScn号:是当Oracle数据库更新后,

oracle中的scn和rowid
首先讲解一下oracle中最重要的两个概念scn和rowid

scn

Scn号:是当Oracle数据库更新后,由DBMS自动维护去累积递增的一个数字。在Oracle中,有四种比较重要的SCN,分别为:系统检查点SCN、数据文件检查点SCN、启动SCN、终止SCN。

oracle系统做任何事情都要有一个号码对应,相当于数据库的内部时间,小号在前大号在后。对于用户来说他是透明的,scn的管理完全由oracle自己管理。

当一个检查点动作完成后,Oracle就把系统检查点的SCN存储到controlfile(控制文件)中。检查点可以暂时理解为数据库按照一定规律定时(不太准确)把内存的数据块存盘。

参看最近的checkpoint的scn

select?checkpoint_change#?from?v$database;

当一个检查点动作完成后,Oracle就把每个数据文件的scn单独存放在controlfile(控制文件)中。主要用于实例恢复,它会参照控制文件的scn号进行相应的处理(主要的恢复和回退)查看数据文件的checkpoint的scn

select?name,checkpoint_change#?from?v$datafile;

  Oracle把这个检查点的scn存储在每个数据文件的文件的头中,这个值称为启动scn,因为它用于在数据库实例启动时,检查是否需要执行数据库恢复。主要和控制文件中的每个数据文件的scn对比,看是否需要恢复。

每个数据文件的终止scn都存储在controlfile(控制文件)中。

?

查看当前的scn号

Select?current_scn?from?v$database;

?

以上的几个scn号主要用于oracle的恢复与备份,有些是oracle自动帮我们完成,有些是需要我们根据以上的几个scn号手工去操作。所以以上的几个scn非常重要,一定要理解和会查找。一般会配合log一起使用这里我只列出对log查询scn号,具体如何操作将在以后讲解。

查询日志文件开始记录的scn号

Select?group#,first_change#?from?v$log;

?

?

?

?

Rowid

Rowid?数据库中数据块记录每一条记录的唯一行号,是18位的64进制组成,是计算出来的,主要是根据行存在的位置计算出来的。Rowid本质限制了数据库的文件大小和表空间文件的个数。rowid伪列不存储在数据库中,它不是数据库数据,这是从database及table的逻辑结构来说的,事实上,在物理结构上,每行由一个或多个?row?pieces组成,每个row?piece的头部包含了这个piece的address,即rowid.从这个意义上来说,rowid还是占了磁盘空间的.

select?ROWID?from?scott.emp?where?rownum<2;

ROWID
------------------?----------
AAABnlAAFAAAAAPAAA
?
ROWID的格式如下:

数据对象编号????????文件编号????????块编号???????????行编号
OOOOOO?????????????FFF????????????????BBBBBB??RRR

我们可以看出,从上面的rowid可以得知:
AAABnl?是数据对象编号(j就是表、索引等)
AAF是相关文件编号
AAAAAP是块编号
AAA?是行编号

通过函数来处理rowid

函数有:

1?Dbms_rowid.rowid_object(rowid)??得到该行的对象号

?

?

?

?

?

?

?

?

?

2?dbms_rowid.rowid_relative_fno(rowid)?rfile#?得到该行的文件号

?

?

?

?

?

?

?

?

?

3?dbms_rowid.rowid_block_number(rowid)?block#?得到该行所在块号

?

?

?

?

?

?

?

?

4?dbms_rowid.rowid_row_number(rowid)?row#,?等到该行的行号

?

?

?

?

?

?

?

?

?

5?dbms_rowid.rowid_to_absolute_fno(rowid,'SYS','TEST')?file#

?

?

?

?

?

?

?

?

?

?

?

?

可以通过以上的函数对某个表做特殊处理

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

有些人很容易把rowid和rownum混淆,这两个是完全不一样的概念,rowid是记录一行数据的唯一标示,并

?

?

?

?

?

?

?

?

?

?

?

?

?

?

是不便的,而rownum只是你从数据库中取出数据的顺序,每次查询都可以不样。它是临时参生的。

?

?

?

热点排行