NakajiJapan

餓鬼の超弩級日記


Mysql-binのログ情報を削除

ログ情報がたまってたのでけしました。

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       125 |
| mysql-bin.000002 |       125 |
| mysql-bin.000003 |       125 |
| mysql-bin.000004 |       241 |
| mysql-bin.000005 |    511837 |
| mysql-bin.000006 |  25169036 |
| mysql-bin.000007 |  33391372 |
| mysql-bin.000008 |       627 |
| mysql-bin.000009 |       125 |
| mysql-bin.000010 |      1778 |
| mysql-bin.000011 |  61360430 |
| mysql-bin.000012 |  89547560 |
| mysql-bin.000013 |  92666202 |
| mysql-bin.000014 |  98112464 |
| mysql-bin.000015 |  28846371 |
| mysql-bin.000016 |       106 |
| mysql-bin.000017 | 122615971 |
+------------------+-----------+
17 rows in set (0.02 sec)
mysql> PURGE MASTER LOGS TO 'mysql-bin.000001';

■参考URL
PURGE MASTER LOGS 構文

んでよくよく考えてみて、そもそも設定で変えられるだろうとおもって調べたら
普通にありましたね。

my.cnfの「log-bin」をコメントアウトでいけた。

はい、終了

No Comments »

Mysqlのコンソールが文字化ける(こんなことだった)

文字コード関連の話。ここ数年文字コードの話ってあるけどさなかなか統一されないよねっていうことと
設定箇所がまだ乱立してるのが面倒くさい。
今だとPHP+apache+linux+mysqlの4つそれぞれせってしないといけないもんね。

んで今回も少しだけとまどったわけなのです。ほんとにちょっとだけよ。

まぁ、そのときの状態。
①HTTPの入力・出力・内部処理はUTF-8で画面出力自体は問題なく表示される。
ツーことはDBには同じ文字コードで入っているはず。
②コンソール上でクライアント動かしてSQL打っても表示されない。
ツーことはクライアントの設定かな

あ、それですね。

まずはDBの文字コード確認。

mysql> SHOW CREATE DATABASE testdb;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| testdb| CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

クライアントはどうか

mysql>  SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1|
| character_set_connection | latin1|
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | latin1|
| character_set_server     | latin1|
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

グーグルちゃんのおかげで設定すべき箇所みつけました。

# char set
default-character-set = utf8

# サーバのエンコードを引き継ぐらしい
skip-character-set-client-handshake

設定後の確認

mysql>  SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | utf8   |
| character_set_server     | utf8   |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

はいおk

No Comments »

Mysqlでプーリング??

ちょっとサーバがらみでいろいろ調べてたんで自分なりにまとめてみる。

発端は会社でDBの負荷分散のためにプログラムをいじってるみたいで
自分的にはちょっとメンドくせーなとおもいつつ、今までのこと考えてみると
PostgresSQLのpg_poolの場合はその辺いろいろやってくれたなぁって感じた。

そのアプリにコネクションプーリングをいれるかどうかは考えていなくて
もし手軽でそんなにコストかかんなきゃ入れてもいいレベルです。

あ、最初にコネクションプーリングとはって言ってみる。

* ウェブアプリケーションから DB への接続を開けっ放しにして、接続に必要とされるオーバーヘッドをカットして双方の負荷を下げる。
* ウェブアプリケーションと DB への接続を「使いまわす」ことで、同時接続本数を節約する。
引用:コネクションプーリングの話

んで上記のサイト見てみたら。

でもどうも MySQL は thread_cache とかを有効にすると(案外しなくてもそうなんだけど)実は接続に必要なオーバーヘッドがアプリケーション総体では無視できる程度の微々たるものだということがベンチマークの結果とかで分かる。それだったら Apache::DBI や CDBI の永続化の機能は OFF にしちゃいましょう…これがコネクションプーリングイラネ、みたいな話。

そんでもって「thread_cache」を調べてみると
まず、1コネクションの中で要求を受けたときにMysqlはスレッドを生成して、要求が終了すればスレッドを取る。
そのときにどのくらいスレッドをキャッシュしておくか。
(ちなみにデフォルトは「0」なので要求毎にスレッドが生成される)

Mysqlの場合は、これで大体のケースいける感じなんかね=。

Hatena:yamazさん
http://d.hatena.ne.jp/yamaz/20060903

Pgpool
http://www2b.biglobe.ne.jp/~caco/pgpool/

No Comments »

DBの永続的接続

Mysqlの設定していたときにちょっと疑問におもったので調査。

mysql.max_persistent integer
The maximum number of persistent MySQL connections per
process.

1プロセスあたりに永続接続できる最大接続数。

ちなみに永続接続っていうのは
・DBのセッションがずっと持ちっぱなしで接続が終了してもセッションは開きっぱなしの状態。
・もし開いている接続があればそれを使う。

これだと効率がよくなるね、でもなんかゾンビ化しそう。

非永続接続は
・DBの接続が終了すればセッションが閉じちゃう感じか。

そんでもって上記の設定だと1プロセスに待ち状態の接続を最大なん個もたせるかか。

例えば、永続接続は、1リクエストでmysql_connect()を2回接続すると2個のセッションが確立されるのでは
なくてすでに最初で接続済みのものを利用する。条件はまったく同じ接続先の場合(詳細割愛)。

1リクエスト1コネクション

非永続だと

1リクエスト2コネクションになっちゃうわけか

じゃこの違いってなんだ?
後者だと普通に考えて効率だよな。前者は一貫性のあるデータ取れたり、トランザクションも統一できるから安全性かな。

なんか読めてきた。

http://www.studyinghttp.net/connections
http://php.net/manual/ja/features.persistent-connections.php
http://php.net/manual/ja/function.mysql-connect.php

No Comments »