今天在进行达梦数据库在线日志和归档日志切换学习和练习的时候,发现了一个问题(由于更加熟悉oracle的日志切换机制,所以在思考方向上出现了问题),即在开启归档以后,手动切换日志的时候,在线日志的日志号并没有改变,此时生成了一个归档日志;而在接下来进行日志切换操作以后:
alter SYSTEM ARCHIVE LOG CURRENT;
alter SYSTEM SWITCH LOGFILE;
alter DATABASE ARCHIVELOG CURRENT;
发现此时也不会再产生归档了。这是为什么呢?
根据官方解释,达梦数据库中在线日志只能在满的时候自动切换,而不能手动切换,这也就解释了为什么我们在做了日志切换以后,去查看v$rlog反而看到的还是之前的日志名字;
LINEID CKPT_LSN FILE_LSN FLUSH_LSN CUR_LSN NEXT_SEQ N_MAGIC DB_MAGIC FLUSH_PAGES FLUSHING_PAGES CUR_FILE CUR_OFFSET
---------- -------------------- -------------------- -------------------- -------------------- -------------------- ----------- -------------------- ----------- -------------- ----------- --------------------
CKPT_FILE CKPT_OFFSET FREE_SPACE TOTAL_SPACE SUSPEND_TIME UPD_CTL_LSN N_RESERVE_WAIT TOTAL_FLUSH_PAGES TOTAL_FLUSH_TIMES TOTAL_ECPR_FLUSH_PAGES
----------- -------------------- -------------------- -------------------- ------------ -------------------- -------------- -------------------- -------------------- ----------------------
GLOBAL_NEXT_SEQ N_PRIMAY_EP PRIMARY_DB_MAGIC CKPT_N_PRIMAY_EP CKPT_PRIMARY_DB_MAGIC MIN_EXEC_VER MIN_DCT_VER
-------------------- ----------- -------------------- ---------------- --------------------- ------------ -----------
1 46386 47405 47405 47405 5510 7 259189736 0 0 0 8958464
0 8929792 805265408 805294080 NULL 0 0 56 9 56
5510 0 0 0 0 V8.1.1.1 4
used time: 0.528(ms). Execute id is 603.
SQL> alter system switch logfile;
executed successfully
used time: 0.519(ms). Execute id is 0.
SQL> select * from v$rlog;
LINEID CKPT_LSN FILE_LSN FLUSH_LSN CUR_LSN NEXT_SEQ N_MAGIC DB_MAGIC FLUSH_PAGES FLUSHING_PAGES CUR_FILE CUR_OFFSET
---------- -------------------- -------------------- -------------------- -------------------- -------------------- ----------- -------------------- ----------- -------------- ----------- --------------------
CKPT_FILE CKPT_OFFSET FREE_SPACE TOTAL_SPACE SUSPEND_TIME UPD_CTL_LSN N_RESERVE_WAIT TOTAL_FLUSH_PAGES TOTAL_FLUSH_TIMES TOTAL_ECPR_FLUSH_PAGES
----------- -------------------- -------------------- -------------------- ------------ -------------------- -------------- -------------------- -------------------- ----------------------
GLOBAL_NEXT_SEQ N_PRIMAY_EP PRIMARY_DB_MAGIC CKPT_N_PRIMAY_EP CKPT_PRIMARY_DB_MAGIC MIN_EXEC_VER MIN_DCT_VER
-------------------- ----------- -------------------- ---------------- --------------------- ------------ -----------
1 46386 47405 47405 47405 5510 7 259189736 0 0 0 8958464
0 8929792 805265408 805294080 NULL 0 0 56 9 56
5510 0 0 0 0 V8.1.1.1 4
used time: 0.881(ms). Execute id is 604.
这个时候可以看到,我在做了alter system switch logfile以后,两次查询的信息完全一样。
且查看归档目录,发现并没有产生归档。
此时我做一次chekcpoint;
SQL> checkpoint(100);
DMSQL executed successfully
used time: 36.576(ms). Execute id is 605.
SQL> alter system switch logfile;
executed successfully
used time: 3.470(ms). Execute id is 0.
SQL> select * from v$rlog;
LINEID CKPT_LSN FILE_LSN FLUSH_LSN CUR_LSN NEXT_SEQ N_MAGIC DB_MAGIC FLUSH_PAGES FLUSHING_PAGES CUR_FILE CUR_OFFSET
---------- -------------------- -------------------- -------------------- -------------------- -------------------- ----------- -------------------- ----------- -------------- ----------- --------------------
CKPT_FILE CKPT_OFFSET FREE_SPACE TOTAL_SPACE SUSPEND_TIME UPD_CTL_LSN N_RESERVE_WAIT TOTAL_FLUSH_PAGES TOTAL_FLUSH_TIMES TOTAL_ECPR_FLUSH_PAGES
----------- -------------------- -------------------- -------------------- ------------ -------------------- -------------- -------------------- -------------------- ----------------------
GLOBAL_NEXT_SEQ N_PRIMAY_EP PRIMARY_DB_MAGIC CKPT_N_PRIMAY_EP CKPT_PRIMARY_DB_MAGIC MIN_EXEC_VER MIN_DCT_VER
-------------------- ----------- -------------------- ---------------- --------------------- ------------ -----------
1 47403 47405 47405 47405 5511 7 259189736 0 0 0 8962560
0 8955392 805286912 805294080 NULL 0 0 64 10 64
5511 0 0 0 0 V8.1.1.1 4
used time: 0.574(ms). Execute id is 606.
此时,可以看到CKPT_LSN发生了改变。而此时查看归档目录,发现产生了一个新的归档。
这是为什么呢?
参考在postgresql、mysql数据库中联机日志的概念,其实就可以想明白了,达梦数据库和mysql、postgresql数据库的联机一样,都存放的是lsn(oracle中存放的是scn信息),数据库的记录均以lsn为基础,而lsn信息其实就可以理解为我在做操作时候的每一个步骤所记录的日志号。
那么联机日志中其实记录的就是一条条的lsn条目。而lsn一般只会记录事物操作、提交、checkpoint点。也就是说当数据库发生了变化,lsn才会改变,那么我的日志中才会有记录更新,此时做日志切换(在达梦里更确切的应该是叫做归档日记切换)才会产生新的归档(因为此时有变化)。而当我在连续进行alter system switch logfile等操作的时候,中间如果没有dml或者ddl操作(也就是说,数据库没有发生变化,没有记录lsn),那么则不会产生新的归档。
文章
阅读量
获赞