【完全ガイド】ORA-00376: file X cannot be read at this time の原因と解決方法|データファイル OFFLINE・MEDIA RECOVERY 徹底解説

【完全ガイド】ORA-00376: file X cannot be read at this time の原因と解決方法|データファイル OFFLINE・MEDIA RECOVERY 徹底解説

Oracle DBA が本番運用中に頻繁に遭遇する重要エラー:

ORA-00376: file 4 cannot be read at this time
ORA-01110: data file 4: '/u01/oradata/orcl/users01.dbf'

**「ファイルが今読み取り不可」**というシンプルなメッセージ。アプリケーションが停止する重大な問題です:

  • 特定テーブルへのアクセス失敗
  • クエリ実行中の突然の失敗
  • INSERT / UPDATE / DELETE の停止
  • ユーザーからの問い合わせ
  • DBA の即時対応が必須

このエラーの本質は、Oracle がデータファイルを開いて読み取ろうとしたが失敗:

1. Oracle が SELECT / DML 実行
2. データファイルへの I/O 要求
3. データファイルが利用不可能
   - OFFLINE 状態
   - RECOVER 必要状態
   - OS レベルで存在しない
   - 他プロセスにロック
4. → ORA-00376 発生

必ず併発する ORA-01110 で問題ファイルが判明:

ORA-00376: file X cannot be read at this time    ← 読み取り不可通知
ORA-01110: data file X: '/path/to/datafile.dbf'   ← 対象ファイル
目次

V$DATAFILE の STATUS の意味

Oracle データファイルの状態は 5 種類:

SYSTEM:   SYSTEM テーブルスペース(常に ONLINE)
ONLINE:   通常状態
OFFLINE:  管理者が OFFLINE 化 or 自動 OFFLINE
RECOVER:  MEDIA RECOVERY 必要
SYSAUX:   SYSAUX テーブルスペース

ORA-00376 の対処この STATUS に依存:

OFFLINE → ALTER DATABASE DATAFILE ... ONLINE
RECOVER → RECOVER DATAFILE ... 
OS 削除 → RMAN RESTORE + RECOVER

現場で最も典型的なパターン:

  • 管理者が意図的に OFFLINE 化(メンテナンス後の戻し忘れ)
  • テーブルスペース OFFLINE(同上)
  • RECOVER 状態(MEDIA RECOVERY 必要)
  • OS レベルでファイル削除/移動
  • バックアップソフトが排他ロック
  • 書き込みエラーで Oracle が自動 OFFLINE 化
  • RMAN RESTORE 中
  • データファイル RENAME 中
  • SAP + Oracle 特有の問題(SAP Note 328785)
  • 停電後の不完全な状態

