- oracle alter日志的位置:/u01/app/oracle/admin/orcl/bdump
- @@@
- ALTER SYSTEM SET LOG_checkpointS_TO_ALERT=TRUE;
- 这设置以后系统的checkpoint将会被记录alert_$SID.log文件中。
- @@@@
- 什么是checkpoint(一个数据库事件)
- 在数据库系统中,写日志和写数据文件是数据库中IO 消耗最大的两种操作,在这两种操作
- 中写数据文件属于分散写,写日志文件是顺序写,因此为了保证数据库的性能,通常数据库
- 都是保证在提交(commit)完成之前要先保证日志都被写入到日志文件中,而脏数据块着
- 保存在数据缓存(buffer cache)中再不定期的分批写入到数据文件中。也就是说日志写入
- 和提交操作是同步的,而数据写入和提交操作是不同步的。这样就存在一个问题,当一个数
- 据库崩溃的时候并不能保证缓存里面的脏数据全部写入到数据文件中,这样在实例启动的时
- 候就要使用日志文件进行恢复操作,将数据库恢复到崩溃之前的状态,保证数据的一致性。
- 检查点是这个过程中的重要机制,通过它来确定,恢复时哪些重做日志应该被扫描并应用于
- 恢复。
- 一般所说的checkpoint 是一个数据库事件(event),checkpoint 事件由checkpoint 进程
- (LGWR/CKPT 进程)发出,当checkpoint 事件发生时DBWn 会将脏块写入到磁盘中,同
- 时数据文件和控制文件的文件头也会被更新以记录checkpoint 信息。
- @@@@
- 当检查点发生时(此时的scn被成为checkpointscn)oracle会通知dbwn进程,把修改过的数据,也就是此checkpoint
- scn 之前的脏数据从buffer cache 写入磁盘,当写入完成之后,ckpt进程更新控制文件和数据文件头,记录检查点信息,标识变更。
- 当检查点(数据库事件)完成之后
- 查v$datafile 获得checkpoint scn号,此检查点之前修改过的数据都已经写回磁盘。
- SQL> select checkpoint_change# from v$datafile;
- CHECKPOINT_CHANGE#
- ------------------
- 679453
- 679453
- 679453
- 679453
- 679453
- @@@
- 当发生checkpoint时,会把SCN写到四个地方去。
- 三个地方于control file内,一个在datafile header。
- Control file三个地方为
- 1.System checkpoint SCN ===========> (SYSTEM CHECKPOINT SCN in control file)
- SQL> select checkpoint_change# from v$database;
- CHECKPOINT_CHANGE#
- --------------------
- 292767
- 2.Datafile checkpoint SCN ===============> (DATAFILE CHECKPOINT SCN in control file)
- SQL> select name,checkpoint_change#
- from v$datafile where name like '%users01%';
- NAME CHECKPOINT_CHANGE#
- ----------------------------------- --------------------
- /u02/oradata/OMFD1/users01.dbf 292767
- 3.Stop SCN ======================> (STOP SCN in control file)
- SQL> select name,last_change#
- from v$datafile where name like '%users01%';
- NAME LAST_CHANGE#
- ----------------------------------- ------------
- /u02/oradata/OMFD1/users01.dbf
- 正常datafile在read-write mode下 last_change#一定是NULL
- 另外一个地方在datafile header内
- @@@
- 4.Start SCN ================================> (DATAFILE HEADER)
- SQL> select name,checkpoint_change#
- from v$datafile_header where name like '%users01%';
- NAME CHECKPOINT_CHANGE#
- ----------------------------------- --------------------
- /u02/oradata/OMFD1/users01.dbf 292767
- SQL> show parameter checkpoint
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- log_checkpoint_interval integer 0
- log_checkpoint_timeout integer 1800
- log_checkpoints_to_alert boolean FALSE(此值最好改为true)
- SQL> alter system set log_checkpoints_to_alert=true;
- System altered.
- 通常情况下:alter system 改内存 alter database/tablespaces 改硬盘
- @@@@
- checkpoint和SCN有什么关系?
- 在Oracle 中SCN 相当于它的时钟,在现实生活中我们用时钟来记录和衡量我们的时间,
- 而Oracle 就是用SCN 来记录和衡量整个Oracle 系统的更改。
- Oracle 中checkpoint 是在一个特定的“时间点”发生的,衡量这个“时间点”用的就是SCN,
- 因此当一个checkpoint 发生时SCN 会被写入文件头中以记录这个checkpoint。
- SQL> select resetlogs_change#,checkpoint_change#,current_scn from v$database;
- RESETLOGS_CHANGE# CHECKPOINT_CHANGE# CURRENT_SCN
- ----------------- ------------------ -----------
- 525876 669103 670673
- sys> select resetlogs_change#,checkpoint_change#,current_scn from v$database;
- RESETLOGS_CHANGE# CHECKPOINT_CHANGE# CURRENT_SCN
- ----------------- ------------------ -----------
- 525876 669103 670673
- (时间原点) (当前时间)
- sys> select checkpoint_change# from v$datafile;(数据文件头部scn)
- CHECKPOINT_CHANGE#
- ------------------
- 669103
- 669103
- 669103
- 669103
- 669103
- 表空间级检查点
- 表空间:system(数据库开启时必须在线,) ,undotbs(数据库开启时必须在线,)
- 其余的表空间可下线(sysaux,emample(方案对象的表空间),users)
- 数据库开启时system,undotbs 不可下线
- SQL> alter tablespace system offline;
- alter tablespace system offline
- *
- ERROR at line 1:
- ORA-01541: system tablespace cannot be brought offline; shut down if necessary
- SQL> alter tablespace undotbs1 offline;
- alter tablespace undotbs1 offline
- *
- ERROR at line 1:
- ORA-30042: Cannot offline the undo tablespace
- A、
- SQL> update employees set salary=24001 where employee_id=100;
- 1 row updated.
- B、
- SQL> select checkpoint_change#,name from v$datafile;
- CHECKPOINT_CHANGE#
- ------------------
- NAME
- --------------------------------------------------------------------------------
- 669442
- /u01/app/oracle/oradata/orcl/system01.dbf
- 669442
- /u01/app/oracle/oradata/orcl/undotbs01.dbf
- 669442
- /u01/app/oracle/oradata/orcl/sysaux01.dbf
- CHECKPOINT_CHANGE#
- ------------------
- NAME
- --------------------------------------------------------------------------------
- 669442
- /u01/app/oracle/oradata/orcl/users01.dbf
- 676942
- /u01/app/oracle/oradata/orcl/example01.dbf
- SQL> alter tablespace example offline;
- Tablespace altered.
- B、
- SQL> select checkpoint_change#,name from v$datafile;
- CHECKPOINT_CHANGE#
- ------------------
- NAME
- --------------------------------------------------------------------------------
- 669442
- /u01/app/oracle/oradata/orcl/system01.dbf
- 669442
- /u01/app/oracle/oradata/orcl/undotbs01.dbf
- 669442
- /u01/app/oracle/oradata/orcl/sysaux01.dbf
- CHECKPOINT_CHANGE#
- ------------------
- NAME
- --------------------------------------------------------------------------------
- 669442
- /u01/app/oracle/oradata/orcl/users01.dbf
- 671527--scn增大
- /u01/app/oracle/oradata/orcl/example01.dbf
- @@@
- 增量检查点:当增量检查点发生时,ckpt将检查点队列中的脏快第一次被脏的LRBA地址记录到控制文件中。
- 增量检查点并不会去更新数据文件,以及控制文件中的文件scn以及数据文件头部的scn信息,而只是没三秒由ckpt
- 去更新控制文件中的LRBA信息,也就是检查点位置。
- @@@
- 完全检查点:完全检查点发生时,ckpt会触发dbwn将所有脏块写回磁盘
- 完全检查点实验:
- A、
- SQL> conn hr/hr
- Connected.
- SQL> update employees set salary=24001 where employee_id=100;
- B
- SQL> alter system checkpoint;(实现完全检查点。相当于正常关机(shutdown immediate))
- System altered. 此时出发完全检查点进程将database bffer cache 中的数据全部写入数据文件(内存最干净,日志到最后一条)
- @@@
- SQL> show parameter fast_start
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- fast_start_io_target integer 0
- fast_start_mttr_target integer 0(默认值为0,最大值为3600,单位秒。表示没有打开,系统自动采样出一个时间,用于实例恢复时跑日志的时间)
- fast_start_parallel_rollback string LOW
- SQL> alter system set fast_start_mttr_target=300;
- System altered.
- 触发完全检查点 条件
触发完全检查点,促使DBWR 将检查点时刻前所有的脏数据写入数据文件。
另外,一般正常运行期间的数据库不会产生完全检查点。
1. 通过正常事务处理或者立即选项关闭例程时(shutdown immediate 或者
Shutdown normal).
2. 当通过设置初始化参数:
LOG_CHECKPOINT_INTERVAL,
LOG_CHECKPOINT_TIMEOUT ,
FAST_START_IO_TARGET 强制时;
3. 当数据库管理员手动请求时:
ALter system checkpoint;
alter tablespace ... offline;
4. 每次日志切换时;
alter system switch logfile
注意:
1. alter system switch logfile也将触发完全检查点的发生。
2. alter database datafile ... offline 不会触发检查点进程
如果是单纯的offline datafile,那么将不会触发文件检查点,只有针对offline
tablespace 的时候才会触发文件检查点,这也是为什么online datafile需要media
recovery而online tablespace不需要。
触发增量检查点
1. 在联机热备份数据文件前,要求该数据文件中被修改的块从DB_Buffer 写
入数据文件中。所以,发出这样的命令:
ALTER TABLESPACE tablespace_name BIGEN BACKUP / end backup;
也将触发和该表空间的数据文件有关的局部检查点;
2. 另外,
ALTER TABLESPACE tablespace_name READ ONLY;
ALTER TABLESPACE tablespace_name OFFLINE NORMAL;
等命令都会触发增量检查点。
对于表空间的offline后再online这种情况,最好做个强制的checkpoint比较好。