Oracleデータベースのデータファイル名に末尾のスペースが含まれていたため、通常のSQLコマンドでリネームが不可能な状況が発生しました。以下は、この問題を解決するための実際の手順です。
SQLコマンドによるリネームの失敗
ALTER TABLESPACE ... RENAME DATAFILE コマンドを使用してファイル名を修正しようとしましたが、OSレベルでファイルが見つからないというエラーが発生しました。
SQL> alter tablespace WST_DATA rename datafile 'D:\oracle11\oradata\teblespace\WST_DATA .DBF' TO 'D:\oracle11\oradata\teblespace\WST_DATA.DBF';
*
ERROR at line 1:
ORA-01525: error in renaming data files
ORA-01141: error renaming data file 6 - new file 'D:\oracle11\oradata\teblespace\WST_DATA.DBF' not found
ORA-01110: data file 6: 'D:\ORACLE11\ORADATA\TEBLESPACE\WST_DATA .DBF'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系统找不到指定的文件。
また、ファイル番号を指定してリネームしようとすると、無効なファイル名というエラーが返されます。
SQL> alter tablespace WST_DATA rename datafile 6 TO 'D:\oracle11\oradata\teblespace\WST_DATA.DBF';
*
ERROR at line 1:
ORA-02236: invalid file name
RMANを用いた代替対応
SQLレベルでの操作が不可能なため、RMAN(Recovery Manager)を使用してファイルをコピーし、制御ファイルを更新する方法を採用しました。
- データベースをシャットダウンし、マウント状態に起動します。
- データファイル6を新しい名前でコピーします。
- コピーしたファイルを新しいパスに切り替えます。
- データベースをオープンします。
RMAN> shutdown immediate;
database closed
database dismounted
Oracle instance shut down
RMAN> startup mount;
Oracle instance started
database mounted
RMAN> copy datafile 6 to 'D:\oracle11\oradata\teblespace\WST_DATA.DBF';
Starting backup at 10-FEB-15
allocated channel: ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile fno=00006 name=D:\ORACLE11\ORADATA\TEBLESPACE\WST_DATA .DBF
output filename=D:\ORACLE11\ORADATA\TEBLESPACE\WST_DATA.DBF tag=TAG20150210T145554 recid=1 stamp=871311470
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:56
Finished backup at 10-FEB-15
RMAN> run {
2> set newname for datafile 6 to 'D:\oracle11\oradata\teblespace\WST_DATA.DBF';
3> switch datafile 6;
4> }
executing command: SET NEWNAME
datafile 6 switched to datafile copy
input datafile copy recid=1 stamp=871311470 filename=D:\ORACLE11\ORADATA\TEBLESPACE\WST_DATA.DBF
RMAN> alter database open;
database opened
変更後の確認
データベースを再起動し、v$datafileビューでファイル名の更新を確認します。
SQL> col name format a60;
SQL> set linesize 180;
SQL> select file#, status, name from v$datafile;
FILE# STATUS NAME
---------- ------- ------------------------------------------------------------
1 SYSTEM D:\ORACLE11\ORADATA\ORA11\SYSTEM01.DBF
2 ONLINE D:\ORACLE11\ORADATA\ORA11\SYSAUX01.DBF
3 ONLINE D:\ORACLE11\ORADATA\ORA11\UNDOTBS01.DBF
4 ONLINE D:\ORACLE11\ORADATA\ORA11\USERS01.DBF
5 ONLINE D:\ORACLE11\ORADATA\TEBLESPACE\WSTJFX_DATA.DBF
6 OFFLINE D:\ORACLE11\ORADATA\TEBLESPACE\WST_DATA.DBF
7 ONLINE D:\ORACLE11\ORADATA\TEBLESPACE\WSXXZB_DATA.DBF
8 ONLINE D:\ORACLE11\ORADATA\TEBLESPACE\TESTBIRPT.DBF
9 ONLINE D:\ORACLE11\ORADATA\TEBLESPACE\WFGS.DBF
10 ONLINE D:\ORACLE11\ORADATA\TEBLESPACE\ZDJWBI.DBF
11 ONLINE E:\DATA\GYBANK\KHFX.DBF
ファイル名の末尾スペースが削除され、正しく更新されていることが確認できました。その後、必要に応じてテーブルスペースをONLINE状態に復旧します。