最近在学习达梦数据库,对日志切换这个问题稍有疑惑,在这里记录与大家分享。
在ORACLE中,alter system switch logfile 为日志切换命令。即手工切换日志组,让Oracle 直接使用下一个日志组,而不管当前使用的日志组是否写满。官方解释如下:
SWITCH LOGFILE Clause The SWITCH LOGFILE clause lets you explicitly force Oracle to begin writing to a new redo log file group, regardless of whether the files in the current redo log file group are full. When you force a log switch, Oracle begins to perform a checkpoint but returns control to you immediately rather than when the checkpoint is complete. To use this clause, your instance must have the database open.
在日志发生切换时,oracle会触发arch进程,即通知归档进程说那个日志可以归档了(产生新的归档文件)。
但在达梦数据库学习中,在执行alter system switch logfile 这条命令后,日志没有切换。这条跟ORACLE略为不同。
日志切换之前:
SQL> select * from v$rlogfile;
行号 GROUP_ID FILE_ID PATH CLIENT_PATH CREATE_TIME RLOG_SIZE
---------- ----------- ----------- ------------------------------------------- ------------ --------------------------- --------------------
1 2 0 /home/dmdba/dmdbms/data/DAMENG/DAMENG01.log DAMENG01.log 2019-09-06 14:44:25.000000 268435456
2 2 1 /home/dmdba/dmdbms/data/DAMENG/DAMENG02.log DAMENG02.log 2019-09-06 14:44:25.000000 268435456
行号 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
-------------------- --------------
1 159950 164935 164935 164935 686529 7 403421828 0 0
1 83075584 1 82556928 536344064 536862720 NULL
47664 0
切换日志:
SQL> alter system switch logfile;
操作已执行
已用时间: 28.745(毫秒). 执行号:0.
再次查看当前redo file:
SQL> select * from v$rlog;
行号 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
-------------------- --------------
1 159950 164935 164935 164935 686529 7 403421828 0 0
1 83075584 1 82556928 536344064 536862720 NULL
47664 0
也还是1。
我的归档配置如下:
归档类型为本地归档,每个归档大小为64M。各个归档类型这个不细说,这个顺便讲下达梦数据库打开归档简单步骤:
1、数据库切换到配置模式
SQL> alter database mount;
2、配置归档文件
SQL> alter database add archivelog 'type=local,dest=/dm7/arch,file_size=64,space_limit=0';
3、切换到归档模式
SQL> alter database archivelog;
4、数据库切换回open状态
SQL> alter database open;
SQL> select * from v$dm_arch_ini;
大体跟ORACLE类似。
数据库归档打开完成之后,多次执行alter system switch logfile命令,发现我的归档文件还是只有原来的那两个。如下图所示:
通过查阅相关官方文档,并没有专门的章节来讲解达梦内部日志切换机制。但在命令手册中有一个简单说明:
ALTER SYSTEM SWITCH LOGFILE 是把新生成的,还未归档的联机日志进行归档。
原来如此,但是为何上面我多次执行alter system switch logfile,并没有新的归档生产呢?原因很简单,因为我是测试环境,当前环境空闲,数据库中没有相应增删改查操作,也就是没有新生成的联机日志,所以没有产生新的归档。
尝试创建一张表,再进行alter system switch logfile 操作,就看到会有新的归档产生。具体如下:
create table ljw.ljw1 as select * from sysobjects;
alter system switch logfile;
再次查看归档文件,有生成新的归档文件了。
通过实验和官方资料查询,得到结论:
ALTER SYSTEM SWITCH LOGFILE 是把新生成的,还未归档的联机日志进行归档,达梦不会去切换使用新的redo日志。达梦redo日志由其内部管理,日志写满之后,自动切换使用下一组日志,不能手工切换人为干预。达梦数据库的redo日志和归档日志是一起写的,这点和ORACLE机制也是不一样的。