在实际业务中,我们有时会遇到磁盘满了的情况,此时就需要转移数据文件到新挂载的磁盘下面,这就是数据文件的路径修改。数据文件的路径修改包含普通表空间、系统表空间、TEMP表空间和ROLL回滚表空间的数据文件,及重做日志文件等,下面分情况讲解。
普通表空间数据文件路径修改
普通表空间只能在脱机状态下才能修改数据文件的路径,所以我们在修改普通表空间的数据文件路径前,需要查询数据文件所在的表空间信息。
(1)查询表空间和数据文件信息
使用如下SQL语句查询表空间和数据文件信息:
select a.file_name,a.file_id,a.tablespace_name,a.status,a.bytes
from dba_data_files a
order by a.tablespace_name,a.file_id;
查询结果如下:
(2)修改数据文件路径信息
假如我们需要修改TBS普通表空间的两个数据文件到TBS文件夹下(需保证TBS文件夹存在),此时可以使用如下SQL语句,操作步骤如下:
①将数据文件所在的表空间脱机:
alter tablespace TBS offline;
②修改数据文件路径:
alter tablespace TBS rename datafile'/dm/data/DAMENG/TBS01.dbf'
to'/dm/data/DAMENG/TBS/TBS01.dbf';
alter tablespace TBS rename datafile'/dm/data/DAMENG/TBS02.dbf'
to'/dm/data/DAMENG/TBS/TBS02.dbf';
③将数据文件所在的表空间联机:
alter tablespace TBS online;
完成以上步骤,重新查询dba_data_files,此时数据文件路径已经修改为新的路径。如下图所示:
注意,在转移数据文件时,因为要将表空间短暂脱机,会影响相关业务的运行,所以需提前知会客户短时间中断业务。另外,在转移数据文件时,要注意新的数据文件路径存在,并且归属于dmdba用户组。
另外,DM客户端管理工具也可以修改表空间的数据文件路径,此原理和上述SQL一致,界面操作后底层调用的也是上述操作步骤中的三个步骤。
重做日志文件路径修改
因为重做日志是联机的,不能对重做日志脱机,所以修改重做日志文件路径只能在mount状态下修改。
(1)查询重做日志文件信息
在修改数据文件之前,先了解重做日志文件信息,使用如下SQL语句查询:
select t.group_id,t.file_id, t.path, t.rlog_size from v$rlogfile t;
查询结果如下:
(2)修改重做日志文件路径信息
修改重做日志文件路径之前,需要将数据库设置为mount状态,然后再修改重做日志文件路径信息。如我们将重做日志修改为/dm/data/DAMENG/REDO路径,操作步骤如下:
①将数据库切换为mount状态:
alter database mount;
②修改重做日志文件路径:
alter database rename logfile'/dm/data/DAMENG/DAMENG01.log'
to'/dm/data/DAMENG/REDO/DAMENG01.log';
alter database rename logfile'/dm/data/DAMENG/DAMENG02.log'
to'/dm/data/DAMENG/REDO/DAMENG02.log';
③将数据库切换为open状态:
alter database open;
完成以上步骤,重新查询V$RLOGFILE,此时重做日志文件路径已经修改为新的路径。如下图所示:
注意,在转移重做日志文件时,因为要将数据库设置为mount状态,此时数据库无法对外提供正常的服务,会影响业务的运行。转移重做日志文件时要注意新的路径存在,并且归属于dmdba用户组。
另外,DM客户端管理工具也可以修改重做日志文件路径,此原理和上述SQL语句一致。DM管理工具需要先将数据库设置为配置状态(MOUNT),再进行重做日志文件路径的修改。
系统表空间、ROLL表空间数据文件
路径修改
因为SYSTEM系统表空间、ROLL回滚表空间不允许脱机,系统表空间和ROLL表空间数据文件的路径修改只能通过修改控制文件中对应数据文件的路径来完成。
DM控制文件是二进制文件,无法直接编辑,需要使用dmctlcvt工具转换为文本文件后编辑。注意,修改系统表空间、UNDO表空间需要手工拷贝文件,为保持数据一致性,需要关闭数据库,再拷贝数据文件。具体操作步骤如下:
①将控制文件dm.ctl转换为文本文件
执行dmctlcvt help可查看该命令的使用帮助。如下图所示:
执行如下命令,将控制文件dm.ctl转换为文本文件dmctl.txt:
[dmdba@localhost~]$ dmctlcvt type=1
src=/dm/data/DAMENG/dm.ctl
dest=/dm/data/DAMENG/dmctl.txt
②修改文本文件中数据文件路径
执行vi dmctl.txt编辑生成的文本文件,修改系统表空间、ROLL表空间数据文件路径为新的路径,如修改为/dm/data/DAMENG/NEW文件夹。
③将修改后的文本文件转换为目标控制文件
执行如下命令,将修改后的文本文件dmctl.txt转换为新的控制文件dmnew.ctl:
[dmdba@localhost~]$ dmctlcvt type=2
src=/dm/data/DAMENG/dmctl.txt
dest=/dm/data/DAMENG/dmnew.ctl
④关闭数据库,复制数据文件到新的路径
关闭数据库,复制SYSTEM.DBF和ROLL.DBF到新的数据文件路径/dm/data/DAMENG/NEW,复制完成后,将新的控制文件重命名覆盖原来的控制文件。完成后启动数据库,重新查询dba_data_files视图,可以看到系统表空间和ROLL表空间文件路径已修改。如下图:
实际上,普通表空间的数据文件和重做日志文件路径的修改也可以采用此方式,但此方式需要关闭数据库,并对控制文件转化,操作没有SQL语句或DM管理工具界面直接方便,如果只是针对普通表空间和联机重做日志,不建议采用此方式。
TEMP表空间数据文件路径修改
TEMP表空间的路径是在dm.ini中配置的,参数名为TEMP_PATH。修改时只需修改dm.ini中TEMP_PATH参数值,因为TEMP_PATH为READONLY类型,所以只能手工修改dm.ini文件,并重启数据库才能生效。TEMP表空间路径的修改不需要拷贝TEMP.DBF,数据库启动时会重新在配置路径下生成该文件。
如下图,使用vi dm.ini修改dm.ini文件中TEMP_PATH为/dm/data/DAMENG/NEW。
修改完成后,重启数据库,查询dba_data_files视图,可以看到TEMP表空间的数据文件路径已修改。如下图: