数据库无法启动问题故障分析报告

本文详细讲述了Windows环境下DM数据库遭遇突然断电后的应急处理方案,包括数据备份、临时设置PSEG_RECV参数、使用dmdbchk检查修复、预防措施(如关闭磁盘缓存和UPS)以及创建一键恢复脚本。重点介绍了如何备份数据、恢复数据库和设置定时任务以确保高可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 问题描述与分析

windows环境数据库实例无法启动,错误日志提示:“Fail to find file in current system.tsid4,fileid:24880”,“code=-1,dm_sys halt new!!!”
经过了解,突然断电。windows没有关闭缓存。数据库写数据流程是先写redo,再从redo写入磁盘。突然断电及开启了磁盘缓存,导致缓存中的数据丢失,写入redo里的数据部分写入了磁盘,部分没有写入磁盘,来电后自动启动数据库,数据库会自身检查LSN,发现数据文件、控制文件和redo里不一致,数据库就起不来。
在这里插入图片描述

2 解决方案

2.1 先备份数据

2.1.1 备份数据方法1

备份”D:\dmdbms\data\DAMENG”数据目录。

2.1.2 备份数据方法2

打开控制台工具(控制台工具位于D:\dmdbms\tool\console.exe),备份数据库。
或者打开 dmrman工具冷备(dmrman工具位于D:\dmdbms\bin目录)。操作如下:./dmrman CTLSTMT=“BACKUP DATABASE ‘D:\dmdbms\data\DAMENG/dm.ini’ FULL BACKUPSET ‘D:\dmdata\bak\DAMENG\db_full_bak_01’”;

2.2 临时设置PSEG_RECV=0

临时设置PSEG_RECV=0,操作如下:
编辑D:\dmdbms\data\DAMENG\dm.ini参数文件,把PSEG_RECV默认值=3设置为PSEG_RECV=0,启动数据库,数据库正常启动且能提供业务后再把PSEG_RECV=0还原为PSEG_RECV=3。再重启数据库。

PSEG_RECV参数值说明:
PSEG_RECV缺省值是3。系统故障重启时,对活动事务和已提交事务的处理方式。
等于0时:跳过回滚活动事务和 PURGE 已经提交事务的步骤。在回滚表空间出现异常、损坏、系统无法正常启动时,可将PSEG_RECV 设置为 0,让系统启动;但存在一定风险,未提交事务的修改将无法回滚,破坏事务的原子性;另外,已提交未 PURGE 的事务,将导致部分存储空间无法回收;
等于1:回滚活动事务并 PURGE 已经提交事务;
等于2:延迟 PURGE 已提交事务,延迟回滚活动事务;
等于3:回滚活动事务,延迟 PURGE 已提交事务。

2.3 使用dmdbchk工具检查数据文件及索引

使用dmdbchk工具检查数据文件及索引(dmdbchk.exe path=D:\dmdbms\data\DAMENG\dm.ini),在当前目录下生成的dbchk_error.txt文件有几处索引已经损坏,需要更新索引。更新方法是查看当前目录下生成的dbchk_error.txt,查找损坏的索引对应的表,备份该表。把原表结构通过管理工具生成后会有创建索引的DDL语句,删除原来的索引再根据管理工具生成的原表结构上创建的索引语句创建索引。
在这里插入图片描述
创建索引后通过管理工具更新表及索引的统计信息。

3 后续措施

3.1 避免突然断电

建议windows环境关闭磁盘缓存,安装UPS电源。如果需要关闭windows,则推荐:
1、执行检查点checkpoint(100)
2、关闭数据库
3、关闭windows主机
4、拉闸断电源

3.2 制定一键恢复数据库脚本

3.2.1 脚本内容

备份脚本如下(bak.bat):
@echo off
sc query DmAPService|find “STATE”|find “RUNNING” || net start DmAPService
sc query DmServiceDMSERVER|find “STATE”|find “RUNNING” || net start DmServiceDMSERVER
set dbbindir=D:\dmdbms\bin
set dbuser=*
set dbpwd=*
set dbport=*

