这是会触发一个完全检查点
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
849115
849115
849115
849115
849115
849115
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
849115
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
849115
849115
849115
849115
849115
849115
已选择6行。
SQL> alter system checkpoint;
系统已更改。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
849184
849184
849184
849184
849184
849184
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
849184
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
849184
849184
849184
849184
849184
849184
已选择6行。 完全检查点 写如了 控制文件的datafile scn,system scn,数据文件头的start scn
实验2 alter system switch logfile 来实验看下
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
849184
849184
849184
849184
849184
849184
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
849184
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------ 环境
849184
849184
849184
849184
849184
849184
已选择6行。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
849184
849184
849184
849184
849184
849184
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
849184
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
849184
849184
849184
849184
849184
849184 也是一个完全ckpt
已选择6行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
854178
854178
854178
854178
854178
854178
已选择6行。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
854178
854178
854178
854178
854178
854178
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
854178
SQL> alter database datafile 5 offline;
数据库已更改。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
854178
854178
854178
854178
854178 854559
854178
已选择6行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
854178
854178
854178
854178
854178
854178
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
854178
SQL> shutdown immediatel
SP2-0717: 非法的 SHUTDOWN 选项
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
数据库装载完毕。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
857631
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
857631
857631
857631
857631
854178
857631
已选择6行。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
857631 857631
857631 857631
857631 857631
857631 857631
854178 854559
857631 857631
已选择6行。
SQL>
补充: 正常关闭也是一个 完全CKPT,完全CKPT的特点就是startscn=systescn=datafilescn 在mount下可以看到startscn=systescn=datafilescn =stopscn
不完全 SCN ,文件级检查点
SQL> alter tablespace testtb offline;
表空间已更改。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
882119
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
882119
882119
882119
882119
882119
883616 883616 当 一个表空间offline时发生CKPT 注意 写入了STOP SCN ,datafile SCN (在控制文件中)
已选择6行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
882119
882119
882119
882119
882119
0 数据文件头部SCN 归为0 即start scn 标为0
已选择6行。
SQL> shutdown immediate; 这是一个完全CKPT,
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
884221
884221
884221
884221
884221
0
已选择6行。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
884221 884221
884221 884221
884221 884221
884221 884221
884221 884221
883616 883616
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
884221
SQL> 注意 这个正常关闭产生的完全CKPT 没有影响到 TESTTB表空间的数据文件,没有写入DATAFILE SCN,STOP SCN,SYSTEM SCN,
STARTSCN还是0
SQL> alter database open; 这个语句产生了一个CKPT 全的 但是只递增了1
数据库已更改。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
884222
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
884222
884222
884222
884222
884222
883616 883616
已选择6行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
884222
884222
884222
884222
884222
0
已选择6行。
SQL> alter tablespace testtb online;
表空间已更改。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
884222
884222
884222
884222
884222
884877
已选择6行。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
884222
884222
884222
884222
884222
884877
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
884222
SQL> shutdown immediate; 关闭 正常产生了一个全CKPT
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
数据库装载完毕。
数据库已经打开。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
886021
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
886021
886021
886021
886021
886021
886021
已选择6行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
886021
886021
886021
886021
886021
886021
总结,当发生表空间offline时候,触发一个文件级CKPT,写入数据文件中datafilescn,stopscn,并且其数据文件头部SCN 写为0
之后的一系列CKPT 都与该表空间无关 不写入。之后online产生一个对该表空间产生一个CKPT,写入 datafilescn, startscn 并且 stop scn 为NULL
此时该表空间的datafilescn,startscn >system scn ,而后运行中产生的 全局CKPT 自动会同步system scn=startscn=stopscn
read only产生的 文件级CKPT
1初始环境
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
887555
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
887555
887555
887555
887555
887555
887555
已选择6行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
887555
887555
887555
887555
887555
887555
已选择6行。
SQL> alter tablespace testtb read only; 产生一个CKPT
表空间已更改。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
887555
887555
887555
887555
887555
887925
已选择6行。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
887555
887555
887555
887555
887555
887925 887925
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
887555
SQL> alter system checkpoint;
系统已更改。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
887948
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
887948
887948
887948
887948
887948
887925 887925
已选择6行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
887948
887948
887948
887948
887948
887925
SQL> alter tablespace testtb read write;
表空间已更改。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
887948
887948
887948
887948
887948
888032
已选择6行。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
887948
887948
887948
887948
887948
888032
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
887948
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup;
ORACLE 例程已经启动。
Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
数据库装载完毕。
数据库已经打开。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
888283
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
888283
888283
888283
888283
888283
888283
已选择6行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
888283
888283
888283
888283
888283
888283
已选择6行。
结论:
read only与 offline(TS)很象,区别在于 read only时候用户还可以读取 该文件中信息 所以read only产生的CKPT 不仅写入了STOP SCN,DATAFILESCN ,更写入了
数据文件头的STARTSCN,offline(TS)已经不可读到信息,所以oracle将offline表空间的数据文件头部SCN写为0 标明,read write后也产生一个CKPT 使得该表空间数据文件
STARSCN=DATAFILESCN>SYSTEMSCN stop scn变会NULL,之后oracle 正常运行中产生全局CKPT 会自动同步STARSCN=DATAFILESCN=SYSTEMSCN
begin backup 这个是比较重要的也是比较容易出问题的
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
888283
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
888283
888283
888283
888283 实验环境
888283
888283
已选择6行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
888283
888283
888283
888283
888283
888283
已选择6行。
SQL> alter tablespace testtb begin backup;
表空间已更改。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
888283
888283
888283
888283
888283
888976 产生了 文件级CKPT
已选择6行。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
888283
888283
888283
888283
888283
888976 给这个文件加锁了
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
888283
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
889668
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
889668
889668
889668
889668
889668
888976
已选择6行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
889668
889668
889668
889668
889668
888976
SQL> shutdown abort; 强行关闭了 没有执行end backup
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
数据库装载完毕。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
889668
889668
889668
889668
889668
888976
已选择6行。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
889668
889668
889668
889668
889668
888976
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
889668
SQL>
此时该文件startscn=datafile scn 不等于SYSTEM SCN
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01113: 文件 6 需要介质恢复
ORA-01110: 数据文件 6: 'D:\自建表空间数据文件\TESTTB.DBF' 必须执行recover 介质恢复
SQL> recover datafile 6;
完成介质恢复。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
889668
889668
889668
889668
889668
889811
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
889668
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
889668
889668
889668
889668
889668
889811 889811
已选择6行。 奇怪了 这是为什么造成的呢 readonly数据文件 也可以出现这种情况呀 在来看看为什么一定要
介质恢复
SQL> alter database open;
数据库已更改。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
909813
909813
909813
909813
909813
909813
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
909813
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
909813
909813
909813
909813
909813
909813
已选择6行。
SQL> alter tablespace testtb read only;
表空间已更改。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
909813
909813
909813
909813
909813
911343 911343
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
909813
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
909813
909813
909813
909813
909813
911343
已选择6行。
SQL> start force mount;
SP2-0310: 无法打开文件 "force.sql"
SQL> startup force mount;
ORACLE 例程已经启动。
Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
数据库装载完毕。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
909813
909813
909813
909813
909813
911343
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
909813
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
909813
909813 stop scn没有是因为 不是正常关闭 oracle没有写进controlfile中STOP SCN
909813
909813
909813
911343 911343
已选择6行。
通过以上结论可以看出 未 end backup 不是 是因为 stopscn为NULL在MOUNT下 ,mount下stopscn为NULL 只需要例程恢复 由SMON自动完成
那是因为啥呢 结论很简单,当 offline(ts),read only时 都会产生CKPT 并写入STOP SCN , 等于做了一个标注,stopscn=startscn=datafilescn时候不需要恢复
未endbackup则 datafilescn=startscn 不等于systemscn 并且没有写进控制文件stopscn 所以必须recover recover 出startscn=datafilescn=stopscn
原因是begingbackup时候 对数据文件加了SCN 使齐不变 备份时候的SCN ,但数据仍然可以 写进 数据文件,所产生的CKPT由SYSTEMSCN 来记录endbackup后 startscn,datafilescn会自动同步到system scn
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
931768
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
931768
931768
931768
931768
931768
931768
已选择6行。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
931768
931768
931768
931768
931768
931768
已选择6行。
SQL> alter tablespace testtb begin backup;
表空间已更改。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
931768
931768
931768
931768
931768
931780
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
931768
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
931768
931768
931768
931768
931768
931780
已选择6行。
SQL> alter tablespace testtb end backup;
表空间已更改。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
931768
931768
931768
931768
931768
931780
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
931768
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
931768
931768
931768
931768
931768
931780
已选择6行。
SQL>
~
08.08.19~~~~~~~~~~~~~~~实验
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1766408
1766408
1766408
1766408
1766408
1766408
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1766408
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1766408
1766408
1766408
1766408
1766408
1766408
已选择6行。
SQL> alter system switch logfile;
系统已更改。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1766408
1766408
1766408
1766408
1766408
1766408
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1766408
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1766408
1766408
1766408
1766408
1766408
1766408
已选择6行。
SQL> alter tablespace testtb begin backup;
表空间已更改。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1766408
1766408
1766408
1766408
1766408
1766500
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1766408
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1766408
SQL> alter system switch logfile;
系统已更改。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1766477
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1766477
1766477
1766477
1766477
1766477
1766500
已选择6行。
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1766477
1766477
1766477
1766477
1766477
1766500
已选择6行。
SQL>
SQL> select checkpoint_change#,last_change# from v$datafile;
CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1766477
1766477
1766477
1766477
1766477
1766500
已选择6行。
SQL> alter tablespace testtb end backup;
表空间已更改。
SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
1766477
1766477
1766477
1766477
1766477
1766500
已选择6行。
SQL> select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
1766477
SQL>
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12020513/viewspace-607610/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12020513/viewspace-607610/