为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
【操作系统】:
【CPU】:
【问题描述】:数据文件删掉之后还能插入数据
今天做DCA实验发现数据文件删除之后还能正常插入数据
[dmdba@panda51:/dm/data/DMDB]$ rm -rf TBS0
[dmdba@panda51:/dm/data/DMDB]$ rm -rf MAIN.DBF
[dmdba@panda51:/dm/data/DMDB]$ rm -rf DMHR.DBF
[dmdba@panda51:/dm/data/DMDB]$ ll
总用量 8605896
drwxr-xr-x 2 dmdba dinstall 6 11月 14 22:22 bak
drwxr-xr-x 2 dmdba dinstall 4096 11月 15 00:59 ctl_bak
-rw-r--r-- 1 dmdba dinstall 337 11月 14 23:14 dmarch.ini
-rw-r--r-- 1 dmdba dinstall 7168 11月 15 00:59 dm.ctl
-rw-r--r-- 1 dmdba dinstall 4294967296 11月 15 01:39 DMDB01.log
-rw-r--r-- 1 dmdba dinstall 4294967296 11月 15 00:59 DMDB02.log
-rw-r--r-- 1 dmdba dinstall 85018 11月 15 00:59 dm.ini
-rw-r--r-- 1 dmdba dinstall 85024 11月 14 23:14 dm.ini.dmbak
-rw-r--r-- 1 dmdba dinstall 900 11月 14 22:22 dminit_DMDB_20251114222219.log
-rw-r--r-- 1 dmdba dinstall 633 11月 14 22:22 dm_service.prikey
-rw-r--r-- 1 dmdba dinstall 3072 11月 14 22:22 dmtemp.ctl
drwxr-xr-x 2 dmdba dinstall 6 11月 14 22:22 HMAIN
-rw-r--r-- 1 dmdba dinstall 134217728 11月 15 01:38 ROLL.DBF
-rw-r--r-- 1 dmdba dinstall 714 11月 14 22:22 sqllog.ini
-rw-r--r-- 1 dmdba dinstall 77594624 11月 15 01:32 SYSTEM.DBF
-rw-r--r-- 1 dmdba dinstall 10485760 11月 15 00:59 TEMP.DBF
drwxr-xr-x 2 dmdba dinstall 6 11月 14 22:22 trace
SQL> select TABLESPACE_NAME from dba_tables where table_name='T1';
行号 TABLESPACE_NAME
---------- ---------------
1 MAIN
SQL> select * from dmhr.t1;
未选定行
已用时间: 0.498(毫秒). 执行号:2204.
SQL> insert into dmhr.t1 values(1);
影响行数 1
已用时间: 1.808(毫秒). 执行号:2205.
SQL>
SQL> commit;
已用时间: 22.112(毫秒). 执行号:2215.
SQL>
SQL> insert into dmhr.t1 values (2);
影响行数 1
已用时间: 3.834(毫秒). 执行号:2216.
SQL> commit;
操作已执行
已用时间: 2.886(毫秒). 执行号:2217.
SQL> select * from dmhr.t1;
行号 ID
---------- -----------
1 1
2 2
但是此时已经没有办法联机备份了
SQL> backup database full to "backup_set_2_full_20251118" backupset '/dm/backup/backup_set_2_full_20251118';
backup database full to "backup_set_2_full_20251118" backupset '/dm/backup/backup_set_2_full_20251118';
[-3432]:使用了不可修改的表空间,该表空间处于离线状态或数据文件被删除.
已用时间: 00:00:02.070. 执行号:0.
在此过程中的事务在数据库重启之后会全部丢失,使用之前的全量备份+增量也会丢数据。为什么操作系统在数据库文件被删除之后还能继续写操作呢?可能是操作系统有数据缓存或者打开的文件句柄还没有释放,基于这样的原理可以在操作系统层面利用IO重定向尝试恢复
dmserver 175629 175698 dm_osio_t dmdba 11u REG 253,0 134217728 74125449 /dm/data/DMDB/MAIN.DBF (deleted)
dmserver 175629 175698 dm_osio_t dmdba 12u REG 253,0 134217728 74125453 /dm/data/DMDB/DMHR.DBF (deleted)
dmserver 175629 175698 dm_osio_t dmdba 13u REG 253,0 67108864 74125496 /dm/data/DMDB/TBS01.DBF (deleted)
dmserver 175629 175698 dm_osio_t dmdba 14u REG 253,0 67108864 74125497
。。。。。。
[dmdba@panda51:/dm/data/DMDB]$ lsof | grep delete | grep DBF|wc -l
lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
Output information may be incomplete.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/0/gvfs
Output information may be incomplete.
484
[dmdba@panda51:/dm/data/DMDB]$ ps -ef | grep dmserver
dmdba 175629 1 0 00:59 pts/0 00:00:06 /dm/bin/dmserver path=/dm/data/DMDB/dm.ini -noconsole
dmdba 178545 167359 0 01:55 pts/4 00:00:00 grep --color=auto dmserver
[dmdba@panda51:/dm/data/DMDB]$ DM_PID=175629
[dmdba@panda51:/dm/data/DMDB]$ lsof -p $DM_PID | grep DBF | grep deleted
lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
Output information may be incomplete.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/0/gvfs
Output information may be incomplete.
dmserver 175629 dmdba 11u REG 253,0 134217728 74125449 /dm/data/DMDB/MAIN.DBF (deleted)
dmserver 175629 dmdba 12u REG 253,0 134217728 74125453 /dm/data/DMDB/DMHR.DBF (deleted)
dmserver 175629 dmdba 13u REG 253,0 67108864 74125496 /dm/data/DMDB/TBS01.DBF (deleted)
dmserver 175629 dmdba 14u REG 253,0 67108864 74125497 /dm/data/DMDB/TBS02.DBF (deleted)
[dmdba@panda51:/dm/data/DMDB]$ vi restore.sh
DM_PID=$(ps -ef | grep dmserver | grep -v grep | awk '{print $2}')
RESTORE_DIR="/dm/data/DMDB"
lsof -p $DM_PID | grep DBF | grep deleted | while read line
do
FD=$(echo $line | awk '{print $4}' | tr -d 'u')
FILE=$(echo $line | awk '{print $9}' | sed 's/(deleted)//')
BASENAME=$(basename $FILE)
cp /proc/$DM_PID/fd/$FD $RESTORE_DIR/$BASENAME
done
chown dmdba:dinstall $RESTORE_DIR/*.DBF
chmod 660 $RESTORE_DIR/*.DBF
[dmdba@panda51:/dm/data/DMDB]$ sh restore.sh
lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
Output information may be incomplete.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/0/gvfs
Output information may be incomplete.
[dmdba@panda51:/dm/data/DMDB]$ ll -lrt
总用量 8999116
drwxr-xr-x 2 dmdba dinstall 6 11月 14 22:22 bak
-rw-r--r-- 1 dmdba dinstall 714 11月 14 22:22 sqllog.ini
-rw-r--r-- 1 dmdba dinstall 633 11月 14 22:22 dm_service.prikey
drwxr-xr-x 2 dmdba dinstall 6 11月 14 22:22 HMAIN
-rw-r--r-- 1 dmdba dinstall 900 11月 14 22:22 dminit_DMDB_20251114222219.log
-rw-r--r-- 1 dmdba dinstall 3072 11月 14 22:22 dmtemp.ctl
drwxr-xr-x 2 dmdba dinstall 6 11月 14 22:22 trace
-rw-r--r-- 1 dmdba dinstall 85024 11月 14 23:14 dm.ini.dmbak
-rw-r--r-- 1 dmdba dinstall 337 11月 14 23:14 dmarch.ini
-rw-r--r-- 1 dmdba dinstall 85018 11月 15 00:59 dm.ini
-rw-rw---- 1 dmdba dinstall 10485760 11月 15 00:59 TEMP.DBF
-rw-r--r-- 1 dmdba dinstall 4294967296 11月 15 00:59 DMDB02.log
-rw-r--r-- 1 dmdba dinstall 7168 11月 15 00:59 dm.ctl
drwxr-xr-x 2 dmdba dinstall 4096 11月 15 00:59 ctl_bak
-rw-rw---- 1 dmdba dinstall 77594624 11月 15 01:50 SYSTEM.DBF
-rw-r--r-- 1 dmdba dinstall 433 11月 15 01:56 restore.sh
-rw-rw---- 1 dmdba dinstall 134217728 11月 15 01:56 ROLL.DBF
-rw-r--r-- 1 dmdba dinstall 4294967296 11月 15 01:56 DMDB01.log
-rw-rw---- 1 dmdba dinstall 134217728 11月 15 01:56 MAIN.DBF
-rw-rw---- 1 dmdba dinstall 134217728 11月 15 01:56 DMHR.DBF
-rw-rw---- 1 dmdba dinstall 67108864 11月 15 01:56 TBS01.DBF
-rw-rw---- 1 dmdba dinstall 67108864 11月 15 01:56 TBS02.DBF
## 全量备份
SQL> backup database full to "backup_set_2_full_20251118" backupset '/dm/backup/backup_set_2_full_20251118';
操作已执行
已用时间: 00:00:04.546. 执行号:3404.
## 重启
[dmdba@panda51:/dm/bin]$ DmServicePROD stop
Stopping DmServicePROD: [ OK ]
[dmdba@panda51:/dm/bin]$ DmServicePROD start
Starting DmServicePROD: [ OK ]
SQL> select * from dmhr.t1;
行号 ID
---------- -----------
1 1
2 2
已用时间: 5.555(毫秒). 执行号:601.
社区地址:
https://eco.dameng.com
