rac oracle single nodes
用lvm做oracleasmdisk时候必须把以下注释掉,因为没划分一个lvm就会生成一个dm卷,而oracle 就是通过dm这种找到lvm的。有点晕。
[root@julia01 rules.d]# more 90-dm.rules
#KERNEL=="dm-[0-9]*", ACTION=="add", OPTIONS+="ignore_device"
at esx end
[root@esx4-lnx03 volumes]# cd ESX4-lnx03-LocalDisk1
[root@esx4-lnx03 ESX4-lnx03-LocalDisk1]# ls
01_FusionR1C_Server JuliaZ1 LNX-rhel48_2 rhel-rescue_x864_v1.0.iso
02_ProxyOS_Server JuliaZ11 LNX-SLES10_1 rhel-server-4.8-DVD.iso
ClusterDisk JuliaZ2 rhel5-t1 SUSE_Linux_Enterprise_Server_10
COE_W2008 JuliaZ3 rhel5x_1 VirtualCenter
esxconsole-4caddac7-d06b-c664-07c8-e41f137ab634 LNX-rhel48_1 rhel-rescue_i686_v1.0.iso XP-Kaibin
[root@esx4-lnx03 ESX4-lnx03-LocalDisk1]# cd ClusterDisk
[root@esx4-lnx03 ClusterDisk]# ls
ShareDisk1-flat.vmdk ShareDisk1.vmdk
[root@esx4-lnx03 ClusterDisk]# ls -rtl
total 31457344
-rw------- 1 root root 32212254720 Jun 16 01:16 ShareDisk1-flat.vmdk
-rw------- 1 root root 471 Jun 16 01:22 ShareDisk1.vmdk
[root@esx4-lnx03 ClusterDisk]#
[root@esx4-lnx03 ClusterDisk]# vmkfstools -c 4720m -a lsilogic -d eagerzeroedthick ShareDisk4.vmdk
Creating disk 'ShareDisk2.vmdk' and zeroing it out...
Create: 100% done.
[root@esx4-lnx03 ClusterDisk]# ls -rtl
total 52674688
-rw------- 1 root root 32212254720 Jun 16 01:16 ShareDisk1-flat.vmdk
-rw------- 1 root root 471 Jun 16 01:22 ShareDisk1.vmdk
-rw------- 1 root root 21726494720 Nov 16 03:46 ShareDisk2-flat.vmdk
-rw------- 1 root root 471 Nov 16 03:49 ShareDisk2.vmdk
[root@esx4-lnx03 ClusterDisk]# ls -rtl
total 52674688
-rw------- 1 root root 32212254720 Jun 16 01:16 ShareDisk1-flat.vmdk
-rw------- 1 root root 471 Jun 16 01:22 ShareDisk1.vmdk
-rw------- 1 root root 21726494720 Nov 16 03:46 ShareDisk2-flat.vmdk
-rw------- 1 root root 471 Nov 16 03:49 ShareDisk2.vmdk
[root@esx4-lnx03 ClusterDisk]# pwd
/vmfs/volumes/ESX4-lnx03-LocalDisk1/ClusterDisk
at server end
1157 cd /sys/class/scsi_host/
1158 ls
1159 cd host0/
1160 ls -rtl
1161 echo "- - -" > scan
fdisk /dev/sdh
let the partition become a asm disk .
[root@julia01 host0]# oracleasm createdisk DISK3 /dev/sdh1
Writing disk header: done
Instantiating disk: done
[root@julia01 host0]# oracleasm listdisks
DISK3
[root@julia01 host0]#
1001 cd /oracle/app/grid/product/11.2.0/grid/crs/install
1002 perl rootcrs.pl -deconfig -force
lvdisplay 通过查看 Block device 253:1
就可以知道/dev/oracleasm/disks/下的盘对应的是那一个LVM了。
删除数据库:
需要删除一下内容:
rm /etc/ora*
rm /u01/app/grid/*
rm /u01/app/grid/dbhome
rm /usr/local/bin/oraenv
rm /usr/local/bin/coraenv
rm /u01/app/oraInventory
#################################
# Load of the ACFS kernel module
#################################
/sbin/modprobe hangcheck-timer
/u01/app/oracle/11.2.0/grid/bin/acfsload start -s
# BANCS project - requested by Erlie Flynn 12 Nov 2012
su - grid -c "/opt/oracle/app/grid/11.2.0.2/grid/bin/asmcmd volenable -G acfs_bancs acfs_bancs" &
sleep 60 &&/bin/mount -t acfs /dev/asm/acfs_bancs-404 /acfs_bancs &
===========================
sudo rpm -Uvh oracleasm-support-1.0.0-1.i386.rpm \
oracleasm-2.4.9-e-enterprise-1.0.0-1.i686.rpm \
oracleasmlib-1.0.0-1.i386.rpm
# /etc/init.d/oracleasm configure
fdisk -l
/etc/init.d/oracleasm createdisk DISK1 /dev/sdb1
将某用户添加到指定组中:
#usermod -g dba wdx
sqlplus userid/pass@//ip:port/sid
===================闪回数据库====================
c.设置闪回保留目标生存期
SQL> show parameter db_flashback --缺省为分钟,即小时
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
SQL> alter system set db_flashback_retention_target=30; --设定保留时间为半小时
--下面查看闪回区分配的大小为大约M,闪回分钟以内的数据则需要M左右的空间
--注意列oldest_flashback_time说明了允许返回的最早的时间点
SQL> select oldest_flashback_scn old_flhbck_scn,oldest_flashback_time old_flhbck_tim,
2 retention_target rete_trgt,flashback_size/1024/1024 flhbck_siz,
3 estimated_flashback_size/1024/1024 est_flhbck_size
4 from v$flashback_database_log;
OLD_FLHBCK_SCN OLD_FLHBC RETE_TRGT FLHBCK_SIZ EST_FLHBCK_SIZE
-------------- --------- ---------- ---------- ---------------
915137 24-OCT-10 30 7.8125 11.2519531
四、使用flashback database闪回数据库
步骤(前提归档日志可用)
关闭数据库
启动数据库到mount状态(exclusive模式)
闪回至某个时间点,SCN或log sequence number
使用resetlogs打开数据库
1.使用sqlplus实现闪回
可以接受一个时间标记或一个系统改变号实参
sqlplus几种常用的闪回数据库方法
FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] SCN <system_change_number> --基于SCN闪回
FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] TIMESTMP <system_timestamp_value>--基于时间戳闪回
FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] RESTORE POINT <restore_point_name>--基于时点闪回
如下面的示例:
SQL> flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss');
SQL> flashback database to scn 918987;
SQL> flashback database ro restore point b1_load;
如下面的示例:
SQL> flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss');
SQL> flashback database to scn 918987;
SQL> flashback database ro restore point b1_load;
==============获取系统最新的scn===================
SQL> SELECT current_SCN SCN,DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER SCN2 FROM v$database;
=============scn更新详解========================
在一个事务提交后commit(上述第四个步骤),会在redo log中存在一条redo记录,同时,系统为其提供一个最新的SCN
(通过函数dbms_flashback.get_system_change_number可以知道当前的最新SCN),记录在该条记录中。
如果该条记录是在redo log被清空(日志满做切换时或发生checkpoint时,所有变化日志已经被写入数据文件中),则其SCN被记录为redo log的low SCN。
以后在日志再次被清空前写入的redo记录中SCN则成为Next SCN。
当日志切换或发生checkpoint(上述第五个步骤)时,从Low SCN到Next SCN之间的所有redo记录的数据就被DBWn进程写入数据文件中,
而CKPT进程则将所有数据文件(无论redo log中的数据是否影响到该数据文件)的文件头上记录的Start SCN(通过视图v$datafile_header的字段checkpoint_change#可以查询)更新为Next SCN,
同时将控制文件中的System Checkpoint SCN(通过视图v$database的字段checkpoint_change#可以查询)、
每个数据文件对应的Datafile Checkpoint(通过视图v$datafile的字段checkpoint_change#可以查询)也更新为Next SCN。
但是,如果该数据文件所在的表空间被设置为read-only时,数据文件的Start SCN和控制文件中Datafile Checkpoint SCN都不会被更新。
system checkpoint scn ------------->v$database的字段checkpoint_change#
Datafile Checkpoint ----------------->v$datafile的字段checkpoint_change#
Start SCN ---------------->v$datafile_header 的字段checkpoint_change#
================================checkpoint==============================
====overview:
1.是一个数据结构代表checkpoint position,也就是一个scn在redo条目里,代表instance recovery的开始位置。
The checkpoint position is determined by the oldest dirty buffer in the database buffer cache. The checkpoint position acts as a pointer to the redo stream and is stored in the control file and in each data file header..
checkpoint是database buffer cache里最旧的dirty buffer存放的位置。存储在control file 和每个数据文件头。
2.把databuffer里的脏数据写到磁盘上的操作。
====checkpoint的目的:
1.减少实例或介质恢复的时间。
2.保证data buffer里的脏数据 定期写到disk
3.保证所有已经提交的数据写到磁盘,during a consistent shutdown。
====checkpoint发生时间======
1.数据库一致性shutdown。
2.alter system checkpoint
3.online redo log switch
4.alter database begin backup
====增量checkpoint:
为了避免大量写操作 在日志切换的时候。DBWR写脏数据的时候,他会更新checkpoint position,cause CKPT进程更新控制文件里checkpoint 位置。
======checkpoint process (CKPT)
checkpoint process更新控制文件和数据文件头with checkpoint information .
checkpoint information include the checkpoint position,scn ,location in online relog log to begin recovery.and so on .
==========System change number (scns)
是一个被oracle database 使用的内部时间戳。
2、SCN概述
SCN是当Oracle数据库更新后,由DBMS去自动维护累积递增的一个数字。通常看文章的时候能看到各种类型的SCN,但是严格来说SCN是没有分类的,之所以会有不同类型的SCN并不是说这些SCN的概念不一样,而是说不同分类的SCN代表的意义不一样,不管什么时候SCN所指代的都是数据库的某个一致性的状态。就像我们给一天中的某个时间点定义上班时间、另外的某个时间点定义成下班时间一样,数据库Checkpoint发生点的SCN被称为Checkpoint SCN,仅此而已。Oracle数据库中一共有4种SCN分别为:
•系统检查点SCN (System Checkpoint SCN)
•文件检查点SCN (Datafile Checkpoint SCN)
•结束SCN (Stop SCN)
•数据文件头SCN (Start SCN)
其中前面3中SCN存在于控制文件中,最后一种则存在于数据文件的文件头中,在Oracle中用来标识数据库的每一次改动,及其先后顺序,SCN的最大值是0xffff.ffffffff。在控制文件中,SystemCheckpoint SCN是针对整个数据库全局的,因而只存在一个,而Datafile Checkpoint SCN和Stop SCN是针对每个数据文件的,因而一个数据文件就对应在控制文件中存在一份Datafile Checkpoint SCN和Stop SCN。在数据库正常运行期间,Stop SCN(通过视图v$datafile的字段last_change#可以查询)是一个无穷大的数字或者NULL。
1、系统检查点SCN
系统检查点SCN位于控制文件中,当检查点进程启动时(ckpt),Oracle就把系统检查点的SCN存储到控制文件中。该SCN是全局范围的,当发生文件级别的SCN时,例如将表空间置于只读状态,则不会更新系统检查点SCN。查询系统检查点SCN的命令如下:
sys@ORCL>select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
21655892
2、文件SCN
当ckpt进程启动时,包括全局范围的(比如日志切换)以及文件级别的检查点(将表空间置为只读、begin backup或将某个数据文件设置为offline等),这时会在控制文件中记录的SCN。查询数据文件SCN的命令如下:
sys@ORCL> altertablespace users read only;
Tablespace altered.
sys@ORCL>select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 21655892
2 21655892
3 21655892
4 21657577
5 21657577
6 21655892
6 rows selected.
sys@ORCL>select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
21655892
可以看到4、5号文件也就是users表空间所属的文件SCN值和其他文件不一致,且比系统检查点的SCN要大(因为这两个数据文件最后被操作,其他数据文件没有变动)。
3、结束SCN
每个数据文件都有一个结束SCN,在数据库的正常运行中,只要数据文件在线且是可读写的,结束SCN为NULL。否则则存在具体的SCN值。结束SCN也记录在控制文件中。
sys@ORCL>select TABLESPACE_NAME,STATUS from dba_tablespaces;
TABLESPACE_NAME STATUS
----------------------------------------------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS READ ONLY
sys@ORCL>select file#,LAST_CHANGE# from v$datafile;
FILE# LAST_CHANGE#
---------- ------------
1
2
3
4 21657577
5 21657577
6
6 rows selected.
可以看到除了users表空间的结束SCN不为空,其他数据文件的结束SCN为空。将数据库至于mount状态,由于该状态下所有的数据文件都不可写,故mount状态下所有的数据文件都具有结束SCN。
sys@ORCL>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ORCL>startup mount
ORACLE instance started.
Total System Global Area 263049216 bytes
Fixed Size 2212448 bytes
Variable Size 230690208 bytes
Database Buffers 25165824 bytes
Redo Buffers 4980736 bytes
Database mounted.
sys@ORCL>select file#,last_change# from v$datafile;
FILE# LAST_CHANGE#
---------- ------------
1 21657939
2 21657939
3 21657939
4 21657577
5 21657577
6 21657939
6 rows selected.
4、数据文件头SCN
不同于上述的SCN数据文件开始SCN记录在每个数据文件中。当发生系统及文件级别的检查点后,不仅将这时的SCN号记录在控制文件中,同样也记录在数据文件中。查询数据文件头SCN的命令如下:
sys@ORCL>select file#,CHECKPOINT_CHANGE# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 21657939
2 21657939
3 21657939
4 21657577
5 21657577
6 21657939
6 rows selected.
用lvm做oracleasmdisk时候必须把以下注释掉,因为没划分一个lvm就会生成一个dm卷,而oracle 就是通过dm这种找到lvm的。有点晕。
[root@julia01 rules.d]# more 90-dm.rules
#KERNEL=="dm-[0-9]*", ACTION=="add", OPTIONS+="ignore_device"
at esx end
[root@esx4-lnx03 volumes]# cd ESX4-lnx03-LocalDisk1
[root@esx4-lnx03 ESX4-lnx03-LocalDisk1]# ls
01_FusionR1C_Server JuliaZ1 LNX-rhel48_2 rhel-rescue_x864_v1.0.iso
02_ProxyOS_Server JuliaZ11 LNX-SLES10_1 rhel-server-4.8-DVD.iso
ClusterDisk JuliaZ2 rhel5-t1 SUSE_Linux_Enterprise_Server_10
COE_W2008 JuliaZ3 rhel5x_1 VirtualCenter
esxconsole-4caddac7-d06b-c664-07c8-e41f137ab634 LNX-rhel48_1 rhel-rescue_i686_v1.0.iso XP-Kaibin
[root@esx4-lnx03 ESX4-lnx03-LocalDisk1]# cd ClusterDisk
[root@esx4-lnx03 ClusterDisk]# ls
ShareDisk1-flat.vmdk ShareDisk1.vmdk
[root@esx4-lnx03 ClusterDisk]# ls -rtl
total 31457344
-rw------- 1 root root 32212254720 Jun 16 01:16 ShareDisk1-flat.vmdk
-rw------- 1 root root 471 Jun 16 01:22 ShareDisk1.vmdk
[root@esx4-lnx03 ClusterDisk]#
[root@esx4-lnx03 ClusterDisk]# vmkfstools -c 4720m -a lsilogic -d eagerzeroedthick ShareDisk4.vmdk
Creating disk 'ShareDisk2.vmdk' and zeroing it out...
Create: 100% done.
[root@esx4-lnx03 ClusterDisk]# ls -rtl
total 52674688
-rw------- 1 root root 32212254720 Jun 16 01:16 ShareDisk1-flat.vmdk
-rw------- 1 root root 471 Jun 16 01:22 ShareDisk1.vmdk
-rw------- 1 root root 21726494720 Nov 16 03:46 ShareDisk2-flat.vmdk
-rw------- 1 root root 471 Nov 16 03:49 ShareDisk2.vmdk
[root@esx4-lnx03 ClusterDisk]# ls -rtl
total 52674688
-rw------- 1 root root 32212254720 Jun 16 01:16 ShareDisk1-flat.vmdk
-rw------- 1 root root 471 Jun 16 01:22 ShareDisk1.vmdk
-rw------- 1 root root 21726494720 Nov 16 03:46 ShareDisk2-flat.vmdk
-rw------- 1 root root 471 Nov 16 03:49 ShareDisk2.vmdk
[root@esx4-lnx03 ClusterDisk]# pwd
/vmfs/volumes/ESX4-lnx03-LocalDisk1/ClusterDisk
at server end
1157 cd /sys/class/scsi_host/
1158 ls
1159 cd host0/
1160 ls -rtl
1161 echo "- - -" > scan
fdisk /dev/sdh
let the partition become a asm disk .
[root@julia01 host0]# oracleasm createdisk DISK3 /dev/sdh1
Writing disk header: done
Instantiating disk: done
[root@julia01 host0]# oracleasm listdisks
DISK3
[root@julia01 host0]#
1001 cd /oracle/app/grid/product/11.2.0/grid/crs/install
1002 perl rootcrs.pl -deconfig -force
lvdisplay 通过查看 Block device 253:1
就可以知道/dev/oracleasm/disks/下的盘对应的是那一个LVM了。
删除数据库:
需要删除一下内容:
rm /etc/ora*
rm /u01/app/grid/*
rm /u01/app/grid/dbhome
rm /usr/local/bin/oraenv
rm /usr/local/bin/coraenv
rm /u01/app/oraInventory
#################################
# Load of the ACFS kernel module
#################################
/sbin/modprobe hangcheck-timer
/u01/app/oracle/11.2.0/grid/bin/acfsload start -s
# BANCS project - requested by Erlie Flynn 12 Nov 2012
su - grid -c "/opt/oracle/app/grid/11.2.0.2/grid/bin/asmcmd volenable -G acfs_bancs acfs_bancs" &
sleep 60 &&/bin/mount -t acfs /dev/asm/acfs_bancs-404 /acfs_bancs &
===========================
sudo rpm -Uvh oracleasm-support-1.0.0-1.i386.rpm \
oracleasm-2.4.9-e-enterprise-1.0.0-1.i686.rpm \
oracleasmlib-1.0.0-1.i386.rpm
# /etc/init.d/oracleasm configure
fdisk -l
/etc/init.d/oracleasm createdisk DISK1 /dev/sdb1
将某用户添加到指定组中:
#usermod -g dba wdx
sqlplus userid/pass@//ip:port/sid
===================闪回数据库====================
c.设置闪回保留目标生存期
SQL> show parameter db_flashback --缺省为分钟,即小时
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
SQL> alter system set db_flashback_retention_target=30; --设定保留时间为半小时
--下面查看闪回区分配的大小为大约M,闪回分钟以内的数据则需要M左右的空间
--注意列oldest_flashback_time说明了允许返回的最早的时间点
SQL> select oldest_flashback_scn old_flhbck_scn,oldest_flashback_time old_flhbck_tim,
2 retention_target rete_trgt,flashback_size/1024/1024 flhbck_siz,
3 estimated_flashback_size/1024/1024 est_flhbck_size
4 from v$flashback_database_log;
OLD_FLHBCK_SCN OLD_FLHBC RETE_TRGT FLHBCK_SIZ EST_FLHBCK_SIZE
-------------- --------- ---------- ---------- ---------------
915137 24-OCT-10 30 7.8125 11.2519531
四、使用flashback database闪回数据库
步骤(前提归档日志可用)
关闭数据库
启动数据库到mount状态(exclusive模式)
闪回至某个时间点,SCN或log sequence number
使用resetlogs打开数据库
1.使用sqlplus实现闪回
可以接受一个时间标记或一个系统改变号实参
sqlplus几种常用的闪回数据库方法
FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] SCN <system_change_number> --基于SCN闪回
FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] TIMESTMP <system_timestamp_value>--基于时间戳闪回
FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] RESTORE POINT <restore_point_name>--基于时点闪回
如下面的示例:
SQL> flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss');
SQL> flashback database to scn 918987;
SQL> flashback database ro restore point b1_load;
如下面的示例:
SQL> flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss');
SQL> flashback database to scn 918987;
SQL> flashback database ro restore point b1_load;
==============获取系统最新的scn===================
SQL> SELECT current_SCN SCN,DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER SCN2 FROM v$database;
=============scn更新详解========================
在一个事务提交后commit(上述第四个步骤),会在redo log中存在一条redo记录,同时,系统为其提供一个最新的SCN
(通过函数dbms_flashback.get_system_change_number可以知道当前的最新SCN),记录在该条记录中。
如果该条记录是在redo log被清空(日志满做切换时或发生checkpoint时,所有变化日志已经被写入数据文件中),则其SCN被记录为redo log的low SCN。
以后在日志再次被清空前写入的redo记录中SCN则成为Next SCN。
当日志切换或发生checkpoint(上述第五个步骤)时,从Low SCN到Next SCN之间的所有redo记录的数据就被DBWn进程写入数据文件中,
而CKPT进程则将所有数据文件(无论redo log中的数据是否影响到该数据文件)的文件头上记录的Start SCN(通过视图v$datafile_header的字段checkpoint_change#可以查询)更新为Next SCN,
同时将控制文件中的System Checkpoint SCN(通过视图v$database的字段checkpoint_change#可以查询)、
每个数据文件对应的Datafile Checkpoint(通过视图v$datafile的字段checkpoint_change#可以查询)也更新为Next SCN。
但是,如果该数据文件所在的表空间被设置为read-only时,数据文件的Start SCN和控制文件中Datafile Checkpoint SCN都不会被更新。
system checkpoint scn ------------->v$database的字段checkpoint_change#
Datafile Checkpoint ----------------->v$datafile的字段checkpoint_change#
Start SCN ---------------->v$datafile_header 的字段checkpoint_change#
================================checkpoint==============================
====overview:
1.是一个数据结构代表checkpoint position,也就是一个scn在redo条目里,代表instance recovery的开始位置。
The checkpoint position is determined by the oldest dirty buffer in the database buffer cache. The checkpoint position acts as a pointer to the redo stream and is stored in the control file and in each data file header..
checkpoint是database buffer cache里最旧的dirty buffer存放的位置。存储在control file 和每个数据文件头。
2.把databuffer里的脏数据写到磁盘上的操作。
====checkpoint的目的:
1.减少实例或介质恢复的时间。
2.保证data buffer里的脏数据 定期写到disk
3.保证所有已经提交的数据写到磁盘,during a consistent shutdown。
====checkpoint发生时间======
1.数据库一致性shutdown。
2.alter system checkpoint
3.online redo log switch
4.alter database begin backup
====增量checkpoint:
为了避免大量写操作 在日志切换的时候。DBWR写脏数据的时候,他会更新checkpoint position,cause CKPT进程更新控制文件里checkpoint 位置。
======checkpoint process (CKPT)
checkpoint process更新控制文件和数据文件头with checkpoint information .
checkpoint information include the checkpoint position,scn ,location in online relog log to begin recovery.and so on .
==========System change number (scns)
是一个被oracle database 使用的内部时间戳。
2、SCN概述
SCN是当Oracle数据库更新后,由DBMS去自动维护累积递增的一个数字。通常看文章的时候能看到各种类型的SCN,但是严格来说SCN是没有分类的,之所以会有不同类型的SCN并不是说这些SCN的概念不一样,而是说不同分类的SCN代表的意义不一样,不管什么时候SCN所指代的都是数据库的某个一致性的状态。就像我们给一天中的某个时间点定义上班时间、另外的某个时间点定义成下班时间一样,数据库Checkpoint发生点的SCN被称为Checkpoint SCN,仅此而已。Oracle数据库中一共有4种SCN分别为:
•系统检查点SCN (System Checkpoint SCN)
•文件检查点SCN (Datafile Checkpoint SCN)
•结束SCN (Stop SCN)
•数据文件头SCN (Start SCN)
其中前面3中SCN存在于控制文件中,最后一种则存在于数据文件的文件头中,在Oracle中用来标识数据库的每一次改动,及其先后顺序,SCN的最大值是0xffff.ffffffff。在控制文件中,SystemCheckpoint SCN是针对整个数据库全局的,因而只存在一个,而Datafile Checkpoint SCN和Stop SCN是针对每个数据文件的,因而一个数据文件就对应在控制文件中存在一份Datafile Checkpoint SCN和Stop SCN。在数据库正常运行期间,Stop SCN(通过视图v$datafile的字段last_change#可以查询)是一个无穷大的数字或者NULL。
1、系统检查点SCN
系统检查点SCN位于控制文件中,当检查点进程启动时(ckpt),Oracle就把系统检查点的SCN存储到控制文件中。该SCN是全局范围的,当发生文件级别的SCN时,例如将表空间置于只读状态,则不会更新系统检查点SCN。查询系统检查点SCN的命令如下:
sys@ORCL>select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
21655892
2、文件SCN
当ckpt进程启动时,包括全局范围的(比如日志切换)以及文件级别的检查点(将表空间置为只读、begin backup或将某个数据文件设置为offline等),这时会在控制文件中记录的SCN。查询数据文件SCN的命令如下:
sys@ORCL> altertablespace users read only;
Tablespace altered.
sys@ORCL>select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 21655892
2 21655892
3 21655892
4 21657577
5 21657577
6 21655892
6 rows selected.
sys@ORCL>select checkpoint_change# from v$database;
CHECKPOINT_CHANGE#
------------------
21655892
可以看到4、5号文件也就是users表空间所属的文件SCN值和其他文件不一致,且比系统检查点的SCN要大(因为这两个数据文件最后被操作,其他数据文件没有变动)。
3、结束SCN
每个数据文件都有一个结束SCN,在数据库的正常运行中,只要数据文件在线且是可读写的,结束SCN为NULL。否则则存在具体的SCN值。结束SCN也记录在控制文件中。
sys@ORCL>select TABLESPACE_NAME,STATUS from dba_tablespaces;
TABLESPACE_NAME STATUS
----------------------------------------------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS READ ONLY
sys@ORCL>select file#,LAST_CHANGE# from v$datafile;
FILE# LAST_CHANGE#
---------- ------------
1
2
3
4 21657577
5 21657577
6
6 rows selected.
可以看到除了users表空间的结束SCN不为空,其他数据文件的结束SCN为空。将数据库至于mount状态,由于该状态下所有的数据文件都不可写,故mount状态下所有的数据文件都具有结束SCN。
sys@ORCL>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ORCL>startup mount
ORACLE instance started.
Total System Global Area 263049216 bytes
Fixed Size 2212448 bytes
Variable Size 230690208 bytes
Database Buffers 25165824 bytes
Redo Buffers 4980736 bytes
Database mounted.
sys@ORCL>select file#,last_change# from v$datafile;
FILE# LAST_CHANGE#
---------- ------------
1 21657939
2 21657939
3 21657939
4 21657577
5 21657577
6 21657939
6 rows selected.
4、数据文件头SCN
不同于上述的SCN数据文件开始SCN记录在每个数据文件中。当发生系统及文件级别的检查点后,不仅将这时的SCN号记录在控制文件中,同样也记录在数据文件中。查询数据文件头SCN的命令如下:
sys@ORCL>select file#,CHECKPOINT_CHANGE# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 21657939
2 21657939
3 21657939
4 21657577
5 21657577
6 21657939
6 rows selected.