ラベル mysql の投稿を表示しています。 すべての投稿を表示
ラベル mysql の投稿を表示しています。 すべての投稿を表示

2010/11/17

SQLAlchemy で collate が utf8_bin なカラムだとユニコード文字列で取得出来ない

某システムで検索の仕様変えることになって(厳密にはいろいろ違うけど)、大文字小文字の区別付けるために検索対象のカラムの collate を utf8_general_ci から utf8_bin に変更した。

ALTER TABLE `hoge` MODIFY `col` VARCHAR(255) NOT NULL DEFAULT '' CHARACTER SET utf8 COLLATE utf8_bin

検索は PHP で書いてて、テストも問題無かったからデプロイしたんだけど、このテーブルを Python で書いたクローラも参照してたから、ちょっと問題が出た。

from sqlalchemy import *
from sqlalchemy.sql import select

engine = create_engine('mysql://localhost/sandbox', echo=False, encoding='utf-8', convert_unicode=True)
conn = engine.connect()
metadata = MetaData(bind=engine)
tbl1 = Table('table1', metadata, autoload=True)

for row in conn.execute(select([tbl1])):
    print row # Unicode文字列になっていない

ORM 使わないで書いてたやつなんだけど、取得した結果の文字カラムがユニコード文字列になってなくて、お馴染の UnicodeDecodeError でクローラが落ちる…。

そもそもの書き方が悪い、っていうのがあるんだけど、一旦それは置いといて(というかすぐ直した)原因は何なのかってのを調べてみる。

ローカルの環境は MySQL 5.1.51 + SQLAlchemy 0.6.1 で、上記のコードを試すと結果はユニコード文字列になってる。

あれ、ってことで本番環境確認すると MySQL 5.0.91 + SQLAlchemy 0.6.1…なんだけど、DB サーバは別にあってそっちは MySQL 5.1.51。 SQLAlchemy のバージョン上げれば解決、だと思ったんだけど、問題解決にはならず結果は同じ…。

あんまり検証してないけど、とりあえずこういうことらしい。SQLAlchemy がその辺うまいこと処理してくれるものだと思ってたんだけど、どうなんだろう…。

それにしても余裕が無い…。

2010/11/13

Maatkit の mk-kill で SELECT だけを殺す

どうもこんばんは。 MySQL さっぱりわからないクズです。

いまいちクエリ改善できなくて、ヘタに検索すると刺さっちゃったりするシステム作ってしまった訳なんですけど、大人の事情でサーバのメモリ増設とかすんなり出来なかったりしてどうしようかなって状態だったりするんですが、とりあえず刺さったクエリを自動で殺す方法探したら Maatkit に含まれる mk-kill 使うのが一番手頃みたいだし cron*1 に仕込んでおいた。

$ mk-kill -kill-query --busy-time 1m

これで実行されてから1分以上経過したクエリが自動で殺されます。よかったよかった…なんですが、ALTER TABLE とかパーティションの更新とかもこれだと対象にされちゃうので、SELECT のみに限定したい場合は

$ mk-kill -kill-query --match-info SELECT --busy-time 1m

--match-info でパターンを指定してやればいいみたい。 info ってのがぱっと見だとわかりずらいけど、show processlist の info の部分ってことみたい。

ぜんぜんわかんないことばかりで悲しいんだけど、Maatkit 便利だしいろいろ試したい。

余談だけど、パーティションって2日先まで作って更新してくのがいいよね?とりあえず問題は出てないしデメリットも思いつかないから、このままでいくけど。。

*1: --daemonize のオプション指定してみたけどちゃんと動かなかった。 pid 指定してみても駄目。何かに依存してるのかな。

2010/09/20

MySQL 5.1 と Q4M のインストール

まぁまぁまぁ。

  • CentOS 5.5
  • MySQL 5.1.50
  • Q4M 0.9.4

MySQLのインストール

$ ./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-extra-charsets=all --with-plugins=all
$ make
# make install
# cp support-files/my-medium.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod a+x /etc/rc.d/init.d/mysql
# /sbin/chkconfig mysqld on
# vim /etc/ld.so.conf.d/mysql
+/usr/local/mysql/lib/mysql
# /sbin/ldconfig
# cd /usr/local/mysql
# chown -R mysql:mysql .
# sudo -u mysql ./bin/mysql_install_db
# ./bin/mysqld_safe --user=mysql &
# ./bin/mysql_secure_installation

Q4Mのインストール

$ ./configure --prefix=/usr/local/mysql --with-mysql=/usr/local/src/mysql-5.1.50
$ make
$ make test
# make install
# mysql -u root -f mysql < support-files/install.sql

PHPのMySQL拡張を個別に再インストール

# yum remove php-mysql
$ wget php-5.x.x
$ tar zxvf php-5.x.x
$ cd php-5.x.x/ext/mysql
$ phpize
$ ./configure --with-mysql=/usr/local/mysql
$ make
# make install
# vim /etc/php.ini