パスワードを忘れた? アカウント作成
171824 journal

Livingdeadの日記: MySQLで接続時刻を記録するカラムを増やす

日記 by Livingdead

アプリケーションサーバが複数台あって、単一の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秒かかった。その間もテーブルにロックが掛かるわけではないらしい。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

アレゲは一日にしてならず -- アレゲ見習い

読み込み中...