「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 status | lsnrctl start |
| ORA-12514 | サービス名間違い | V$PARAMETER | tnsnames.oraを修正 |
| ORA-01017 | パスワード誤り/ロック | DBA_USERS | ACCOUNT UNLOCK / パスワードリセット |
| ORA-01031 | 権限不足 | USER_SYS_PRIVS | GRANT実行 |
| ORA-00942 | テーブル不存在/権限なし | ALL_TABLES | GRANT SELECT |
| ORA-01653 | データTBS不足 | DBA_FREE_SPACE | データファイル追加 |
| ORA-01652 | TEMP不足 | V$TEMP_SPACE_HEADER | 一時ファイル追加 |
| ORA-30036 | UNDO不足 | DBA_UNDO_EXTENTS | UNDOファイル追加 |
| ORA-00001 | 一意制約違反 | 重複データ確認 | データ修正/制約見直し |
| ORA-02292 | 外部キー参照あり | ALL_CONSTRAINTS | 子から順に削除 |
| ORA-00018 | セッション数上限 | V$SESSION | 不要セッションKILL |
| ORA-04031 | Shared Pool不足 | V$SGASTAT | FLUSH or SGA拡張 |
| ORA-00904 | 列名/エイリアス誤り | SQL確認 | SQL修正 |
| ORA-01722 | 型変換失敗 | データ確認 | データ修正 |
| ORA-01555 | UNDO不足(古すぎる) | undo_retention | パラメータ拡大 |
関連記事:









コメント