最近open fastladderがやけに遅い。
MySQLのチューニングなんかを見て、少しmy.cnfをいじってみたりしたけど効果なし。
itemsテーブルから古い記事を消すと少しだけ効果があるかな?と言う感じ。
そもそもMySQLは慣れていないので、古い記事を消すとかでも苦労しちゃう。
で、RrailsのActiveRecord?はPostgreSQLに対応しているんじゃないかと思って調べて見たら、いけそうな雰囲気。
まずは、fastladder/config/database.yml を修正。
pgsqlユーザでDB fastladder_productionとユーザfastladderを作成して、rake db:migrateしてみたら、なんかpostgresがないみたいなエラーが出たので、
あとは、PlaggerのStore::Fastladderなんだけど、こちらも中身を見たら直接SQLなんて書いてなくて、DBIx::Class::Schema::Loader とか言うのを使ってORマッピングしてるっぽい。
手元の環境を見たら、p5-DBD-Pgと言うのが入っていたので、Plaggerのyamlを修正してみる。
plaggerを実行してみると、membersにid=1の人なんていないってエラーになるので、MySQLからmembersテーブルだけPostgreSQLに移行。MysqlからPostgresへ移行 - かぴぶろぐを参考にしたけど、記事の通りだとデータ中の改行が消えてしまうのでsedを使った。
MySQLのチューニングなんかを見て、少しmy.cnfをいじってみたりしたけど効果なし。
itemsテーブルから古い記事を消すと少しだけ効果があるかな?と言う感じ。
そもそもMySQLは慣れていないので、古い記事を消すとかでも苦労しちゃう。
で、RrailsのActiveRecord?はPostgreSQLに対応しているんじゃないかと思って調べて見たら、いけそうな雰囲気。
まずは、fastladder/config/database.yml を修正。
production: adapter: postgresql encoding: utf8 database: fastladder_production username: fastladder password: password host: localhost変えたのは、adapterをmysqlからpostgresqlにして、socketをhostに変えただけ。
pgsqlユーザでDB fastladder_productionとユーザfastladderを作成して、rake db:migrateしてみたら、なんかpostgresがないみたいなエラーが出たので、
# gem install postgresとしてpostgresをインストールしたら、無事にrakeでテーブルが作られた。
あとは、PlaggerのStore::Fastladderなんだけど、こちらも中身を見たら直接SQLなんて書いてなくて、DBIx::Class::Schema::Loader とか言うのを使ってORマッピングしてるっぽい。
手元の環境を見たら、p5-DBD-Pgと言うのが入っていたので、Plaggerのyamlを修正してみる。
- module: Store::Fastladder config: connect_info: - dbi:Pg:dbname=fastladder_production - fastladder - password member_id: 1dbi:mysqlをdbi:Pgに変更して、後は接続パラメータの指定方法が違うのを適当に修正した。
plaggerを実行してみると、membersにid=1の人なんていないってエラーになるので、MySQLからmembersテーブルだけPostgreSQLに移行。MysqlからPostgresへ移行 - かぴぶろぐを参考にしたけど、記事の通りだとデータ中の改行が消えてしまうのでsedを使った。
- mysqlで実行(DBの管理者ユーザでやる)
# mysql -u root fastladder_production -p Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1604 Server version: 5.0.77 FreeBSD port: mysql-server-5.0.77_1 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> select * from members into outfile '/tmp/members.csv' fields terminated by ',' optionally enclosed by '\"'; Query OK, 1 row affected (0.02 sec)
- ファイルを覗くと、データ中の改行が\+改行になっているので、\を削除する。
# sed 's/\\$//' < /tmp/members.csv > /tmp/members2.csv
- PostgreSQL側で実行(こちらもDB管理者ユーザで)
% psql -U pgsql fastladder_production -W Password for user pgsql: Welcome to psql 8.1.17, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit fastladder_production=# copy members from '/tmp/members2.csv' with csv null as '\\N' escape '\\';
再度plaggerを実行すると、今度はDateTime/Format/Pgがないと怒られたので、portsから devel/p5-DateTime-Format-Pg をインストール。
今度こそうまくPostgreSQLにデータが入った。
面倒なので過去のデータはそのまま捨てる(と言うかMySQLに入れたまま)にして、これから先のデータだけPostgreSQLを使うことにする。
しかし、あっけないほど簡単だった。今回対象にした、fastladderとPlagger::Plugin::Store::Fastladderがそれぞれ特定のDBに依存していなかったおかげだ。
RubyとかPerlは、普通にORマッピングを使ってるのに対して、Javaだとまだまだ閾が高いような気がするのは何故だろうか。
次は、mongrel捨ててPassengerへの移行だな。
カテゴリ
Plaggerトラックバック(0)
このブログ記事を参照しているブログ一覧: fastladder を PostgreSQLで動かす
このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/2127
コメントする