Oracle jdbc thin Connection reset の対処
久しぶりに JDBCRunner をやったらこれにハマってたのでメモ。
症状的には、1回目は通るのに2回目を掛けようとすると流れなくて、数分後にエラー。こうなると何回やっても同じで30分くらい放置するとなぜかまた1回だけ通るようになる…みたいな不思議な動き。
「jdbc thin Connection reset」でGoogle先生に聞いたら一発HITでした。適当に作ったLinuxVMホストでかけたので、最初はNW周りを疑いまくったのだけど違った。
http://d.hatena.ne.jp/tmftake/20130130/1359553276
●回避版の今の起動方法メモ
export CLASSPATH="jdbcrunner-1.2.jar:ojdbc6.jar:orai18n.jar" java -Djava.security.egd=file:/dev/./urandom JR test.txt
●エラーになってたときのログ
19:37:31 [ERROR] An exception occurred at agent 0 jdbcrunner.ApplicationException: An exception occurred while connecting to database at jdbcrunner.Agent.callInit(Agent.java:227) at jdbcrunner.Agent.run(Agent.java:86) at java.lang.Thread.run(Thread.java:679) Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (IO Error: Connection reset) at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549) at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388) at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) at jdbcrunner.Manager.getConnection(Manager.java:224) at jdbcrunner.Agent.callInit(Agent.java:222) ... 2 more Caused by: java.sql.SQLRecoverableException: IO Error: Connection reset at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:467) at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546) at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521) at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582) at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556) at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545) ... 6 more Caused by: java.net.SocketException: Connection reset at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) at java.net.SocketOutputStream.write(SocketOutputStream.java:153) at oracle.net.ns.DataPacket.send(DataPacket.java:210) at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230) at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:312) at oracle.net.ns.NetInputStream.read(NetInputStream.java:260) at oracle.net.ns.NetInputStream.read(NetInputStream.java:185) at oracle.net.ns.NetInputStream.read(NetInputStream.java:102) at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124) at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80) at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:404) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:385) ... 14 more
Linux + SGA 大きく + 接続セッション沢山 -> Hugepage
メモ
http://www.reqtc.com/column/linux-hugepage4.html
http://www.reqtc.com/column/linux-hugepage5.html
http://joe.blog.freemansoft.com/2010/10/memory-tuning-how-os-page-sizes-can.html
メモリ沢山積んだ(っても、64Gくらいじゃもうそんなに多いといえないか?)マシンでOracle動かして、
調子に乗ってSGA 30G環境で、1000セッションつないだらスワップ起きますよというお話。
「1GBの共有メモリに対して、2MBのPTEが消費」とあるので →1024/2 = 512/M 30Gだと、、、最悪、、、 →30720/512 = 60M/1ses * 1000 ses = 60G (ノω・、) ウゥ・・・
HugePageの設定をおとなしく入れましょうorz
LinuxだとPTEで予想以上にメモリ使われるんですねえ…。
最近はあまり見かけない?ですが、共有メモリアーキテクチャ全般に言えることですので、
PostgreSQL辺りでも言えることかもしれません。
※9/2追記(ちょっとした検証結果
■メモリ 2G ■SGA設定 1G ■コネクション数 100(外部ホストからjdbc-thin接続) ■Huge設定時の 5分後付近の vmstat vm.nr_hugepages = 524 HugePages_Total: 524 HugePages_Free: 19 HugePages_Rsvd: 8 Hugepagesize: 2048 kB procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 27 2 84 11424 2004 478108 0 0 24 31344 3702 20264 73 16 5 5 0 64 1 84 10540 1988 478496 0 0 4 21936 4095 20599 66 15 12 7 0 51 1 84 10168 1988 478468 0 0 0 14504 3970 22267 75 15 7 4 0 9 2 84 12696 1960 477628 0 0 0 22188 3626 20708 74 16 5 4 0 ■Hugeなしの 5分後付近の vmstat HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 Hugepagesize: 2048 kB procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 70 0 166704 12708 1080 1363400 0 0 0 13064 3294 20129 75 15 6 3 0 33 1 166700 11552 1080 1364644 0 0 0 17064 3198 19718 75 16 6 4 0 1 2 166696 11568 1088 1364044 0 0 16 25660 3470 19088 74 16 4 5 0 7 1 166696 11356 1080 1363584 0 0 20 27688 3502 16701 59 15 14 11 0
MyNA(日本MySQLユーザ会)会 2013年7月メモ
前回に続いて参加できたのでメモ。
一言で感想をまとめるとこんな感じ。
「MySQL5.6をps_helperを使いこなしつつ、performance_schemaを使ってMySQLの内部動作を把握していきつつ平塚さんの資料を生かしてパラメータ検討すればbug踏まない限りうまく動くんじゃね?それでも性能困ったら、スケールアウトできるMySQL Clusterトライだ!」
以下は微妙な個人的備忘録メモ。
■Sheeri さん
資料
http://technocation.org/files/doc/2013_07_PS.pdf
http://www.markleith.co.uk/ps_helper/
・パフォーマンスカウンタのOFF/ONはSQLで動的に設定できるぽい
・events_statements_summary_by_digest でSQL絞ってイベント分析だけど 5.6 以上
思ったこと
・events_statements_summary_by_digestはロック時間、Diskソート使用状況とか、SQLで色々フィルタ書けるのがうれしい
→個人的にはMySQLはSSDを意識したようなパラメータも存在しているので、その辺のパラメータチューニング時に使うとよいイメージ
→後、explain・debugと合わせると効果的な感じ
・IOに関するカウンタがたくさん登場してきているということは、MySQLではIOまわりについてそれだけ重要視している、もしくはチューニングの余地がまだあるという感じなのか?
・SQLというかオプティマイザ結果による動作を知るためのものが多かったオプティマイザの癖を知るうえで有用か?
・本番で入れるにはパフォーマンス劣化度合いがやっぱり気になるところだけど5%くらいで収まるなら入れておきたいところ
■とみたさん
資料
http://slide.rabbit-shocker.org/authors/tommy/mysql-protocol/
思ったこと
・認証パケットやり取りは興味深い(パスワードハッシュSAH1ベースなんだ…
・カーソル情報についてどのメモリに持たれるんだろうってのとパケットのやり取りはどうなるか?
→メモリはこれかな?http://dev.mysql.com/doc/refman/5.6/en/cursor-restrictions.html
■平塚さん
資料というかUpdateがかかったまとめ
http://d.hatena.ne.jp/sh2/20130806
思ったこと
・補足資料のパラメータ資料が素敵
→http://dbstudy.info/files/20130729/
→kazeburoさんのと比較すると更にいい感じにできそう https://github.com/kazeburo/mysetup/blob/master/mysql/my56.cnf
・sync_binlog は基本1派なのであまり気にしてないけど、0設定レプリケーション前提で組んでるところが性能影響的にちょっと大変かな?
・個人的にO_DIRECT した場合に実際に O_DIRECT でオープンされるファイルを改めて調査してみたい
■yoku0825さん
資料
http://www.slideshare.net/yoku0825/5-24757328
・MariaDB側でクエリキャッシュをいじってるネタが出てきているので、何か動きが出てくるかも?
思ったこと
・ソースいじり具合が面白かった
■やまさきさん
資料
http://www.slideshare.net/yoyamasaki/5mysql-cluster
思ったこと
・とりあえずテスト環境作る分にはだいぶ楽になったかな?
・NoSQL-APIが充実してるので、そちらでSQLも発行できるDBインフラネタ的な方向で検証はありかもしれない。(でも時間が…orz
logmnr で hextoraw 先が DATE型列の時の変換方法適当版
ちょっと諸事情でディクショナリ情報を取れない状況で LOGMNR して追っていくときに、DATE型へ入れているところを変換したかったのでやっつけで探したという話。
オブジェクトID は、とりあえず dba_objects を取れば分かるので、後は SQL_REDO列を見ていくわけですが…。
他に簡単なやり方があったら是非知りたい!!
結論としては HEXTORAW('7871061d062701') な感じで見えたので、後はデータフォーマット仕様にあわせて逆変換しましょうということです。
データフォーマット仕様は SHIFT-THE-ORACLE さんが良い感じ。
で、結果こうなる。
■DATE型簡易変換
CREATE OR REPLACE Procedure HEXTODATE(P_HEX IN VARCHAR2) AS vHexYearY NUMBER; vHexYearR NUMBER; vHexMonth NUMBER; vHexDay NUMBER; vHexHour NUMBER; vHexMin NUMBER; vHexSec NUMBER; BEGIN vHexYearY := to_number(SUBSTR(P_HEX,1,2),'XXX') - 100 ; vHexYearR := to_number(SUBSTR(P_HEX,3,2),'XXX') - 100 ; vHexMonth := to_number(SUBSTR(P_HEX,5,2),'XX'); vHexDay := to_number(SUBSTR(P_HEX,7,2),'XX'); vHexHour := to_number(SUBSTR(P_HEX,9,2),'XX') - 1 ; vHexMin := to_number(SUBSTR(P_HEX,11,2),'XX') - 1 ; vHexSec := to_number(SUBSTR(P_HEX,13,2),'XX') - 1 ; DBMS_OUTPUT.PUT_LINE('result = ' || vHexYearY||vHexYearR||'/'||vHexMonth||'/'||vHexDay||' '||vHexHour||':'||vHexMin||':'||vHexSec); END; / set serveroutput on exec hextodate('7871061d062701'); result = 2013/6/29 5:38:0
■varchar/numberは面倒だけどこんな感じで
select UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('78')) from dual; select UTL_RAW.CAST_TO_NUMBER(HEXTORAW('78')) from dual;
しかし、timestampってどーすんだろ…。
※参考
http://www.shift-the-oracle.com/element/data-type/data-type-inside.html
デバッグ版MySQL cmake ビルド更新版(Cent6系&MySQL5.6.12)
メモ書きです。久々に MySQL をビルドしてみました。前にビルドしたのはもはや1年前。
どんだけMySQL使ってないんだ(´Д⊂
●前提
CentOS release 6.4 (Final) (Linux 2.6.32-358.2.1.el6.x86_64 #1 SMP Wed Mar 13 00:26:49 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux)
●ソース入手
持ってきたもの mysql-5.6.12.tar.gz
●不足パッケージ投入
yum install cmake yum install ncurses-devel yum install bison yum install gcc-c++
●一応マニュアルにしたがってユーザ作成
groupadd mysql useradd -r -g mysql mysql
●ビルド
CMAKE_C_COMPILER=gcc CMAKE_CXX_COMPILER=g++ CC=gcc CXX=g++ cmake -DWITH_PIC=1 -DWITH_DEBUG=1 -DCMAKE_INSTALL_PREFIX=/zfs/MySQL/mysql-5.6.12 . make -j8 make install
※-DWITH_DEBUG=1は、過去の記事を流用したので。
※-DWITH_PIC=1は、共有ライブラリ使用向けに備えてつけてみただけです。効果未確認。
※DCMAKE_INSTALL_PREFIXをいちいち指定したのは個人的なやり方ってだけです。普通は指定しないんじゃないかなぁ。。
●起動
cd インストール先 rm -rf data/* scripts/mysql_install_db chown -R mysql:mysql data ./bin/mysqld_safe --debug
※my.cnfまだ作ってません。
デバッグ版にしてしまったので、/tmp/mysqld.traceにトレースがやっぱり出てました。
GitLab でインストール時に localhost を使って適当に作っていると git push 時にハマるというメモ
個人的なgit勉強&会社でも使おうかなということで、環境構築勉強もかねて gitlab を作り始めていますが適当に作ったせいでハマったのでメモ。
インストール時、名前はちゃんと考えておきましょう。。というオチではありますが、具体的には
gitlab-shell/config.yml の gitlab_url: "http://~/" は git remote に登録するときと同じ名前になるように設定
ということでした。
インストールはとりあえずGitLabのオフィシャルを参照するのが一番いいかと。で、ユーザ作ってリポジトリ作ってまではよかったんですがpushすると
git push -u origin master fatal: The remote end hung up unexpectedly
で、エラー。色々似た事例があるんですが、最終的にたどり着いたのはここでした。
https://groups.google.com/forum/?fromgroups=#!topic/gitlabhq/dqiHDBrXOjQ
書いてあるとおり gitlab-shell/config.yml の gitlab_url 直して service gitlab restart でリスタート。
その後無事 push できるようになりました。ふー、ようやくスタートライン。
ま、原因はインストール時の名前付けるところで localhost 連発したせいということでちゃんと叩かれるときに使う名前にしましょうということですね。IPアドレスでもとりあえず通るので、内部向けであればそれでもいいかなと思いますが。
gitlab にログがあんまり出ないので、たどり着くのが大変でした。ログレベル上げれば出るようになるのかな?
munin 2.0.12 環境構築メモ(munin-master側)
自作の munin plugin 使って OracleDatabase のリソースグラフ化する時のメモ。ここでは Munin-Master 環境。
といっても、基本 Node と変わらずで入れる Perl Module の違いくらいです。
■Perl
Nodeと一緒です。5.16.3 使いました。
./Configure -des -Dprefix=/home/oracle/local/munin make -j 4 make test make install
■Perl-Module
cpanm で入れます。
Mail::Sendmail のテストが固まりますが入力待ちなのでリターン2回くらい入れればそのうちタイムアウトで通って入ります。
IO::Socket::INET6 は ipv6 環境作ってないとテストがエラーになるので、強制インストール。テストスキップでも良いと思います。
export PATH=/home/oracle/local/munin/bin:$PATH curl -LOk http://xrl.us/cpanm chmod 755 cpanm mv cpanm /home/oracle/local/munin/bin/ sudo yum install openssl-devel sudo yum install db4-devel cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Alien::RRDtool cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Storable cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::MD5 cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN HTML::Template cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Params::Validate cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Date::Parse cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::SSLeay cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN File::Copy::Recursive cpanm -f --mirror http://ftp.nara.wide.ad.jp/pub/CPAN IO::Socket::INET6 cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Log4perl cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN IPC::Shareable cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Dispatch cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Dispatch::FileRotate cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN MIME::Lite cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Mail::Sender cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Mail::Sendmail
■Munin-Master
Node と一緒。PATH 関係はここで全部設定します。perl 部分を絶対 PATH にしたり。内容は作る人のお好みで。
vi Makefile.config
install で丸ごと入れます。後 Node と一緒で、oracle でもう全部動かすことにするので、chown で がっつり oracle にオーナ・パーミッションを変えます。この辺の考え方は好み次第。
make su -- make install cp -pr contrib /home/oracle/local/munin/ ls -l /home/oracle/local/munin/ chown -R oracle:oinstall /home/oracle/local/munin/* ls -l /home/oracle/local/munin/ exit --
Makefile.config の設定の仕方が多分マズイために起きているんだと思いますが、一部のソースの perl PATH が変わってくれないので手で直します。
cd /home/oracle/local/munin/sbin vi munin-node vi munin-node-configure vi munin-run vi munin-sched === #!/home/oracle/local/munin/bin/perl === cd /home/oracle/local/munin/contrib vi dump_storable vi import_db vi dump_db vi epoch2localtime === #!/home/oracle/local/munin/bin/perl ===
UpdateWorker にパッチあてときます。(前の記事の件です http://nsrzakki.hateblo.jp/entry/2013/04/24/015415)
cd /home/oracle/local/munin/lib/perl5/site_perl/5.16.3/Munin/Node/ cp -p UpdateWorker.pm /tmp/UpdateWorker.pm patch < /home/oracle/local/src/Munin/UpdateWorker.pm.patch
■Munin-Master設定
監視ホストを登録します。
asyncd を使うので、ssh アクセスになります。鍵作って監視先ホストに設定して、sshするようにします。サンプル。
※鍵作る ssh-keygen -t rsa -b 2048 ※監視先ノードで authorized_keys に鍵登録 command="/home/oracle/local/munin/lib/munin-async --spoolfetch",no-pty,from="192.168.xxx.xxx" ssh-rsa xxxxxxxxxx== oracle@hogemaster ※munin.conf に設定 [hogenode] address ssh://oracle@hogenode use_node_name yes
■実行
※一番最初は手動実行して動作チェック /home/oracle/local/munin/bin/munin-cron ※上手くいきそうならcron設定 */5 * * * * /home/oracle/local/munin/bin/munin-cron >/dev/null 2>&1