fc2ブログ

Home > ORACLE Archive

ORACLE Archive

Cygwinでrlwrap

  • Posted by: Nakunaru
  • 2011-02-13 Sun 15:28:15
  • ORACLE
追記:Cygwin版のrlwrapで余計な改行が出力される問題があり、以下の記事で解決しています。
検索で飛んできた方はどうぞ。
http://hitai.blog72.fc2.com/blog-entry-85.html





WindowsのDOSプロンプトでSQL*Plusを起動すると、上下の矢印キーでコマンドヒストリが呼び出せますけど、Cygwinのプロンプトではできません。
DB2のCLPも一緒で、矢印キーによるコマンドヒストリは使えません。

こういったコマンドヒストリ機能がないツールでも、ヒストリ機能を無理やり使えるようにしてしまうのがReadLineWrapperと呼ばれるもので、Linuxではrlwrapというパッケージが提供されています。

で、Cygwinでは使えないの?と探してみたらあっさりありました。


こちらからダウンロードできました。
http://ftp.yz.yamagata-u.ac.jp/pub/cygwin/release/rlwrap/



適当にダウンロードしてきたら、展開するとusrというディレクトリが作成される。

tar jxf rlwrap-0.24-1.tar.bz2




└─usr
├─bin
│ rlwrap.exe

└─share
├─doc
│ ├─Cygwin
│ │ rlwrap-0.24.README
│ │
│ └─rlwrap-0.24
│ AUTHORS
│ BUGS
│ ChangeLog
│ COPYING
│ INSTALL
│ NEWS
│ README
│ TODO

├─man
│ └─man1
│ rlwrap.1.gz

└─rlwrap
ftp
testclient


この中のrlwrap.exeを適当にパスが通ったディレクトリに置いて、

rlwrap sqlplus / as sysdba



とすればヒストリ機能が使えるようになる。



ただし、このままだ

SQL> connect / as sysdba
?????????????B


こんな感じで、日本語メッセージが化けてしまう。

解決するには、

.bashrcに以下を追加
export LANG=ja_JP.SJIS
export TZ=JST-9
export JLESSCHARSET=japanese-sjis
alias ls='ls --show-control-chars'

.inputrcに以下を追加
set kanji-code sjis
set convert-meta off
set meta-flag on
set output-meta on

参考:http://seiza.dip.jp/computer/20071028001115338.html

これで解決。日本語も通ります。


rlwrap.exe sqlplus / as sysdba
SQL*Plus: Release 11.1.0.6.0 - Production on 木 2月 10 15:38:05 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
に接続されました。
SQL>
SQL> select * from hr.regions;
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
SQL>
SQL> insert into hr.regions values(11,'新世界');
1行が作成されました。
SQL> select * from hr.regions;
REGION_ID REGION_NAME
---------- -------------------------
11 新世界
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
SQL> rollback;
ロールバックが完了しました。




もちろんDB2のCLPでも日本語が通ります。


./rlwrap.exe db2
(c) Copyright IBM Corporation 1993,2002
DB2 ADCL 9.1.0 コマンド行プロセッサー
コマンド・プロンプトからデータベース・マネージャーのコマンド、および SQL
ステートメントを呼び出せます。 例:
db2 => connect to sample
db2 => bind sample.bnd
一般ヘルプには ? をタイプしてください。
コマンドのヘルプには ? command をタイプしてください。 command
は、データベース・マネージャー・コマンドの主要なキーワードの
いくつかです。 例:
す。
? CATALOG は全 CATALOG コマンドのヘルプです。
db2 対話モードを抜けるには、コマンド・プロンプトで QUIT
とタイプしてください。対話モード以外では、すべてのコマンドに接頭語 'db2'
を付ける必要があります。
現在のコマンド・オプションの設定をリストするには、 LIST COMMAND OPTIONS
とタイプしてください。
詳細は、「オンライン・リファレンス」を参照してください。
db2 =>




あとは、rlwrapの置き場所だけ決めればOKです。
私の場合は、/optの配下に本体を配置し、/usr/binの配下のシンボリックリンクを置いてみました。

ln -s /opt/rlwrap/usr/bin/rlwrap.exe /usr/bin/rlwrap.exe



そして、sql*plusとかclpはaliasをはっておきます。
.bashrc

#rlwrap Settings
alias sqlplus='rlwrap.exe sqlplus'
alias db2='rlwrap.exe db2'





[関連]
http://hitai.blog72.fc2.com/blog-entry-77.html
http://hitai.blog72.fc2.com/blog-entry-76.html

方向転換 VirtualBox + Oracle Enterprise Linux + Oracle 11g R1 検証環境構築

  • Posted by: Nakunaru
  • 2010-08-09 Mon 23:10:36
  • ORACLE
