カテゴリー別アーカイブ: DBとか

java.sql.SQLException: Communication link failure: java.io.IOException

このエラーが取れない。

Oct 28, 2009 9:32:42 AM org.apache.jk.server.JkCoyoteHandler action
INFO: RESET
java.sql.SQLException: Communication link failure: java.io.IOException
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1604)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:886)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:945)
at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:917)
at com.mysql.jdbc.Connection.execSQL(Connection.java:1841)
at com.mysql.jdbc.Connection.execSQL(Connection.java:1775)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1220)
(snip)

発生するトリガーも不明。

Tomcat動かして、2,3日すると発生する模様。

う~ん・・・

頑張って調べよう。

でわ。

Oracle Express Edition (OracleXE)

まだ11gは出ていないので、10gでのお話です。

※2009/06/01時点

結構前に出てるんですが、Oracle Express Edition は、無償で使える Oracle Database です。

ただ、有償版に比べて制限事項があったりします。

まぁ、色々な機能が落ちてたりするんですが、それ以外に、

    ・ユーザ・データは4GBまで

    ・DBインスタンスは、1サーバ上で1つまで

    ・Oracle DBプロセスが使えるメモリは1GBまで

    ・マルチコアでもCPUは1つしか使用出来ない

といった制限があります。

安価に済ませたい会員管理Webサイトくらいなら、十分耐えられそうですが、

それなりの規模のサイトの場合は、ちょっと厳しいかもですね。

チューニングすれば大丈夫かも・・・?

でわ。

MySQLでの日付の計算

MySQLでの日付の計算について。

■ テーブル構成

テーブル名:t_test

フィールド:id      :ユニークなID

     :data     :データ

     :regist_date  :登録日時

     :update_date  :更新日時

例えば、上記テーブルにて、直近2週間に登録されたデータを取得したい場合、

select * from t_test where regist_date between date_add(current_date, interval -2 week) and current_date;

と、なります。

直近3日の場合は、

select * from t_test where regist_date between date_add(current_date, interval -3 day) and current_date;

と。

date_add()を使うと便利でいいですね。

でわ。

MySQLの詳細ログ出力設定について

例えば、会員登録サイトを構築して会員情報の検索が遅い時、

まずはSQLを調べますよね?

PHP等でO/Rマッパーを使っている場合、

実際にどのようなSQLが投げられているかがよくわからなかったりします。

そんな時は、ログを出力するようにしましょう。

設定は簡単です。

my.cnf に設定を追加するだけです。

# cd /etc

# vi my.cnf

[mysqld]

log=/var/log/mysqld_detail_access.log

これだけ。

設定追加後は、MySQLのプロセス再起動をしましょう。

これで、MySQLに実際に投げられているクエリがログに出力されます。

実際に見てみるとわかりますが、思った以上にゴリゴリとSQLが投げられています。

開発効率を考えてO/Rマッパーを使うのもいいですが、

素でSQLを書いた方がパフォーマンスチューニングしやすいかな、と思ったり。

でわ。

MySQLのトリガーの勉強

業務で、既存テーブルと新規テーブルとの整合性を取る必要が出てきたので、

MySQL5.0 から実装された、トリガーを使おうかと。

多少書き方は違えど、Oracleと似たり寄ったりかな、との認識。

データが2重管理になるので、出来れば既存か新規か、テーブルを寄せたかったのだが、

時既に遅し。。。orz

頑張ろう。

でわ。

PHPでOracle接続

簡単に手順を書きます。

前提として、

OS:CentOS3.9

Apache:2系

PHP:4.4.114.4.1

Oracle:10.2.0.3

です。

1) Oracleのサイトより、Oracle Instant Client をダウンロードする

oracle-instantclient-basic-10.2.0.3-1.i386.rpm

oracle-instantclient-devel-10.2.0.3-1.i386.rpm

これだけでも良いが、接続確認の為、SQLPlusも。

oracle-instantclient-sqlplus-10.2.0.3-1.i386.rpm

