DB

April 27, 2012

PostgreSQLでVACUUM FULLはやってはいけない

昔は定期的にVACUUM FULLするのが半ば常識だったと思うんだけど、公式サイトのwikiによると、バージョン8系以前では使わないほうがいいみたい。強い調子で否定されている。

http://wiki.postgresql.org/wiki/VACUUM_FULL/ja
ネットワーク上の間違ったアドバイスや「優れている」に違いないという仮定に基づき、多くの人は定期的に自身のテーブルに対してVACUUM FULLを実行しています。 これは一般的に本当に間違った考えであり、自身のデータベースを高速にではなく低速にしています。
もっと重要な点は、VACUUM FULLはテーブルを小さくしますが、インデックスは小さくしないことです。 実際にはインデックスのサイズは大きくなる可能性があり、低速化、インデックスの使用時のより多くのディスクI/Oの発生、必要とするメモリ量の増加が起こります。 VACUUM FULLの後にREINDEXが必要になるかもしれません。
で、VACUUM FULL&REINDEXよりも、

CLUSTER

を使うべき、とのこと。

VACUUM FULLは記憶領域が一杯になりそうな時だけ使えばよい、と。

ちなみにバージョン9以降では、VACUUM FULLの処理が全面的に変更され、CLUSTERに近くなったらしい。

matssaku at 14:14|PermalinkComments(0)TrackBack(0)clip!

April 14, 2012

mysqlコマンドでportを指定しても無視される

mysqlコマンド、ポートを指定するにはオプションで「--port=port_num」あるいは「-P port_num」のように指定します。
マニュアルにそう書いてあります。

しかし、mysqldを別ポートで複数起動しているマシン上で、デフォルトでないポートのmysqlにアクセスしようとしてもできませんでした。

portの指定が効いていないようで、何番を指定しても同じプロセスにつながってしまいます。

色々悩んだ末にたどり着いたのがこれ

http://dev.mysql.com/doc/refman/5.1/ja/invoking-programs.html
Unix 上でのクライアントプログラムには、このホストネーム localhost は特別な意味を持っています。これによってクライアントがUnixソケットファイルを通し MySQL サーバに接続することができるようになります。これはまた、--port もしくは -P オプションがポート番号を特定するために与えられたとしても実行されます。クライアントによって TCP/IP 接続をローカルサーバに確実に行わせるためには、ホスト名、もしくは IP アドレス、ローカルサーバ名のいずれかを 127.0.0.1 に指定するために --host または -h を使用します。--protocol=tcp オプションを使用することによって、localhost に対してもまた、プロトコル接続をさらに明確に指定することができます。
えー!ホスト名を省略したり、localhostで指定していると、TCP/IPではなくUnixソケットで接続されると。
ポートを指定していても、無視されると。

そういう重要なことはmanに書いといてよー!!

matssaku at 21:29|PermalinkComments(0)TrackBack(0)clip!