注册
DM表空间和数据文件管理
专栏/技术分享/ 文章详情 /

DM表空间和数据文件管理

打工人小赵 2025/07/25 259 0 0
摘要

1 系统表空间

初始化 DM 数据库时,系统默认生成以下 5 个基础表空间:
image.png

1.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;

image.png

调整临时表空间大小

SELECT * FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'TEMP';
ALTER TABLESPACE TEMP RESIZE DATAFILE '/dbdata/dmdata/DMTEST/TEMP.DBF' TO 2048;

1.2ROLL 表空间管理

ROLL 表空间用于事务回滚,是数据库事务完整性和恢复能力的基础。
查看信息

SELECT * FROM DBA_TABLESPACES WHERE CONTENTS = 'UNDO';
SELECT * FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'ROLL';

调整ROLL 表空间大小

ALTER TABLESPACE ROLL RESIZE DATAFILE '/dbdata/dmdata/DMTEST/ROLL.DBF' TO 300;
  • 相关参数(UNDO_RETENTION)
    如果 UNDO_RETENTION 参数设置过大,可能导致 ROLL 表空间需要占用更多的存储空间来保存大量未被清理的回滚信息。此外,在事务频繁操作的情况下,过多的回滚信息可能会对数据库的性能产生一定影响,如增加存储 I/O 压力、影响事务的执行效率等。生产环境建议将UNDO_RETENTION参数设置为900。
查询数据库当前参数值:
select para_value from v$dm_ini where para_name='UNDO_RETENTION';
修改方式(在线动态生效):
SP_SET_PARA_DOUBLE_VALUE(1,'UNDO_RETENTION',900);

1.3MAIN 表空间管理
在实际业务场景中,往往在项目初期将所有业务表默认创建在MAIN 表空间中。随着系统逐步规范化,开始创建自定义表空间并将业务表迁移至独立表空间后,MAIN 表空间的数据文件仍可能保持较大的物理尺寸,未能自动释放已空闲的空间。从 DM8 v8.1.2.138 版本开始,系统支持对MAIN 表空间的数据文件进行缩容操作,有助于释放未使用的磁盘空间。

  • 缩小数据文件大小(前提:文件存在足够空闲空间)
    对于 MAIN 表空间,可以使用 ALTER TABLESPACE 语句的 RESIZE 子句来尝试缩小其大小,但只能缩小空闲部分的空间,且缩小之后的空间不能小于实际的数据量大小。例如,如果 MAIN 表空间总大小为 500MB,已使用空间为 300MB,那么通过 RESIZE 操作最多只能将表空间缩小到 300MB。
ALTER TABLESPACE MAIN RESIZE DATAFILE '/dbdata/dmdata/DMTEST/MAIN.DBF' TO 128;

注意:数据文件的最小允许值为页大小 × 4096(通常为 128MB)。

2自定义表空间

为提升管理灵活性和性能,提升安全性,建议业务系统使用自定义表空间。

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;
说明:
创建用户未指定表空间,默认为MAIN表空间
创建用户未指定索引表空间,默认为SYSTEM表空间

3表空间迁移操作

迁移历史数据至新表空间的典型步骤如下:

创建新表空间
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;

4常用表空间管理语句汇总

查询表空间数据文件信息,数据文件路径名称、自动扩展、最大扩展
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;

5数据文件路径修改

5.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%';
  • 转储控制文件
[dmdba@localhost bin]$ ./dmctlcvt TYPE=1 SRC=/dbdata/dmdata/DMTEST/dm.ctl DEST=/dbbak/dmbak/dmctl.txt
DMCTLCVT V8
convert ctl to txt success!
  • 转储控制文本文件为二进制
[dmdba@localhost bin]$ ./dmctlcvt TYPE=2 SRC=/dbbak/dmbak/dmctl.txt DEST=/dbdata/dmdata/DMTEST/dmnew.ctl
DMCTLCVT V8
convert txt to ctl success!

5.2数据文件迁移
在磁盘满的情况下,需要将数据文件迁移至新磁盘。不同类型的数据文件修改方式不同:

  • 普通表空间路径修改
    必须先将表空间脱机
