Redolog记录了数据库中物理数据页的变更,既包括已提交的也包括未提交事务的数据修改,在事务提交后数据库会按一定的时机进行日志归档和数据刷盘,如果redo日志文件被误删除会导致数据库无法启动和数据丢失。
在误删redo文件后,可以利用数据库的物理备份集(需要开启归档和设置定时作业)进行还原;
如果没有备份或者备份集无法使用。就使用单独还原redolog文件的方式:需要重新初始化一个新的实例将生成的redo日志文件复制过来并修改名称和redo日志文件内容以及dm.ini参数进行启动。(可能会丢失一定量的数据)
在生产环境都会创建定时备份作业,开启归档日志并对数据库进行物理全备和增量备份。如果数据库有这些备份集存在并且数据库数据量不大的情况下则优先采用数据库备份还原的方式。
如果数据库还在运行则直接关闭数据库:
su - dmdba
cd /home/dmdba/dmdbms/bin
./DmServicedmdb stop
利用备份集还原:
DB_dmdb_INCREMENT_2026_06_09_01_05_10是最近一次增量备份集;/dmdata/dmarch/dmdb是归档日志目录,也可以单独将增量备份以后的归档日志拷贝出来再指定目录;
校验备份集:
./dmrman CTLSTMT="check backupset '/dmdata/dmbak/dmdb/bak/DB_dmdb_INCREMENT_2026_06_09_01_05_10' "
还原数据库,如果数据库还是开启状态的话需要关闭实例服务
./dmrman CTLSTMT="RESTORE DATABASE '/dmdata/dmdb/dm.ini' FROM BACKUPSET '/dmdata/dmbak/dmdb/bak/DB_dmdb_INCREMENT_2026_06_09_01_05_10'"
恢复归档日志。若无归档日志,并且可以接受丢失少量数据,可以直接用备份集得到归档恢复
./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/dmdb/dm.ini' WITH ARCHIVEDIR '/dmdata/dmarch/dmdb'"
更新数据库魔数
./dmrman CTLSTMT="RECOVER DATABASE '/dmdata/dmdb/dm.ini' UPDATE DB_MAGIC"
还原后重启数据库服务。
模拟在测试环境就删掉一个redo日志,并停止数据库:
重启数据库,会报错:
按原实例初始化参数重建一个新的实例
—— 查询数据库初始化信息:
SELECT '页大小',cast(PAGE()/1024 as varchar) union all
SELECT '簇大小',cast(SF_GET_EXTENT_SIZE() as varchar) union all
SELECT '字符集',CASE SF_GET_UNICODE_FLAG() WHEN '0' THEN 'GBK18030' WHEN '1' then 'UTF-8' when '2' then 'EUC-KR' end union all
SELECT '大小写敏感',cast(SF_GET_CASE_SENSITIVE_FLAG() as varchar) union all
select 'VARCHAR类型长度是否以字符为单位',para_value from v$dm_ini where para_name='LENGTH_IN_CHAR' union all
select '空格填充模式',cast(BLANK_PAD_MODE() as varchar) union all
select '实例名称' 数据库选项,INSTANCE_NAME 数据库集群相关参数值 FROM v$instance union all
select '数据库名',name from v$database union all
select '端口号',para_value from v$dm_ini where para_name='PORT_NUM' union all
select '数据库产品ID', id_code from dual union all
select '数据库版本',substr(svr_version,instr(svr_version,'(')) FROM v$instance union all
select '数据库模式',MODE$ from v$instance union all
SELECT '字符数据类型' NAME, CASE VALUE WHEN 0 THEN 'BYTE' WHEN 1 THEN 'CHAR' end FROM v$parameter WHERE name like '%LENGTH_IN_CHAR%' union all
select '唯一魔数',cast(permanent_magic as varchar) union all
select 'LSN',cast(cur_lsn as varchar) from v$rlog union all
select 'KEY文件属性', cluster_type from v$license ;
根据源库的初始化参数,重新初始化一个数据库实例,REDO大小要大于等于源库的重做日志文件大小。
初始化参数要和原库一致,页大小、大小写敏感、字符集等。
查看初始化日志文件,并根据实际参数重新初始化实例:
cd /home/dmdba/dmdbms/bin
./dminit path=/dmdata page_size=32 extent_size=32 charset=1 CASE_SENSITIVE=0 log_size=1024 db_name=dbdb_test instance_name=dmdb_test SYSDBA_PWD="Hn@dameng123" SYSAUDITOR_PWD="Hn@dameng123" PORT_NUM=15236
拷贝Redo文件
将新初始化实例目录下的的Redo日志拷贝到故障的实例目录下,并且修改Redo文件名:
cd /dmdata/dbdb_test/
cp dbdb_test01.log /dmdata/dmdb/dmdb01.log
修改新Redo日志的db_magic、pemnt_magic的值
利用dmmdf 工具修改新拷贝到故障实例的Redo日志的db_magic、pemnt_magic的值,保持和源库(故障库)一样。
通过查看故障库的数据文件头信息,可以找到数据库魔数(db_magic)、永久魔数(pemnt_magic)值:
cd /home/dmdba/dmdbms/bin
./dmmdf type=1 file=/dmdata/dmdb/SYSTEM.DBF
修改redo日志中的db_magic和pemnt_magic:
./dmmdf type=2 file=/dmdata/dmdb/dmdb01.log
输入对应的行号,则可以更新对应的字段信息:
db_magic:
pemnt_magic:
编辑dm.ini将PSEG_RECV设置为0并启动故障实例
查看该实例的PSEG_RECV值修改前的值是多少,然后设置为0。
关于PSEG_RECV参数:
该参数是系统级的动态参数,默认为1。系统故障重启时,对活动事务和已提交事务的处理方式。0:跳过回滚活动事务和 PURGE 已经提交事务的步骤。在回滚表空间出现异常、损坏、系统无法正常启动时,可将 PSEG_RECV设置为 0,让系统启动;但存在一定风险,未提交事务的修改将无法回滚,破坏事务的原子性;另外,已提交未 PURGE 的事务,将导致部分存储空间无法回收;1:回滚活动事务并PURGE 已经提交事务;2:延迟 PURGE 已提交事务,延迟回滚活动事务;3:回滚活动事务,延迟 PURGE 已提交事务。
原值为3
修改为0
但是对于新版达梦数据库还是不能启动实例,启动会出现以下报错:
新版本的数据库还要修改clsn值,在(可查询对应server运行日志最后打印的cur_lsn值,如果有归档可分析对应归档的最大lsn值,稍大于此值即可),因为前面尝试启动过数据库,导致无法修改lsn号,所以要重新拷贝日志过来然后一并修改db_magic和pemnt_magic的值
比这个值大就行,比如+64。
修改成功。
如果修改lsn的时候提示“ERROR, rlog is active, dmserver should shutdown normal.”后面发现日志的sta=0,于是尝试将sta改为1,然后修改clsn号后把sta重新改为0就可以了。
另外还要在dm.ini中追加参数RLOG_CHECK_SPACE=2
前台启动数据库实例:
cd /home/dmdba/dmdbms/bin
./dmserver /dmdata/dmdb/dm.ini
成功启动后关闭实例并将修改的RLOG_CHECK_SPACE参数注释掉以及PSEG_RECV改为3。
此方法可能会造成部分数据丢失。
文章
阅读量
获赞
