【完全ガイド】ORA-00376: file X cannot be read at this time の原因と解決方法|データファイル OFFLINE・MEDIA RECOVERY 徹底解説
- 作成日 2026.08.27
- Oracle Database
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' ← 対象ファイル
- 1. 結論:STATUS 確認 → 適切な対処
- 2. Oracle データファイル状態の仕組み
- 3. 【原因①】データファイル OFFLINE(最頻出)
- 4. 【原因②】テーブルスペース OFFLINE
- 5. 【原因③】RECOVER status(MEDIA RECOVERY 必要)
- 6. 【原因④】OS レベルでファイル削除
- 7. 【原因⑤】バックアップソフトが排他ロック
- 8. 【原因⑥】書き込みエラーで自動 OFFLINE 化
- 9. 【原因⑦】RMAN RESTORE 中
- 10. 【原因⑧】データファイル RENAME 中
- 11. 【原因⑨】SAP + Oracle 特有
- 12. 【原因⑩】停電後の不完全状態
- 13. 診断ツール完全リファレンス
- 14. 6つの解決策 完全リファレンス
- 15. Rails / Java / Python 対応
- 16. 実践シナリオ
- 17. トラブルシューティング
- 18. よくある質問(FAQ)
- 19. 参考リンク
- 20. まとめ
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_HEADERのcheckpoint_change# / SCNONLINEvsRECOVERで対処方法が完全に異なる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 ONLINE | TS OFFLINE |
| ② | ALTER DATABASE DATAFILE ONLINE | データファイル OFFLINE |
| ③ | RECOVER DATAFILE | RECOVER status |
| ④ | RMAN RESTORE + RECOVER | OS 削除/破損 |
| ⑤ | OFFLINE DROP | データ諦め |
| ⑥ | SAP Note 参照 | SAP 環境 |
V$DATAFILE STATUS
| STATUS | 意味 | 対処 |
|---|---|---|
| ONLINE | 通常 | 問題なし |
| OFFLINE | 停止 | ONLINE 化 |
| RECOVER | 復旧必要 | RECOVER |
| SYSTEM | SYSTEM TS | 特殊対応 |
| SYSAUX | SYSAUX 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 公式
- Oracle Database Error Messages: ORA-00376
- Oracle Database Administrator’s Guide: Managing Datafiles
- Oracle Database Backup and Recovery: RMAN
- Oracle Database Reference: V$DATAFILE
まとめ
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 |
| SYSTEM | SYSTEM TS | 特殊対応 |
| SYSAUX | SYSAUX 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大原因
| # | 原因 | 対処 |
|---|---|---|
| ① | データファイル OFFLINE | ONLINE 化 |
| ② | テーブルスペース OFFLINE | TS ONLINE |
| ③ | RECOVER status | RECOVER + ONLINE |
| ④ | OS ファイル削除 | RMAN RESTORE |
| ⑤ | バックアップソフトロック | RMAN 使用 |
| ⑥ | 自動 OFFLINE 化 | HW 修理 + RECOVER |
| ⑦ | RMAN RESTORE 中 | 完了待ち |
| ⑧ | RENAME 中 | ONLINE 化忘れ |
| ⑨ | SAP + Oracle | SAP 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)もあわせてご確認ください。
-
前の記事
【完全ガイド】PLS-00341: declaration of cursor is incomplete or malformed の原因と解決方法|PLS-00320 カスケード・自己参照 RETURN 型 徹底解説 2026.08.26
-
次の記事
【完全ガイド】ORA-12170: TNS:Connect timeout occurred の原因と解決方法|Firewall・タイムアウト・JDBC/Python 徹底解説 2026.08.28
コメントを書く