SQL> ALTER TABLESPACE USERS OFFLINE;
executed successfully
used time: 121.761(ms). Execute id is 32709.
SQL> ALTER TABLESPACE USERS RENAME DATAFILE '/dbdata/dmdata/DMTEST/USERS.DBD' TO '/dbdata/dmdata/DMTEST/USERS.DBF';
executed successfully
used time: 00:00:40.258. Execute id is 32710.
SQL> ALTER TABLESPACE USERS ONLINE;
executed successfully
used time: 30.752(ms). Execute id is 32711.

日志信息
2025-07-24 21:10:40.289 [INFO] database P0000007791 T0000000000000049527  backup control file /dbdata/dmdata/DMTEST/dm.ctl to file /dbdata/dmdata/DMTEST/dm_20250724211040_288821.ctl
2025-07-24 21:10:40.291 [INFO] database P0000007791 T0000000000000049527  backup control file /dbdata/dmdata/DMTEST/dm.ctl to file /dbdata/dmdata/DMTEST/ctl_bak/dm_20250724211040_290287.ctl succeed
2025-07-24 21:11:26.149 [INFO] database P0000007791 T0000000000000049527  ifun_rename_file_name->os_file_copy from [/dbdata/dmdata/DMTEST/USERS.DBD] to [/dbdata/dmdata/DMTEST/USERS.DBF]
2025-07-24 21:11:26.151 [INFO] database P0000007791 T0000000000000049527  backup control file /dbdata/dmdata/DMTEST/dm.ctl to file /dbdata/dmdata/DMTEST/dm_20250724211126_151573.ctl
2025-07-24 21:11:26.154 [INFO] database P0000007791 T0000000000000049527  backup control file /dbdata/dmdata/DMTEST/dm.ctl to file /dbdata/dmdata/DMTEST/ctl_bak/dm_20250724211126_153278.ctl succeed
2025-07-24 21:11:45.680 [INFO] database P0000007791 T0000000000000049527  ifun_altts_state_online ts[5] to_state[0]begin
2025-07-24 21:11:45.701 [INFO] database P0000007791 T0000000000000049527  ifun_altts_state_online ts[5] to_state[0] end
2025-07-24 21:11:45.706 [INFO] database P0000007791 T0000000000000049527  backup control file /dbdata/dmdata/DMTEST/dm.ctl to file /dbdata/dmdata/DMTEST/dm_20250724211145_702442.ctl
2025-07-24 21:11:45.708 [INFO] database P0000007791 T0000000000000049527  backup control file /dbdata/dmdata/DMTEST/dm.ctl to file /dbdata/dmdata/DMTEST/ctl_bak/dm_20250724211145_707696.ctl succeed
  • 系统表空间与 ROLL 表空间路径修改(需关闭数据库)
    因为SYSTEM系统表空间、ROLL回滚表空间不允许脱机,系统表空间和ROLL表空间数据文件的路径修改只能通过修改控制文件中对应数据文件的路径来完成。
SQL> ALTER TABLESPACE roll OFFLINE;
ALTER TABLESPACE roll OFFLINE;
[-3409]:Error in line: 1
tablespace [ROLL] can not offline.
used time: 87.540(ms). Execute id is 0.
SQL> ALTER TABLESPACE system OFFLINE;
ALTER TABLESPACE system OFFLINE;
[-3409]:Error in line: 1
tablespace [SYSTEM] can not offline.
used time: 133.622(ms). Execute id is 0.

DM控制文件是二进制文件,无法直接编辑,需要使用dmctlcvt工具转换为文本文件后编辑。注意,修改系统表空间、UNDO表空间需要手工拷贝文件,为保持数据一致性,需要关闭数据库,再拷贝数据文件。具体操作步骤如下:1.执行dmctlcvt help可查看该命令的使用帮助。

  1. 执行dmctlcvt help可查看该命令的使用帮助
[dmdba@localhost DMTEST]$ dmctlcvt help
DMCTLCVT V8
version: 03134284194-20241022-246636-20108 Pack26

Format:  ./dmctlcvt KEYWORD=value
Note:    ctl file name must be dm.ctl or dmmpp.ctl or dss.ctl

