RDBMS
2010年01月29日
SQLAlchemyを少し
単純なひとつのテーブルをDBで管理しようとおもってORMとしてまだ使ったことのないSQLAlchemyをつかってみた。
むかーし、SQLAlchemyをちらっと見たときには宣言的な書き方ができなかった気がするが…。だからelixirが出てきたと思ったのだが…。いつのまにかできるようになったようだ。特に難しいことはないな。ORMの書き方もqueryの書き方もdjangoとちょっと違うが、慣れの問題。ちょいちょいとやってOK。なるほど。
2009年04月14日
pgpool-IIをテスト
pgpool-IIでレプリケーション+オンラインリカバリーのテストをしてみた。
いまいちドキュメントがわかりにくい。書いてあることは書いてあるんだけど、なんとなくわかりにくい。
recoveryの方法はrsyncでやった。PITRはそれ自体がどうなのかよくわかってないのでパス。
構成として1台のPCにpgpoolとPostgresのクラスターを2つ用意した。
環境はpgpool-II 2.2 / PosrgreSQL 8.3
レプリケーションまでの手順
debianのpgpool-IIのバージョンが古いので自分でコンパイルしてインストールした。# pg_createcluster 8.3 cl0とやってクラスターを二つ作る。
# pg_createcluster 8.e cl1
/usr/local/etc/pgpool.confを設定。長いので関係あるとこだけ抜粋。pidの場所とかは自分でどうぞ。
replication_mode = true
replication_stop_on_mismatch = true
次がリカバリーに関係する部分
recovery_user = 'postgres'バックエンドのクラスターの定義
recovery_password = ''
recovery_1st_stage_command = 'pgpool_recovery'
recovery_2nd_stage_command = 'pgpool_recovery'
replication_timeout = 5000pcp.confの設定は省力。
backend_hostname0 = 'localhost'
backend_port0 = 5433
backend_weight0 = 1
backend_data_directory0 = '/var/lib/postgresql/8.3/cl0'
backend_hostname1 = 'localhost'
backend_port1 = 5434
backend_weight1 = 1
backend_data_directory1 = '/var/lib/postgresql/8.3/cl1'
/etc/postgres/8.3/cl[01]/pg_hba.conf は
host all all 127.0.0.1/32 trustとりあえずこうしておく。ここまでやってreplicationがはいるようになった。
次はオンラインリカバリー
pgpool-IIのソースのpgpool-II-2.2/sql/pgpool-recoveryに移動する。Cの拡張をいれる必要があるので、ここでmake; make installを実行。このあと各クラスターを再起動。
psql -U postgres -p 15432 -f pgpool-recovery.sql template1を実行。/var/lib/postgresql/8.3/pgpool_recoveryを作成。
#! /bin/sh/var/lib/postgresql/8.3/pgpool_remote_start
if [ $# -ne 3 ]
then
echo "pgpool_recovery datadir remote_host remote_datadir"
exit 1
fi
datadir=$1
DEST=$2
DESTDIR=$3
rsync -v -aurz --delete $datadir/global/ $DESTDIR/global/ &
rsync -v -aurz --delete $datadir/base/ $DESTDIR/base/ &
rsync -v -aurz --delete $datadir/pg_multixact/ $DESTDIR/pg_multixact/ &
rsync -v -aurz --delete $datadir/pg_subtrans/ $DESTDIR/pg_subtrans/ &
rsync -v -aurz --delete $datadir/pg_clog/ $DESTDIR/pg_clog/ &
rsync -v -aurz --delete $datadir/pg_xlog/ $DESTDIR/pg_xlog/ &
rsync -v -aurz --delete $datadir/pg_twophase/ $DESTDIR/pg_twophase/ &
wait
#! /bin/bashこのふたつのファイルは /var/lib/postgresql/8.3/cl[01]のそれぞれにコピーしておく。
if [ $# -ne 2 ]
then
echo "pgpool_remote_start remote_host remote_datadir"
exit 1
fi
DEST=$1
DESTDIR=$2
pg_ctlcluster 8.3 $(basename $DESTDIR) start
想定手順
実際の運用はこんな手順かな。cl0を止めた、あるいは勝手に止まった想定。# pg_ctlcluster 8.3 cl0 stopてな具合です。
# /usr/local/bin/pcp_detach_node 30 localhost 9898 postgres postgres 0
# /usr/local/bin/pcp_recovery_node 30 localhost 9898 postgres postgres 0
pgpoolAdminをインストール
pgpoolを使うのに便利なのかねと思って入れてみた。
まあ、単なるWeb UI提供だけだったので、びっくりする機能はなかった。結局recoveryの部分は自分でやるのかーという話。
それはそうとして、起動がwebからだとwww-dataで起動されるのでいろいろファイルの権限が問題に。/var/run/postgresqlが当然書き込めない。
setfacl -m u:www-data:rwx /var/run/postgresql
とやってACLで問題を解消しておいた。
2007年09月24日
SQLでお絵かきロジックを解く
SQLで数独を解くという記事に触発されてやってみました。
残念ながら全部SQLではできなかった。問題設定から得られる条件をSQLに変換するところでRubyの助けが必要なのが現状である。なんとかしたいんだけどなあ。ここらへんがSQLの知識不足なところである。
問題の方針としては Bool値をカラムに持つテーブルの升目文の直積を作って where に条件を書くというものである。
たとえば5x5の升目だとする。すると "SELECT * FROM boolean AS b_0_0 CROSS JOIN boolean AS b_0_1 CROSS JOIN ... CROSS JOIN booean AS b_4_4"が答になるべきものである。ちなみにこんなものを直接実行すると二度と帰ってこないのでやめましょう。で次は条件を書くわけだが…。
条件が2,1とあったら OOXXO OOXOX XOOXO の3通がある。たとえば一つ目をSQLで書くと "b_0_0.bool = true AND b_0_1.bool = true AND b_0_2.bool = false AND b_0_3.bool = false AND b_0_4 = true"となる。ちなみに booelanというのは "CREATE TABLE boolean (bool bool)"である。 3通をORで結び、各行についての条件をANDで結ぶ。これをwhereに書く。
が、この条件文を作るのはもちろん自動化する。これはどうやるかというと 0か4までの数列(seq)の入ったテーブルの条件個の直積を作る。で where に "seq1 + 個数 < seq2" をANDで結ぶ。 2,1 なら seq1 + 2 < seq2 AND seq2 + 1 <= 5 となる。そこからテーブルのwhereに変換するのはRubyで書いてしまった。ここが問題か。
結構遅い。8x8で1秒ぐらい。15x15だと帰ってきません。
苦労したのが適当に作ったらX軸とY軸がごっちゃになってしまったこと。きちんとやりましょう。それからもっと頭のいい方法を考えないと。
2007年04月09日
gdaの削除方法って?
GNOME Data Accessのデータソースの削除方法を調べてみた。
mergeant
一方GnomeのDBツール

データの中身が見えないんですけど?こんなもんでいいのかね。
knoda
graphical database frontend for KDE
中身のCSV・XMLへのエクスポートなどもできる。
- MySQLのデータをXMLにエクスポートしたら、UTF-8と宣言してデータの中身がEUC-JPで出てきたけど何が悪いのかな。
- &がentityに変換されずに出てきた。


