DM8 roll.dbf损坏修复

01| 新建实例

dmdba@whx01 192.168.1.20 18:14:12 [pwd:~/dm8/dm_home/bin]$ dminit port_num=5230
dmdba@whx01 192.168.1.20 18:07:25 [pwd:~/dm8/dm_home/script/root]$ sudo sh dm_service_installer.sh -t dmerver -p DAMENG -dm_ini /home/dmdba/dm8/dm_home/bin/DAMENG/dm.ini
dmdba@whx01 192.168.1.20 18:10:05 [pwd:~/dm8/dm_home/bin]$ ./DmServiceDAMENG start

插入数据

dmdba@whx01 192.168.1.20 18:10:46 [pwd:~/dm8/dm_home/bin]$ disql sysdba/SYSDBA:5230

服务器[LOCALHOST:5230]:处于普通打开状态
登录使用时间 : 1.696(ms)
disql V8
SQL> create table test(a int);
操作已执行
已用时间: 6.401(毫秒). 执行号:55200.
SQL> insert into test values(1);
影响行数 1

已用时间: 0.713(毫秒). 执行号:55201.
SQL> insert into test values(2);
影响行数 1

已用时间: 0.299(毫秒). 执行号:55202.
SQL> commit;
操作已执行
已用时间: 0.971(毫秒). 执行号:55203.
SQL> insert into test values(3);
影响行数 1

已用时间: 0.282(毫秒). 执行号:55204.
SQL> insert into test values(3);
影响行数 1

已用时间: 0.124(毫秒). 执行号:55205.
SQL> insert into test values(3);
影响行数 1

02| 破坏roll.dbf

dmdba@whx01 192.168.1.20 18:12:36 [pwd:~/dm8/dm_home/bin/DAMENG]$ echo  1> ROLL.DBF 

03| 启动数据库看效果

重新启动下数据库看看

1. 数据库正常启动

SQL> shutdown immediate;
操作已执行
已用时间: 0.262(毫秒). 执行号:0.
SQL> exit

# 启动数据库,正常启动
dmdba@whx01 192.168.1.20 18:14:12 [pwd:~/dm8/dm_home/bin]$ DmServiceDAMENG start
Starting DmServiceDAMENG:                                  [ OK ]
dmdba@whx01 192.168.1.20 18:17:23 [pwd:~/dm8/dm_home/bin]$ disql sysdba/SYSDBA:5230

服务器[LOCALHOST:5230]:处于普通打开状态
登录使用时间 : 1.832(ms)
disql V8
SQL> 
SQL> select * from test;

行号     A          
---------- -----------
1          1
2          2

# 已提交的数据仍然存在,未提交的数据丢失

📢注意:这里虽然正常启动了数据库并且可能查询数据,但是在备份的时候可能会因为roll的大小与控制文件中记录的不符而报错,可能报错信息如下:

[bdbf_check] backup (path: /home/dmdba/dm8/dm_home/bin/DAMENG/ROLL.DBF) error: file size(134217728) from file h
eader is greater than file size(12320768) in os

报错中显示:

  • 当前的roll.dbf的大小为11M,而DM中即便是8K的page_size ,文档大小最小也要配置成32M,根本就不可能配置成这么小的;
  • 当前的数据库中存储的roll.dbf文件大小为134217728 即128M
  • 实际大小与数据库中记载的不符,因此报错

处理:
新建实例替换roll.dbf:

  • 初始化一个新的实例,配置参照问题库
  • 新库正常启停一次后,替换roll.dbf
  • 需要保证新旧库的roll.dbf大小一致

2. 数据库不能正常启动

1)物理上的roll.dbf被删除
数据库重启后,如果发现物理上的roll.dbf不见了,那大约是不能启动的,处理办法也可以参照:新建实例替换roll.dbf

2) 物理上的roll.dbf还在
如果roll.dbf还在,但是仍旧不能启动,可以尝试修改数据库配置文件dm.ini
添加一个参数:
PSEG_RECV=0 # 默认是1
调过回滚purge的过程,看是否可以启动,如果仍旧不可启动,可以进行roll.dbf替换

04| 替换roll.dbf的影响说明

DM的多版本并发控制是通过undo来实现的,
已提交数据,数据文件中会短时间保存这些数据,这些数据作为不可见记录存在,并且以undo为依据,当undo中不在保留这些不可见数据时,同时也会对数据文件中这些不可见记录进行清理。替换roll.dbf后,数据库将无法对数据文件中的不可见数据进行清理
○ 如:1000w的表,删除999w,commit;select count() 结果是1w,但是实际上不可见的记录也是需要被扫描的,所以,查询的时候,可能就会很慢;考虑脏读来验证 isolation level read uncommit 后在查询count()
未提交数据:那些对数据库做了修改但是尚未提交的数据,尚未超过undo_retention保留期并且尚未被循环覆盖的数据会短时间留在undo的表空间文件,即roll.dbf中,替换了roll.dbf,那些未提交数据将无法回滚

附:友情链接链接:

达梦技术社区:https://eco.dameng.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值