MySQL5.1->5.5へのアップデート(バージョンアップ)でmysql_upgradeするとレプリが止まる

MySQLを 5.1 から 5.5 にアップデートした際に、mysql_upgradeしたらレプリケーションが止まってしまった。実行直後から、スレーブ側でエラーが出てレプリのSQLスレッドが止まる。

エラーログその1

120228 15:05:14 [ERROR] Slave SQL: Error 'Duplicate column name 'plugin'' on query. Default database: 'mysql'. Query: 'ALTER TABLE user ADD plugin char(64) DEFAULT '',  ADD authentication_string TEXT', Error_code: 1060
120228 15:05:14 [Warning] Slave: Duplicate column name 'plugin' Error_code: 1060
120228 15:05:14 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart

エラーログその2

120228 14:58:40 [ERROR] Slave SQL: Error 'Duplicate column name 'Create_tablespace_priv'' on query. Default database: 'mysql'. Query: 'ALTER TABLE user ADD Create_tablespace_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Trigger_priv', Error_code: 1060
120228 14:58:40 [Warning] Slave: Duplicate column name 'Create_tablespace_priv' Error_code: 1060
120228 14:58:40 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'log-bin.000021' position 45258

エラーログその3

120228 14:21:10 [ERROR] Slave SQL: Error 'You cannot 'ALTER' a log table if logging is enabled' on query. Default database: 'mysql'. Query: 'ALTER TABLE slow_log
   MODIFY start_time TIMESTAMP NOT NULL,
   MODIFY user_host MEDIUMTEXT NOT NULL,
   MODIFY query_time TIME NOT NULL,
   MODIFY lock_time TIME NOT NULL,
   MODIFY rows_sent INTEGER NOT NULL,
   MODIFY rows_examined INTEGER NOT NULL,
   MODIFY db VARCHAR(512) NOT NULL,
   MODIFY last_insert_id INTEGER NOT NULL,
   MODIFY insert_id INTEGER NOT NULL,
   MODIFY server_id INTEGER UNSIGNED NOT NULL,
   MODIFY sql_text MEDIUMTEXT NOT NULL', Error_code: 1580
120228 14:21:10 [Warning] Slave: You cannot 'ALTER' a log table if logging is enabled Error_code: 1580
120228 14:21:10 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'log-bin.000021' position 32074

なんでそうなるか

mysqlデータベースをレプリ対象としていて、スレーブ->マスタ の順番でバージョンアップ作業をやったことが原因の模様。

1. スレーブ側を先にバージョンアップして mysql_upgrade を済ませる → mysqlデータベースの内容を、5.5向けに修正する。
  - 新しいテーブル追加
  - 既存テーブルにカラム追加 など
  - この状態だとレプリケーションは失敗せず、システム全体として問題なく稼動する。
2. マスタをバージョンアップして mysql_upgrade を実行 →  mysqlデータベースの内容を、5.5向けに修正する。
3. これをスレーブにレプリケーション → すでに同じ内容の修正がされている → Duplicate のエラー。
4. SQLスレッドが止まる。

回避方法としては以下がありそう。

1. マスタから先にバージョンアップする。
  - でも mysql データベースの修正がレプリされてしまうので、動きがおかしくなるかもしれない。
2. スレーブからバージョンアップしていくが、mysql_upgrade はマスタのバージョンアップが終わったあと、マスタから実行する。
3. スレーブからバージョンアップしていくが、マスタのバージョンアップ時の mysql_upgrade 実行時にバイナリログを作成しない。
4. スレーブからバージョンアップしていくが、マスタのバージョンアップと mysql_upgrade 実行が終わったあと、スレーブ側でエラーとなったクエリをスキップさせる。

SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;

5. スレーブからバージョンアップしていくが、マスタのバージョンアップと mysql_upgrade 実行が終わったあと、マスタの内容すべてをダンプしてスレーブに取りこんで、マスタとスレーブを完全に同じ状態に保つ。
6. マスタ(log_slave_updatesをやっているならスレーブも)のバイナリログ出力を、バージョンアップ中に止めておく。my.cnf で以下の定義をコメントにしてリスタート。その上でバージョンアップ作業に取りかかる。

#log_bin
#sync_binlog
#binlog_format
--- スレーブで log_slave_updates をしているなら、スレーブでは上に加えて以下のものもコメントアウトする
#log-bin-index
#log_slave_updates

まぁそれ以前に、mysqlデータベースをレプリ対象にしていること自体が問題だよなーと思ったりする。

| | コメント (0) | トラックバック (0)

InnoDB: No valid checkpoint found.

MySQLの定義をいじっているうちに、DBが起動できなくなった。ログには以下のように書いてある。

InnoDB: No valid checkpoint found.
InnoDB: If this error appears when you are creating an InnoDB database,
InnoDB: the problem may be that during an earlier attempt you managed
InnoDB: to create the InnoDB data files, but log file creation failed.
InnoDB: If that is the case, please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.1/en/error-creating-innodb.html
110117 16:00:02 [ERROR] Plugin 'InnoDB' init function returned error.
110117 16:00:02 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
110117 16:00:02 [ERROR] Unknown/unsupported table type: InnoDB
110117 16:00:02 [ERROR] Aborting

いったんInnoDB関係のファイルを全部削除して作り直す必要があるっぽい。
「InnoDB関係のファイル」とは、以下のもの。

  • ib_logfile*
  • ibdata*

DB停止 → ファイル削除 → DB起動 で動くようになった。よくあるのが、innodb_log_file_sizeを変更したときにこれが出る。
もちろんファイルを削除したらデータも消えるので注意が必要。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 13.5.5.1 InnoDB 初期化問題の扱い
http://dev.mysql.com/doc/refman/5.1/ja/error-creating-innodb.html

