【Oracle】ORA-01034 / ORA-27101の原因と解決方法|DB未起動・ORACLE_SID違い

【Oracle】ORA-01034 / ORA-27101の原因と解決方法|DB未起動・ORACLE_SID違い Oracle

ORA-01034: ORACLE not availableORA-27101: shared memory realm does not exist は、Oracleインスタンスへ接続しようとした時に、対象インスタンスが利用できない、または共有メモリ領域が見つからない場合に一緒に出ることが多いエラーです。代表的な原因は、DBインスタンスが起動していない、ORACLE_SID が違う、Windowsサービスが停止している、別Oracle Homeを見ている、起動に失敗している、などです。

Oracle公式の説明では、ORA-01034はOracleインスタンスが利用できないため起動が必要な状態、ORA-27101は共有メモリ領域が存在しない状態として説明されています。つまり、このエラーではネットワーク設定よりも先に、対象インスタンスが本当に起動しているか、正しいSIDを見ているかを確認します。

先に結論
ORA-01034 / ORA-27101が出たら、まず ORACLE_SID とインスタンス起動状態を確認します。Linuxでは ps -ef | grep pmon、WindowsではOracleサービス、SQL*Plusでは sqlplus / as sysdba から startup を確認します。起動に失敗する場合はalert.logを見ます。
スポンサーリンク

ORA-01034 / ORA-27101とは

ORA-01034は、接続しようとしたOracleインスタンスが利用できないことを示します。ORA-27101は、そのインスタンスのSGAなどの共有メモリ領域を見つけられないことを示します。多くの場合、DBが起動していないか、接続しようとしているSIDが違います。

このエラーは、sqlplus / as sysdba、SQL Developer、アプリ、バッチなどで表示されます。ただし、クライアント接続のリスナーエラーとは原因が違います。リスナーに接続できない場合は ORA-12541の記事、サービス名が見つからない場合は ORA-12514の記事 を参照してください。

外部クライアントからの接続設定全体を確認したい場合は、Oracleネットワーク設定の記事 も参考になります。ただし、ORA-01034 / ORA-27101では、まずローカルでインスタンスが起動しているかを優先して確認します。

DBインスタンスが停止している

最も多い原因です。OS上にPMONなどのOracleバックグラウンドプロセスがない、Windowsサービスが停止している状態です。

ORACLE_SIDが違う

別のSIDを指定しているため、存在しないインスタンスへ接続しようとしている状態です。

起動に失敗している

メモリ不足、パラメータ不備、制御ファイル/データファイル問題などでstartupが失敗している状態です。

別Oracle Homeを見ている

複数Oracle Home環境で、環境変数やPATHが想定と違うOracleを参照している状態です。

最短チェック順

ORA-01034 / ORA-27101では、ネットワーク設定やtnsnames.oraを見る前に、ローカルのインスタンス状態を確認します。次の順番で見ると、DB停止なのか、SID違いなのか、起動失敗なのかを分けやすくなります。

1. ORACLE_SIDを確認

接続したいインスタンスのSIDを見ているか確認します。

2. OSプロセス/サービスを確認

LinuxならPMON、WindowsならOracleService が動いているか確認します。

3. sqlplus / as sysdbaで確認

管理接続できるか確認し、必要なら startup します。

4. 起動失敗ならalert.logを見る

startupでエラーになる場合は、alert.logとトレースを確認します。

LinuxでORACLE_SIDとPMONを確認する

Linuxでは、まずOracleユーザーで環境変数とPMONプロセスを確認します。PMONプロセス名には通常 ora_pmon_ が含まれます。

check-linux-oracle-sid.sh
echo $ORACLE_SID
echo $ORACLE_HOME
which sqlplus

ps -ef | grep pmon | grep -v grep

ORACLE_SID とPMONのSIDが違う場合、環境変数を正しいSIDへ切り替えます。oraenv を使う環境なら、そこで正しいSIDを選びます。

