在达梦数据库(DM)中,表空间作为数据库的逻辑存储结构,扮演着至关重要的角色。它不仅是各类数据库对象(如表、索引等)逻辑存放的容器,更通过数据文件实现底层的物理存储。无论是系统自动创建的基础表空间,还是用户根据业务需求定制的表空间,均在数据库性能保障与稳定性支撑中发挥着关键作用。随着业务不断扩展,表空间及其数据文件的合理管理与优化配置,已成为保障数据库高效、平稳运行的重要一环。
本文将详细介绍达梦数据库表空间的管理方法和实操建议。
系统表空间
初始化 DM 数据库时,系统默认生成以下 5 个基础表空间:
表空间名称 | 功能说明 |
SYSTEM | 存放数据库的数据字典信息,不允许用户创建表或索引。 |
ROLL | 自动用于事务回滚操作,提供读一致性视图,完全由系统维护。 |
MAIN | 默认用户数据表空间,在未指定默认表空间时系统使用此表空间。 |
TEMP | 处理排序、临时表、中间结果等需要磁盘空间的操作,由系统维护。 |
HMAIN | HUGE 表默认表空间,用于处理大数据量表结构,由系统自动维护。 |
1. 临时表空间管理
TEMP 表空间完全由 DM 数据库自动维护。当用户的 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP 表空间。
查看表空间使用率
SELECT a.tablespace_name "表空间名称",
total / (1024 * 1024) "表空间大小(M)",
free / (1024 * 1024) "表空间剩余大小(M)",
(total - free) / (1024 * 1024 ) "表空间使用大小(M)",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name;
调整临时表空间大小
SELECT * FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'TEMP';
ALTER TABLESPACE TEMP RESIZE DATAFILE '/dmdata/DAMENG/temp_01.dbf' TO 2048;
2. ROLL 表空间管理
ROLL 表空间用于事务回滚,是数据库事务完整性和恢复能力的基础。
查看信息
SELECT * FROM DBA_TABLESPACES WHERE CONTENTS = 'UNDO';
SELECT * FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'ROLL';
调整ROLL 表空间大小
SELECT * FROM DBA_TABLESPACES WHERE CONTENTS = 'UNDO';SELECT * FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'ROLL';
相关参数(UNDO_RETENTION)
如果 UNDO_RETENTION 参数设置过大,可能导致 ROLL 表空间需要占用更多的存储空间来保存大量未被清理的回滚信息。此外,在事务频繁操作的情况下,过多的回滚信息可能会对数据库的性能产生一定影响,如增加存储 I/O 压力、影响事务的执行效率等。生产环境建议将UNDO_RETENTION参数设置为90。
查询数据库当前参数值:select para_value from v$dm_ini where para_name='UNDO_RETENTION';
修改方式(在线动态生效):
SP_SET_PARA_DOUBLE_VALUE(1,'UNDO_RETENTION',90);
3. MAIN 表空间管理
在实际业务场景中,一些开发人员由于对达梦数据库了解不深,往往在项目初期将所有业务表默认创建在MAIN 表空间中。随着系统逐步规范化,开始创建自定义表空间并将业务表迁移至独立表空间后,MAIN 表空间的数据文件仍可能保持较大的物理尺寸,未能自动释放已空闲的空间。
从 DM8 v8.1.2.138 版本开始,系统支持对MAIN 表空间的数据文件进行缩容操作,有助于释放未使用的磁盘空间。
查看表空间使用率
缩小数据文件大小(前提:文件存在足够空闲空间)
对于 MAIN 表空间,可以使用 ALTER TABLESPACE 语句的 RESIZE 子句来尝试缩小其大小,但只能缩小空闲部分的空间,且缩小之后的空间不能小于实际的数据量大小。例如,如果 MAIN 表空间总大小为 500MB,已使用空间为 300MB,那么通过 RESIZE 操作最多只能将表空间缩小到 300MB。
ALTER TABLESPACE MAIN RESIZE DATAFILE 'MAIN.DBF' TO 128;
注意:数据文件的最小允许值为页大小 × 4096(通常为 128MB)。
自定义表空间
为提升管理灵活性和性能,提升安全性,建议业务系统使用自定义表空间。
1. 创建表空间
CREATE TABLESPACE TEST DATAFILE 'TEST01.DBF' SIZE 128;
2. 表空间数据文件管理
-- 增加数据文件
ALTER TABLESPACE TEST ADD DATAFILE '/dmdata/DAMENG/TEST02.DBF' SIZE 500 AUTOEXTEND ON;
-- 缩容数据文件
ALTER TABLESPACE TEST RESIZE DATAFILE '/dmdata/DAMENG/TEST02.DBF' TO 128;
-- 开启/关闭自动扩展
ALTER TABLESPACE TEST DATAFILE '/dmdata/DAMENG/TEST02.DBF' AUTOEXTEND ON;
ALTER TABLESPACE TEST DATAFILE '/dmdata/DAMENG/TEST02.DBF' AUTOEXTEND OFF;
3. 生产环境自定义表空间管理策略
为业务系统账号创建独立的表空间:
-- 创建表空间
CREATE TABLESPACE PRODUCTION DATAFILE 'PRODUCTION.DBF' SIZE 128;
-- 创建业务用户
CREATE USER PRODUCTION IDENTIFIED BY "**";
ALTER USER PRODUCTION DEFAULT TABLESPACE PRODUCTION DEFAULT INDEX TABLESPACE PRODUCTION;
GRANT RESOURCE, VTI, SOI TO PRODUCTION;
表空间迁移操作
迁移历史数据至新表空间的典型步骤如下:
-- 创建新表空间
CREATE TABLESPACE CS_DATA DATAFILE 'CS_DATA01.DBF' SIZE 500 AUTOEXTEND ON;
CREATE TABLESPACE CS_INDEX DATAFILE 'CS_INDEX01.DBF' SIZE 500 AUTOEXTEND ON;
-- 修改用户默认表空间
ALTER USER CS DEFAULT TABLESPACE CS_DATA DEFAULT INDEX TABLESPACE CS_INDEX;
-- 迁移历史表
ALTER TABLE T_TEST MOVE TABLESPACE CS_DATA;
常用表空间管理语句汇总
-- 查询表空间数据文件信息,数据文件路径名称、自动扩展、最大扩展
SET PAGESIZE 100;
SELECT TABLESPACE_NAME,FILE_NAME,BYTES,STATUS,AUTOEXTENSIBLE,MAXBYTES FROM DBA_DATA_FILES;
-- 查询业务用户数据占用
SELECT owner, SUM(bytes/1024/1024) FROM dba_segments GROUP BY owner;
-- 查询页大小
SELECT * FROM v$DM_INI WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE';
ALTER TABLESPACE TEST CACHE = "KEEP"; -- 设置数据缓冲类型
ALTER TABLESPACE TEST CACHE = "NORMAL"; -- 将表空间缓存策略恢复为标准模式
ALTER TABLESPACE TEST RENAME TO TEST01; -- 修改表空间名
ALTER TABLESPACE TEST OFFLINE; -- 设置为脱机
ALTER TABLESPACE TEST ONLINE; -- 设置为联机
ALTER TABLESPACE TEST CORRUPT; -- 设置为损坏状态(仅限OFFLINE)
DROP TABLESPACE IF EXISTS TEST; -- 删除表空间(不存在也不会报错)
--表空间使用率
SELECT a.tablespace_name "表空间名称",
total / (1024 * 1024) "表空间大小(M)",
free / (1024 * 1024) "表空间剩余大小(M)",
(total - free) / (1024 * 1024 ) "表空间使用大小(M)",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name;
数据文件路径修改实操
1. 控制文件
达梦数据库的控制文件 dm.ctl 是一个二进制文件,记录了数据库的必要初始信息,其中包括数据文件的路径等信息。数据文件是数据库存储数据的物理文件,而控制文件则是数据库管理数据文件的关键依据。
当需要修改数据文件路径时,不仅要将数据文件实际移动到新的位置,还需要同步修改 dm.ctl 控制文件中对应的数据文件路径信息,以确保数据库能够正确识别和访问数据文件。否则,数据库启动时会因无法找到数据文件而报错,导致数据库无法正常运行。
查看控制文件信息
select para_name,para_value from v$dm_ini where para_name='CTL_PATH';
select name,type,value,default_value,isdefault from v$parameter where name like '%CTL%';
转储控制文件
dmctlcvt TYPE=1 SRC=/dmdata/DAMENG/dm.ctl DEST=/dmbak/dmctl.txt
转储控制文本文件为二进制
dmctlcvt TYPE=2 SRC=/dmbak/dmctl.txt DEST=/dmdata/DAMENG/dmnew.ctl
2. 数据文件迁移
在磁盘满的情况下,需要将数据文件迁移至新磁盘。不同类型的数据文件修改方式不同:
普通表空间路径修改
必须先将表空间脱机:
ALTER TABLESPACE TEST OFFLINE;
ALTER TABLESPACE TEST RENAME DATAFILE '/dmdata/DAMENG/TEST01.DBF' TO '/dmdata/DAMENG/TBS/TEST01.DBF';
ALTER TABLESPACE TEST ONLINE;
系统表空间与 ROLL 表空间路径修改(需关闭数据库)
因为SYSTEM系统表空间、ROLL回滚表空间不允许脱机,系统表空间和ROLL表空间数据文件的路径修改只能通过修改控制文件中对应数据文件的路径来完成。
DM控制文件是二进制文件,无法直接编辑,需要使用dmctlcvt工具转换为文本文件后编辑。注意,修改系统表空间、UNDO表空间需要手工拷贝文件,为保持数据一致性,需要关闭数据库,再拷贝数据文件。具体操作步骤如下:
1. 执行dmctlcvt help可查看该命令的使用帮助。如下图所示:
2. 执行如下命令,将控制文件dm.ctl转换为文本文件dmctl.txt :
dmctlcvt type=1 src=/dmdata/DAMENG/dm.ctl dest=/dmdata/DAMENG/dmctl.txt
3. 修改文本文件中数据文件路径
执行vi dmctl.txt编辑生成的文本文件,修改系统表空间、ROLL表空间数据文件路径为新的路径,如修改为/dmdata/DAMENG/TBS文件夹。
4. 将修改后的文本文件转换为目标控制文件
执行如下命令,将修改后的文本文件dmctl.txt转换为新的控制文件dmnew.ctl:
dmctlcvt type=2 src=/dmdata/DAMENG/dmctl.txt dest=/dmdata/DAMENG/dmnew.ctl
5. 关闭数据库,复制数据文件到新的路径
关闭数据库,复制SYSTEM.DBF和ROLL.DBF到新的数据文件路径/dm/dataDAMENG/TBS,复制完成后,将新的控制文件重命名覆盖原来的控制文件。完成后启动数据库,重新查询dba_data_files视图,可以看到系统表空间和ROLL表空间文件路径已修改。如下图:
TEMP 表空间路径修改
修改 dm.ini 中的 TEMP_PATH 参数后重启数据库即可:
TEMP_PATH = /dm/data/DAMENG/NEW