达梦数据库表空间损坏问题处理

本文详细记录了在达梦数据库重启时遇到的FloatingPointException错误,源于表空间hiv_01.dbf文件损坏。通过控制文件转换、数据清理、重建表空间和用户,作者展示了在没有备份的情况下处理问题的步骤。强调了数据备份的重要性,以及在修复过程中涉及的关键技术和注意事项。

测试数据库重启报如下的错:

[dmdba@dsc3 bin]$ ./DmServiceDMSERVER start

Starting DmServiceDMSERVER: ./DmServiceDMSERVER: line 413:  2834 Floating point exception(core dumped) eval exec "\"$EXEC_PROG_FULL_PATH\"" "$STARTUP_PARAMS" -noconsole $TMP_START_MODE > "$SERVICE_LOG_FILE" 2>&1
                                                           [ FAILED ]
file dm.key not found, use default license!
version info: develop
DM Database Server x64 V8 1-2-38-21.07.09-143359-10018-ENT  startup...
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
Database mode = 0, oguid = 0
License will expire on 2022-07-09
file lsn: 24388
ndct db load finished

查看日志

2021-11-10 09:58:22.421 [FATAL] database P0000002834 T0000000000000002834  fil_io try to R file(5, 0) beyond size. path:/dmdata/DAMENG/hiv_01.dbf size:16 offset:16
2021-11-10 09:58:22.421 [FATAL] database P0000002834 T0000000000000002834  code = -2, dm_sys_halt now!!!
2021-11-10 09:58:22.421 [INFO] database P0000002834 T0000000000000002834  total 2 rfil opened!

从日志发现,表空间/dmdata/DAMENG/hiv_01.dbf出现了问题,导致数据库启动校验数据库一致性时出错。

在数据库没有备份的情况恢复数据库

1.将控制文件转换成文本文件
切换到数据安装路径 ,执行 ./dmctlcvt help 可以查看到 dmctlcvt 工具的具体情况,如下所示:
[dmdba@dsc3 bin]$ ./dmctlcvt help

DMCTLCVT V8

格式: ./dmctlcvt KEYWORD=value
注意: 控制文件名称必须指定为dm.ctl、dmmpp.ctl、dss.ctl

关键字              说明
--------------------------------------------------------------------------------
TYPE                1 转换控制文件为文本文件(源文件路径中控制文件名称必须是dm.ctl或dmmpp.ctl或dss.ctl)
                    2 转换文本文件为控制文件(目标文件路径中控制文件名称必须是dm.ctl或dmmpp.ctl或dss.ctl)
SRC                 源文件路径
DEST                目标文件路径
DCR_INI             dmdcr.ini文件路径
DFS_INI             dmdfs.ini文件路径
HELP                打印帮助信息

示例:
./dmctlcvt TYPE=1 SRC=/opt/dmdbms/data/dameng/dm.ctl DEST=/opt/dmdbms/data/dameng/dmctl.txt
./dmctlcvt TYPE=2 SRC=/opt/dmdbms/data/dameng/dmctl.txt DEST=/opt/dmdbms/data/dameng/dm.ctl

转化控制文件为文本文件

[dmdba@dsc3 bin]$ ./dmctlcvt TYPE=1 SRC=/dmdata/DAMENG/dm.ctl

DEST=/dmdata/DAMENG/dmctl.txt
DMCTLCVT V8
convert ctl to txt success!

在文本文件中删除hiv表空间的路径信息:

在这里插入图片描述

[dmdba@dsc3 bin]$ ./DmServiceDMSERVER start
Starting DmServiceDMSERVER:                                [ OK ]
[dmdba@dsc3 bin]$ 
已用时间: 17.339(毫秒). 执行号:0.
SQL> alter tablespace hiv add datafile '/dmdata/DAMENG/hiv_02.dbf' size 512 autoextend on;
操作已执行
已用时间: 24.455(毫秒). 执行号:601.
SQL> 
SQL> 
SQL> select path from v$datafile;

