达梦数据库修改表空间数据文件位置

本文详细介绍了如何在达梦数据库中移动表空间的数据文件位置,包括在数据库运行时和停止服务时的两种方法。通过脱机、修改控制文件或直接移动文件、重新联机等步骤,确保数据文件迁移的同时保持数据完整性和服务正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于各种原因,有时需要修改数据库数据文件的位置

在达梦数据库中,可以通过以下方式移动表空间的数据文件位置。

 磁盘目录如下:

[dmdba@CentOS7 DAMENG]$ df -hl
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   27G  6.9G   21G   26% /
devtmpfs                 977M     0  977M    0% /dev
tmpfs                    993M     0  993M    0% /dev/shm
tmpfs                    993M  9.1M  984M    1% /run
tmpfs                    993M     0  993M    0% /sys/fs/cgroup
/dev/sdc1                9.8G   37M  9.2G    1% /data2
/dev/sdb1                9.8G  5.0G  4.3G   54% /data1
/dev/sda1               1014M  161M  854M   16% /boot
tmpfs                    199M   12K  199M    1% /run/user/42
tmpfs                    199M     0  199M    0% /run/user/0

创建表空间:

SQL> CREATE TABLESPACE "DMTEST" DATAFILE '/data1/DAMENG/DMTEST1.DBF' SIZE 128 AUTOEXTEND ON NEXT 100 MAXSIZE 10240, '/data1/DAMENG/DMTEST2.DBF' SIZE 128 AUTOEXTEND ON NEXT 100 MAXSIZE 10240 CACHE = NORMAL;
操作已执行
已用时间: 48.318(毫秒). 执行号:603.
SQL> CREATE TABLESPACE "DMTEST_IDX" DATAFILE '/data1/DAMENG/DMTEST_IDX.DBF' SIZE 128 AUTOEXTEND ON NEXT 100 MAXSIZE 10240 CACHE = NORMAL;
操作已执行
已用时间: 30.889(毫秒). 执行号:604.

创建用户,并指定默认表空间

SQL> CREATE USER "DMUSER" IDENTIFIED BY "Dameng123" LIMIT FAILED_LOGIN_ATTEMPS 3, PASSWORD_LOCK_TIME 1, PASSWORD_GRACE_TIME 10 DEFAULT TABLESPACE "DMTEST" DEFAULT INDEX TABLESPACE "DMTEST_IDX";
操作已执行
已用时间: 22.630(毫秒). 执行号:608.
SQL> GRANT "PUBLIC","RESOURCE","VTI" TO "DMUSER";
操作已执行
已用时间: 4.031(毫秒). 执行号:609.

切换为"DMUSER"用户,创建测试表,插入数据

SQL> conn DMUSER/Dameng123;

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.305(ms)
SQL> select user;

行号     USER()
---------- ------
1          DMUSER

已用时间: 3.300(毫秒). 执行号:700.
SQL> create table t1 (id int,name varchar2(10));
操作已执行
已用时间: 23.471(毫秒). 执行号:610.
SQL> insert into t1 values (1,'aa');
影响行数 1

已用时间: 1.078(毫秒). 执行号:611.
SQL> insert into t1 values (2,'bb');
影响行数 1

已用时间: 0.719(毫秒). 执行号:612.
SQL> insert into t1 values (3,'cc');
影响行数 1

已用时间: 0.877(毫秒). 执行号:613.
SQL> commit;
操作已执行
已用时间: 15.812(毫秒). 执行号:614.
SQL> select * from t1;

行号     ID          NAME
---------- ----------- ----
1          1           aa
2          2           bb
3          3           cc

已用时间: 1.418(毫秒). 执行号:615.

修改表空间的数据文件物理位置

方法一(数据库运行时):

1.将表空间脱机

(1)查看表空间信息

   a.查看表空间类型和状态(STATUS为0时是联机状态,为1时是脱机状态)

SQL> select tablespace_name,status,contents from dba_tablespaces;

行号     TABLESPACE_NAME STATUS      CONTENTS 
---------- --------------- ----------- ---------
1          SYSTEM          0           PERMANENT
2          ROLL            0           UNDO
3          TEMP            0           TEMPORARY
4          MAIN            0           PERMANENT
5          DMTEST          0           PERMANENT
6          DMTEST_IDX      0           PERMANENT
7          HMAIN           NULL        PERMANENT

7 rows got

已用时间: 2.579(毫秒). 执行号:902.

   b.查询表空间的路径

SQL> select file_id,file_name,tablespace_name from dba_data_files;

行号     FILE_ID     FILE_NAME                    TABLESPACE_NAME
---------- ----------- ---------------------------- ---------------
1          0           /data1/DAMENG/SYSTEM.DBF     SYSTEM
2          0           /data1/DAMENG/DMTEST_IDX.DBF DMTEST_IDX
3          1           /data1/DAMENG/DMTEST2.DBF    DMTEST
4          0           /data1/DAMENG/DMTEST1.DBF    DMTEST
5          0           /data1/DAMENG/MAIN.DBF       MAIN
6          0           /data1/DAMENG/TEMP.DBF       TEMP
7          0           /data1/DAMENG/ROLL.DBF       ROLL

