【完全版】ORA-01017: invalid username/password エラーの原因と対処法|Oracleログイン失敗の全パターン徹底解説
- 作成日 2026.06.12
- 更新日 2026.06.17
- ubuntu
Oracle Databaseに接続しようとした時に、以下のエラーで弾かれた経験はありませんか?
ORA-01017: invalid username/password; logon denied
「ユーザー名かパスワードが違います」というシンプルなメッセージですが、実際の原因は10種類以上あり、単純なタイプミスだけではありません。
- パスワードは合っているはずなのにエラーが出る
- 昨日まで繋がっていたのに今日突然失敗する
- SQL*Plusでは繋がるのにJDBC/SQL Developerでは繋がらない
- SYSアカウントだけ繋がらない
- 開発環境では成功するが本番環境で失敗する
本記事では、ORA-01017エラーのすべての原因と対処法を、現場で即使えるトラブルシューティング手順として整理します。基本的な確認事項から、大文字小文字問題、アカウントロック・期限切れ、CDB/PDB切り替え、JDBCドライバ互換性、SYS認証の特殊事情、各プログラム言語からの接続まで完全網羅。この1本でORA-01017の悩みが全て解決します。
- 1. 結論:今すぐ試すべき3ステップ
- 2. まず押さえる:ORA-01017エラーの全体像
- 3. 【原因①】パスワード・ユーザー名の入力ミス(最頻出)
- 4. 【原因②】大文字・小文字の問題(12c以降の重要ポイント)
- 5. 【原因③】アカウントがロック・期限切れ
- 6. 【原因④】CDB/PDB環境の接続先間違い(12c以降の重要原因)
- 7. 【原因⑤】そもそもユーザーが存在しない
- 8. 【原因⑥】接続文字列の指定ミス(別のDBに繋いでいる)
- 9. 【原因⑦】JDBC接続でのORA-01017
- 10. 【原因⑧】SYS / SYSTEM アカウントでの ORA-01017
- 11. 【原因⑨】SQL*Plusでは繋がるが他ツールで繋がらない
- 12. 【原因⑩】DataGuard / Standby DBへの接続
- 13. プログラム言語別 ORA-01017 対処
- 14. 関連エラーと違い
- 15. セキュリティ視点での注意
- 16. トラブルシューティング・チェックリスト
- 17. よくある質問(FAQ)
- 17.1. Q1. 昨日まで繋がっていたのに今日突然 ORA-01017 になります
- 17.2. Q2. パスワードに @ を含んでいて接続できません
- 17.3. Q3. SYS / SYSTEM のパスワードを忘れました
- 17.4. Q4. 同じ情報で開発環境では繋がるのに本番では繋がりません
- 17.5. Q5. JDBC で接続すると「ORA-01017」、SQL*Plus では成功します
- 17.6. Q6. 「SEC_CASE_SENSITIVE_LOGON を FALSE にしたら繋がりました」と言われましたが?
- 17.7. Q7. パスワードが正しいのに失敗します。何度確認しても
- 17.8. Q8. SQL Developer の接続テストだけ失敗します
- 17.9. Q9. リモートからの接続だけ失敗します
- 17.10. Q10. プロファイルでFAILED_LOGIN_ATTEMPTS=UNLIMITEDにすれば永久にロックされませんか?
- 18. 参考リンク・関連資料
- 19. まとめ
結論:今すぐ試すべき3ステップ
時間がない方向けに、まず試すべき手順を示します。
ステップ1:パスワードを再入力(タイプミスチェック)
sqlplus username/password@dbname
⚠️ パスワードに @ / " ( などの記号が含まれる場合はダブルクォートで囲む:
sqlplus 'username/"P@ssw0rd!"@dbname'
ステップ2:アカウント状態を確認(要DBA権限)
SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE, EXPIRY_DATE
FROM DBA_USERS
WHERE USERNAME = 'YOUR_USER';
ステップ3:パスワードをリセット(DBAが必要)
ALTER USER your_user IDENTIFIED BY new_password ACCOUNT UNLOCK;
それでも解決しない場合は、以下の詳細な原因分析へ進んでください。
まず押さえる:ORA-01017エラーの全体像
ORA-01017は、Oracleの認証ステップで失敗したことを示します。原因は大きく以下のカテゴリに分けられます。
| カテゴリ | 原因例 | 頻度 |
|---|---|---|
| 入力ミス系 | パスワード誤り、特殊文字エスケープ、コピペミス | 最多 |
| アカウント状態系 | ロック、期限切れ、ユーザー削除済み | 多 |
| 接続先間違い系 | 別DBに接続、PDB誤り、CDBルート誤接続 | 中 |
| 大小文字感度系 | 12c以降の大小文字区別、引用符問題 | 中 |
| ドライバ互換性系 | 古いJDBC、暗号化方式の不一致 | 中 |
| SYS特殊系 | SYSDBA接続、パスワードファイル問題 | 少 |
| 設定系 | sec_case_sensitive_logon、PROFILE設定 | 少 |
これらを順番にチェックしていくのが効率的な切り分け方法です。
【原因①】パスワード・ユーザー名の入力ミス(最頻出)
最も多いケースです。意外な落とし穴を含めて整理します。
ありがちなタイプミス
- スペースが含まれている(前後・中間)
- 全角文字が混じっている(特に英字
Oと0、lと1) - Caps Lockが有効
- 日本語キーボードで記号が想定と違う(
@が[になる等)
コピペ時の見えない文字に注意
メールやチャットからパスワードをコピーすると、改行コードやゼロ幅スペースが混入することがあります。一度メモ帳で開いて余計な文字がないか確認してください。
パスワードに特殊文字が含まれる場合
シェル経由(sqlplus、bash)で接続する場合、@ $ ! " ' などはシェルの特殊文字として解釈される可能性があります。シングルクォートまたはダブルクォートで囲むのが安全です。
# パスワード = MyP@ss!2025 の場合
sqlplus 'scott/"MyP@ss!2025"@orcl'
Linux/Mac の bash の場合のエスケープ例
# シングルクォートで全体を囲む(推奨)
sqlplus 'scott/MyP@ss!2025@orcl'
# あるいは特殊文字をバックスラッシュでエスケープ
sqlplus scott/MyP\@ss\!2025@orcl
Windows のコマンドプロンプト
sqlplus scott/"MyP@ss!2025"@orcl
ダブルクォートを使うのが標準です。
【原因②】大文字・小文字の問題(12c以降の重要ポイント)
Oracle 12c(11g R2の一部設定でも)以降、パスワードはデフォルトで大文字小文字を区別します。
CASE_SENSITIVE_LOGON 設定の確認
SHOW PARAMETER sec_case_sensitive_logon;
| 値 | 動作 |
|---|---|
TRUE(デフォルト) | パスワードの大小文字を区別する |
FALSE | 区別しない(11g以前の挙動) |
⚠️ Oracle 19c以降では、SEC_CASE_SENSITIVE_LOGON は非推奨かつ後続バージョンで削除予定です。FALSE設定は移行措置としてのみ使ってください。
引用符付きユーザー名の罠
CREATE USER "MyUser" IDENTIFIED BY ... のように二重引用符で作成すると、ユーザー名が大文字小文字を区別する状態で登録されます。接続時も完全一致する必要があります。
-- 大文字小文字を含むユーザーは引用符が必須
SELECT USERNAME FROM ALL_USERS WHERE USERNAME LIKE 'My%';
接続:
sqlplus '"MyUser"/password@orcl'
パスワード ベリファイア関数による制約
PASSWORD_VERIFY_FUNCTION で大文字・小文字・記号の混在を強制している環境では、ポリシーに違反するパスワードは設定できません。
SELECT * FROM DBA_PROFILES WHERE RESOURCE_NAME = 'PASSWORD_VERIFY_FUNCTION';
【原因③】アカウントがロック・期限切れ
しばらく繋いでいなかったり、パスワードを連続で間違えると、アカウントが自動的にロック・期限切れ状態になります。
アカウント状態の確認
SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE, EXPIRY_DATE, PROFILE
FROM DBA_USERS
WHERE USERNAME = 'SCOTT';
ACCOUNT_STATUS の主な値
| ステータス | 意味 | 解決方法 |
|---|---|---|
OPEN | 正常 | (他の原因を疑う) |
LOCKED | 管理者がロックした | ALTER USER ... ACCOUNT UNLOCK |
LOCKED(TIMED) | パスワード連続誤入力で自動ロック | 同上 |
EXPIRED | パスワード期限切れ | パスワード変更 or 期限延長 |
EXPIRED(GRACE) | 期限切れ猶予期間中 | パスワード変更を促される |
EXPIRED & LOCKED | 期限切れ+ロック | 両方対処 |
ロックを解除する
ALTER USER scott ACCOUNT UNLOCK;
パスワード期限切れの解決
期限切れアカウントに接続を試みると、SQL*Plusでは以下のような対話が出ます:
ORA-28001: パスワードが期限切れです
古いパスワードを入力してください:
新しいパスワードを入力してください:
新しいパスワードを再入力してください:
パスワードが変更されました。
スクリプトから一括変更する場合:
ALTER USER scott IDENTIFIED BY new_password;
期限を無期限にする(セキュリティ的に非推奨)
-- 専用プロファイルを作成
CREATE PROFILE NO_EXPIRY LIMIT PASSWORD_LIFE_TIME UNLIMITED;
ALTER USER scott PROFILE NO_EXPIRY;
または既存プロファイルを変更:
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
⚠️ パスワード無期限化はセキュリティリスクを生むため、業務要件と照らし合わせてご判断ください。
ロック・期限切れの状態を一覧で確認
SELECT USERNAME, ACCOUNT_STATUS
FROM DBA_USERS
WHERE ACCOUNT_STATUS != 'OPEN'
ORDER BY USERNAME;
詳細なユーザー一覧確認方法は[Oracleユーザー一覧取得の解説記事]も併せて参照してください。
【原因④】CDB/PDB環境の接続先間違い(12c以降の重要原因)
12c以降のマルチテナント環境では、接続先のコンテナを間違えることでORA-01017が発生します。
CDBルートとPDBの違い
- CDBルート: コモンユーザー(C##プレフィックス)のみ存在
- PDB: ローカルユーザー(通常のユーザー)が存在
CDBルートに対して通常のユーザー(例: HR)で接続しようとすると、ユーザーが存在しないため ORA-01017 になります。
現在の接続先を確認
SHOW CON_NAME
-- または
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;
PDB一覧を確認
SELECT NAME, OPEN_MODE FROM V$PDBS;
接続先PDBを明示する
サービス名で接続する形に変更します:
# CDBルートではなくPDBサービスに接続
sqlplus hr/hr@//localhost:1521/ORCLPDB1
tnsnames.oraで名前解決している場合:
sqlplus hr/hr@ORCLPDB1
よくあるパターン:環境変数 ORACLE_SID だけ設定して接続失敗
ORACLE_SID=orclだけ設定してsqlplus hr/hrとすると、CDBルートに接続してしまい、PDBのユーザー(HR等)では認証失敗します。サービス名指定が必要です。
コモンユーザーで接続する場合
CDBルートのユーザー(C##で始まる)にPDBから接続したい場合:
ALTER SESSION SET CONTAINER = ORCLPDB1;
-- 通常のC##ユーザーで接続を試みる
または接続文字列でPDBサービスを指定するのが標準です。
【原因⑤】そもそもユーザーが存在しない
ユーザー名のスペルミスや、別環境からコピーした接続情報をそのまま使った場合に発生します。
ユーザーの存在確認
SELECT USERNAME FROM ALL_USERS WHERE USERNAME = 'SCOTT';
⚠️ 大文字で検索してください。Oracleではユーザー名は内部的に大文字管理が原則です。
ユーザーが存在しない場合
DBA権限のあるユーザーで作成:
CREATE USER scott IDENTIFIED BY tiger;
GRANT CONNECT, RESOURCE TO scott;
【原因⑥】接続文字列の指定ミス(別のDBに繋いでいる)
tnsnames.oraの設定や@dbnameの指定で別のDBに繋ぎに行ってしまい、そちらに存在しないユーザーで認証失敗するケースです。
接続先を確認
-- 現在のインスタンス名
SELECT INSTANCE_NAME FROM V$INSTANCE;
-- DB名
SELECT NAME FROM V$DATABASE;
-- ホスト名
SELECT HOST_NAME FROM V$INSTANCE;
tnsnames.ora の場所と内容
# Linux
echo $ORACLE_HOME/network/admin/tnsnames.ora
cat $ORACLE_HOME/network/admin/tnsnames.ora
# Windows
echo %ORACLE_HOME%\network\admin\tnsnames.ora
type %ORACLE_HOME%\network\admin\tnsnames.ora
接続文字列を直接指定して確認
tnsnames.oraを使わずEasy Connect形式で接続することで、設定問題を切り分けられます:
sqlplus scott/tiger@//hostname:1521/service_name
エラーが ORA-12541 / ORA-12154 に変わったら?
接続先指定を変えて「ORA-01017」ではなく接続エラー(ORA-12541、ORA-12154等)が出る場合は、そもそも接続先が間違っていたことを意味します。本記事のシリーズの[ORA-12541解説記事]・[ORA-12154解説記事]を参照してください。
【原因⑦】JDBC接続でのORA-01017
JavaアプリケーションからJDBC経由でORA-01017が発生する場合、追加の原因があります。
ドライバのバージョン互換性
12c以降のサーバーに対して、古いJDBC ドライバ(ojdbc6など)を使うと、新しい認証方式に未対応で接続失敗することがあります。
java -classpath ojdbc8.jar:. YourApp
推奨ドライバ:
- Oracle 12c接続 →
ojdbc8.jar(JDK 8+) - Oracle 19c接続 →
ojdbc8.jarまたはojdbc10.jar - Oracle 21c / 23ai / 26ai接続 →
ojdbc11.jar(JDK 11+)またはojdbc17.jar(JDK 17+)
最新ドライバはOracle Database JDBC ドライバ公式ダウンロードページから取得できます。
認証アルゴリズムの不一致
Oracle 12c以降ではデフォルトで強力なパスワードベリファイア(12C verifier)が使われます。古いクライアントが対応していない場合、サーバー側で互換性設定を変更します:
-- 互換認証方式を許可(一時的・推奨されない)
ALTER SYSTEM SET SQLNET.ALLOWED_LOGON_VERSION_SERVER = 11 SCOPE=SPFILE;
-- DB再起動が必要
恒久的な解決はクライアントドライバを新しくすることです。
接続URL での記述
// 推奨:サービス名形式
String url = "jdbc:oracle:thin:@//hostname:1521/service_name";
// 旧来:SID形式
String url = "jdbc:oracle:thin:@hostname:1521:SID";
// TNSエイリアス形式(tnsnames.oraが必要)
String url = "jdbc:oracle:thin:@TNS_ALIAS";
パスワードに特殊文字がある場合のJDBC接続
getConnection(url, user, password) 方式なら通常エスケープ不要ですが、URL内に直接書く場合はURLエンコードが必要です。
// 安全
Connection conn = DriverManager.getConnection(url, "scott", "Tig@r!");
// URLに含める場合
String url = "jdbc:oracle:thin:scott/Tig%40r%21@//host:1521/svc";
【原因⑧】SYS / SYSTEM アカウントでの ORA-01017
管理者アカウント(特にSYS)には、通常ユーザーと異なる特殊事情があります。
SYS には AS SYSDBA が必須
SYSは特権ユーザーで、通常認証ではなく AS SYSDBA 句が必要です:
# 正しい
sqlplus sys/password@orcl AS SYSDBA
# 失敗(ORA-01017 または ORA-28009)
sqlplus sys/password@orcl
パスワードファイル(orapw)の問題
リモートから SYS AS SYSDBA で接続するには、サーバー上にパスワードファイルが必要です。
パスワードファイルの場所
# Linux
ls -l $ORACLE_HOME/dbs/orapw*
# Windows
dir %ORACLE_HOME%\database\PWD*.ora
パスワードファイル再作成
# Linux
orapwd file=$ORACLE_HOME/dbs/orapwORCL password=new_password force=y
# Windows
orapwd file=%ORACLE_HOME%\database\PWDORCL.ora password=new_password force=y
REMOTE_LOGIN_PASSWORDFILE の確認
SHOW PARAMETER remote_login_passwordfile
| 値 | 意味 |
|---|---|
NONE | パスワードファイル認証無効 |
EXCLUSIVE | 単一DBで使用(標準) |
SHARED | 複数DB共有 |
NONEになっているとリモートSYS接続できないため、EXCLUSIVEに変更してDB再起動が必要です。
OS認証で接続を試す(最終手段)
SYSパスワードを忘れた場合、サーバー上で dba グループに属するOSユーザーで:
sqlplus / AS SYSDBA
これでログインできれば、SYSパスワードをリセット可能:
ALTER USER sys IDENTIFIED BY new_password;
【原因⑨】SQL*Plusでは繋がるが他ツールで繋がらない
「sqlplusでは認証OK・SQL Developerでは失敗」というケースもあります。
よくある原因
- クライアントの暗号化設定 の違い
- 接続文字列の解釈の違い(特にパスワードの特殊文字)
- SSL/TLS要件 の不一致
- JDBCドライバ のバージョン違い
SQL Developer での接続ミス
- 「接続タイプ」が「TNS」になっていないか確認
- 「ロール」プルダウンが間違ってないか(SYSDBA選択忘れ)
- パスワードに特殊文字がある場合、入力欄に直接入力して**「テスト」ボタン**で確認
別ツールで同じ接続情報を試す
切り分けには、複数ツールで同じ情報を試すのが有効です:
- SQL*Plus(CLI)
- SQL Developer(GUI)
- A5:SQL Mk-2(GUI)
- 自作プログラム(JDBC/Python)
一部のみ失敗するなら、そのツール側の設定問題と切り分けられます。
【原因⑩】DataGuard / Standby DBへの接続
DataGuard環境で、**スタンバイDB(Read-Only)**に接続しようとして失敗するケースです。スタンバイは認証情報の更新が反映されないため:
- プライマリでパスワードを変更した直後、スタンバイには未同期
- スタンバイにはパスワードファイル同期が必要
確認
-- スタンバイかどうか
SELECT DATABASE_ROLE FROM V$DATABASE;
-- 結果: PHYSICAL STANDBY / PRIMARY
対処
プライマリ側で:
ALTER USER scott IDENTIFIED BY new_password;
パスワードファイルが同期されている場合は数秒で反映されます。同期されていない場合は、パスワードファイルを手動コピーする必要があります。
プログラム言語別 ORA-01017 対処
Python(python-oracledb)
import oracledb
try:
conn = oracledb.connect(
user="scott",
password="tiger",
dsn="localhost:1521/ORCLPDB1"
)
except oracledb.DatabaseError as e:
error, = e.args
if error.code == 1017:
print("認証エラー: ユーザー名・パスワードを確認")
print(f"接続先: localhost:1521/ORCLPDB1")
oracledbはpython-oracledb公式ドキュメントを参照。
Java(JDBC)
import java.sql.*;
try {
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@//localhost:1521/ORCLPDB1",
"scott",
"tiger"
);
} catch (SQLException e) {
if (e.getErrorCode() == 1017) {
System.err.println("ORA-01017: 認証失敗");
System.err.println("ユーザー名・パスワード・接続先を確認してください");
}
}
Node.js(node-oracledb)
const oracledb = require('oracledb');
try {
const conn = await oracledb.getConnection({
user: 'scott',
password: 'tiger',
connectString: 'localhost:1521/ORCLPDB1'
});
} catch (err) {
if (err.errorNum === 1017) {
console.error('認証失敗 - ユーザー/パスワードを確認');
}
}
.NET(ODP.NET)
using Oracle.ManagedDataAccess.Client;
string connStr = "User Id=scott;Password=tiger;Data Source=ORCLPDB1;";
try {
using var conn = new OracleConnection(connStr);
conn.Open();
} catch (OracleException ex) when (ex.Number == 1017) {
Console.WriteLine("認証失敗");
}
関連エラーと違い
ORA-01017と混同しやすいエラーを整理します。
ORA-28000: アカウントがロックされています
明示的にロックされた場合のエラー。ORA-01017とは別に出ることがあります。
対処:
ALTER USER scott ACCOUNT UNLOCK;
ORA-28001: パスワードが期限切れです
期限切れアカウントに接続した場合。ORA-01017ではなくこちらが出ることが多いです。
対処: パスワード変更で解決
ORA-28009: SYSへの接続にはAS SYSDBAが必要
SYSに通常認証で接続しようとした場合。
対処: AS SYSDBA を付ける
ORA-12541 / ORA-12154
そもそも接続文字列で指定したDBに到達できていない場合。認証以前の問題です。本シリーズの該当記事を参照してください。
ORA-01005: パスワードが指定されていません
パスワードが空文字で渡された場合。
対処: パスワードを明示的に指定
セキュリティ視点での注意
ロック解除の前に監査ログ確認
LOCKED(TIMED) は不正アクセス試行が原因の可能性があります。ロック解除する前に、誰がいつ失敗したかを確認しましょう。
SELECT
USERNAME,
USERHOST,
TERMINAL,
TIMESTAMP,
RETURNCODE
FROM DBA_AUDIT_SESSION
WHERE USERNAME = 'SCOTT'
AND ACTION_NAME = 'LOGON'
AND RETURNCODE = 1017
ORDER BY TIMESTAMP DESC
FETCH FIRST 20 ROWS ONLY;
Unified Auditing(12c以降推奨)の場合:
SELECT
DBUSERNAME,
USERHOST,
TERMINAL,
EVENT_TIMESTAMP,
RETURN_CODE
FROM UNIFIED_AUDIT_TRAIL
WHERE DBUSERNAME = 'SCOTT'
AND ACTION_NAME = 'LOGON'
AND RETURN_CODE = 1017
ORDER BY EVENT_TIMESTAMP DESC
FETCH FIRST 20 ROWS ONLY;
予期せぬホスト・時刻からの失敗が続いている場合は、ブルートフォース攻撃の可能性も検討してください。
パスワード失敗回数のしきい値設定
-- 5回失敗で60分ロック
ALTER PROFILE DEFAULT LIMIT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 1/24;
トラブルシューティング・チェックリスト
ORA-01017が出た時に上から順にチェックする手順です。
- パスワードのタイプミス・コピペミスがないか → 再入力
- 特殊文字のエスケープ・引用符が正しいか → クォート見直し
- 大文字小文字を正しく入力したか → 大小確認
- ユーザーが存在するか →
SELECT FROM ALL_USERS - アカウントがロックされていないか →
DBA_USERS.ACCOUNT_STATUS - パスワードが期限切れでないか →
DBA_USERS.EXPIRY_DATE - 接続先のCDB/PDBが正しいか → サービス名指定
- SYS接続なら AS SYSDBA を付けたか
- クライアントドライバが対応バージョンか → ojdbcバージョン確認
- パスワードを再設定できる権限が手元にあるか → DBA経由でリセット
これでも解決しないなら、Oracleサポートに問い合わせるべきレアケースです。
よくある質問(FAQ)
Q1. 昨日まで繋がっていたのに今日突然 ORA-01017 になります
主な原因:
- パスワードが期限切れになった →
DBA_USERS.EXPIRY_DATEを確認 - 連続失敗で自動ロックされた →
LOCKED(TIMED)状態 - 管理者がパスワードを変更した
- パスワードを他人がリセットした
まずはDBA_USERSでアカウント状態を確認してください。
Q2. パスワードに @ を含んでいて接続できません
シェルが @ を区切り文字として誤解釈しています。引用符で囲んでください:
sqlplus 'scott/"P@ssw0rd"@orcl'
Q3. SYS / SYSTEM のパスワードを忘れました
サーバーにOSログインできるなら:
sqlplus / AS SYSDBA
SQL> ALTER USER sys IDENTIFIED BY new_password;
SQL> ALTER USER system IDENTIFIED BY new_password;
OSログイン権限もない場合は、サーバー管理者・クラウドベンダーへ依頼が必要です。
Q4. 同じ情報で開発環境では繋がるのに本番では繋がりません
ありがちな原因:
- PDB名が違う(dev=
DEVPDB、本番=PRDPDB) - パスワード ポリシーが本番のほうが厳格で期限切れ
- 本番では同じユーザー名で別のスキーマとして存在
- 本番ではSSL/TLS必須でクライアント設定不足
各環境のtnsnames.oraと接続文字列を比較してください。
Q5. JDBC で接続すると「ORA-01017」、SQL*Plus では成功します
ドライバのバージョン互換性問題の可能性が高いです。最新のojdbc11.jar / ojdbc17.jarを使ってください。oracle.jdbc.thinLogonCapability プロパティでの調整も可能です:
Properties props = new Properties();
props.put("user", "scott");
props.put("password", "tiger");
props.put("oracle.jdbc.thinLogonCapability", "o3"); // 古いサーバー互換
Connection conn = DriverManager.getConnection(url, props);
ただし将来的にはドライバ更新が必須です。
Q6. 「SEC_CASE_SENSITIVE_LOGON を FALSE にしたら繋がりました」と言われましたが?
短期的な解決策としては機能しますが、Oracle 19c以降で非推奨パラメータであり、将来削除されます。本来は正しい大小文字でパスワードを入力するのが解です。FALSE設定はセキュリティを著しく弱体化させるため、本番環境では絶対に避けてください。
Q7. パスワードが正しいのに失敗します。何度確認しても
以下を試してください:
- パスワードに改行・空白が含まれていないかメモ帳で確認
- 全角文字が混入していないか
- ユーザー名・パスワード両方を新しいシンプルな値にリセットして再確認
- OS言語環境(LANG変数)の違いをチェック
- クライアントの文字コード(NLS_LANG)が正しいか
Q8. SQL Developer の接続テストだけ失敗します
- 「接続タイプ」が
Basic、TNS、Advancedのどれかを確認 - TNS選択時は
tnsnames.oraのパス設定が必要 - 「接続ロール」が
Defaultになっているか(SYSDBA選択忘れに注意) - パスワードを再入力してから「接続テスト」
Q9. リモートからの接続だけ失敗します
ローカルでは成功するなら、ネットワーク経路またはリスナー設定の問題の可能性。
sqlplusローカルでパスワード確認- リモートからは別エラー(ORA-12541等)が出ていないか確認
- リスナー稼働確認:
lsnrctl status
ORA-12541が真の原因なら、本シリーズの該当記事を参照してください。
Q10. プロファイルでFAILED_LOGIN_ATTEMPTS=UNLIMITEDにすれば永久にロックされませんか?
技術的には可能ですが、ブルートフォース攻撃に対して無防備になるため強く非推奨です。標準の 10回 または 5回 設定を維持してください。
参考リンク・関連資料
Oracle公式ドキュメント
- Oracle Database Error Messages – ORA-01017 – 公式エラー解説
- Oracle Database Security Guide – セキュリティ全般
- Oracle Database Reference – DBA_USERS – DBA_USERSビュー仕様
- Oracle Database Administrator’s Guide – Managing Users – ユーザー管理
JDBCドライバ
- Oracle JDBC Driver Downloads – 公式JDBC配布
- JDBC Developer’s Guide – JDBC開発ガイド
プログラム言語ドライバ
- python-oracledb Documentation – Python公式
- node-oracledb Documentation – Node.js公式
- ODP.NET Documentation – .NET公式
まとめ
ORA-01017は単純な認証エラーに見えて、実は10種類以上の原因があります。トラブルシューティングの要点を再整理します。
- 入力ミスチェックを最優先: タイプミス・特殊文字エスケープ・大文字小文字
- アカウント状態を確認:
DBA_USERS.ACCOUNT_STATUSで LOCKED / EXPIRED を判別 - CDB/PDB環境では接続先確認: サービス名で明示的にPDB指定
- SYS接続は特殊:
AS SYSDBA句とパスワードファイル - JDBCはドライババージョン要確認: 12c+サーバーには
ojdbc8以降 - セキュリティ視点も忘れずに: ロック解除前に監査ログ確認
これらの知識は、開発環境のセットアップ・本番運用・ユーザー管理・セキュリティ監査などあらゆる場面で必須です。本記事をブックマークしておけば、ORA-01017に遭遇した時にすぐ参照できます。
本記事は2026年6月時点の情報をもとに、Oracle Database 19c / 21c / 23ai / 26ai での動作確認・公式ドキュメントに基づき作成しています。バージョンによってパラメータや認証方式が異なる場合があるため、最新の情報はOracle公式ドキュメントもあわせてご確認ください。
-
前の記事
【完全版】UbuntuでIPアドレスを確認する全方法|ip a・nmcli・グローバルIPまで徹底解説 2026.06.12
-
次の記事
UbuntuでDockerポート競合を解決 | address already in use 2026.06.13
コメントを書く