【Oracle系列】- Oracle数据库更改数据文件位置
文章目录
- 【Oracle系列】- Oracle数据库更改数据文件位置
- 一、概述
- 二、控制文件位置更改
- 三、数据文件位置更改(不包括临时数据文件)
- 四、临时数据文件位置更改
- 五、临时数据文件位置更改
一、概述
突然收到zabbix报警提示OA数据库服务器磁盘不足,经常查发现根目录磁盘空间不足,由于无法添加磁盘来扩容,需要将数据库目录从/oradata更改到/home/oracle/oradata。
由于数据库文件和表空间具有不同的性质,将数据文件位置更改分为四个步骤:
- 控制文件位置更改
- 数据文件位置更改*(不包括临时数据文件)*
- 临时数据文件位置更改
- 日志文件位置更改
二、控制文件位置更改
-
停止数据库监听,防止有应用连接对数据库进行修改。
lsnrctl stop
-
数据库open的状态下
alter system set control_files='/home/oracle/oradata/oa/control01.ctl','/home/oracle/oradata/oa/control02.ctl','/home/oracle/oradata/oa/control03.ctl' scope=spfile;
-
然后将数据库shutdown
shutdown immediate;
-
将控制文件移动到新目录/home/oracle/oradata/oa下
mv /oradata/oa/control* /home/oracle/oradata/oa/
将数据库启动到mount状态,至此,控制文件位置更改结束。
三、数据文件位置更改(不包括临时数据文件)
数据库需要在open状态下
-
将表空间全部offline,使用一下命令:
SELECT 'alter tablespace ' || DTS.Tablespace_Name || ' offline;'FROM Sys.Dba_Tablespaces DTSWHERE DTS.Contents <> 'TEMPORARY'AND DTS.Tablespace_Name <> 'UNDOTBS1'AND DTS.Tablespace_Name <> 'SYSTEM';
-
生成的SQL语句如下,使用sysdba账户执行
alter tablespace SYSAUX offline; alter tablespace USERS offline; ...
-
将这些表空间的数据文件复制到新目录/home/oracle/oradata目录下,数据文件rename的时候,需要两边都有数据文件。
-
使用以下语句生成rename数据文件的SQL语句
SELECT 'alter tablespace ' || Ddf.Tablespace_Name || ' rename datafile ''' ||Ddf.File_Name || ''' to ''' || '/home/oracle' || Ddf.File_Name ||''';'FROM Sys.Dba_Data_Files DdfWHERE Ddf.Tablespace_Name <> 'SYSTEM'AND Ddf.Tablespace_Name <> 'UNDOTBS1';
-
生成的SQL语句如下,使用sysdba账户执行
alter tablespace USERS rename datafile '/oradata/ipcc/users01.dbf' to '/home/oracle/oradata/ipcc/users01.dbf'; alter tablespace SYSAUX rename datafile '/oradata/ipcc/sysaux01.dbf' to '/home/oracle/oradata/ipcc/sysaux01.dbf'; ......
-
执行结束之后,将表空间全部**online,**使用以下语句生成表空间online的SQL语句
SELECT 'alter tablespace ' || Ds.Tablespace_Name || ' online;'FROM Sys.Dba_Tablespaces DsWHERE Ds.Contents <> 'TEMPORARY'AND Ds.Tablespace_Name <> 'UNDOTBS1'AND Ds.Tablespace_Name <> 'SYSTEM';
-
生成的SQL语句如下,使用sysdba账户执行
alter tablespace SYSAUX online; alter tablespace USERS online; ......
四、临时数据文件位置更改
临时表空间比较特殊,不能将临时表空间offline,需要将临时表空间的临时数据文件offline。
-
数据库在open状态下,生成临时数据文件offline的SQL语句如下:
SELECT 'alter database tempfile ''' || File_Name || ''' offline;'FROM Dba_Temp_FilesORDER BY File_Id;
-
生成的SQL语句如下,使用sysdba账户执行
alter database tempfile '/oradata/ipcc/temp01.dbf' offline; alter database tempfile '/oradata/ricd_temp10' offline; ......
-
将临时数据文件复制到/home/oracle/oradata目录下
-
生成rename临时数据文件的SQL语句如下:
SELECT 'alter database rename file ''' || File_Name || ''' to ''' ||'/home/oracle' || File_Name || ''';'FROM Dba_Temp_FilesORDER BY File_Id;
-
生成的SQL语句如下,使用sysdba账户执行
alter database rename file '/oradata/oa/temp01.dbf' to '/home/oracle/oradata/oa/temp01.dbf'; alter database rename file '/oradata/oa_temp10' to '/home/oracle/oradata/oa_temp10'; ......
-
执行结束之后,将临时数据文件online,生成临时数据文件online的SQL语句如下:
SELECT 'alter database tempfile ''' || File_Name ||''' online;'FROM Dba_Temp_FilesORDER BY File_Id;
-
生成的SQL语句如下,使用sysdba账户执行
alter database tempfile '/home/oracle/oradata/oa/temp01.dbf' online; alter database tempfile '/home/oracle/oradata/oa_temp10' online; ......
至此,临时数据文件位置更改结束
五、临时数据文件位置更改
数据库可以在mount状态或open状态下。
-
查看日志文件状态
select group#,thread#,sequence#,members,archived,status from v$log; select member from v$logfile;
-
当日志文件状态不为current的时候,将日志文件复制到新目录/home/oracle/oradata下,然后可以切换日志文件位置。也可以使用alter system switch logfile,切换日志文件状态
SQL> alter database rename file '/oradata/oa/redo01.log' to '/home/oracle/oradata/oa/redo01.log'; SQL> alter database rename file '/oradata/oa/redo02.log' to '/home/oracle/oradata/oa/redo02.log';
至此,日志文件位置更改结束。当所有文件位置均更改结束时,测试数据库的可用性;如果无问题,可以删除旧数据目录下的文件。