http://hitai.blog72.fc2.com/blog-entry-72.html

前回、VirtualBox + Oracle Enterprise Linux + Oracle 11g R1で色々触る環境を作成する予定でした。


が、どうもyumリポジトリへうまくアクセスができていなくて作業が止まっています。

デフォルトのyum.repos.d/の配下にはoracle.comのリポジトリが設定されていて、サポート契約の番号があれば利用できるようになっています。
で、サポートがなくても使いたいので、理研さんのリポジトリの中のCentOS 5のリポジトリを使って、必要なパッケージをインストールする予定だったのですが、どうもそこがうまくいきません。
以前はできてたような記憶があったのですが。
記憶違いだったかなー。

そんなわけで、なんとく決めたOracle Enterprise Linuxはとりあえずやめといて、CentOSでもっかい環境をつくり直すつもりです。

今、isoイメージのダウンロード中で多分明日から作業になるかと思います。







VirtualBox + Oracle Enterprise Linux + Oracle 11g R1 検証環境構築

  • Posted by: Nakunaru
  • 2010-08-01 Sun 23:49:13
  • ORACLE
ORACLE周りの検証環境をつくるためにVirtualBoxを導入します。

ちょいちょい環境構築について質問されるのでメモとして。


1 必要なファイルたちのダウンロード
・VirtualBoxのダウンロード
http://jp.sun.com/products/software/virtualbox/get.html
URLはまだsunのURLだけど、そのうちoracle.comに統合されるかと思われ。
リンクが切れてたらgoogle先生に聞いてください。


ダウンロードにリンクを辿って、該当プラットホームのモノを落とします。
今回はOSX用。





・Oracle Enterprise Linuxのダウンロード
なぜOELなのかというと、なんとなく。以上。
まぁRedHat系なので、CentOSとか使い慣れてる人は楽ちんでしょっていうくらい。

OTNがsunと統合の途中でリンクがよくわかんないので、google先生に聞いていきます。
http://edelivery.oracle.com/EPD/Search/get_form


Enterprise Linuxで該当bit数のモノを選択。




CDイメージはいちいちめんどくさいので、DVDイメージを落とします。


・Oracle Database 11g R1のダウンロード
既にR2が出ているのでそのうちいろいろ触りたいのですが、とりあえず今はR1で。
http://www.oracle.com/technology/global/jp/software/products/database/index.html
URLはそのうち変わるかもしれないので、適当にリンクを辿ってください。






2 バーチャルボックスのインストール
インストールは普通にインスコします。
OSXならダウンロードしたdmgをWクリックし、さらに中に入っているmpkgをWクリック。






というか普通にインスコするだけだから途中省略。

これでインストール完了。


3 Oracle Enterprise Linuxのインストール
これも普通にOSのインストールです。

virtualboxを起動。

[新規]ボタンで仮想マシンの作成






名前は後で分かりやすければなんでもOK。インストールしたマシンのホスト名とは別なので適当でいいです。
名前をOELってするとバージョンでOracleが選択される辺りは流石。


メモリサイズは、ORACLEを入れるなら1Gは割り当てないとしんどいかも。












これで仮想マシンは完成。



次にOELのisoファイルをマウントしてインストーラを起動します。


[起動]ボタンで起動。



マウスのキャプチャのダイアログはウザったいので出ないようにしておくべし。
winだと右Ctrlで、OSXでは左Commandで抜けます。


初回起動ではウィザードでisoのマウントとか設定できます。









ダウンロードしておいたisoを指定。


初期設定終了。
このままブートします。



いつものブート画面


これもしょっちゅうダイアログが出てうざったいので出ないように。


インストールメディアのチェックは必要ないのでスキップ


いつものアナコンダです。


言語選択


キーボード選択


ディスクの初期化とパーティション作成。
こだわりがあれば手動設定しますが、今回は自動設定に任せます。




構わず削除


swapが2G程度あれば大丈夫なはず。


bootloaderは普通にインストール


デフォルトではDHCPなんで、適当な固定ipにすること。Oracle ServerのEMを使うなら固定IP必須ということで。




rootのパスワードを設定


パッケージの選択。面倒なんで全部選択。
どうせ後で必要なものはyumするんで多分適当でOK


インストール開始


待ちます


おめでとうございます。


ブートします


インストール後の初期設定




ファイアウォールはめんどくさいので解除
解除しないなら、後で必要なポートは開けること。リスナーの1521とかEMの1158とか。


SELinuxはいい思い出がないので問答無用で解除






適当にユーザを作成。oracleユーザは後で作るのでここではその他の作業用のユーザを適当に




追加CDはないので終了ボタンでおしまい。


リブート




rootでログイン



