Livingdeadの日記: MySQLで接続時刻を記録するカラムを増やす
アプリケーションサーバが複数台あって、単一のMySQLをバックエンドとして使っているのだが、各アプリケーションサーバの時刻が微妙にずれているためにアプリケーションサーバ側の時刻を記録しても正確な時刻とは言えない。そこでいつアクセスを受けたかをMySQL側でテーブルに記録しようと思う。もちろん一般クエリログを見れば分かるのだが、テーブルに永続的に記録したい。スキーマをいじるときの分をいつも忘れるのでメモ。
ALTER TABLE activities2 ADD COLUMN dbtime TIMESTAMP;
ちなみにアクセス元もMySQL側で記録しようと思ったのだが、デフォルト値は完全に定数でなければならないのでUSER()なんていう関数の結果を記録するって事はできない。
デフォルト値は一定でなければいけませんので、それは関数や式にはなり得ません。これは例えば、日付カラムの値に NOW() や CURRENT_DATE のような関数の値をデフォルトとして設定する事はできないという意味です。例外として、TIMESTAMP カラムのデフォルトとして CURRENT_TIMESTAMP を指定する事ができます。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 10.1.4 データタイプデフォルト値
TIMESTAMP型のフィールドだけは例外。
TIMESTAMP カラムは DATETIME カラムと同じフォーマットで表示されます。言い換えると、表示幅は19文字に決められていて、フォーマットは YYYY-MM-DD HH:MM:SS となります。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 10.3.1.1 TIMESTAMP MySQL 4.1での性質
MySQL 5.1のマニュアルが真っ先に引っかかったからそれでよしとする。こういうRDBMSごとに挙動の違う部分はすぐ忘れてしまうんだよなぁ。試しにデカイテーブルに対してやってみた。
mysql> ALTER TABLE mdl_log ADD COLUMN dbtime TIMESTAMP;
Query OK, 5430288 rows affected (5 min 22.94 sec)
Records: 5430288 Duplicates: 0 Warnings: 0
5.4メガ行のテーブルに一つカラムを増やすと5分23秒かかった。その間もテーブルにロックが掛かるわけではないらしい。
MySQLで接続時刻を記録するカラムを増やす More ログイン