• 締切済み

既存テーブルにカラム追加でサービス停止

既存のテーブルに新しいカラムを追加するSQL文をphpmyadmin上から 実行すると、1,2分ほどしてから以下のメッセージを出力してサービスが停止します。 「SHOW TABLE STATUS LIKE 'テーブルA' #2003-サーバが応答しません。」 OS:windows2003 MySQL:4.0.26 全てのテーブルについてエラーになるわけではなく、一部のテーブルのみ現象が発生します。 現象がおきているのをテーブルA,テーブルBとすると、 テーブルAはレコード件数は90万件弱ですが、カラム数が200以上あります。 テーブルBはレコード件数が700万件近くあります。 カラムの追加は3つあり、一つのSQL文で3つを追加しようとしています。 全てのカラムは既存の最後に追加します。 データ型は全てINT(20)です。 以下はエラーログです。 *** Windows2003 アプリログ ************************************************ エラー発生アプリケーション mysqld-nt.exe、 バージョン 0.0.0.0、 エラー発生モジュール mysqld-nt.exe、 バージョン 0.0.0.0、 エラー発生アドレス 0x00173539 どなたかお分かりになる方、おられましたらご教授お願いします。 この質問はMySQLメーリングリストにも投稿しています。 どちらかで回答がもらえれば、回答を掲載します。

みんなの回答

回答No.2

#1回答者です。 MySQLのこの辺の内部処理には詳しくないのですが、他のRDBMSでも、「同期点を設定(commit等)しない多量の更新が発生した場合、RDBMS側でチェックポイントの取得ができなくて異常終了してしまう」ことがあります。 今回のポイントは、 「MySQLでは、ALTER TABLEの背景で、表のデータを変更前の表から、変更後の表へ全件コピーしている」 ということだと思います。 これはつまり、 「MySQLでは、同期点を設定しないで、多量データの更新を行なった場合、(チェックポイントの設定ができないといった理由で)やはり異常終了することがあるのでは?」 ということと、 「質問者さんの環境ではその二つの表が特にデータが多く、質問者さんの環境上、耐えられない状況だったのではないか?」 ということです。 この辺の異常終了の要因の切り分けについて、私自身は他のRDBMSには詳しいのですが、MySQLについては確証を持てないので、こういう書き方になりました。

参考URL:
http://dev.mysql.com/doc/refman/4.1/ja/innodb-checkpoints.html
S202
質問者

お礼

アドバイスありがとうございます。 自分でいろいろ調べておりまして、MySQLのログを確認できまして原因がわかりました。 ログにはinnodb_buffer_pool_sizeが8Mしかないので、設定を見直して下さいという記述がありました。 解決策として、innodb_buffer_pool_sizeの設定値を増やして、最初はALTER文にて1つのテーブルに同時に3つのカラムを追加しようとしていたのですが、これを1つずつ追加してやることで正常に処理が完了しました。 どうもありがとうございました。

回答No.1

MySQLのALTER TABLEは、内部処理として (1)変更前の表定義+変更内容から、変更後の表を定義 (2)変更前の表から、変更後の表に、行を全件コピー&変更反映 (3)変更前の表を削除 という、ある意味で”恐ろしいこと"(全件、insert ~ selectする)を行なっていることを知った上での質問ですか?

S202
質問者

お礼

すいません。 質問時点では知りませんでした。 いろいろと調べていくうちにALTER TABLEの動作はなんとなく分かりました。 chukenkenkouさんの文面から判断すると、できないということでしょうか?

関連するQ&A