set-oracle-sid-linux.sh
export ORACLE_SID=ORCL
. oraenv

sqlplus / as sysdba

Windowsでサービスを確認する

Windowsでは、Oracleインスタンスがサービスとして管理されます。OracleService が停止していると、ORA-01034 / ORA-27101になることがあります。

check-windows-oracle-service.ps1
Get-Service | Where-Object { $_.Name -like 'OracleService*' }

# 例: ORCLサービスを確認
Get-Service OracleServiceORCL
start-windows-oracle-service.ps1
Start-Service OracleServiceORCL

# リスナーも必要に応じて確認
Get-Service | Where-Object { $_.Name -like '*TNSListener*' }

Windowsでローカル接続エラーが絡む場合は、ORA-12560の記事 も参考になります。OracleServiceは動いているが外部接続できない場合は、リスナー側も確認します。

sqlplus / as sysdbaで起動状態を確認する

正しいOSユーザーと環境変数で、管理接続を試します。接続後に STARTUP できる場合は、インスタンスが停止していた可能性が高いです。

sqlplus-startup.sql
sqlplus / as sysdba

STARTUP;

SELECT instance_name, status
FROM v$instance;

SELECT name, open_mode
FROM v$database;

STARTUP が成功したら、必要に応じてリスナー状態も確認します。リスナー確認は リスナー確認の記事、リスナー起動は リスナー起動の記事 を参照してください。SQL*Plusの基本操作は SQL*Plusの記事 も参考になります。

NOMOUNT・MOUNT・OPENの状態を確認する

インスタンスが完全に停止している場合だけでなく、NOMOUNTMOUNT の途中状態でも、通常ユーザーやアプリからは利用できないことがあります。管理接続できる場合は、インスタンス状態とデータベースのOPEN状態を確認します。

check-instance-open-mode.sql
SELECT instance_name, status, database_status
FROM v$instance;

SELECT name, open_mode
FROM v$database;

STARTED / NOMOUNT

インスタンスは起動していますが、制御ファイルをまだマウントしていません。通常利用はできません。

MOUNTED

制御ファイルは読めていますが、データベースはOPENしていません。リカバリや管理作業中のことがあります。

OPEN

通常接続できる状態です。OPENなのにアプリだけ失敗する場合は、接続先やリスナー側も確認します。

行が取得できない

管理接続自体ができない、またはインスタンス未起動/SID違いの可能性があります。

startupで失敗する場合はalert.logを見る

STARTUP で別のエラーが出る場合、ORA-01034 / ORA-27101は結果であり、根本原因は起動失敗側にあります。メモリ不足、パラメータファイル不備、制御ファイルやデータファイルの問題などをalert.logで確認します。

check-alert-location.sql
SHOW PARAMETER diagnostic_dest;

SELECT name, value
FROM v$diag_info
WHERE name IN ('Diag Trace', 'Diag Alert');

メモリ設定が原因で起動できない場合は、SGA/PGAやメモリ管理の見直しが必要です。メモリ設定全体は SGA・PGAメモリ管理の記事 も参考になります。

共有メモリを安易に削除しない

Linux環境では、共有メモリ関連の情報を ipcs で確認することがあります。ただし、原因が分からないまま ipcrm で共有メモリを削除するのは危険です。稼働中インスタンスや別インスタンスに影響する可能性があるため、まずプロセス、SID、alert.log、起動状態を確認します。

check-shared-memory-linux.sh
ipcs -m
ps -ef | grep pmon | grep -v grep

# 共有メモリ削除は、対象インスタンス停止と影響確認後にDBA判断で行う
ipcrmは最後の手段
ipcrm は共有メモリを削除する操作です。ORA-27101が出たからといって機械的に実行するものではありません。対象インスタンスが停止していること、他インスタンスに影響しないこと、再起動手順があることを確認してからDBA判断で行います。

ORACLE_HOMEが違う場合

