初始化 DM 数据库时,系统默认生成以下 5 个基础表空间:
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 '/dbdata/dmdata/DMTEST/TEMP.DBF' TO 2048;
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;
查询数据库当前参数值:
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 表空间的数据文件进行缩容操作,有助于释放未使用的磁盘空间。
ALTER TABLESPACE MAIN RESIZE DATAFILE '/dbdata/dmdata/DMTEST/MAIN.DBF' TO 128;
注意:数据文件的最小允许值为页大小 × 4096(通常为 128MB)。
为提升管理灵活性和性能,提升安全性,建议业务系统使用自定义表空间。
CREATE TABLESPACE TEST DATAFILE ‘TEST01.DBF’ SIZE 128;
增加数据文件
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;
为业务系统账号创建独立的表空间:
创建表空间
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表空间
迁移历史数据至新表空间的典型步骤如下:
创建新表空间
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;
数据库的控制文件 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
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可查看该命令的使用帮助。
[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
[dmdba@localhost DMTEST]$ dmctlcvt TYPE=1 SRC=/dbdata/dmdata/DMTEST/dm.ctl DEST=/dbbak/dmbak/dmctl.txt
DMCTLCVT V8
convert ctl to txt success!
fil_path=/dbbak/dmbak/ROLL.DBF
[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;
文章
阅读量
获赞