达梦数据库DM8之重做日志文件
重做日志(即 REDO 日志)指在 DM 数据库中添加、删除、修改对象,或者改变数据,DM 都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。重做日志文件以 log 为扩展名。每个 DM 数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为 DAMENG01.log、DAMENG02.log,这两个文件循环使用。
重做日志文件因为是数据库正在使用的日志文件,因此被称为联机日志文件。
重做日志文件主要用于数据库的备份与恢复。理想情况下,数据库系统不会用到重做日志文件中的信息。然而现实世界总是充满了各种意外,比如电源故障、系统故障、介质故障,或者数据库实例进程被强制终止等,数据库缓冲区中的数据页会来不及写入数据文件。这样,在重启 DM 实例时,通过重做日志文件中的信息,就可以将数据库的状态恢复到发生意外时的状态。
重做日志文件对于数据库是至关重要的。它们用于存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复。在 DM 数据库运行过程中,任何修改数据库的操作都会产生重做日志,例如,当一条元组插入到一个表中的时候,插入的结果写入了重做日志,当删除一条元组时,删除该元组的事实也被写了进去,这样,当系统出现故障时,通过分析日志可以知道在故障发生前系统做了哪些动作,并可以重做这些动作使系统恢复到故障之前的状态。
1.管理重做日志文件
1.1 添加重做日志文件
在服务器打开状态下,可以添加新的重做日志文件。添加的数据文件大小最小为 4096*页大小,如页大小为 8K,则可添加的文件最小值为 4096*8k=32M。如添加重做大小为 128M的重做日志文件 DAMENG03.log。
ALTER DATABASE ADD LOGFILE 'd:\DAMENG03.log' size 128;
1.2 扩展重做日志文件
在服务器打开状态下,可以扩展已有的重做日志文件的大小。如扩展重做日志文件DAMENG03.log 到 256M。
ALTER DATABASE RESIZE LOGFILE 'd:\DAMENG03.log' to 256;
操作实例
1. 检查数据库REDO日志信息
达梦数据库中与REDO日志相关的视图主要有:
1.1 V$RLOG 视图:用来查询日志的总体信息。包括当前日志的检查点LSN、文件LSN等。
[dmdba@dmdb01 ~]$ disql SYSDBA/SYSDBA@192.168.186.128:5240
服务器[192.168.186.128:5240]:处于普通打开状态
登录使用时间 : 2.756(ms)
disql V8
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 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 48565 50910 50910 50910 5149 7
1488733682 0 0 0 11720704 0 11452928
536594944 536862720 NULL 0 0 523
3 0 5149 0 0 0
0 V8.1.1.1 4
已用时间: 13.014(毫秒). 执行号:500.
SQL>
1.2 V$RLOGFILE 视图:用来查询日志文件的具体信息。包括当前数据库的日志文件路径、大小、创建时间等信息。
SQL> select * from v$rlogfile;
行号 GROUP_ID FILE_ID PATH CLIENT_PATH CREATE_TIME RLOG_SIZE
---------- ----------- ----------- -------------------------------- ----------- -------------------------- --------------------
MIN_EXEC_VER MIN_DCT_VER
------------ -----------
1 2 0 /dm8/dmdbms/data/dm01/dm0101.log dm0101.log 2022-04-24 21:14:40.000000 268435456
V8.1.1.1 4
2 2 1 /dm8/dmdbms/data/dm01/dm0102.log dm0102.log 2022-04-24 21:14:40.000000 268435456
V8.1.1.1 4
已用时间: 1.118(毫秒). 执行号:501.
SQL>
2. 添加REDO日志文件
达梦数据库的REDO日志文件是有最小大小限制的,最小大小为4096*页大小,当前数据库的页大小可以通过如下语句查看:
SQL> select para_name,para_value from v$dm_ini where para_name = 'GLOBAL_PAGE_SIZE';
行号 PARA_NAME PARA_VALUE
---------- ---------------- ----------
1 GLOBAL_PAGE_SIZE 32768
已用时间: 8.783(毫秒). 执行号:503.
SQL>
所以当前数据库能够添加的REDO日志文件最小大小为4096*32768=128MB,我们可以通过alert database add logfile的方式添加REDO日志文件,如下所示:
SQL> select file_id,path,rlog_size/1024/1024 as MB from v$rlogfile;
行号 FILE_ID PATH MB
---------- ----------- -------------------------------- --------------------
1 0 /dm8/dmdbms/data/dm01/dm0101.log 256
2 1 /dm8/dmdbms/data/dm01/dm0102.log 256
已用时间: 0.786(毫秒). 执行号:505.
SQL>
1)测试添加小于128M的REDO日志文件
SQL> alter database add logfile '/dm8/dmdbms/data/dm01/dm0103.log' size 100;
alter database add logfile '/dm8/dmdbms/data/dm01/dm0103.log' size 100;
第1 行附近出现错误[-2410]:数据文件[/dm8/dmdbms/data/dm01/dm0103.log]大小无效.
已用时间: 0.319(毫秒). 执行号:0.
2)测试添加大于等于128M的REDO日志文件
SQL> alter database add logfile '/dm8/dmdbms/data/dm01/dm0103.log' size 128;
操作已执行
已用时间: 13.997(毫秒). 执行号:506.
SQL>
SQL> select file_id,path,rlog_size/1024/1024 as MB from v$rlogfile;
行号 FILE_ID PATH MB
---------- ----------- -------------------------------- --------------------
1 0 /dm8/dmdbms/data/dm01/dm0101.log 256
2 1 /dm8/dmdbms/data/dm01/dm0102.log 256
3 2 /dm8/dmdbms/data/dm01/dm0103.log 128
已用时间: 0.241(毫秒). 执行号:507.
SQL>
注意:以上过程我们可以看到,当日志文件大小小于128MB时,会提示“第1 行附近出现错误[-2410]:数据文件[/dm8/dmdbms/data/dm01/dm0103.log]大小无效.”。
3. 修改现有REDO日志文件大小
达梦8数据库目前只能对日志文件进行向上(扩大)RESIZE操作,不能进行向下(缩容)RESIZE操作,可以通过alter database resize to语句实现,我们现在将上面添加的日志文件由128MB扩大到150MB,再尝试缩容到128MB,过程如下:
SQL> select file_id,path,rlog_size/1024/1024 as MB from v$rlogfile;
行号 FILE_ID PATH MB
---------- ----------- -------------------------------- --------------------
1 0 /dm8/dmdbms/data/dm01/dm0101.log 256
2 1 /dm8/dmdbms/data/dm01/dm0102.log 256
3 2 /dm8/dmdbms/data/dm01/dm0103.log 128
已用时间: 0.241(毫秒). 执行号:507.
SQL>
SQL> alter database resize logfile '/dm8/dmdbms/data/dm01/dm0103.log' to 150;
操作已执行
已用时间: 11.492(毫秒). 执行号:508.
SQL> alter database resize logfile '/dm8/dmdbms/data/dm01/dm0103.log' to 128;
alter database resize logfile '/dm8/dmdbms/data/dm01/dm0103.log' to 128;
[-2410]:数据文件[/dm8/dmdbms/data/dm01/dm0103.log]大小无效.
已用时间: 2.062(毫秒). 执行号:0.
SQL>
SQL> select file_id,path,rlog_size/1024/1024 as MB from v$rlogfile;
行号 FILE_ID PATH MB
---------- ----------- -------------------------------- --------------------
1 0 /dm8/dmdbms/data/dm01/dm0101.log 256
2 1 /dm8/dmdbms/data/dm01/dm0102.log 256
3 2 /dm8/dmdbms/data/dm01/dm0103.log 150
已用时间: 0.269(毫秒). 执行号:510.
SQL>
注意:可以看到,FILE_ID为2的日志文件可以正常从128MB扩容到150MB,但是向下(缩容)从150MB缩容到128MB报错:[-2410]:数据文件[/dm8/dmdbms/data/dm01/dm0103.log]大小无效。
4.修改REDO日志文件名
达梦数据库REDO日志文件重命名必须在MOUNT状态下进行,通过alter database rename to语句实现,现在我们将文件file_id为2的日志文件由 dm0103.log改为dm0103_1.log,过程如下:
SQL> select name,instance_name,status$ from v$instance;
行号 NAME INSTANCE_NAME STATUS$
---------- ---- ------------- -------
1 DM01 DM01 OPEN
已用时间: 0.822(毫秒). 执行号:512.
SQL>
SQL> alter database rename logfile '/dm8/dmdbms/data/dm01/dm0103.log' to '/dm8/dmdbms/data/dm01/dm0103_1.log';
alter database rename logfile '/dm8/dmdbms/data/dm01/dm0103.log' to '/dm8/dmdbms/data/dm01/dm0103_1.log';
第1 行附近出现错误[-530]:只允许在MOUNT状态NORMAL模式下执行.
已用时间: 0.207(毫秒). 执行号:0.
SQL>
SQL> alter database mount;
操作已执行
已用时间: 2.263(毫秒). 执行号:0.
SQL> select name,instance_name,status$ from v$instance;
行号 NAME INSTANCE_NAME STATUS$
---------- ---- ------------- -------
1 DM01 DM01 MOUNT
已用时间: 0.678(毫秒). 执行号:513.
SQL>
SQL> alter database rename logfile '/dm8/dmdbms/data/dm01/dm0103.log' to '/dm8/dmdbms/data/dm01/dm0103_1.log';
操作已执行
已用时间: 994.826(毫秒). 执行号:514.
SQL> select file_id,path,rlog_size/1024/1024 as MB from v$rlogfile;
行号 FILE_ID PATH MB
---------- ----------- ---------------------------------- --------------------
1 0 /dm8/dmdbms/data/dm01/dm0101.log 256
2 1 /dm8/dmdbms/data/dm01/dm0102.log 256
3 2 /dm8/dmdbms/data/dm01/dm0103_1.log 150
已用时间: 0.786(毫秒). 执行号:515.
SQL> alter database open;
操作已执行
已用时间: 11.614(毫秒). 执行号:0.
SQL> select file_id,path,rlog_size/1024/1024 as MB from v$rlogfile;
行号 FILE_ID PATH MB
---------- ----------- ---------------------------------- --------------------
1 0 /dm8/dmdbms/data/dm01/dm0101.log 256
2 1 /dm8/dmdbms/data/dm01/dm0102.log 256
3 2 /dm8/dmdbms/data/dm01/dm0103_1.log 150
已用时间: 0.272(毫秒). 执行号:516.
SQL>
注意:在实际操作过程中,我们可以看到,在OPEN状态下执行REDO日志重命名操作,是不被允许的,会提示“[-530]:只允许在MOUNT状态NORMAL模式下执行”错误。
5.删除REDO日志文件名
通过测试 alter database drop logfile 和 alter database delete logfile删除重做日志都报错,说明达梦数据库当前不支持删除重做REDOLOG日志
SQL> select file_id,path,rlog_size/1024/1024 as MB from v$rlogfile;
行号 FILE_ID PATH MB
---------- ----------- ---------------------------------- --------------------
1 0 /dm8/dmdbms/data/dm01/dm0101.log 256
2 1 /dm8/dmdbms/data/dm01/dm0102.log 256
3 2 /dm8/dmdbms/data/dm01/dm0103_1.log 150
已用时间: 0.272(毫秒). 执行号:516.
SQL>
SQL> alter database drop logfile file_id 2;
alter database drop logfile file_id 2;
*
第 1 行, 第 32 列[drop]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.367(毫秒). 执行号:0.
SQL>
SQL> alter database drop logfile '/dm8/dmdbms/data/dm01/dm0103_1.log';
alter database drop logfile '/dm8/dmdbms/data/dm01/dm0103_1.log';
*
第 1 行, 第 32 列[drop]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.172(毫秒). 执行号:0.
SQL> alter database drop logfile 'dm0103_1.log';
alter database drop logfile 'dm0103_1.log';
alter database drop logfile 'dm0103_1.log';
*
第 1 行, 第 32 列[drop]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.280(毫秒). 执行号:0.
SQL>
SQL>
SQL> alter database delete logfile '/dm8/dmdbms/data/dm01/dm0103_1.log';
alter database delete logfile '/dm8/dmdbms/data/dm01/dm0103_1.log';
alter database delete logfile '/dm8/dmdbms/data/dm01/dm0103_1.log';
*
第 1 行, 第 48 列[logfile]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.354(毫秒). 执行号:0.
SQL> alter database delete logfile file_id 2;
alter database delete logfile file_id 2;
alter database delete logfile file_id 2;
*
第 1 行, 第 48 列[logfile]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.137(毫秒). 执行号:0.
SQL>
达梦数据库社区地址:https://eco.dameng.com/