接上篇 《跟 Inthirties学Oracle之checkpoint由来 》
上回说到了checkpoint的由来,checkpoint的出生意义不在于数据库本身的运行,其真正的价值体现在数据库的crash/instance recovery上。而且不是解决恢复的问题。恢复是比较容易搞定的,解决的是高效恰达好处的问题。做事不难,做到恰到好处就是个学问了,checkpoint就是这个学问。 题目中提到的scn就是我们这个文章的主角了。题目立的是“checkpoint中的scn”, 这里scn绝不应该硬扯为checkpoint里的东西。那么scn是什么东西了。以至于我不得不冒天下之大不韪而将其扯过来叻。
SCN,名为 system change number。 又一个容易骗到人的名字。至少我最开始是经常被这个change骗到的。不过顺着自己对oracle的知识足够多的了解,也慢慢体会出Oracle在这个名字上所费尽的心思了,对于了解Oracle不是很系统,不能以面来贯彻体系的朋友,暂时不要去理解这个名词,你就先就把SCN当做一个代号,这个代号标识出Oracle运行的某个时刻。其实在10g里已经完全让我们这样来理解这个scn了。通过scn_to_timestamp我们可以把根据指定的scn号找到对应的数据库时间。 timestamp_to_scn我们又可以根据数据的指定的时间找到此时对应的scn号。我们来看看
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
755287
这里是获取当前的scn号。别看他封在了dbms_flashback里,他绝对不是只和这个有关的。 上面说过来,scn就是标识某个运行点的,其实就是运行的时间, 按照这样。
当我们再执行以下上面的方法,结果是不是不一样呀,
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
755541
答案是肯定的,肯定是不一样的。
即使现在没有任何数据写入数据库。我没有做任何修改的操作,你再执行,又会改变。
为了帮助你自己,先把system change number从你的脑海里抹掉,知道SCN是这几个词的缩写就可以了,不要再去揣测他了。你现在功力尚浅,小心走了火入了魔。
不过还好, 至少你可以看到了,和时间是有关的。(这段并不是有意误导大家,从过来人的体验,现在这样理解容易,以后有能力了,自然就对这个system change number有了更深入的理解而豁然开朗了)。
scn和时间之间的转换
SQL> select scn_to_timestamp(755541) from dual;
SCN_TO_TIMESTAMP(755541)
--------------------------------------------------------------------------------
03-6月 -10 02.04.31.000000000 下午
时间到scn的转换
SQL> select timestamp_to_scn(to_timestamp('2010-06-03 14:04:31', 'yyyy-mm-dd hh24:mi:ss:ff')) from dual;
TIMESTAMP_TO_SCN(TO_TIMESTAMP(
------------------------------
755541
那么这个可以干嘛呀。
标识呀,这个最大的功能就是标识了。一旦某些的scn一样,那么我们就知道他们是同一次操作的了。如果不一样,就是不同次的操作了。这样这个scn号就好理解了。
既然是scn的作用是标识,那么他都标识在什么重要的东东上呀。