达梦数据库数据文件迁移必须要求相对应的表空间处于脱机(offline)状态,关于达梦数据库表空间管理,可以参考https://www.modb.pro/db/60757,达梦数据库中system、sysaux、temp、roll等表空间不能进行offline操作,也就是说,system、sysaux、temp、roll表空间下的数据文件,在数据库初始化完成以后,要更改数据文件目录,就是一件比较麻烦的事情了,所以在数据库上线初期,一定要规划好数据文件的存放路径。
但是,可以修改用户自己创建的表空间以及main等表空间的数据文件存放路径,以下我们就以实际过程来演示将表空间dm_dba下的数据文件C:\dmdbms\data\DAMENG\dm_dba01.dbf迁移并重命名为C:\dmdbms\data\dm_dba_move01.db的过程。
1、查看当前数据库表空间及数据文件信息
SQL> select tablespace_name,file_name,status from dba_data_files;
行号 TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ---------------------------------- ---------
1 SYSTEM C:\dmdbms\data\DAMENG\SYSTEM.DBF AVAILABLE
2 SYSAUX C:\dmdbms\data\DAMENG\SYSAWR.DBF AVAILABLE
3 DM_DBA C:\dmdbms\data\DAMENG\dm_dba01.dbf AVAILABLE
4 DM_TBS C:\dmdbms\data\DAMENG\dm_tbs01.dbf AVAILABLE
5 DMHR C:\dmdbms\data\DAMENG\DMHR.DBF AVAILABLE
6 BOOKSHOP C:\dmdbms\data\DAMENG\BOOKSHOP.DBF AVAILABLE
7 MAIN C:\dmdbms\data\DAMENG\MAIN.DBF AVAILABLE
8 TEMP C:\dmdbms\data\DAMENG\TEMP.DBF AVAILABLE
9 ROLL C:\dmdbms\data\DAMENG\ROLL.DBF AVAILABLE
9 rows got
已用时间: 7.185(毫秒). 执行号:39.
SQL> select tablespace_name,status from dba_tablespaces;
行号 TABLESPACE_NAME STATUS
---------- --------------- -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 0
5 BOOKSHOP 0
6 DMHR 0
7 DM_TBS 0
8 DM_DBA 0
9 SYSAUX 0
10 HMAIN NULL
10 rows got
已用时间: 0.878(毫秒). 执行号:40.
SQL>
在这里,表空间的状态0为online,1为offline。
2、移动达梦数据库文件位置并确认迁移后信息
SQL> alter tablespace dm_dba rename datafile 'C:\dmdbms\data\DAMENG\dm_dba01.dbf
' to 'C:\dmdbms\data\dm_dba_move01.dbf';
alter tablespace dm_dba rename datafile 'C:\dmdbms\data\DAMENG\dm_dba01.dbf' to
'C:\dmdbms\data\dm_dba_move01.dbf';
第1 行附近出现错误[-3407]:表空间[DM_DBA]处于联机状态.
已用时间: 0.960(毫秒). 执行号:0.
SQL>
SQL> alter tablespace dm_dba offline;
操作已执行
已用时间: 108.964(毫秒). 执行号:41.
SQL> select tablespace_name,status from dba_tablespaces;
行号 TABLESPACE_NAME STATUS
---------- --------------- -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 0
5 BOOKSHOP 0
6 DMHR 0
7 DM_TBS 0
8 DM_DBA 1
9 SYSAUX 0
10 HMAIN NULL
10 rows got
已用时间: 3.927(毫秒). 执行号:42.
SQL> alter tablespace dm_dba rename datafile 'C:\dmdbms\data\DAMENG\dm_dba01.dbf
' to 'C:\dmdbms\data\dm_dba_move01.dbf';
操作已执行
已用时间: 99.642(毫秒). 执行号:43.
SQL> alter tablespace dm_dba online;
操作已执行
已用时间: 38.549(毫秒). 执行号:44.
SQL> select tablespace_name,status from dba_tablespaces;
行号 TABLESPACE_NAME STATUS
---------- --------------- -----------
1 SYSTEM 0
2 ROLL 0
3 TEMP 0
4 MAIN 0
5 BOOKSHOP 0
6 DMHR 0
7 DM_TBS 0
8 DM_DBA 0
9 SYSAUX 0
10 HMAIN NULL
10 rows got
已用时间: 0.688(毫秒). 执行号:45.
SQL> select tablespace_name,file_name,status from dba_data_files;
行号 TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ---------------------------------- ---------
1 SYSTEM C:\dmdbms\data\DAMENG\SYSTEM.DBF AVAILABLE
2 SYSAUX C:\dmdbms\data\DAMENG\SYSAWR.DBF AVAILABLE
3 DM_DBA C:\dmdbms\data\dm_dba_move01.dbf AVAILABLE
4 DM_TBS C:\dmdbms\data\DAMENG\dm_tbs01.dbf AVAILABLE
5 DMHR C:\dmdbms\data\DAMENG\DMHR.DBF AVAILABLE
6 BOOKSHOP C:\dmdbms\data\DAMENG\BOOKSHOP.DBF AVAILABLE
7 MAIN C:\dmdbms\data\DAMENG\MAIN.DBF AVAILABLE
8 TEMP C:\dmdbms\data\DAMENG\TEMP.DBF AVAILABLE
9 ROLL C:\dmdbms\data\DAMENG\ROLL.DBF AVAILABLE
9 rows got
已用时间: 1.862(毫秒). 执行号:46.
SQL>
可以看到,当表空间在online状态是,是不允许进行数据文件迁移的。而且需要注意的是,在执行“alter tablespace dm_dba rename datafile 'C:\dmdbms\data\DAMENG\dm_dba01.dbf' to 'C:\dmdbms\data\dm_dba_move01.dbf';”语句完成之后,是不需要通过外部方式拷贝或者移动数据文件的,系统会自动将原来的数据文件移动到新的位置并完成重命名。
号外:可能有读者会通过想通过创建删除同属性的表空间或者添加数据文件再删除数据文件的方式,来间接实现迁移system、sysaux、temp、roll等表空间数据文件的位置,这是行不通的,目前达梦数据库语法不支持(版本dm8,也可能是笔者未找到相关资料,希望有办法的小伙伴可以评论区进行交流)。关于通过控制文件进行停机迁移系统表空间数据文件的方式可以参考