Keyword             Explanation
--------------------------------------------------------------------------------
TYPE                1 convert ctl file(dm.ctl or dmmpp.ctl or dss.ctl) to txt file
                    2 convert txt file to ctl file(dm.ctl or dmmpp.ctl or dss.ctl)
SRC                 Source file
DEST                Destination file
DCR_INI             the path of dmdcr.ini
HELP                Show this help info

Example:
./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
  1. 执行如下命令,将控制文件dm.ctl转换为文本文件dmctl.txt
[dmdba@localhost DMTEST]$ dmctlcvt TYPE=1 SRC=/dbdata/dmdata/DMTEST/dm.ctl DEST=/dbbak/dmbak/dmctl.txt
DMCTLCVT V8
convert ctl to txt success!
  1. 修改文本文件中数据文件路径执行
    vi dmctl.txt编辑生成的文本文件,修改系统表空间、ROLL表空间数据文件路径为新的路径,如修改为/dbbak/dmbak/文件夹。
fil_path=/dbbak/dmbak/ROLL.DBF
  1. 将修改后的文本文件转换为目标控制文件
    将修改后的文本文件dmctl.txt转换为新的控制文件dmnew.ctl:
[dmdba@localhost DMTEST]$ dmctlcvt TYPE=2 SRC=/dbbak/dmbak/dmctl.txt DEST=/dbdata/dmdata/DMTEST/dmnew.ctl
DMCTLCVT V8
convert txt to ctl success!
[dmdba@localhost DMTEST]$ strings /dbdata/dmdata/DMTEST/dmnew.ctl
DMTEST
SYSTEM
/dbbak/dmbak/SYSTEM.DBF
ROLL
/dbbak/dmbak/ROLL.DBF
RLOG
/dbdata/dmdata/DMTEST/DMTEST01.log
/dbdata/dmdata/DMTEST/DMTEST02.log
MAIN
/dbdata/dmdata/DMTEST/MAIN.DBF
/dbdata/dmdata/DMTEST/HMAIN
USERS
NORMAL
/dbdata/dmdata/DMTEST/USERS.DBF
IDX_USERS
NORMAL
/dbdata/dmdata/DMTEST/dbdata/dmdata/DMTEST/idx_USERS.DBF
BOOKSHOP
NORMAL
/dbdata/dmdata/DMTEST/BOOKSHOP.DBF

5.关闭数据库,复制数据文件到新的路径
关闭数据库,复制SYSTEM.DBF和ROLL.DBF到新的数据文件路径/dbbak/dmbak/,复制完成后,将新的控制文件重命名覆盖原来的控制文件。完成后启动数据库,重新查询dba_data_files视图,可以看到系统表空间和ROLL表空间文件路径已修改。

[dmdba@localhost DMTEST]$ DmServiceDMTEST stop
Stopping DmServiceDMTEST:                                  [ OK ]
[dmdba@localhost DMTEST]$ ls
bak           ctl_bak  dmarch.ini  dm.ini        dminit20250721200833.log  dm_service.prikey  DMTEST02.log  MAIN.DBF  sqllog.ini  TEMP.DBF  USERS.DBF
BOOKSHOP.DBF  dbdata   dm.ctl      dm.ini.dmbak  dmnew.ctl                 DMTEST01.log       HMAIN         ROLL.DBF  SYSTEM.DBF  trace
[dmdba@localhost DMTEST]$ mv ROLL.DBF /dbbak/dmbak/ROLL.DBF
[dmdba@localhost DMTEST]$ mv SYSTEM.DBF /dbbak/dmbak/SYSTEM.DBF
[dmdba@localhost DMTEST]$ mv dmnew.ctl dm.ctl
[dmdba@localhost DMTEST]$ DmServiceDMTEST start
Starting DmServiceDMTEST:                                  [ OK ]

SELECT TABLESPACE_NAME,FILE_NAME,BYTES,STATUS,AUTOEXTENSIBLE,MAXBYTES FROM DBA_DATA_FILES;

image.png

  • TEMP 表空间路径修改
    修改 dm.ini 中的 TEMP_PATH 参数后重启数据库即可:TEMP_PATH = /dm/data/DAMENG/NEW
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服