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について」といった個別にピックアップされた情報は出てくるんだけど、
必要なもの一覧的なものは見つからなかったのでしらみつぶし的な進め方になってしまった。
意外と苦戦しちゃったなぁ。。。
linuxにoracleを入れてsqlplusを起動する
1.sqlplusのダウンロード
Instant Client downloads for Linux x86-64
oracleのアカウント登録が必要。
rpmというコマンドでインストールする。
# rpm -ivh oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm
zipファイルみたいに圧縮されててサーバーから展開することも可能なコマンドです。
ダウンロードする場所は/opt/app/oracleあたりでいいかと思います。
んで、これをやったら
「エラー: 依存性の欠如:」
と言われました。あーめんどくさ!
なんか足りないものがあるようですが解凍したいだけなので一時的に解決させときます。
# rpm -ivh --nodeps oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm
「--nodeps」が依存性を無視して実行するオプションです。
Preparing... ################################# [100%]
Updating / installing...
1:oracle-instantclient12.1-sqlplus-################################# [100%]
こんなんが出てきてsqlplusとライブラリがインストールされます。
2.パスを通す
マシンの起動時にパスを読み込むようにするため、各ユーザーの設定ファイルに書いておきます。
export~でパスを通すと端末を再ログインした際にはその情報はクリアされてしまうので注意。
・home/ユーザ名/.bash_profile
の「# User specific environment and startup programs」の下あたりに以下を追加。
・export ORACLE_SID=接続するDBのサービス名
・export ORACLE_HOME=/opt/app/oracle/product/xx.x.x/dbhome_x(インストールしたverによって異なる)
・PATH=$PATH:$ORACLE_HOME/bin
この3つを追加して動いたので、とりあえずはこれで大丈夫なんじゃないかと思います。
上記を設定し終えたら起動してみます。
# sqlplus
SQL*Plus: Release 11.2.0.4.0 Production on Mon Aug 29 17:17:43 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Enter user-name:
でも、これだけではログインしようとしても「 ORA-12154: TNS:could not resolve the connect identifier specified」と言われてしまいます。
その対策は後半戦で。
HTMLファイルをjspに変換する
■ HTMLって?
HTML(Hyper Text Markup Language)
タグを使って作られてます。
阿部寛さんの公式ホームページが分かりやすいので使用させてもらいます。
阿部寛のホームページ
このページ上で F12 もしくはオプションから「開発者ツール」「デベロッパー ツール」(ブラウザにより名前が違います)
をクリックしてコードを見てみます。
※ なんだか懐かしい造りですが公式HPですよ!
下になんか出てきました。これがこのホームページのソースコードです。
ここでダブルクリックすると編集できます。(chromeで実施。他のブラウザは出来ないかも)
ためしに「ドラマ出演」のページで、出演記録の内容を変えてみました。
※ 実際のホームページの内容は書きかわっておらず、あくまで自分のPCでの表示が変わっただけです
■ jspって?
java server page
サーバー上で動き、htmlページの中にjavaのコードを書けます。
jspの作り方
0.tomcatをダウンロードしておく
jspはサーバー上で動きます。なのでTomcatを入れておきます。
・Tomcat/ webapps/ arashi(任意のフォルダ名)/ jsp
jspを入れる
・Tomcat/ webapps/ arashi/ WEB-INF
こっちにjavascriptとかライブラリとか入れとく
1.拡張子を「.jsp」にする
先ほどの阿部寛さんホームページもメモ帳に貼り付けて「.jsp」で保存すればjspになります。
・・ので、HTMLページに動作を加えたいってときにはjspファイルにしてスクリプトを埋め込めばOKです。
2.スクリプトを記述する
<%> ~ <%>のなかにjavaのコードを書きます。
例) 現在日時を取得
現在日時:<%= new java.util.Date() %>
今回は好きなアイドルグループのメンバーにメッセージを送るページを作ってみました。
<!-- このようにしてコメントをかけます --> <!-- これは文字コードを指定するためのもの。なくても動く(環境による) --> <%@ page contentType="text/html;charset=Shift_JIS" %> <html> <head> <title></title> </head> <body> <font color = " dimgray"> <p align="left"> </p> <fieldset class="black_bokashi" style="HEIGHT: 614px; WIDTH: 515px"> <br> <p align="left"><strong><font size="7" color="darkgray">message for member<br></font></strong> <br><br> <!-- javaコード記述で現在日時を取得 --> <strong>現在日時:<%= new java.util.Date() %></strong> <br><br> <strong>アーティスト区分</strong> <select style="WIDTH: 174px"><option selected>アーティスト区分選択</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option></select><br> ・ ・ ・ (以下省略)
jspは以下においたので
URLはこうなります。
http://localhost:8080/arashi/jsp/message.jsp
ブラウザから見てみます。
データベースからメンバー情報をとってきたり時刻を表示したり、javaのプログラムの処理が行えました。
これがhtmlだとどうなるかというと、、
当然ですがjavaプログラムと認識されずそのまま文字として表示されます。
java gold紫本の新版が3年越しでついに発売
java 紫本、ついに新版出ます。
・オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)
オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)
- 作者: 山本道子
- 出版社/メーカー: 翔泳社
- 発売日: 2016/07/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
2013年に発売した紫本から実に3年。
SE 8へのバージョンアップによって拡大した出題範囲を詳しく解説。
サンプルコードで動作を確認しながら学習できるとともに、試験対策として豊富な練習問題と模擬試験を掲載。
サンプルコード付きなのが良いです。
silverのときもテキストでの学習だけでなく、けっこうコーディングをして実際に動かして理解したので・・。
java se7と比較して
・ラムダ式
・Stream API
・Date and Time API
などが追加になりました。
APIの使い方と、se8で新しく増えた機能を理解することがカギとなりそうです。
最近rubyばかりでjavaはご無沙汰なので、javaの基本文法と概念(オブジェクト指向など)を復習しなくては。
こういう試験は期間をあけずに取るべきだなぁ~と改めて感じました。
リハビリたいへん。
Encoding::CompatibilityError の対処方法と cannot load such file -- 2.2/gherkin_lexer_en
rubyのバージョンを上げて以来、Encoding::CompatibilityError というエラーが発生。
Encoding::CompatibilityError は互換性のない文字列連結などで発生するらしい。
けど、ソースいじってないし実行マシンの設定も変えてない。
実行時のログを見てみると
WARNING: cannot load such file -- 2.3/gherkin_lexer_en
"cannot load such file" 再び。
今度は「gherkin_lexer_en」ってのが見つからないよって言われた。
なんだこのファイルは。GENKINGと空目してしまう。
調べたらfeatureファイルの書式の1つに「Gherkin 書式」というものがあるそう。
このファイルが読めてないせいで、エンコーディングがうまくいかずにエラーになってるっぽい。
下記ページに対処方法が載っている
watir - cucumber Couldn't load 2.1/gherkin_lexer_en - Stack Overflow
対処方法
1.gherkin 2.12.2 をインストールする
2.c_lexer.rbのprefix = の部分を置き換える
・ファイルの場所
例)version2.3.0の場合
C:\Ruby23-x64\lib\ruby\gems\2.3.0\gems\gherkin-2.12.2-x86-mingw32\lib\gherkin
・元々書いてある以下をコメントアウトして、
prefix = RbConfig::CONFIG['arch'] =~ /mswin|mingw/ ? "#{RbConfig::CONFIG['MAJOR']}.#{RbConfig::CONFIG['MINOR']}/" : ''
・以下を追記
prefix = ''
注意点
※ 上記対応は動かしているrubyのバージョンのファイルに対して行います。
インストールしたrubyのディレクトリ以下それぞれにファイルが作られているため。。
これは2.2系
これは2.3系
関連:rubyの最新バージョンをインストールするとろくなことがない (cannot load such file -- ffi_c (LoadError)) - 文系seの備忘録
ただし・・・
・バージョンアップするごとに毎回書き換えるのが面倒
・別の環境で実行したときにわざわざ書き換えなきゃいけないのは面倒
という問題があるかと思います。
その場合は実行時にcopyコマンドでファイルごと上書きするよう設定しておくと良いと思います。
例) バグ対応パッチをどこかにおいておいて、それを2.3系にコピーする
copy /Y xxx\c_lexer.rb C:\Ruby23-x64\lib\ruby\gems\2.3.0\gems\gherkin-2.12.2-x86-mingw32\lib\gherkin\c_lexer.rb
※ 別のrubyバージョンを使うときにはcopy先のフォルダを変更すればOKです
再度実行してみたところ、Encoding::CompatibilityError は消えました。
rubyの最新バージョンをインストールするとろくなことがない (cannot load such file -- ffi_c (LoadError))
7/5
Rubyの最新バージョンを入れて、jenkinsからジョブを実行したところこんなエラーがでました。
C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ffi-1.9.13-x64-mingw32/lib/ffi.rb:6:in `require': cannot load such file -- ffi_c (LoadError)
ffiってのはForeign Function Interfaceという多言語を呼び出すためのIFらしい。
これが読み込めないよって言われてる。
ジョブを実行してるノードで以下コマンドを実行したところ、
gem list
ffi自体は入ってるっぽい。
ffi (1.9.10 x64-mingw32)
しかたなく実際にそのディレクトリを覗いてみました。
・・・ああ。確かに2.3系用のファイルがありません。
7/12
上記エラーが解消されてました。
LoadErrorと言われてたパスの場所を見に行くと
2.3系用のライブラリフォルダが作成されてました。
今回はほっといたら直ったので良かったけど、すぐに動かしたいってときにはgemを入れなおすとかする必要があるみたいです
can't find ffi_c with ruby 2.2.1 on Windows · Issue #432 · ffi/ffi · GitHub
最新版を適用するとこういうことがあるので厄介ですね。。
slackを3ヶ月間使ってみて (便利な機能やコマンドなどまとめ)
slackを個人的に使い始めて3か月ほど経ちました。
無課金でなかなか便利に使えているので、おすすめの機能や連携アプリなどを紹介したいと思います。
過去に書いたslackに関する記事はこちら
Botkitでslackのbotを作る(Windows環境)
Botkitでslackのbotを作る(Windows環境) - 文系seの備忘録
slackをプログラミングの勉強に生かす
slackをプログラミングの勉強に生かす - 文系seの備忘録
現在の用途としても、変わらず個人の学習がメインです。
チャンネルはこんなかんじ↓
ソースを貼ると言語に合わせていいかんじに色付け・インデントされるのでよいです。
・リマインダー
スマホならリマインダー機能がついていると思いますが
- パソコンからでも確認できる
- 他の人にリマインドを送れる
- リマインダーのリストが確認できる
- 投稿に対してリマインダー設定できる
などの理由で、最近はslackのリマインダーを使用してます。
設定方法は2種類。
1. コマンドで入力
/remind [me or @人 or #チャンネル] [内容] [at|in|on] [日時] (every day)
例) /remind me 本屋寄る at 19:00
夜7時に本屋寄るって予定です。順番は適当でも大丈夫そうです。
2. slackの投稿からリマインダー設定
slackの投稿にカーソルを当てて出てきた「…」みたいなボタンから、
「Remind me about this」で設定できます。
これは最近追加された機能ですが、便利です。
例)jenkinsの機能について調べたいなーっていう投稿に対して、リマインド設定をします。
そうすると、忘れたころに通知が来て「あぁ、こんなこと気になってたっけな」というのが思い出せたりします。
・連携アプリ
・IFTTT(イフト)
- Twitterの特定ユーザーやワードのツイート
- 今日の天気
- グーグルカレンダーの予定やtodo
などを、自動でslackに投稿してくれる便利なツールです。
これは英語のフレーズbotです。
これは現在勉強中のFPに関するbot。
別の作業をしていても、ポップアップで確認できて便利です。
使い方
1. 画面上部の検索ボックスに「slack」と入れて検索すると、slackに対して可能な操作が表示されます。
2. やりたいことを選んで色々設定します。
・Trigger
例) ツイッターの特定ユーザーからのツイートをslackに通知する
- 「Trigger」の「Search for」というところに取得したいユーザー名を記載します。
from:@ユーザー名 とすると、特定のユーザーからのツイートのみが通知されるようになります
他にも、
「#パンケーキ」で ハッシュタグを含むツイート、
「櫻井翔 filter:videos」で櫻井翔さんの動画つきツイート
「東急 見合わせ -RT」でリツイート以外のツイート
などなど、「twitterの高度な検索」にて使える条件ならここに設定することができます。
・Action
- 特に設定しなくてもOKです
- 表示内容のカスタマイズ
MessageとかTitleとかのテキストボックスにカーソルをあてると右側に三角フラスコみたいなのが出るのでクリック
「Select an Ingredient」でslackで何を表示したいか選ぶことが出来ます
以下は天気の通知ですが、初期設定だと上のように表示されます。
ツイートのリンクなど要らなかったので外したものが下の画像になります。
・グーグルカレンダー
グーグルカレンダーで予定を入れたときにslackに通知が飛びます。
一週間の予定など確認でき、便利。
欲を言えばslackからグーグルカレンダーに予定が登録できればいいんだけど・・
それは自分で作れって話ですね。
・その他
・ユーザーの表示名を日本語化する
1. 左上のProfile&Accountで自分の名前を日本語名にしとく
2. 左上の「preferences」をクリック
3. 「Display real names instead of usernames (team default)」にチェック
slackのAPIはどんどん出来ることが増えてます。
SlackのAPIがアップデート、メッセージボタンでのタスク実行が可能に | TechCrunch Japan
・・・が、便利そうなツールを取り入れては消してを繰り返した結果、
結局残ったのはIFTTTとグーグルカレンダーくらいです。
私的に使うことが多く、誰かと共有することが少ないというのもあるかもしれません。
自分の使用目的としては、色んな学習を平行して行っていてその内容を書き込んだり管理することなので、
その目的を果たすのには十分です。
もし職場などで導入する場合は業務に適した機能を取り入れることで効率化を図れそうです。