| | コメント (0) | トラックバック (0)

mod_rewriteでNotFoundを返す

RewriteRule を以下のように記述すればよい。

RewriteRule ^.*$ - [R=404,L]

あるURL以外へのアクセスは全部NotFoundにする。

RewriteEngine On
Options FollowSymLinks
RewriteCond %{REQUEST_URI} !^/cgi-bin/hoge/piyo$
RewriteRule ^.*$ - [R=404,L]

mod_rewrite はFollowSymLinks のオプションが使えないとエラーになる。ここで書かなくてもいいけど。

決められたIPアドレス以外からのアクセスは全部NotFoundにする。

RewriteEngine On
Options FollowSymLinks
RewriteCond %{REMOTE_ADDR} !^192\.168\.111\.13[0-9]$
RewriteCond %{REMOTE_ADDR} !^192\.168\.3\.10$
RewriteRule ^.*$ - [R=404,L]

| | コメント (0) | トラックバック (0)

my.cnfで使えなくなる定義名

mysqld.log に出てくるwarningで、もうすぐ使えなくなるよと警告されているオプション。ほかにもあるかもしれないけど一応メモ。

  • default-character-set → character-set-server
  • skip-locking → skip-external-locking

101027 15:57:22 [Warning] '--default-character-set' is deprecated and will be removed in a future release. Please use '--character-set-server' instead.
101027 15:57:22 [Warning] '--skip-locking' is deprecated and will be removed in a future release. Please use '--skip-external-locking' instead.

5.5.にアップデートするとホントに使えなくなってエラー吐いて起動できない。

| | コメント (0) | トラックバック (0)

jsvcのソースアーカイブが変わってるっぽい

Tomcat6のバイナリパッケージに同梱されていた、jsvcのソースアーカイブが、新しいバージョンだと別名で置いてあるっぽい。
Tomcat6.0.24あたりだと、インストールしたディレクトリの /bin 配下に jsvc.tar.gz があったが、最近のは /bin/commons-daemon-native.tar.gz になっているみたい。

$ tar tvfz commons-daemon-native.tar.gz | grep jsvc
-rw-rw-r-- mturk/mturk    7245 2010-02-23 15:01:07 commons-daemon-1.0.2-native-src/unix/man/jsvc.1.xml
-rw-rw-r-- mturk/mturk    1487 2010-02-23 15:01:08 commons-daemon-1.0.2-native-src/unix/native/jsvc.h
-rw-rw-r-- mturk/mturk   38712 2010-02-23 15:01:09 commons-daemon-1.0.2-native-src/unix/native/jsvc-unix.o
-rw-rw-r-- mturk/mturk   22901 2010-02-23 15:01:09 commons-daemon-1.0.2-native-src/unix/native/jsvc-unix.c

このプロジェクトの名前に変えたってこと?よく分からないけど紛らわしいなぁ。

Daemon - Daemon : Java based daemons or services
http://commons.apache.org/daemon/

| | コメント (0) | トラックバック (0)

Perlからメールを送る

Perlからメールを送るやりかた。

はまるのがSubjectのところ。
SubjectはJISにするだけじゃなく、MIMEエンコードしなくてはいけないという規則にのっとり、Encodeモジュールで一手間加えてやる必要がある。

my $subject = '日本語の件名ですよ。';
$subject = encode('MIME-Header-ISO_2022_JP', decode_utf8($subject));

本文は以下のようにする。

my $body = 'ほえほえあうあう。あーあーテステス。\n";
$body = encode('iso-2022-jp', decode_utf8($body));

メールの組み立てと送信。

my $from = "example\@example.com";
my $to = "example2\@example.com";

open MAIL, "|/usr/sbin/sendmail -f $from -t $to";

print MAIL "From: $from\n";
print MAIL "Subject: $subject\n";
print MAIL "To: $to\n";
print MAIL "Content-type: text/plain; charset=iso-2022-jp\n";
print MAIL "\n";
print MAIL "$body";

close MAIL;

$from と $to で使うアットマークをエスケープしないと、配列の変数と見なされて怒られる。

| | コメント (0) | トラックバック (0)

Tomcatで文字コードの設定をする

CATALINA_OPTS にこれを設定する。

-Dfile.encoding=UTF-8

バイト数チェックなどをするときに、UTF-8とShiftJISだと結果が異なるので、注意が必要。
デフォルトはUTF-8じゃない?

| | コメント (0) | トラックバック (0)

Tomcatで独自エラーページを出す

@IT:Java TIPS -- Tomcatで独自のエラーページを使う
http://www.atmarkit.co.jp/fjava/javatips/064container011.html

web.xml の <error-page> を直せばよいらしい。
わりと基本のキだと思うので記録しておこう。

| | コメント (0) | トラックバック (0)

HTTPステータス 400 - Direct access for JSP is not permitted.

SAStrutsで、jspへのダイレクトアクセスが禁止されているからエラーになる。

web.xmlで以下の場所を「false」から「true」にしたら動いた。

<filter>
  <filter-name>routingfilter</filter-name>
  <filter-class>org.seasar.struts.filter.RoutingFilter</filter-class>
  <init-param>
    <param-name>jspDirectAccess</param-name>
    <param-value>false</param-value>
  </init-param>
</filter>

| | コメント (0) | トラックバック (0)

渡しますです

Solaris環境にdaemontoolsをインストールしようとしてコンパイルしたら、gccからの警告が変だった。

警告: 互換性のないポインタ型からの引数 2 個の `execve' を渡しますです

なんだこりゃ(笑)。ちょっと萌えキャラっぽい語り口調ワロタ。

| | コメント (0) | トラックバック (0)

«keepalivedでフェイルオーバー環境作るときにiptablesの設定を忘れない