さて、ここからユーザつくったりoracleのインストールをしたりするんですけど、長くなったので今日はここまで。

続きはまた今度。

Oracle Enterprise Managerのブログ

  • Posted by: Nakunaru
  • 2010-06-15 Tue 23:36:48
  • ORACLE
こちらのブログで見つけました。

10gからのEMは、便利になった部分も多いのですが、メニューをみてもなんの機能なのかさっぱり分からないとか、エラーの意味が分からないとかあったんですけど、こういうブログがあると助かる場面があるかもしれません。


英語 … ですけど … 。
 

Oracle RBOでハマったこと

  • Posted by: Nakunaru
  • 2010-02-04 Thu 00:08:39
  • ORACLE
9iの環境でちょっと盲点だったので忘れないようにアウトプットしておく。

まずSQL

SELECT cola, colb, colc, cold, cole, colf
FROM tab_a
WHERE cola = xx
AND colb = yy
AND ( colc = zz1
OR colc = zz2);

絞り込みの値はバインド変数で色々変わるかも、という状況。
そんでトレース結果。

Total count 3 cpu 0.5 elapsed 10 disc 10000 current 0 rows 10
Optimizer goal: CHOOSE

Rows Row Source Operation
------------------------------
0 CONCATENATION
0 TABLE ACCESS BY INDEX ROWID tab_a
8000 INDEX RANGE SCAN idx_1
0 TABLE ACCESS BY INDEX ROWID tab_a
25000 INDEX RANGE SCAN idx_1

索引情報はこんな感じ
idx_1 (colc)
idx_2 (cola, colb, colc, cold)


さて、普通に考えればidx_2を使ってくれれば良さそうなのに、idx_1を使ってくれちゃってるのが気になる木になる。
それとCONCATENATION。
コストベースな頭だとパパっと理解できなかった。

で、まずCONCATENATIONの原因としては、オプティマイザによるSQL変換。トランスレーションとか言うんだっけ?
こいつのせいっぽかった。
ORが含まれる条件は2つのSQLに分離してUNION ALLする形に変換されてるっぽい。
つまり、
SELECT …
FROM tab_a
WHERE cola = xx
AND colb = yy
AND colc = zz1
UNION ALL
SELECT …
FROM tab_a
WHERE cola = xx
AND colb = yy
AND colc = zz2
AND cola != xx
AND colb != yy
AND colc != zz1;

重複排除のためにこんなんが追加されるっぽい。

そんなわけで、CONCATENATIONで2回scanが走っていると。
でも、idx_2を使ってくれれば1回で済むんじゃね?なんでidx_1を使うのかっていうところで悩んだのですが、これってルールベースのランキングが原因でした。
ランキング参考ページ
今回の変換後のSQLに対し、idx_2はランキング10。(coldが条件に含まれてないから)
それに対しidx_1はランキング9。
どう見てもidx_2の方がよさそうなのに、ランキングで言えばidx_2がよいと判断されてしまってるわけです。

idx_1を削除できればいいのですが、他のSQLで使用しているため、削除は不可。
かといって、(cola, colb, colc)のインデックスを追加するのも、idx_2と冗長なので不可。
と、いうことでインデックス側での対処は無理でした。

あとできることは、CBOに変えてしまうか、ヒント句でなんとかするか、もしくはそれ以外の何かを使うか。
CBOへの変更は運用計画にも影響がでるし。ただ、optimizer_modeがchooseなんで、この表だけ統計をとるってのはありかもしれない。

そんなわけで、
・indexヒントでidx_2を指定
・first_rowsヒントでidx_2を選んでくれるのに期待(統計を取らなくてもデフォルト値でそれなりに選択してくれる)
・first_rowsヒント+no_expandヒントでsql変換防止
のどれかで対応をとることに。
indexヒントはメンテしにくくなるんでちょっと嫌われる傾向があるので、CBOの優秀さに期待して統計なしのfirst_rows+no_expandが一応最適解のような。

あとはSQLでちょっと小細工してidx_1が選択されにくくするってのはあるかもしれないけど、ロジックが変わると再テスト、ヒントならテストなしってのが結構通りやすいので、そういった意味でもヒントが良さげ。

統計とっていいなら素直にCBOが一番なんだろうけどなー。
いまだにRBOオンリーの環境がちょいちょあって、運用計画とか今更変える気のないお客さんだと、色々大変だとかそんな話でした。

Index of all entries

Home > ORACLE Archive

タグクラウド
Categories
Monthly
Recent Entries
Recent Comments
Recent Trackbacks
Appendix

Nakunaru

    Author:Nakunaru

    データベース(ORACLEとかSQL ServerとかDB2とかMySQLとか)とか技術者教育とかプログラムとか。
    気になる技術を少しずつ勉強していきます。


Return to page top