行号     PATH                     
---------- -------------------------
1          /dmdata/DAMENG/SYSTEM.DBF
2          /dmdata/DAMENG/ROLL.DBF
3          /dmdata/DAMENG/TEMP.DBF
4          /dmdata/DAMENG/MAIN.DBF
5          /dmdata/DAMENG/MAIN.DBF
6          /dmdata/DAMENG/hiv_02.dbf

6 rows got

已用时间: 0.439(毫秒). 执行号:602.
SQL> 

使用user1用户,测试在hiv表空间建表,插入数据。

[dmdba@dsc3 bin]$ ./disql user1/user11234

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.168(ms)
disql V8
SQL> desc t1;       

行号     NAME TYPE$       NULLABLE
---------- ---- ----------- --------
1          ID   INTEGER     Y
2          NAME VARCHAR(40) Y
3          AGE  INTEGER     Y

已用时间: 64.130(毫秒). 执行号:700.
SQL> 
SQL> insert into t1 values(1,'CHENLINLONG',20);
连接丢失

在表空间写入数据时,导致数据服务宕机,数据库中任然存在不一致问题。

继续处理存在的问题

查看用户默认的表空间
SQL> select username,default_tablespace from dba_users;

行号     USERNAME   DEFAULT_TABLESPACE
---------- ---------- ------------------
1          SYSSSO     SYSTEM
2          USER1      HIV
3          SYSDBA     MAIN
4          SYS        SYSTEM
5          SYSAUDITOR SYSTEM


已用时间: 24.271(毫秒). 执行号:503.

删除hiv表空间上对应的用户及hiv表空间

SQL> drop user user1 cascade;
SQL> drop tablespace hiv;

重新创建hiv表空间 及创建用户等

SQL> create tablespace hiv datafile '/dmdata/DAMENG/hiv_01.dbf' size 512 autoextend on;
操作已执行
已用时间: 48.577(毫秒). 执行号:508.
SQL> 
重新创建用户,并指定用户默认表空间为hiv
SQL> create user user1 identified by user11234 default tablespace hiv;
操作已执行
已用时间: 19.690(毫秒). 执行号:509.
SQL> 

使用user1用户,测试在hiv表空间建表,插入数据。


[dmdba@dsc3 bin]$ ./disql user1/user11234

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 2.719(ms)
disql V8
SQL> create table t1(id int,name varchar(40),age int);
操作已执行
已用时间: 29.895(毫秒). 执行号:600.
SQL> insert into t1 values(1,'XIANMING',20);
影响行数 1

已用时间: 3.766(毫秒). 执行号:601.
SQL> select * from t1;

行号     ID          NAME     AGE        
---------- ----------- -------- -----------
1          1           XIANMING 20

已用时间: 1.901(毫秒). 执行号:602.
SQL> commit;
操作已执行
已用时间: 1.158(毫秒). 执行号:603.
SQL> 

表空间损坏问题处理完成,但是这样操作会造成数据丢失,数据丢失是企业不能接受的,因此,数据备份,是dba的重中之重。

更多资讯请上达梦技术社区了解:https://eco.dameng.com

