文章目录
- 1 问题描述与分析
- 2 解决方案
- 2.1 先备份数据
- 2.1.1 备份数据方法1
- 2.1.2 备份数据方法2
- 2.2 临时设置PSEG_RECV=0
- 2.3 使用dmdbchk工具检查数据文件及索引
- 3 后续措施
- 3.1 避免突然断电
- 3.2 制定一键恢复数据库脚本
- 3.2.1 脚本内容
- 3.2.2 添加定时任务
- 3.2.2.1 创建开机备份定时任务(bak.bat)
- 3.2.2.2 创建开机延迟3分钟生成备份路径定时任务(build_path.bat)
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.sqlbak.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 DmServiceDMSERVERpause
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’;)这一步去掉,再执行脚本。