首先讲解一下oracle 中最重要的两个概念 scn 和 rowid
scn
Scn号: 是当Oracle 数据库更新后,由 DBMS 自动维护去累积递增的一个数字。在 Oracle 中,有四种 比较重要的 SCN,分别为:系统检查点 SCN 、数据文件检查点 SCN 、启动 SCN 、终止 SCN 。
oracle系统做任何事情都要有一个号码对应,相当于数据库的内部时间,小号在前大号在后。对于用户来说他是透明的, scn 的管理完全由 oracle 自己管理。
1、系统检查点 scn
当一个检查点动作完成后,Oracle 就把系统检查点的 SCN 存储到 controlfile(控制文件 ) 中。 检查点可以暂时理解为数据库按照一定规律定时(不太准确)把内存的数据块存盘。
参看最近的 checkpoint的 scn
select checkpoint_change# from v$database;
2、数据文件检查点 scn
当一个检查点动作完成后,Oracle 就把每个数据文件的 scn 单独存放在 controlfile(控制文件 ) 中。 主要用于实例恢复,它会参照控制文件的 scn号进行相应的处理(主要的恢复和回退)查看数据文件的 checkpoint 的 scn
select name,checkpoint_change# from v$datafile;
3、启动 scn
Oracle 把这个检查点的 scn 存储在每个数据文件的 文件的头 中,这个值称为启动scn ,因为它用于在数据库实例启动时,检查是否需要执行 数据库恢复 。 主要和控制文件中的每个数据文件的 scn对比,看是否需要恢复。
4、终止 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只是你从数据库中取出数据的顺序,每次查询都可以不样。它是临时参生的。