linuxにoracleを入れてsqlplusを起動・実行する(ORA-12154 トラブルシューティング編)
昨日の続きです。
linuxにoracleを入れてsqlplusを起動する - 文系seの備忘録
昨日はsqlplusを入れて起動させるところまでやりました。
こんどはログインして実際にsqlを発行しデータのやりとりを行うところです。
私はこの設定であれこれ苦戦しましたので記録を残しておきます。
具体的に言うと、これから記載する内容に抜けがわんさかあったせいで、実行するたびに何度も
ORA-12154: TNS: サービス名を解決できませんでした。
ORA-12154: TNS: 指定された接続識別子を解決できませんでした
ORA-12154: TNS:could not resolve service name
ORA-12154: TNS:could not resolve the connect identifier specified
このメッセージを見るはめになりました・・・orz
1.環境変数の設定
ホームディレクトリの .bashrc / .bash_profile に設定しておく
前回記事でも書いたように、「export」では端末をオフして再度ログインしたときには
その情報は消えてしまいます。
su でrootユーザーに切り替えて、/home/ユーザー/.bash_profileに環境変数を設定しておきます。
パスの設定などで使うもの
・ ORACLE_BASE
ベースとなるディレクトリ。例:/opt/app/oracle
必須ではないが設定しておくと他の環境変数の記述やバージョン管理が容易になったりする。
・ ORACLE_HOME
(必須)Oracleがインストールされているディレクトリ
・ ORACLE_SID
(必須)接続する識別子
・ PATH
(必須)ORACLE_HOME/bin を追加しておく。
2.tnsnames.ora の設定
クライアント側に必要なファイル。
$ORACLE_HOME/network/admin ディレクトリにあるものが参照されるので、そこに作成する。
tnsnames.oraを検索すると
# find / -name tnsnames.ora
/opt/app/oracle/product/11.2.0/dbhome_1/network/admin/samples/tnsnames.ora
samplesの中にサンプルのファイルがあったけど、サンプル見てもよく分かんなかったので以下のページを参考に作成しました。
> tnsnames.ora - オラクル・Oracleをマスターするための基本と仕組み
ここで注意。
・ tnsnames.oraに無駄な半角、全角スペースがないことを確認する
慣れないlinuxのviでの編集で、知らないうちに先頭にスペースが入ってしまってこれが原因で動作しないというケースがありました。
その他、サービス名などをスペルミスしたり等の記述ミスに注意してください・・・。
3.sqlnet.ora の設定
クライアントとサーバ両方に必要なファイル。
これも$ORACLE_HOME/network/admin ディレクトリ 以下に作っておきます。
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
これで自分の場合はsqlplusにてsql実行することが出来ました。
もし、これでもtnsエラーが出る場合について、メモしておきます。
・古いバージョンのoracleがインストールされてて、そっちのtnsnames.oraが参照されてしまっている
⇒ ORACLE_HOMEに古いオラクルのパスが記述されていたら、それを一旦コメントアウトしてみるか、順番を変えて実行してみる
・TNS_ADMIN環境変数が間違って登録されている
TNS_ADMIN は本来設定されてないと思いますが、おかしなディレクトリに設定されてしまったりしてないか念のため確認しておく。
.bash_profileに参照すべきtnsnames.oraの場所が指定されていればOK
・他環境のtnsnames.oraの記述をコピってきて、一部だけ変更した際に情報が誤っていた
私はこれをやらかしました。凡ミスです。
コピー元が「12.1.0」で、自分の環境は「11.2.0」なのに気付かず実行してました。
このエラーが出たとき、何が原因なのか、何が足りてないのか?
何を設定すればよいのか?
全てが分からず混乱でした。。
ネットで調べても、「tnsnames.oraについて」といった個別にピックアップされた情報は出てくるんだけど、
必要なもの一覧的なものは見つからなかったのでしらみつぶし的な進め方になってしまった。
意外と苦戦しちゃったなぁ。。。