cd %dbbindir%
D:
DIsql.exe %dbuser%/%dbpwd%:%dbport% `D:\backup_script\bak.sql

bak.sql文件内容如下(bak.sql):
SET LINESHOW OFF;
backup database;
CALL SF_BAKSET_BACKUP_DIR_ADD(‘DISK’,‘D:\dmdata\bak\DAMENG’);
CALL SP_DB_BAKSET_REMOVE_BATCH(‘DISK’,SYSDATE-7);
exit;

生成备份路径脚本如下(build_path.bat):
@echo off
set dbbindir=D:\dmdbms\bin
set dbuser=*
set dbpwd= *
set dbport=*

cd %dbbindir%
D:
DIsql.exe %dbuser%/%dbpwd%:%dbport% -E “select top 1 backup_path from v$backupset order by backup_time desc” > D:\backup_script\version_path.txt
exit;

一键恢复数据库脚本内容如下(recover_database.bat):
@echo off
set BACKUPSET_PATH=“”
:如下代码的效果就是把version_path.txt第8行路径取出来,skip=7指跳过前面7行,tokens=1指取第一列
for /f “skip=7 tokens=1” %%a in (D:\backup_script\version_path.txt) do (
set BACKUPSET_PATH=%%a
goto :Show
)
:Show
:如下代码还原恢复
D:\dmdbms\bin\dmrman CTLSTMT=“repair archivelog database ‘D:\dmdata\data\DAMENG\dm.ini’;RESTORE DATABASE ‘D:\dmdata\data\DAMENG\dm.ini’ FROM BACKUPSET ‘%BACKUPSET_PATH%’; RECOVER DATABASE ‘D:\dmdata\data\DAMENG\dm.ini’ with archivedir ‘D:\dmdata\arch\DAMENG’; RECOVER DATABASE ‘D:\dmdata\data\DAMENG\dm.ini’ UPDATE DB_MAGIC;”
net start DmServiceDMSERVER

pause

3.2.2 添加定时任务

3.2.2.1 创建开机备份定时任务(bak.bat)

1.在Windows Server中,我们进入服务器管理面板,点击右上角菜单栏中的“工具”,选择其中的“任务计划程序”:
在这里插入图片描述
2.打开了任务计划程序之后,我们点击右侧的“创建基本任务”:
在这里插入图片描述
3.然后,我们需要填写任务的名称(bak_database),以及描述信息:
名称:bak_database
描述:开机备份数据库
4.点击下一步之后,设置触发器(当前用户登录时):
在这里插入图片描述
5.继续“下一步”后,我们选择“启动程序”:
在这里插入图片描述
6.在之后的对话框中,我们需要选择编写的脚本文件:
在这里插入图片描述
7.完成
在这里插入图片描述
8.查看已配置的计划任务
在这里插入图片描述
9.双击配置的计划任务修改
因为window环境开机没有密码,所有勾选“只在用户登录时运行、使用最高权限运行”。如果开机需要密码则勾选“不管用户是否登录都要运行、使用最高权限”。下图设置是开机不需要密码时的设置。
常规设置:
在这里插入图片描述
若window环境开机有密码,下图设置时是开机需要密码时的情况
在这里插入图片描述
设置触发器:
在这里插入图片描述
条件设置
在这里插入图片描述

3.2.2.2 创建开机延迟3分钟生成备份路径定时任务(build_path.bat)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
延迟3分钟执行
在这里插入图片描述
备注:需要预先创建“D:\backup_script\”目录。
如果数据库无法启动时,只需要双击“recover_database.bat”脚本即可恢复数据库。需要注意的是在SYSTEM.DBF数据文件损坏时不能用“recover_database.bat”脚本恢复。需要调整脚本内容:把修复归档(repair archivelog database ‘D:\dmdata\data\DAMENG\dm.ini’;)这一步去掉,再执行脚本。

达梦社区地址:https://eco.dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值