7 rows got

已用时间: 160.184(毫秒). 执行号:903.

(2)当有事务未提交时,将表空间脱机时会报以下错误

SQL> ALTER TABLESPACE "DMTEST" OFFLINE;
ALTER TABLESPACE "DMTEST" OFFLINE;
[-6407]:锁超时.
已用时间: 00:00:12.020. 执行号:0.

(3)确保当前用户有修改表空间的权限,否则会报以下错误

SQL> ALTER TABLESPACE "DMTEST" OFFLINE;
ALTER TABLESPACE "DMTEST" OFFLINE;
第1 行附近出现错误[-5566]:没有修改表空间权限.
已用时间: 0.809(毫秒). 执行号:0.

(4)正常执行表空间脱机操作

SQL>  ALTER TABLESPACE "DMTEST" OFFLINE;
操作已执行
已用时间: 115.977(毫秒). 执行号:904.
SQL> select tablespace_name,status,contents from dba_tablespaces;

行号     TABLESPACE_NAME STATUS      CONTENTS 
---------- --------------- ----------- ---------
1          SYSTEM          0           PERMANENT
2          ROLL            0           UNDO
3          TEMP            0           TEMPORARY
4          MAIN            0           PERMANENT
5          DMTEST          1           PERMANENT
6          DMTEST_IDX      0           PERMANENT
7          HMAIN           NULL        PERMANENT

7 rows got

已用时间: 2.267(毫秒). 执行号:905.

2.修改表空间路径

SQL> alter tablespace "DMTEST" rename datafile '/data1/DAMENG/DMTEST1.DBF' to '/data2/DAMENG/DMTEST1.DBF';
操作已执行
已用时间: 00:00:03.706. 执行号:906.
SQL> select file_id,file_name,tablespace_name from dba_data_files;

行号     FILE_ID     FILE_NAME                    TABLESPACE_NAME
---------- ----------- ---------------------------- ---------------
1          0           /data1/DAMENG/SYSTEM.DBF     SYSTEM
2          0           /data1/DAMENG/DMTEST_IDX.DBF DMTEST_IDX
3          1           /data1/DAMENG/DMTEST2.DBF    DMTEST
4          0           /data2/DAMENG/DMTEST1.DBF    DMTEST
5          0           /data1/DAMENG/MAIN.DBF       MAIN
6          0           /data1/DAMENG/TEMP.DBF       TEMP
7          0           /data1/DAMENG/ROLL.DBF       ROLL

7 rows got

已用时间: 11.366(毫秒). 执行号:907.

3.将表空间联机

SQL> ALTER TABLESPACE "DMTEST" ONLINE;
操作已执行
已用时间: 29.277(毫秒). 执行号:910.
SQL> select tablespace_name,status,contents from dba_tablespaces;

行号     TABLESPACE_NAME STATUS      CONTENTS 
---------- --------------- ----------- ---------
1          SYSTEM          0           PERMANENT
2          ROLL            0           UNDO
3          TEMP            0           TEMPORARY
4          MAIN            0           PERMANENT
5          DMTEST          0           PERMANENT
6          DMTEST_IDX      0           PERMANENT
7          HMAIN           NULL        PERMANENT

7 rows got

已用时间: 1.012(毫秒). 执行号:911.

4.查看服务器上的数据文件位置是否移动

数据文件已经移动到了/data2/DAMENG/目录下

原/data1/DAMENG/目录下已经只剩DMTEST2.DBF数据文件

5.查看表数据正常

SQL> select * from t1;

行号     ID          NAME
---------- ----------- ----
1          1           aa
2          2           bb
3          3           cc

已用时间: 0.634(毫秒). 执行号:401.

方法二(停止数据库服务时):

1.停止数据库服务

[dmdba@CentOS7 bin]$ ./DmServiceDMSERVER stop
Stopping DmServiceDMSERVER:                                [ OK ]

2.修改数据库控制文件

(1)将数据库转换控制文件为文本文件

[dmdba@CentOS7 bin]$ ./dmctlcvt TYPE=1 SRC=/data1/DAMENG/dm.ctl DEST=/data1/DAMENG/dmctl.txt
DMCTLCVT V8
convert ctl to txt success!

(2)修改转换后的txt文件

a.打开txt文件可以发现DMTEST1.DBF已经在方法一中修改过了,DMTEST1.DBF和DMTEST2.DBF路径不同,本次修改DMTEST2.DBF的路径

b.修改后的DMTEST2.DBF路径如下

# file path
fil_path=/data2/DAMENG/DMTEST1.DBF
# mirror path
mirror_path=
# file id
fil_id=0
# whether the file is auto extend
autoextend=1
# file create time
fil_create_time=DATETIME '2021-2-21 14:24:53'
# file modify time
fil_modify_time=DATETIME '2021-2-21 15:2:15'
# the max size of file
fil_max_size=0
# next size of file
fil_next_size=0

