dポイントプレゼントキャンペーン実施中!

既存のテーブルに新しいカラムを追加する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メーリングリストにも投稿しています。
どちらかで回答がもらえれば、回答を掲載します。

A 回答 (2件)

#1回答者です。



MySQLのこの辺の内部処理には詳しくないのですが、他のRDBMSでも、「同期点を設定(commit等)しない多量の更新が発生した場合、RDBMS側でチェックポイントの取得ができなくて異常終了してしまう」ことがあります。

今回のポイントは、
「MySQLでは、ALTER TABLEの背景で、表のデータを変更前の表から、変更後の表へ全件コピーしている」
ということだと思います。
これはつまり、
「MySQLでは、同期点を設定しないで、多量データの更新を行なった場合、(チェックポイントの設定ができないといった理由で)やはり異常終了することがあるのでは?」
ということと、
「質問者さんの環境ではその二つの表が特にデータが多く、質問者さんの環境上、耐えられない状況だったのではないか?」
ということです。

この辺の異常終了の要因の切り分けについて、私自身は他のRDBMSには詳しいのですが、MySQLについては確証を持てないので、こういう書き方になりました。

参考URL:http://dev.mysql.com/doc/refman/4.1/ja/innodb-ch …
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/04 14:21

MySQLのALTER TABLEは、内部処理として



(1)変更前の表定義+変更内容から、変更後の表を定義
(2)変更前の表から、変更後の表に、行を全件コピー&変更反映
(3)変更前の表を削除

という、ある意味で”恐ろしいこと"(全件、insert ~ selectする)を行なっていることを知った上での質問ですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/03 16:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!