2) PHPのインストール

configureオプションに以下を付与する

–with-oci8-instant-client=shared,/usr/lib/oracle/10.2.0.3/client/lib

3) php.iniの編集

以下を追加

extension_dir = “#PHPインストールディレクトリ#/lib/php/extensions/no-debug-non-zts-20020429/”

extension=oci8.so

4) 環境変数の設定

LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client/lib/

ORACLE_HOME=/usr/lib/oracle/10.2.0.3/client

文字化けするようなら、NLS_LANG も追加

5) Apacheの再起動

/etc/rc.d/init.d/httpd stop

/etc/rc.d/init.d/httpd start

6) 接続確認

sqlplus system/manager@DB_SERV_NAME:1521/SID

上記を実行して、以下が表示されればOK

SQL*Plus: Release 10.2.0.3.0 – Production on Wed Mar 25 02:33:57 2009

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

Connected to:

Oracle Database 10g Release 10.2.0.3.0 – Production

SQL>

7) テストスクリプトにて、PHPから接続出来る事を確認

以下サイトを参考にしました

http://www.doyouphp.jp/inst/inst_unix_dso_430_ic.shtml

これで、テーブルの中身が表示されれば、PHPからのOracle接続は成功!

でわ。

postgreSQLでリストアエラー

postgreSQLのリストアで、こんなエラーが出る事があります。

# su – postgres

$ createdb testDB

$ psql -e testDB < testDB.dump

(snip)

ERROR: invalid byte sequence for encoding “UTF8”: 0xcbcc

HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by “client_encoding”.

このエラーの場合、バックアップする為にDumpした時のエンコードと、リストアする時のDBのエンコードが合っていない事が主な原因っぽいです。

バックアップとリストアの手順としては、

■バックアップ

# su – postgres

$ pg_dump DB名 > Dumpファイル名

■リストア

# su – postgres

$ createdb DB名

$ psql -e DB名 < Dumpファイル名

こんな感じです。

ここで、エンコードの絡みが出てくるのです。

今回、CentOS 5.2, postgreSQL8 で createdb した場合、デフォルトでエンコードは UTF8 になりました。

しかし、Dumpしたデータのエンコードが SQL_ASCII だった為、正常にリストアが出来ない状況でした。

それを回避する為には、リストアする際に、

# su – postgres

$ createdb -E SQL_ASCII DB名

$ psql -e DB名 < Dumpファイル名

と、エンコードを SQL_ASCII にしてあげれば、正常にリストアされます。

時々こういった事を忘れるので。。。

忘れないように書いておきます。

でわ。

検索エンジンでのDBのIndexing方法

以前、業務で HyperEstraier を使用したのだが、

静的なファイル(HTMLやPDFなどなど)が対象だったです。

PostgreSQL・MySQLなどなど、DBのIndexingが出来ればいいなぁ~、と。

本家のサイト(http://hyperestraier.sourceforge.net/index.ja.html)を見ると、

DBを扱うAPIもあるのだが、ちょっと難しそうな・・・

もう少し簡単に出来ないかな・・・?

色々やってみたい。

でわ。

MySQL 5.0 → MySQL4.0 データ移植 その2

とりあえず、うまくいったげ。

MySQL5.0 のサーバに、phpMyAdmin 2.11.6 をセットアップ。

んで、MySQL4.0 の形式でエクスポート。

ここでは、テーブル作成部分のSQLのみを取得。

サーバにログインし、テーブル毎にデータをDump。

mysqldump –default-character-set=sjis -u USER_NAME DB_NAME TABLE_NAME > TABLE_NAME.sql

でDump。

そのあとは、MySQL4.0 形式でエクスポートしたテーブル作成部分のSQLと合体させてファイル作成。

MySQL4.0 のサーバにログインして、

mysql –default-character-set=sjis -u USER_NAME DB_NAME < TABLE_NAME.sql

これで完了。

つか、UTF-8 でDBもテーブルも作って欲しいものです。

でわ。