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只是你从数据库中取出数据的顺序,每次查询都可以不样。它是临时参生的。
?
?
?