<think>嗯,用户询问的是达梦数据库表空间数据文件过大的影响。这个问题涉及到数据库物理存储管理的核心知识,需要结合达梦特有的架构来分析。 从用户提问的措辞来看,ta应该是有一定数据库管理经验的DBA或运维人员,更关注实际运维中的性能问题而非理论概念。用户特别强调"过大"这个关键词,说明可能遇到了存储空间告警或性能下降的实际问题。 参考站内资料,有三个关键点需要特别注意:首先是达梦独特的页簇结构设计,页大小直接影响物理存储效率[^3];其次是数据文件位置管理的重要性,错误位置会影响性能[^2];最后是页大小对表空间的深层影响[^1]。这些都需要融入回答。 关于数据文件过大的具体影响,可以从四个维度展开:首先是I/O性能,大文件会导致磁盘寻道时间增加,特别是HDD环境下更明显;其次是备份恢复的可行性,超大文件可能超出备份工具处理能力;然后是资源占用问题,文件扩展时可能长时间锁定系统资源;最后是空间管理难度,单个超大文件故障影响范围更大。 在回答时需要强调达梦的特殊性:比如页大小不可更改的特性[^3],以及簇大小与页大小的乘积效应[^1]。还要给出可操作的解决方案,比如分文件存储、定期归档等实用技巧。 用户可能没意识到但很重要的是文件位置规划,引用[2]显示错误位置会导致管理混乱,这点需要特别提醒。最后补充监控建议时,要具体说明如何查看v$datafile等系统视图。 这个问题其实还隐含了预防性管理的需求,所以补充相关问题时要覆盖容量规划、性能优化等方向,帮助用户建立系统化认知。</think>在达梦数据库中,表空间数据文件过大可能带来多方面的影响,需要谨慎管理: ### 一、主要负面影响 1. **I/O 性能下降** - **磁盘寻道效率降低**:操作系统对超大文件的读写需更频繁移动磁头(HDD场景尤甚),增加寻道时间。 - **内存压力增大**:达梦以页(默认 8KB)为最小操作单位,数据文件过大时,频繁访问热点数据需加载更多非必要页到内存,挤占缓冲池空间。 - **检查点延迟**:检查点需刷新脏页到磁盘,大文件导致写入耗时增加,可能阻塞正常事务。 2. **备份与恢复困难** - **备份时间显著增长**:物理备份需扫描整个文件,即使部分数据未修改。 - **恢复风险增加**:单文件损坏可能导致更大范围数据丢失(需结合备份策略评估)。 - **存储成本上升**:备份集占用空间与数据文件正相关。 3. **运维操作阻塞** - **文件扩展耗时**:`AUTOEXTEND` 触发时,大文件扩展可能因连续分配磁盘空间而延迟。 - **维护窗口延长**:表空间重组、数据迁移等操作时间与文件大小成正比。 4. **空间管理僵化** - **存储碎片利用不足**:即使表空间存在大量空闲块,新增对象仍优先扩展数据文件,而非复用空闲空间。 - **单点故障影响扩大**:单个损坏的数据文件可能影响更多业务表。 --- ### 二、达梦数据库的特殊考量 1. **页大小不可更改** 达梦页大小(4K/8K/16K/32K)在**数据库初始化时确定且无法修改**[^3]。若页大小设置过小: ```sql -- 初始化数据库时指定页大小(默认为8K) ./dminit path=/dm/data PAGE_SIZE=16 ``` 会导致大字段(如 `BLOB`)或行溢出时,需更多页存储相同数据量,间接加剧文件膨胀。 2. **簇大小与文件分配** 簇是物理存储最小单元,大小为 **页大小 × 簇大小(默认16)**。例如: - 页大小=8K 时,簇大小=128KB - 页大小=32K 时,簇大小=512KB 更大的页/簇设置虽提升单次I/O效率,但可能导致**空间浪费**(小表占用完整簇)[^1]。 --- ### 三、优化建议 1. **分拆数据文件** 将表空间拆分为多个较小文件(如 32GB/个),分散I/O压力: ```sql ALTER TABLESPACE tbs_name ADD DATAFILE '/dm/data/tbs02.dbf' SIZE 32768; ``` 2. **启用自动扩展限制** 设置文件上限避免无限增长: ```sql ALTER DATABASE DATAFILE '/dm/data/tbs01.dbf' AUTOEXTEND ON MAXSIZE 32768M; ``` 3. **定期归档与清理** - 对历史数据使用`PARTITION BY RANGE`分区,定期`DROP PARTITION`释放空间。 - 启用`FLASHBACK`功能避免误删,减少备份依赖。 4. **监控文件位置与状态** 定期检查避免文件误放低速盘(如引用[^2]中的位置错误): ```sql SELECT PATH, STATUS, TOTAL_SIZE FROM V$DATAFILE; -- 查看文件路径与大小 ``` > **关键提示**:达梦数据库的页大小和簇大小需在**初始化时谨慎规划**[^3][^1],后期无法调整。若已存在过大文件,建议在业务低峰期分拆迁移,避免在线操作影响业务连续性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值