OracleのORA-エラー頻出15選と即効対処法【現場エンジニア保存版】

当ページのリンクには広告が含まれています。

「ORA-XXXXX が出た!何これ?」——現場で焦った経験ありませんか?本記事では現場でよく遭遇するORA-エラーを厳選し、原因・確認SQL・対処法をまとめました。これ一本でほぼ対応できます。

目次

1. 接続系エラー {#connection}

ORA-12541: TNS: リスナーがありません

原因: Oracleリスナーが起動していない、またはホスト名・ポートが間違い。

# リスナーの状態確認
lsnrctl status

# リスナーを起動
lsnrctl start

# リスナーを再起動
lsnrctl stop && lsnrctl start
-- tnsnames.oraの接続文字列を確認
-- ホスト名・ポート・サービス名が正しいか確認
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl))
  )

ORA-12514: TNS: リスナーは現在、接続記述子で要求されたサービスを認識していません

原因: サービス名(SERVICE_NAME)が間違っている。

-- 正しいサービス名を確認(DBに接続できる場合)
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'service_names';

-- または
SELECT NAME FROM V$DATABASE;

ORA-01017: ユーザー名/パスワードが無効です。ログインは拒否されました

原因: パスワード間違い、またはアカウントがロックされている。

-- アカウントのロック状態を確認(DBAユーザーで実行)
SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE, EXPIRY_DATE
FROM DBA_USERS
WHERE USERNAME = 'TARGET_USER';

-- アカウントのロックを解除
ALTER USER TARGET_USER ACCOUNT UNLOCK;

-- パスワードをリセット
ALTER USER TARGET_USER IDENTIFIED BY 新しいパスワード;