多くの日本語記事が「データファイルを ONLINE にせよ」で終わりますが、実務では:

  • V$DATAFILE.STATUS による厳密な状態判定
  • V$RECOVER_FILE によるリカバリ要件確認
  • V$DATAFILE_HEADERcheckpoint_change# / SCN
  • ONLINE vs RECOVER対処方法が完全に異なる
  • OFFLINE DROP によるデータ捨てる選択(最終手段)
  • UNDO テーブルスペースの特殊対応(ROLLBACK_SEGMENTS
  • RMAN による BLOCKRECOVER(ORA-01578 との関連)
  • SAP 環境での SAP Note 328785 参照
  • Autonomous DBでの自動対応
  • Rails / Java アプリでのリトライロジック

さらに、Oracle が自動 OFFLINE 化する典型的パターン:

alert.log:
"Automatic datafile offline due to write error on file 2"
"H:\ORACLE\DEV\SAPDATA2\ROLL.DATA2"

原因:
- ディスク I/O エラー
- ストレージ障害
- ネットワーク断(NFS)
- ファイルシステム故障

**「書き込みエラー → 自動 OFFLINE → ORA-00376」**という連鎖が起きます。

本記事では、ORA-00376: file X cannot be read at this time完全な原因と解決方法を、リファレンスとして実用的に整理します。10大発生パターン、V$DATAFILE STATUS 詳解、6つの解決策、SAP 対応、Rails/Java/Python 対応、実践シナリオ、FAQまで完全網羅。この1本で ORA-00376 に冷静に的確に対処できるようになります。


結論:STATUS 確認 → 適切な対処

時間がない方向けに、最速の対処を先に示します。

エラーメッセージの読み方

ORA-00376: file X cannot be read at this time
                 ↑
             読み取り不可のファイル番号

ORA-01110: data file X: '/path/to/datafile.dbf'
                    ↑
              物理ファイルパス

= 特定データファイルへの I/O が失敗
  STATUS に応じた対処が必要

最速の緊急対応

-- STEP 1: SYSDBA 接続
$ sqlplus / as sysdba

-- STEP 2: データファイル STATUS 確認
SELECT file#, name, status 
FROM v$datafile 
WHERE file# = 4;

-- OFFLINE → 次へ (ONLINE 化)
-- RECOVER → RECOVER DATAFILE

-- STEP 3: OFFLINE の場合
ALTER DATABASE DATAFILE 4 ONLINE;

-- STEP 4: RECOVER の場合
RECOVER DATAFILE 4;
ALTER DATABASE DATAFILE 4 ONLINE;

-- STEP 5: OS 削除の場合
$ rman target /
RMAN> RESTORE DATAFILE 4;
RMAN> RECOVER DATAFILE 4;
RMAN> ALTER DATABASE DATAFILE 4 ONLINE;

6つの解決策

#手法使う場面
ALTER TABLESPACE ONLINETS OFFLINE
ALTER DATABASE DATAFILE ONLINEデータファイル OFFLINE
RECOVER DATAFILERECOVER status
RMAN RESTORE + RECOVEROS 削除/破損
OFFLINE DROPデータ諦め
SAP Note 参照SAP 環境

V$DATAFILE STATUS

STATUS意味対処
ONLINE通常問題なし
OFFLINE停止ONLINE 化
RECOVER復旧必要RECOVER
SYSTEMSYSTEM TS特殊対応
SYSAUXSYSAUX TS特殊対応

詳細は以下で解説します。


Oracle データファイル状態の仕組み

データファイルの階層

Database
├── Tablespace 1
│   ├── Datafile 1 (STATUS: ONLINE)
│   └── Datafile 2 (STATUS: ONLINE)
├── Tablespace 2 (OFFLINE)
│   ├── Datafile 3 (STATUS: OFFLINE ← 上位から)
│   └── Datafile 4 (STATUS: OFFLINE)
└── Tablespace 3
    └── Datafile 5 (STATUS: RECOVER)

テーブルスペースの OFFLINE含まれる全 datafile OFFLINE

V$DATAFILE と DBA_DATA_FILES の違い

-- V$DATAFILE: 動的、現在の状態
SELECT file#, name, status FROM v$datafile;

-- DBA_DATA_FILES: 静的、テーブルスペース単位
SELECT file_name, tablespace_name, online_status 
FROM dba_data_files;

自動 OFFLINE 化

Oracle が自動的に OFFLINE 化する条件:

  • ARCHIVELOG モード
  • 書き込みエラー発生
  • DBWR プロセスが検知

NOARCHIVELOG モードでは、書き込みエラー時DB 全体停止


【原因①】データファイル OFFLINE(最頻出)

症状

SQL> SELECT * FROM my_table;
ORA-00376: file 4 cannot be read at this time
ORA-01110: data file 4: '/u01/oradata/orcl/users01.dbf'

診断

SELECT file#, name, status, enabled
FROM v$datafile 
WHERE file# = 4;

-- STATUS: OFFLINE
-- ENABLED: DISABLED / READ ONLY / READ WRITE

解決

ONLINE 化:

ALTER DATABASE DATAFILE 4 ONLINE;

-- または名前指定
ALTER DATABASE DATAFILE '/u01/oradata/orcl/users01.dbf' ONLINE;

ARCHIVELOG モードで OFFLINE の場合、通常 RECOVER が必要:

RECOVER DATAFILE 4;
ALTER DATABASE DATAFILE 4 ONLINE;

【原因②】テーブルスペース OFFLINE

症状

SELECT tablespace_name, status 
FROM dba_tablespaces 
WHERE tablespace_name = 'USERS';
-- STATUS: OFFLINE

解決

A. TS ONLINE 化:

ALTER TABLESPACE users ONLINE;

B. 個別 datafile OFFLINE の場合:

-- 全 datafile ONLINE 化
BEGIN
  FOR r IN (SELECT file_name FROM dba_data_files 
            WHERE tablespace_name = 'USERS'
              AND online_status = 'OFFLINE') LOOP
    EXECUTE IMMEDIATE 
      'ALTER DATABASE DATAFILE ''' || r.file_name || ''' ONLINE';
  END LOOP;
END;
/

領域管理は Oracle テーブルスペース確認の記事、ORA-01950: no privileges on tablespace の記事も参照してください。


【原因③】RECOVER status(MEDIA RECOVERY 必要)

症状

SELECT file#, name, status 
FROM v$datafile 
WHERE file# = 9;
-- STATUS: RECOVER

-- V$RECOVER_FILE で詳細
SELECT * FROM v$recover_file WHERE file# = 9;

診断

-- SCN 確認
SELECT file#, status, fuzzy, checkpoint_change#, checkpoint_time
FROM v$datafile_header 
WHERE file# = 9;

解決

A. アーカイブログから RECOVER:

RECOVER DATAFILE 9;

-- または AUTO 応答
RECOVER AUTOMATIC DATAFILE 9;

B. 完了後 ONLINE:

ALTER DATABASE DATAFILE 9 ONLINE;

C. RMAN 使用:

rman target /

RMAN> RECOVER DATAFILE 9;
RMAN> SQL 'ALTER DATABASE DATAFILE 9 ONLINE';

領域関連は ORA-00257: archiver error の記事も参照してください。


【原因④】OS レベルでファイル削除

症状

$ ls -la /u01/oradata/orcl/users01.dbf
ls: cannot access '/u01/oradata/orcl/users01.dbf': No such file or directory

alert.log:

ORA-01157: cannot identify/lock data file 4
ORA-01110: data file 4: '/u01/oradata/orcl/users01.dbf'

解決

A. RMAN RESTORE + RECOVER:

rman target /

# datafile を OFFLINE 化
RMAN> SQL 'ALTER DATABASE DATAFILE 4 OFFLINE';

# バックアップから RESTORE
RMAN> RESTORE DATAFILE 4;

# アーカイブログで RECOVER
RMAN> RECOVER DATAFILE 4;

# ONLINE
RMAN> SQL 'ALTER DATABASE DATAFILE 4 ONLINE';

B. バックアップなし & データ諦め:

-- ⚠️ データ完全消失
ALTER DATABASE DATAFILE 4 OFFLINE DROP;

-- テーブルスペース削除も検討
DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;

RMAN 関連は ORA-01578: data block corrupted の記事も参照してください。


【原因⑤】バックアップソフトが排他ロック

シナリオ

Veritas NetBackup / Commvault 等のバックアップ実行中
→ データファイルを排他ロック
→ Oracle が読み取り失敗
→ ORA-00376(一時的)

診断

# ファイルロック確認
$ lsof | grep users01.dbf

解決

A. バックアップ完了待ち(一時的問題)。 B. RMAN 使用(Oracle 推奨、ロック不要):

rman target /
RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE;

【原因⑥】書き込みエラーで自動 OFFLINE 化

症状(alert.log)

Automatic datafile offline due to write error on file 2:
H:\ORACLE\DEV\SAPDATA2\ROLL.DATA2
Errors in file: 
ORA-00604: error occurred at recursive SQL level 1
ORA-00376: file 2 cannot be read at this time
ORA-01110: data file 2: 'H:\ORACLE\DEV\SAPDATA2\ROLL.DATA2'

診断

# OS ログ確認
$ dmesg | grep -E "(I/O error|read error|drive)"
$ tail -100 /var/log/messages

# SMART 情報
$ smartctl -a /dev/sda

解決

A. ハードウェア修理 → RECOVER:

-- ハードウェア修理後
RECOVER DATAFILE 2;
ALTER DATABASE DATAFILE 2 ONLINE;

B. RMAN RESTORE(ファイル破損の場合):

rman target /
RMAN> RESTORE DATAFILE 2;
RMAN> RECOVER DATAFILE 2;

内部エラーは ORA-00600: internal error の記事も参照してください。


【原因⑦】RMAN RESTORE 中

シナリオ

RMAN が datafile RESTORE 中
→ 一時的に読み取り不可
→ アプリからのアクセスで ORA-00376

対処

RESTORE 完了待ち、業務時間外での実施。


【原因⑧】データファイル RENAME 中

シナリオ

-- datafile を移動
ALTER TABLESPACE users OFFLINE;

-- OS で移動
$ mv /u01/oradata/users01.dbf /u02/oradata/users01.dbf

-- RENAME
ALTER TABLESPACE users RENAME DATAFILE 
  '/u01/oradata/users01.dbf' TO '/u02/oradata/users01.dbf';

-- ONLINE 化忘れ → ORA-00376

解決

ALTER TABLESPACE users ONLINE;

【原因⑨】SAP + Oracle 特有

シナリオ

SAP システムで ORA-00376 頻発、SAP Note 328785 で対処方法明示。

典型的な状況:

alert.log:
Automatic datafile offline due to write error on file X
ORA-376 encountered when generating server alert

解決

A. SAP Note 328785 参照B. Oracle 側で SYSTEM/UNDO 以外の TS を ONLINE:

-- OFFLINE な datafile 一覧
SELECT NAME FROM v$datafile WHERE STATUS = 'OFFLINE';

-- 順次 ONLINE
ALTER DATABASE DATAFILE '...' ONLINE;

C. brtools 使用(SAP 標準):

brrecover -c force -t recov_datafile

【原因⑩】停電後の不完全状態

シナリオ

1. 停電(UPS 失敗)
2. Oracle が異常終了
3. 再起動時に一部 datafile が RECOVER 状態
4. ORA-00376

解決

-- STARTUP 時のメッセージ確認
SQL> STARTUP MOUNT
-- ORA-01113: file X needs media recovery

-- RECOVER
SQL> RECOVER DATABASE;
-- または個別
SQL> RECOVER DATAFILE X;

-- OPEN
SQL> ALTER DATABASE OPEN;

診断ツール完全リファレンス

V$DATAFILE

SELECT file#, name, status, enabled, 
       checkpoint_change#, checkpoint_time
FROM v$datafile
ORDER BY file#;

V$RECOVER_FILE

-- リカバリ必要な datafile
SELECT file#, error, change#, time
FROM v$recover_file;

V$DATAFILE_HEADER

-- ヘッダ情報(SCN 等)
SELECT file#, status, fuzzy, checkpoint_change#, 
       checkpoint_time, resetlogs_change#, resetlogs_time
FROM v$datafile_header
WHERE file# = 4;

DBA_DATA_FILES

SELECT tablespace_name, file_name, online_status, 
       bytes/1024/1024 AS mb
FROM dba_data_files
WHERE online_status != 'ONLINE';

DBA_TABLESPACES

SELECT tablespace_name, status, contents
FROM dba_tablespaces
WHERE status != 'ONLINE';

alert.log

# 場所確認
SQL> SELECT value FROM v$diag_info WHERE name = 'Diag Trace';

# 最新エラー
$ tail -200 alert_orcl.log | grep -E "(ORA-00376|ORA-01110|OFFLINE)"

6つの解決策 完全リファレンス

解決策① ALTER TABLESPACE ONLINE

-- TS 全体を ONLINE
ALTER TABLESPACE users ONLINE;

-- 事前確認
SELECT status FROM dba_tablespaces WHERE tablespace_name = 'USERS';

解決策② ALTER DATABASE DATAFILE ONLINE

-- 個別 datafile を ONLINE
ALTER DATABASE DATAFILE 4 ONLINE;

-- 名前指定
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf' ONLINE;

-- ARCHIVELOG モードなら通常 RECOVER 必要

解決策③ RECOVER DATAFILE

-- SYSDBA で
RECOVER DATAFILE 4;

-- AUTO 応答
RECOVER AUTOMATIC DATAFILE 4;

-- 完了後
ALTER DATABASE DATAFILE 4 ONLINE;

解決策④ RMAN RESTORE + RECOVER

rman target /

# データファイル OFFLINE
RMAN> SQL 'ALTER DATABASE DATAFILE 4 OFFLINE';

# バックアップから RESTORE
RMAN> RESTORE DATAFILE 4;

# アーカイブログで RECOVER
RMAN> RECOVER DATAFILE 4;

# ONLINE
RMAN> SQL 'ALTER DATABASE DATAFILE 4 ONLINE';

解決策⑤ OFFLINE DROP(最終手段)

-- ⚠️ データ完全消失
-- バックアップなし & リカバリ不能な場合のみ

ALTER DATABASE DATAFILE 4 OFFLINE DROP;

-- テーブルスペース削除も検討
DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;

解決策⑥ SAP Note 328785 対応

SAP + Oracle 環境:

1. SAP Note 328785 参照
2. brtools 使用(brrecover 等)
3. Oracle 側の datafile ONLINE 化

Rails / Java / Python 対応

Rails ActiveRecord

エラーハンドリング:

begin
  User.find(1)
rescue ActiveRecord::StatementInvalid => e
  if e.message.include?("ORA-00376")
    Rails.logger.fatal "Datafile not accessible"
    NotifyOps.critical("Oracle datafile issue: #{e.message}")
    # DBA へ通知、一時的に読み取り専用モードに
  end
end

Rails 8 系の詳細は Rails 8 アップグレードガイドの記事も参照してください。

Java (JDBC)

try {
    ResultSet rs = ps.executeQuery();
    while (rs.next()) {
        // 処理
    }
} catch (SQLException e) {
    if (e.getErrorCode() == 376) {
        logger.fatal("Datafile not readable: " + e.getMessage());
        alertingService.critical("DBA action required");
    }
}

Python (oracledb)

import oracledb
import logging

try:
    cursor.execute("SELECT * FROM my_table")
    for row in cursor:
        process(row)
except oracledb.DatabaseError as e:
    error_obj, = e.args
    if error_obj.code == 376:
        logging.critical(f"Datafile issue: {error_obj.message}")
        # DBA 通知

実践シナリオ

シナリオ1:本番緊急対応

# 1. アラート受信
# "ORA-00376: file 4 cannot be read at this time"

# 2. サーバー接続
ssh dbserver
sqlplus / as sysdba

# 3. STATUS 確認
SQL> SELECT file#, name, status FROM v$datafile WHERE file# = 4;
-- STATUS: OFFLINE

# 4. TS 確認
SQL> SELECT tablespace_name, status FROM dba_tablespaces 
     WHERE tablespace_name = (SELECT tablespace_name FROM dba_data_files 
                              WHERE file_id = 4);

# 5. ONLINE 化試行
SQL> ALTER DATABASE DATAFILE 4 ONLINE;

# 6. 失敗(RECOVER 必要)なら
SQL> RECOVER DATAFILE 4;
SQL> ALTER DATABASE DATAFILE 4 ONLINE;

# 7. 業務再開確認

シナリオ2:OS ファイル削除への対応

# 1. ファイル削除を検出
$ ls /u01/oradata/orcl/users01.dbf
# ls: No such file or directory

# 2. RMAN RESTORE
rman target /

RMAN> SQL 'ALTER DATABASE DATAFILE 4 OFFLINE';
RMAN> RESTORE DATAFILE 4;
RMAN> RECOVER DATAFILE 4;
RMAN> SQL 'ALTER DATABASE DATAFILE 4 ONLINE';

# 3. 検証
SQL> SELECT COUNT(*) FROM users;

シナリオ3:SAP 環境での対応

-- 1. OFFLINE な datafile 一覧
SELECT NAME FROM v$datafile WHERE STATUS = 'OFFLINE';

-- 2. RECOVER 必要な datafile
SELECT * FROM v$recover_file;

-- 3. 順次 RECOVER + ONLINE
BEGIN
  FOR r IN (SELECT file# FROM v$datafile WHERE status = 'RECOVER') LOOP
    -- RECOVER は SQL*Plus セッション必要
    DBMS_OUTPUT.PUT_LINE('RECOVER DATAFILE ' || r.file#);
    DBMS_OUTPUT.PUT_LINE('ALTER DATABASE DATAFILE ' || r.file# || ' ONLINE;');
  END LOOP;
END;
/

-- 4. 手動実行
RECOVER DATAFILE 2;
ALTER DATABASE DATAFILE 2 ONLINE;

シナリオ4:停電復旧手順

# 1. 起動試行
SQL> STARTUP
-- ORA-01113: file X needs media recovery

# 2. MOUNT 状態で確認
SQL> STARTUP MOUNT

# 3. リカバリ必要な datafile
SQL> SELECT * FROM v$recover_file;

# 4. 全 datafile RECOVER
SQL> RECOVER DATABASE;
-- または AUTO
SQL> RECOVER AUTOMATIC DATABASE;

# 5. OPEN
SQL> ALTER DATABASE OPEN;

# 6. 業務再開

シナリオ5:定期監視スクリプト

#!/bin/bash
# monitor_datafile.sh

result=$(sqlplus -s / as sysdba <<EOF
SET HEADING OFF FEEDBACK OFF
SELECT COUNT(*) FROM v\$datafile 
WHERE status NOT IN ('ONLINE', 'SYSTEM', 'SYSAUX');
EXIT;
EOF
)

if [ "$result" != "0" ]; then
  echo "ALERT: $result datafiles not online" | \
    mail -s "URGENT: Oracle Datafile Issue" ops@example.com
fi

crontab の詳細は crontab 使い方の記事も参照してください。

シナリオ6:CI/CD デプロイ前チェック

- name: Check datafiles
  run: |
    sqlplus -s / as sysdba <<EOF
    WHENEVER SQLERROR EXIT SQL.SQLCODE
    DECLARE
      v_cnt NUMBER;
    BEGIN
      SELECT COUNT(*) INTO v_cnt FROM v\$datafile 
      WHERE status NOT IN ('ONLINE', 'SYSTEM', 'SYSAUX');
      IF v_cnt > 0 THEN
        RAISE_APPLICATION_ERROR(-20001, 'Datafiles not online: ' || v_cnt);
      END IF;
    END;
    /
    EOF

Kamal 2 デプロイの詳細は Kamal 2 デプロイの記事を参照してください。

シナリオ7:Docker Oracle でのテスト

docker exec -it oracle-xe sqlplus / as sysdba <<EOF
-- テスト: datafile OFFLINE
ALTER DATABASE DATAFILE 4 OFFLINE;

-- ORA-00376 再現
SELECT * FROM scott.emp;
-- ORA-00376

-- ONLINE 化
ALTER DATABASE DATAFILE 4 ONLINE;

-- ARCHIVELOG モードなら RECOVER 必要
-- RECOVER DATAFILE 4;
EOF

Docker 関連は docker daemon 接続エラーの記事、Docker no space left on device の記事も参照してください。

シナリオ8:Rails ヘルスチェック

class DatabaseHealthController < ApplicationController
  def datafile_check
    result = ActiveRecord::Base.connection.select_all(<<-SQL).to_a
      SELECT file#, name, status FROM v$datafile 
      WHERE status NOT IN ('ONLINE', 'SYSTEM', 'SYSAUX')
    SQL
    
    if result.any?
      render json: { status: 'CRITICAL', datafiles: result }, status: 503
    else
      render json: { status: 'OK' }
    end
  end
end

シナリオ9:Python での自動監視

import oracledb
import logging
from datetime import datetime

def check_datafiles():
    with oracledb.connect(user='monitor', password=pw, dsn=dsn) as conn:
        cursor = conn.cursor()
        cursor.execute("""
            SELECT file#, name, status FROM v$datafile
            WHERE status NOT IN ('ONLINE', 'SYSTEM', 'SYSAUX')
        """)
        problems = cursor.fetchall()
        
        if problems:
            for file_num, name, status in problems:
                logging.critical(
                    f"Datafile {file_num} ({name}): {status}"
                )
            return False
        return True

シナリオ10:Autonomous DB での対応

Autonomous DB では
- 自動的な datafile 管理
- 通常 DBA 介入不要
- ただし監視は継続

トラブルシューティング

ONLINE 化しても再度 OFFLINE

ハードウェア障害の可能性、OS ログ確認。

RECOVER が失敗

アーカイブログ不足、RMAN で確認:

RMAN> LIST ARCHIVELOG ALL;

RESTORE 失敗

バックアップなし or バックアップ破損、最新バックアップ確認。

OFFLINE DROP のリスク

データ完全消失、最終手段のみ。

大量 datafile 影響

テーブルスペース単位で対処:

ALTER TABLESPACE users ONLINE;

PostgreSQL からの移行

PG は pg_basebackup + WAL、Oracle は RMAN + アーカイブログ。


よくある質問(FAQ)

Q1. ORA-00376 と ORA-01578 の違い

  • 00376: ファイル読み取り不可(OFFLINE/RECOVER)
  • 01578: ブロック破損

Q2. ONLINE と RECOVER の違い

  • ONLINE: 通常状態
  • RECOVER: MEDIA RECOVERY 必要

Q3. OFFLINE DROP のリスク

データ完全消失、リカバリ不能。

Q4. ARCHIVELOG モードの重要性

ONLINE 復旧に必須、NOARCHIVELOG は制限大。

Q5. RMAN の推奨

バックアップ標準、OS レベルコピーより安全。

Q6. Rails での対応

ヘルスチェックエンドポイント、監視統合。

Q7. Java での対応

errorCode == 376 で判定、監視通知。

Q8. SAP 環境の考慮

SAP Note 328785 参照、brtools 併用。

Q9. 監視の閾値

status != ‘ONLINE’ で即アラート。

Q10. Autonomous DB での挙動

自動管理、通常介入不要。

Q11. パフォーマンスへの影響

発生時業務停止、予防必須。

Q12. 予防策

  • 定期 RMAN バックアップ
  • ARCHIVELOG モード
  • 監視スクリプト
  • ハードウェア冗長化

参考リンク

Oracle 公式


まとめ

ORA-00376: file X cannot be read at this time の要点を再整理します。

エラーの本質

Oracle がデータファイルを読み取ろうとしたが失敗
→ OFFLINE / RECOVER / OS 削除 / ロック等
→ 特定オブジェクトへのアクセス不能
→ アプリ停止
→ DBA 緊急対応

エラーメッセージの読み方

ORA-00376: file X cannot be read at this time
                 ↑
             読み取り不可のファイル番号

ORA-01110: data file X: '/path/to/file.dbf'
                    ↑
              物理ファイルパス

V$DATAFILE STATUS

STATUS意味対処
ONLINE通常問題なし
OFFLINE停止ONLINE 化
RECOVER復旧必要RECOVER + ONLINE
SYSTEMSYSTEM TS特殊対応
SYSAUXSYSAUX TS特殊対応

緊急対応の5ステップ

-- STEP 1: SYSDBA 接続
sqlplus / as sysdba

-- STEP 2: STATUS 確認
SELECT file#, name, status FROM v$datafile WHERE file# = X;

-- STEP 3: TS 確認
SELECT status FROM dba_tablespaces 
WHERE tablespace_name = (SELECT tablespace_name 
                         FROM dba_data_files WHERE file_id = X);

-- STEP 4: 対処
-- OFFLINE → ALTER DATABASE DATAFILE X ONLINE
-- RECOVER → RECOVER DATAFILE X + ONLINE
-- OS 削除 → RMAN RESTORE + RECOVER

-- STEP 5: 検証
SELECT COUNT(*) FROM user_table;

10大原因

#原因対処
データファイル OFFLINEONLINE 化
テーブルスペース OFFLINETS ONLINE
RECOVER statusRECOVER + ONLINE
OS ファイル削除RMAN RESTORE
バックアップソフトロックRMAN 使用
自動 OFFLINE 化HW 修理 + RECOVER
RMAN RESTORE 中完了待ち
RENAME 中ONLINE 化忘れ
SAP + OracleSAP Note 328785
停電後RECOVER DATABASE

6つの解決策

-- ① ALTER TABLESPACE ONLINE
ALTER TABLESPACE users ONLINE;

-- ② ALTER DATABASE DATAFILE ONLINE
ALTER DATABASE DATAFILE 4 ONLINE;

-- ③ RECOVER DATAFILE
RECOVER DATAFILE 4;
ALTER DATABASE DATAFILE 4 ONLINE;
-- ④ RMAN RESTORE + RECOVER
rman target /
RMAN> RESTORE DATAFILE 4;
RMAN> RECOVER DATAFILE 4;
RMAN> SQL 'ALTER DATABASE DATAFILE 4 ONLINE';
-- ⑤ OFFLINE DROP(最終手段、データ捨てる)
ALTER DATABASE DATAFILE 4 OFFLINE DROP;

-- ⑥ SAP 環境
-- SAP Note 328785 参照、brtools 使用

診断クエリ Top 5

-- ① datafile STATUS
SELECT file#, name, status FROM v$datafile;

-- ② リカバリ必要
SELECT * FROM v$recover_file;

-- ③ ヘッダ SCN
SELECT file#, status, checkpoint_change# 
FROM v$datafile_header;

-- ④ TS 状態
SELECT tablespace_name, status FROM dba_tablespaces;

-- ⑤ ONLINE_STATUS
SELECT file_name, online_status FROM dba_data_files;

予防のポイント

1. ARCHIVELOG モードで運用
2. 定期 RMAN バックアップ
3. 監視スクリプト(status != ONLINE 検知)
4. ハードウェア冗長化(RAID/DR)
5. SAP 環境は brtools 併用
6. Rails/Java でヘルスチェック
7. CI/CD で datafile 検証
8. 停電対策(UPS)
9. OS ログ監視(I/O エラー)
10. Autonomous DB では自動管理

これらの知識は、Oracle DBA の本番運用・障害対応・DR 計画・データ保護・Rails / Java / Python アプリ運用・監視設計・バックアップ戦略・SAP + Oracle 管理・Autonomous DB 管理など、あらゆる場面で活用できます。本記事をブックマークしておけば、ORA-00376 に出会っても冷静に的確に対処できるようになります。


本記事は2026年6月時点の情報をもとに、Oracle Database 19c〜23ai での動作確認・公式ドキュメントに基づき作成しています。Oracle のバージョンにより挙動が異なる場合があるため、最新の情報は Oracle 公式ドキュメント(docs.oracle.com)もあわせてご確認ください。