一 前言

在实际生产环境中,可能存在数据磁盘空间不足的情况,一般情况下,我们会通过增加新的磁盘来解决,当新磁盘增加完毕后,需要将原数据文件迁移一部分到新磁盘空间,以释放原数据磁盘的空间,本文主要阐述此种情况下数据文件的移动。

二 环境描述

操作系统版本:
[dmdba@dm3 ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.0 (Santiago)
数据库版本:
[dmdba@dm3 ~]$ disql sysdba/SYSDBA

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间: 60.654(毫秒)
disql V7.6.0.171-Build(2019.07.02-109059)ENT
SQL> select * from v$version;
行号     BANNER
---------- ---------------------------------------------------------------
1          DM Database Server x64 V7.6.0.171-Build(2019.07.02-109059)ENT
2          DB Version: 0x7000a
已用时间: 55.167(毫秒). 执行号:5.

三 数据文件迁移步骤

1、关闭数据库服务并通过dmctlcvt转换控制文件为文本文件;
2、拷贝数据文件到新的路径;
3、修改控制文件中数据文件的路径到新的路径并重建控制文件;
4、启动数据库服务

注意:如果是用户表空间的所有数据文件都更换了位置,也需要同时修改dm.ini中的数据文件的路径!!!

四 数据文件迁移过程

4.1 创建测试环境

创建如下表空间及用户用于数据文件迁移测试。
表空间:
create tablespace "SEMITER" datafile '/usr/appsoft/dmdbms/data/TEST/semiter01.dbf' size 128 CACHE = NORMAL;
表空间扩展:
alter tablespace "SEMITER" add datafile '/usr/appsoft/dmdbms/data/TEST/semiter02.dbf' size 128;
用户:
create user "SEMITER" identified by "semiter123" default tablespace "SEMITER";
角色与权限:
grant "DBA","PUBLIC","RESOURCE" to "SEMITER";
alter user "SEMITER" limit failed_login_attemps unlimited, pa$$word_lock_time unlimited, pa$$word_grace_time unlimited;
表空间SEMITER中有两个数据文件,semiter01.dbf和semiter02.dbf,我们将迁移semiter02.dbf到新的目录/usr/appsoft/dmdbms/data下。
迁移前数据文件路径如下:
SQL> select t.name tablespace_name,t.id file_id,d.path file_name,d.total_size*SF_GET_PAGE_SIZE()/1024/1024||'M' total_space from v$tablespace t, v$datafile d where t.id=d.group_id and t.name='SEMITER';

行号     tablespace_name file_id     file_name                                    total_space
---------- --------------- ----------- -------------------------------------------- -----------
1          SEMITER         5           /usr/appsoft/dmdbms/data/TEST/semiter02.dbf 128M
2          SEMITER         5           /usr/appsoft/dmdbms/data/TEST/semiter01.dbf 128M

已用时间: 2.918(毫秒). 执行号:19.
SQL>

4.2 关闭实例并转换控制文件为文本文件

1.关闭数据库实例:
[root@dm3 data]# /etc/init.d/DmServiceTEST stop
Stopping DmServiceTEST: [ OK ]
2.转换控制文件
[dmdba@dm3 usr]$ dmctlcvt type=1 src=/usr/appsoft/dmdbms/data/TEST/dm.ctl dest=/tmp/semiter.txt
DMCTLCVT V7.6.0.171-Build(2019.07.02-109059)ENT
convert ctl to txt succe$$!

4.3 拷贝数据文件到新的路径

[dmdba@dm3 TEST]$ pwd
/usr/appsoft/dmdbms/data/TEST
[dmdba@dm3 TEST]$ mv semiter02.dbf ../

4.4 修改文本文件中数据文件路径到新路径并重建控制文件

[dmdba@dm3 IESDB]$ cat /tmp/semiter.txt |grep semiter02.dbf
fil_path=/usr/appsoft/dmdbms/data/semiter02.dbf

[dmdba@dm3 IESDB]$ dmctlcvt type=2 src=/tmp/semiter.txt dest=/usr/appsoft/dmdbms/data/IESDB/dm.ctl
DMCTLCVT V7.6.0.171-Build(2019.07.02-109059)ENT
convert txt to ctl succe$$!
[dmdba@dm3 IESDB]$

4.5 启动数据库并进行验证

[dmdba@dm3 IESDB]$ /etc/init.d/DmServiceIESDB start
Starting DmServiceIESDB:                                   [ OK ]

SQL> select t.name tablespace_name,t.id file_id,d.path file_name,d.total_size*SF_GET_PAGE_SIZE()/1024/1024||'M' total_space from v$tablespace t, v$datafile d where t.id=d.group_id and t.name='SEMITER';

行号     tablespace_name file_id     file_name                                    total_space
---------- --------------- ----------- -------------------------------------------- -----------
1          SEMITER         5           /usr/appsoft/dmdbms/data/semiter02.dbf       128M
2          SEMITER         5           /usr/appsoft/dmdbms/data/IESDB/semiter01.dbf 128M

已用时间: 9.828(毫秒). 执行号:4.

从上面的输出中可以明显看到,semiter02.dbf的路径已经更改,至此我们就完成了达梦数据库下数据文件路径的修改。