2. 権限系エラー {#permission}

ORA-01031: 権限が不十分です

原因: 実行しようとした操作に必要な権限がない。

-- 現在のユーザーが持つシステム権限を確認
SELECT PRIVILEGE FROM USER_SYS_PRIVS;

-- 現在のユーザーが持つオブジェクト権限を確認
SELECT TABLE_NAME, PRIVILEGE, GRANTABLE FROM USER_TAB_PRIVS;

-- 権限を付与(DBAユーザーで実行)
GRANT CREATE TABLE TO TARGET_USER;
GRANT SELECT ON SCOTT.EMP TO TARGET_USER;

ORA-00942: 表またはビューが存在しません

原因: テーブル名が間違い、またはそのテーブルへのSELECT権限がない。

-- テーブルの存在確認
SELECT OWNER, TABLE_NAME
FROM ALL_TABLES
WHERE TABLE_NAME = 'EMP';

-- 権限付与(テーブルオーナーまたはDBAで実行)
GRANT SELECT ON SCOTT.EMP TO TARGET_USER;

-- シノニムを作成するとスキーマ名不要になる
CREATE SYNONYM EMP FOR SCOTT.EMP;

3. 領域系エラー {#space}

ORA-01653: 表を拡張できません(表領域が不足)

原因: データテーブルスペースの空き容量不足。

-- テーブルスペースの残量確認
SELECT
    df.TABLESPACE_NAME,
    ROUND(df.TOTAL_MB - NVL(fs.FREE_MB, 0), 1) AS 使用MB,
    ROUND(NVL(fs.FREE_MB, 0), 1) AS 空きMB
FROM
    (SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS TOTAL_MB FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) df
    LEFT JOIN
    (SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS FREE_MB FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) fs
    ON df.TABLESPACE_NAME = fs.TABLESPACE_NAME;

-- 対処: データファイルを追加
ALTER TABLESPACE USERS
    ADD DATAFILE '/u01/oradata/ORCL/users02.dbf'
    SIZE 2048M AUTOEXTEND ON NEXT 256M MAXSIZE 32767M;

ORA-01652: 一時セグメントを拡張できません

原因: TEMPテーブルスペースの空き不足(大きなソート・結合で使用)。

-- TEMP使用状況の確認
SELECT
    ts.TABLESPACE_NAME,
    ROUND(ts.TOTAL_MB, 1) AS 合計MB,
    ROUND(ts.TOTAL_MB - tf.FREE_MB, 1) AS 使用MB
FROM
    (SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS TOTAL_MB FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME) ts,
    (SELECT TABLESPACE_NAME, SUM(FREE_BLOCKS*8192)/1024/1024 AS FREE_MB FROM V$TEMP_SPACE_HEADER GROUP BY TABLESPACE_NAME) tf
WHERE ts.TABLESPACE_NAME = tf.TABLESPACE_NAME;

-- 対処: 一時ファイルを追加
ALTER TABLESPACE TEMP
    ADD TEMPFILE '/u01/oradata/ORCL/temp02.dbf'
    SIZE 2048M AUTOEXTEND ON;

ORA-30036: UNDOセグメントを拡張できません

原因: UNDOテーブルスペースの空き不足(長時間トランザクション実行時)。

-- UNDO設定を確認
SHOW PARAMETER undo_retention;
SHOW PARAMETER undo_tablespace;

-- UNDO TBSの使用状況確認
SELECT TABLESPACE_NAME, STATUS, SUM(BYTES)/1024/1024 AS MB
FROM DBA_UNDO_EXTENTS GROUP BY TABLESPACE_NAME, STATUS;

-- 対処: UNDOファイルを追加
ALTER TABLESPACE UNDOTBS1
    ADD DATAFILE '/u01/oradata/ORCL/undotbs02.dbf'
    SIZE 2048M AUTOEXTEND ON;

4. データ整合性エラー {#integrity}

ORA-00001: 一意制約(制約名)に反しています

原因: PRIMARY KEYまたはUNIQUE制約に重複した値をINSERT/UPDATE しようとした。

-- 重複しているデータを確認
SELECT 重複カラム, COUNT(*)
FROM テーブル名
GROUP BY 重複カラム
HAVING COUNT(*) > 1;

-- どの制約か確認
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_NAME = 'エラーに出た制約名';

-- 重複データを削除(ROWIDを使って古い行を残す)
DELETE FROM テーブル名
WHERE ROWID NOT IN (
    SELECT MIN(ROWID) FROM テーブル名 GROUP BY 重複カラム
);

ORA-02292: 整合性制約が違反されました — 子レコードが見つかりました

原因: 外部キーで参照されている親レコードをDELETEしようとした。

-- 参照している子テーブルを確認
SELECT
    a.OWNER, a.TABLE_NAME, a.CONSTRAINT_NAME,
    a.R_CONSTRAINT_NAME
FROM
    ALL_CONSTRAINTS a
WHERE
    a.R_CONSTRAINT_NAME = 'エラーに出た制約名'
    AND a.CONSTRAINT_TYPE = 'R';

-- 対処: 子レコードを先に削除してから親を削除
DELETE FROM 子テーブル WHERE 外部キー = 削除したい値;
DELETE FROM 親テーブル WHERE 主キー = 削除したい値;

5. リソース系エラー {#resource}

ORA-00018: 最大セッション数を超えました

原因: SESSIONS パラメータで設定した上限に達した。

-- 現在のセッション数を確認
SELECT COUNT(*) FROM V$SESSION;

-- 最大セッション数を確認
SHOW PARAMETER SESSIONS;

-- 不要セッションを強制切断
SELECT SID, SERIAL#, USERNAME, STATUS, OSUSER, MACHINE
FROM V$SESSION
WHERE USERNAME IS NOT NULL
ORDER BY LOGON_TIME;

-- 対象セッションをKILL
ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;

-- 根本対処: SESSIONS を増やす(要DB再起動)
ALTER SYSTEM SET SESSIONS = 500 SCOPE = SPFILE;

ORA-04031: 共有メモリを割り当てられません(Shared Pool)

原因: Shared Pool(共有プール)のメモリ不足。大量の異なるSQLキャッシュなどが原因。

-- Shared Poolの使用状況確認
SELECT POOL, NAME, BYTES/1024/1024 AS MB
FROM V$SGASTAT
WHERE POOL = 'shared pool'
ORDER BY BYTES DESC;

-- 対処①: Shared Poolをフラッシュ(緊急時のみ)
ALTER SYSTEM FLUSH SHARED_POOL;

-- 対処②: SGA_TARGET または SHARED_POOL_SIZE を増やす
ALTER SYSTEM SET SHARED_POOL_SIZE = 512M SCOPE = BOTH;

-- 対処③: バインド変数を使うようにSQLを修正(根本対処)
-- ❌ リテラル値を直書き → SQLがキャッシュされない
SELECT * FROM EMP WHERE EMPNO = 7369;
-- ✅ バインド変数を使う → 同一SQLとして再利用
SELECT * FROM EMP WHERE EMPNO = :empno;

6. SQL構文・実行エラー {#sql}

ORA-00904: 無効な識別子です

原因: 存在しない列名、またはエイリアスの記述位置が間違い。

-- ❌ SELECTで定義したエイリアスをWHEREで使えない
SELECT SAL * 12 AS ANNUAL_SAL FROM EMP WHERE ANNUAL_SAL > 30000;

-- ✅ サブクエリを使う
SELECT * FROM (
    SELECT SAL * 12 AS ANNUAL_SAL FROM EMP
) WHERE ANNUAL_SAL > 30000;

ORA-01722: 数値が無効です

原因: 文字列を数値に変換しようとして失敗(型変換エラー)。

-- ❌ 文字列 'ABC' を数値列と比較
WHERE 数値列 = 'ABC'

-- 混在データを調べる
SELECT * FROM テーブル名
WHERE TRANSLATE(文字列カラム, '0123456789', '') IS NOT NULL;

ORA-01555: スナップショットが古すぎます

原因: 長時間クエリ実行中に、そのクエリが必要としていたUNDOデータが上書きされた。

-- undo_retention を確認(秒単位)
SHOW PARAMETER undo_retention;

-- 対処: undo_retention を大きくする
ALTER SYSTEM SET UNDO_RETENTION = 3600 SCOPE = BOTH;  -- 1時間

-- UNDO TBSに十分な空き容量があることを確認したうえで設定

7. まとめ:エラー対処早見表 {#summary}

エラーコード主な原因即時確認対処
ORA-12541リスナー未起動lsnrctl statuslsnrctl start
ORA-12514サービス名間違いV$PARAMETERtnsnames.oraを修正
ORA-01017パスワード誤り/ロックDBA_USERSACCOUNT UNLOCK / パスワードリセット
ORA-01031権限不足USER_SYS_PRIVSGRANT実行
ORA-00942テーブル不存在/権限なしALL_TABLESGRANT SELECT
ORA-01653データTBS不足DBA_FREE_SPACEデータファイル追加
ORA-01652TEMP不足V$TEMP_SPACE_HEADER一時ファイル追加
ORA-30036UNDO不足DBA_UNDO_EXTENTSUNDOファイル追加
ORA-00001一意制約違反重複データ確認データ修正/制約見直し
ORA-02292外部キー参照ありALL_CONSTRAINTS子から順に削除
ORA-00018セッション数上限V$SESSION不要セッションKILL
ORA-04031Shared Pool不足V$SGASTATFLUSH or SGA拡張
ORA-00904列名/エイリアス誤りSQL確認SQL修正
ORA-01722型変換失敗データ確認データ修正
ORA-01555UNDO不足(古すぎる)undo_retentionパラメータ拡大

関連記事:

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ITの事や自分の経験談など綴っていきたいと思っています。

コメント

コメントする

CAPTCHA


目次