Oracleエラー対応(ORA-01157):「データファイルを識別/ロックできません」の対処方法について

現役DBAが解説-Oracleエラー対応

データベース起動時等に「ORA-01157:データファイルを識別/ロックできません」というエラーが発生する可能性があります。

本記事では ORA-01157発生時の原因および対応方法を解説します。
※SYSTEM表領域以外のデータファイルについての解説になります。

1. エラーメッセージ

ORA-01157: データファイルstringを識別/ロックできません - DBWRトレース・ファイルを参照してください

ORA-01157はデータファイルを様々な要因で参照できない場合に発生するエラーです。
データベース起動時にデータファイルを参照できない場合に発生し、基本的にORA-01157が発生するとORA-01110も同時に発生します。

<エラー発生例>

ORA-01157: データファイル13を識別/ロックできません – DBWRトレース・ファイルを参照してください
ORA-01110: データファイル13: ‘/ORACLE/ORADATA/ORATEST/TEST01.DBF’

2.エラー調査

まず、ORA-01157がどのような原因で発生したのか、調査を行います。
エラー文で表示されたデータファイルが存在しているのか、OSのコマンドラインで確認します。

<例:Linux環境でOSのコマンドラインから検索>

$ ls -l /ORACLE/ORADATA/ORATEST/TEST01.DBF
ls: /ORACLE/ORADATA/ORATEST/TEST01.DBF にアクセスできません: 
そのようなファイルやディレクトリはありません

※「/ORACLE/ORADATA/ORATEST/」はデータファイル格納場所

また、必要に応じてデータベースアラートログおよびトレースファイルも確認してください。
エラー発生時付近の情報を確認することで、本エラーに関連する情報が発見できる可能性があります。

3. 原因と対応方法

ORA-01157が発生する代表的な原因として、以下4つのパターンが挙げられます。

①データファイルがOS上から削除されている

データファイルがOS上から削除されていた場合は、データベースの運用保守手順に従ってバックアップからリカバリを行ってください。
バックアップが存在しない場合は表領域を再作成する必要があります。
ただしデータは復旧されないため、注意が必要です。

②データファイルの名前が変更されている、格納場所が移動している

必要なデータファイルが名前変更されていた場合、OS側からデータファイルの名前を変更することで解決できます。

<例:Linux環境で名前を戻す場合>

$ mv /ORACLE/ORADATA/ORATEST/TEST02.DBF
/ORACLE/ORADATA/ORATEST/TEST01.DBF

※名前変更されていたデータファイル(TEST02.DBF)をエラー文で表示された元の名前(TEST01.DBF)に変更

データファイルの格納場所が変更されていた場合、元の格納場所に戻す必要があります。

<例:Linux環境でディレクトリを元に戻す場合>

$ mv TEST01.DBF /ORACLE/ORADATA/ORATEST

※データファイル(TEST01.DBF)を/ORACLE/ORADATA/ORATEST配下に移動

データファイルの削除や名前変更、移動はOracle管理下で操作する必要があります。
手動で直接操作を行うと、Oracleがデータファイルを認識できなくなりデータベースがクラッシュする可能性があるため、必ずOracleの管理下で操作してください。

③データファイル格納領域のマウントが外れている、マウントポイントが正しくない

OS側からマウント状況を確認し、データファイル格納領域がマウントされていない場合は再度マウントを実行してください。

④データファイルの読み取り/書き込み権限がない

データファイルの格納場所に移動し、権限情報を確認します。
Oracleを使用しているユーザーのファイルの読み取り/書き込み権限が不足している場合、権限を変更します。

<Linux環境での一例>

$ ls -l /ORACLE/ORADATA/ORATEST/TEST01.DBF
$ chmod  640 TEST01.DBF

起動確認

上記のエラー対応方法を実施した後、データベースが問題ないか確認していきます。

①データベースをオープンする
<例>

SQL> alter database open;	※MOUNT状態の場合
SQL> startup			※SHUTDOWN状態の場合

②データベースの起動確認
<例>

SQL> SELECT name, open_mode FROM v$database;
NAME          OPEN_MODE
------------- ----------------------------
ORACLE14   READ WRITE

※OPEN_MODEがREAD WRITEになっていればデータベースが起動できている

③データファイルの確認
<例>

SQL> SELECT tablespace_name, file_name, status, online_status 
FROM dba_data_files WHERE file_name=’ /ORACLE/ORADATA/ORATEST/TEST01.DBF’;
TABLESPACE FILE_NAME                                                   STATUS
--------------  --------------------------------------------------         ----------------
TEST            /ORACLE/ORADATA/ORATEST/TEST01.DBF   AVAILABLE

④データベースを使用しているアプリの動作確認
エラーとなったデータファイルを使用しているアプリを操作して、問題なく動作することを確認してください。

4. 最後に

ORA-01157に関する解説は以上となります。
ORA-01157が発生した際は、まずどのような状況でエラーが発生したのか原因を突き止めることが大切です。

また、データファイルのバックアップを保管していない場合、データ復旧ができず表領域を再作成する必要があるため、バックアップ運用をお勧めします。