MySQLのlogrotate

MySQLのlogrotateを設定したところ、ログファイルが正常にローテーションされない問題が発生。

/var/log/messageには下記のログが出ていました。

logrotate: ALERT exited abnormally with [1]

調査をしていくとcronの結果メールに下記の内容が来ていました。

/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'
error: error running postrotate script for /var/log/mysql/*.log
/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'
error: error running postrotate script for /var/log/mysql/*.log

/root/.my.cnfにアカウント情報を記載していたのですが正常に読み込まれていないようです。

調べてみたところ/etc/crontabでHOMEの設定が/になっていました。

これを修正して正常に動作を確認。

修正前

HOME=/

修正後

HOME=/root/

cronの結果メールはちゃんとチェックしないとダメですね。

Zend_SessionでDBにデータを保存

Zend_SessionでDBにデータを保存した時に、セッション情報が復元されない問題が発生しました。

分かりにくいポイントなので備忘録として残しておきます。

原因としてはDBの文字コードが合っていないため、テーブルに保存するタイミングで文字化けを起こし、それを復元時にunserializeでエラーになっていたというものです。

セッションハンドラは暗黙的に呼び出しをされるのと、unserialize自体のエラーが表に出ないため解析に時間がかかりました。

文字コードの設定はマニュアルに記載がなかったのですが、ZendFrameworkのコードを見ることでわかりました。

Db/Adapter/Pdo/Mysql.phpの_connectを参照

参考にコードを載せておきます。

$db = Zend_Db::factory('Pdo_Mysql', array(
	'host' => $config->host,
	'username' => $config->user,
	'password'=> $config->pass,
	'dbname' => $config->name,
	'charset' => 'ujis'
));
Zend_Db_Table_Abstract::setDefaultAdapter($db);
$config = array(
	'name' => 'session',
	'primary' => 'id',
	'modifiedColumn' => 'modified',
	'dataColumn' => 'data',
	'lifetimeColumn' => 'lifetime'
);
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));