パーソナルツール
現在位置: ホーム 日々のメモ書き Topics RDBMS

RDBMS

2010年01月29日

SQLAlchemyを少し

by TANIGUCHI Takaki — last modified 2010年01月29日 14時16分
Filed Under:

単純なひとつのテーブルをDBで管理しようとおもってORMとしてまだ使ったことのないSQLAlchemyをつかってみた。

むかーし、SQLAlchemyをちらっと見たときには宣言的な書き方ができなかった気がするが…。だからelixirが出てきたと思ったのだが…。いつのまにかできるようになったようだ。特に難しいことはないな。ORMの書き方もqueryの書き方もdjangoとちょっと違うが、慣れの問題。ちょいちょいとやってOK。なるほど。

 

2009年04月14日

pgpool-IIをテスト

by TANIGUCHI Takaki — last modified 2009年04月14日 00時11分
Filed Under:

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 = 5000
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'
pcp.confの設定は省力。
/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

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
/var/lib/postgresql/8.3/pgpool_remote_start
#! /bin/bash
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
このふたつのファイルは /var/lib/postgresql/8.3/cl[01]のそれぞれにコピーしておく。

想定手順

実際の運用はこんな手順かな。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をインストール

by TANIGUCHI Takaki — last modified 2009年04月14日 00時10分
Filed Under:

pgpoolを使うのに便利なのかねと思って入れてみた。

まあ、単なるWeb UI提供だけだったので、びっくりする機能はなかった。結局recoveryの部分は自分でやるのかーという話。

それはそうとして、起動がwebからだとwww-dataで起動されるのでいろいろファイルの権限が問題に。/var/run/postgresqlが当然書き込めない。

setfacl -m u:www-data:rwx /var/run/postgresql

とやってACLで問題を解消しておいた。

2007年09月24日

SQLでお絵かきロジックを解く

by TANIGUCHI Takaki — last modified 2007年09月24日 00時07分
Filed Under:

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の削除方法って?

by TANIGUCHI Takaki — last modified 2007年04月09日 23時05分
Filed Under:

GNOME Data Accessのデータソースの削除方法を調べてみた。

テストでゴミのデータソースが溜っていたので削除したいなあと思った。gda-configを駆使するしかないのかな?そんなに難しいわけではないが。gconfをgconfeditorで編集するよりはましなんだろうけど。

mergeant

by TANIGUCHI Takaki — last modified 2007年04月09日 22時56分
Filed Under:

一方GnomeのDBツール

screenshot-root@mysqlmysql - mergeant.png
データの中身が見えないんですけど?こんなもんでいいのかね。

knoda

by TANIGUCHI Takaki — last modified 2007年04月09日 22時29分
Filed Under:

graphical database frontend for KDE

KDEのRDBMS管理ソフト。テーブルの中身の参照、編集、モデルの作成等々いろいろな機能がある。

中身のCSV・XMLへのエクスポートなどもできる。

  • MySQLのデータをXMLにエクスポートしたら、UTF-8と宣言してデータの中身がEUC-JPで出てきたけど何が悪いのかな。
  • &がentityに変換されずに出てきた。
screenshot-mysql  - knoda.png
takaki's twitter
焼酎風味の水に500円も取ろうとはどういう店だ。 2010年03月09日 22時53分
ジョブカードなる糞エクセル方眼紙を埋め中。心が折れそうだ。 2010年03月08日 22時16分
Excel方眼紙がOOoで崩れるわけだが。 2010年03月04日 22時49分
嫌味言ってりゃ世の中良くなるわけでもなし 2010年03月04日 22時06分
どう考えても風邪だがタイミングが悪すぎる 2010年03月02日 23時51分
Affiliate