# file path
fil_path=/data2/DAMENG/DMTEST2.DBF
# mirror path
mirror_path=
# file id
fil_id=1
# whether the file is auto extend
autoextend=1
# file create time
fil_create_time=DATETIME '2021-2-21 14:24:53'
# file modify time
fil_modify_time=DATETIME '2021-2-21 14:24:53'
# the max size of file
fil_max_size=10240
# next size of file
fil_next_size=100

(3)将数据库转换后的txt文本文件转换为控制文件

[dmdba@CentOS7 bin]$ ./dmctlcvt TYPE=2 SRC=/data1/DAMENG/dmctl.txt DEST=/data1/DAMENG/dm.ctl
DMCTLCVT V8
convert txt to ctl success!

3.使用Linux命令修改数据文件物理位置

[dmdba@CentOS7 ~]$ mv /data1/DAMENG/DMTEST2.DBF /data2/DAMENG/

4.启动数据库服务

[dmdba@CentOS7 bin]$ ./DmServiceDMSERVER start
Starting DmServiceDMSERVER:                                [ OK ]

5.查看表数据正常

SQL> select * from t1;

行号     ID          NAME
---------- ----------- ----
1          1           aa
2          2           bb
3          3           cc

已用时间: 0.336(毫秒). 执行号:402.

6.查看表空间信息

a.查询表空间的路径

b.查看表空间类型和状态

注意:临时表空间路径无法在数据库服务启动时修改,无法执行联机脱机操作。在数据库服务停止时,如果要修改临时表空间数据文件的路径,无需修改控制文件,因为在控制文件中并没有保存临时表空间的路径信息。临时表空间的路径信息在dm.ini中修改,在dm.ini中有一个参数为:TEMP_PATH,默认路径为数据库目录下

修改临时表空间路径直接修改dm.ini参数TEMP_PATH,修改完后重启数据库服务即可

### 如何在达梦数据库中创建表空间 #### 工具准备 为了顺利创建表空间,在操作前需确认已安装并配置好达梦数据库环境。通过命令行访问 `tool` 目录下的管理工具,输入相应密码即可进入管理界面[^1]。 #### 创建表空间的具体方法 以下是基于 SQL 的标准流程用于创建表空间: ```sql CREATE TABLESPACE 表空间名称 DATAFILE '文件存放路径/表空间文件名称.DBF' SIZE 32 AUTOEXTEND ON MAXSIZE 16777215 CACHE = NORMAL; ``` 上述语句中的参数解释如下: - **表空间名称**:自定义命名,建议具有描述性和唯一性。 - **DATAFILE**:指定存储数据的实际物理文件位置及其名称,注意文件扩展名为 `.DBF`。 - **SIZE**:初始分配大小,默认单位为 MB。 - **AUTOEXTEND ON**:允许自动扩展磁盘容量。 - **MAXSIZE**:设置最大可增长至的空间量。 - **CACHE = NORMAL**:缓存策略设定为常规模式。 完成以上步骤后,可以验证新建立的表空间是否存在以及其属性是否正确配置完毕[^2]。 #### 关联用户到新建表空间 一旦表空间被成功构建起来,则需要进一步关联它给特定用户作为默认工作区。这一步骤可通过下面这条指令实现: ```sql ALTER USER 用户名 DEFAULT TABLESPACE 表空间名; ``` 这里,“用户名”代表目标账户标识符;而“表空间名”,则是之前所创设的那个专属区域标签。 #### 注意事项 在整个过程中有几个要点需要注意避免常见失误: - 确认所有涉及路径均真实存在并且权限适当开放以便读写操作无障碍执行; - 特别留意文件格式问题——务必采用`.dbf`结尾的标准形式声明外部储存单元; - 调整内存限制数值(如遇到因默认值过低而导致失败的情况),通常情况下将其提升至至少匹配当前硬件条件支持的最大限度会有所帮助。 ```python # 示例 Python 连接脚本片段展示如何调用这些SQL命令 import dmPython conn = dmPython.connect(user='SYSDBA', password='sysdba', serverName='localhost') cursor = conn.cursor() try: cursor.execute(""" CREATE TABLESPACE my_tablespace DATAFILE '/path/to/data/my_tablespace.dbf' SIZE 32 AUTOEXTEND ON MAXSIZE 16777215 CACHE = NORMAL """) cursor.execute("CREATE USER test_user IDENTIFIED BY test_password;") cursor.execute("ALTER USER test_user DEFAULT TABLESPACE my_tablespace;") finally: cursor.close() conn.commit() # 提交事务以保存更改 conn.disconnect() ``` 此代码段仅作演示用途,实际部署时应考虑安全性加固措施比如加密传输敏感信息等最佳实践方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DB实践

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值