複数Oracle Homeや複数バージョンがあるサーバーでは、想定と違う sqlplus や設定ファイルを参照していることがあります。ORACLE_HOMEPATHoratab、Windowsサービス名を確認します。

check-oracle-home.sh
echo $ORACLE_HOME
echo $PATH
which sqlplus
cat /etc/oratab

別Oracle Homeのリスナーやsqlplusを使っていると、接続先や管理対象を取り違えることがあります。リスナー設定の場所は リスナーログの記事 やネットワーク設定記事も参考になります。

アプリからだけ出る場合

サーバー上で sqlplus / as sysdba や通常接続が成功するのに、アプリからだけORA-01034 / ORA-27101が出る場合は、アプリが別の接続先や古いSIDを見ている可能性があります。接続文字列、環境変数、サービス名、接続プール設定を確認します。

アプリの接続先SIDが古い

DB移行やPDB化後に、古いSIDへ接続しようとしているケースです。

サービス名ではなくSID接続している

CDB/PDB環境ではサービス名接続が基本です。接続方式を見直します。

接続先サーバーが違う

DNS、hosts、ロードバランサ、環境別設定ファイルを確認します。

DBは起動したがリスナー未登録

外部接続ではORA-12514やORA-12541になることがあります。リスナー状態を確認します。

似た接続エラーとの違い

ORA-01034 / ORA-27101は、ローカルのインスタンス起動状態やSID違いで見ることが多いです。ネットワーク系エラーとは確認順が違います。

ORA-01034

Oracleインスタンスが利用できません。DB未起動、起動失敗、SID違いを確認します。

ORA-27101

共有メモリ領域が見つかりません。対象インスタンスが起動していない、またはSIDが違う可能性があります。

ORA-12541

指定ホスト・ポートにリスナーがいません。詳しくは ORA-12541の記事 を参照してください。

ORA-12514

リスナーは応答していますが、サービス名を認識していません。詳しくは ORA-12514の記事 を参照してください。

ORA-12560

TNSプロトコル・アダプタエラーです。Windowsローカル接続や環境変数、サービス状態で見ることがあります。詳しくは ORA-12560の記事 を参照してください。

対応手順まとめ

  1. ORACLE_SID が正しいか確認する
  2. Linuxなら ps -ef | grep pmon でインスタンスプロセスを確認する
  3. Windowsなら OracleService が起動しているか確認する
  4. sqlplus / as sysdba で管理接続する
  5. 停止していれば STARTUP する
  6. 起動に失敗する場合はalert.logを確認する
  7. 複数Oracle Home環境では ORACLE_HOMEPATH を確認する
  8. 外部接続が必要ならリスナー状態も確認する

ORA-01034 / ORA-27101は、まずDBインスタンスが本当に起動しているか、正しいSIDを見ているかを確認するエラーです。ネットワーク設定やリスナーを直す前に、ローカルで管理接続できるか、PMONやWindowsサービスが存在するか、STARTUP が成功するかを見てください。起動に失敗する場合は、alert.logに根本原因が残っていることが多いです。

よくある質問

sqlplus / as sysdbaでもORA-01034になります

対象SIDのインスタンスが起動していないか、ORACLE_SID が違う可能性があります。PMONプロセスやWindowsサービスを確認し、正しいSIDで STARTUP します。

startupしたら別のエラーが出ました

その別エラーが根本原因です。alert.logを確認し、メモリ、パラメータ、制御ファイル、データファイルなどの問題を切り分けます。

DBは起動しているのにアプリだけ失敗します

アプリが別SID、別ホスト、古い接続文字列を見ている可能性があります。アプリの接続先、環境別設定、接続プール、tnsnames.oraを確認します。

リスナーも起動する必要がありますか?

ローカルの sqlplus / as sysdba だけならリスナー不要な場合があります。外部クライアントやアプリから接続する場合は、リスナーも起動している必要があります。

参考