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