
ALTER TABLEの処理が全然終わらなくなってしまったので、質問させて下さい。
下記のような状態です。
・テーブルの行数は962362
・topコマンドで見たとき、普段mysqldのCPU使用率が50~100%なのですが、ALTER TABLE後に確認すると2%前後になる
・試した処理はdrop indexとadd column
・mysqlを再起動しようにもstopするのに数分かかる
・nginxを一度stopし、負荷の少ない状態でも同じことを試しましたが結果はかわりませんでした
・検索してみると、key_buffer_sizeが少なすぎることが原因という記事をみかけたので、試しにkey_buffer=512Mとして、設定を読み込み直してから試してみましたが結果はかわりませんでした
このような場合の原因と対策を教えて頂ければ幸いです。
足りていない情報は随時補足させていただきます。
是非回答宜しくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
key_buffer_sizeをチューニングしようとされているので、ストレージエンジンは、MyISAMでしょうか?
InnoDBなら、チューニングするパラメータが異なります。
alter tableでテーブルを変更する場合において、
基本的にデータが多いときは、indexの再作成に時間がかかります。
(使用しているハードウェアのスペックに依存しますが)
CPU使用率ですが、普段が2%前後で、alter table実行時に50~100%になるのでしょうか?
教えていただきたいのが、下記の項目です。
・ハードウェアのスペック
・ストレージエンジン
・テーブルに張っているインデックスの数とインデックスの合計データサイズ(1行あたり)
この回答への補足
ストレージエンジンはmroongaを使っています。
mysqldのCPU使用率ですが、普段が50~100%でalter table実行時に2%前後になってしまいます。
サーバーのスペックは、さくらVPSの8Gのプランになります。
http://vps.sakura.ad.jp/
・テーブルに張っているインデックスの数とインデックスの合計データサイズ(1行あたり)
すみません、これはどの部分を見ればよいでしょうか…
No.2
- 回答日時:
・対象テーブルと同じ構成の変更用テーブルをつくる
・あらたにインデックスをつける
・対象テーブルから変更用テーブルにデータを流し込む
・変更用テーブルをつかってテスト
・問題なければ対象テーブルを削除し、変更用テーブルを対象テーブルにリネーム
という流れでやるとよいでしょう
・対象テーブルから全データを別テーブルコピー
・対象テーブルをトランケート
・インデックスを設定
・別テーブルから対象テーブルにデータを戻し入れる
でもよいかも
この回答への補足
いつもお世話になります。
教えていただいた方法を早速試してみようと思ったのですが、CREATE TABLE自体が処理が終わらないようです…
CREATE TABLEで処理が返ってこない状態で別windowからSHOW TABLESとしてみたところ、CREATE TABLEしたテーブルの名前があったので、処理が返ってこないだけでできているのかと思ったら、そのテーブルに対してINSERTやSELECTをしてみても何も返ってきませんでした。(emptyではなく処理待ち状態)
この補足を書いている現在、DROP TABLE `table_`;の処理待ち中です…
この件に関してはmysqldのCPU使用率は2%まで落ちることはなかったのですが、なにか根本的に直さなければならない部分があるように思ったのですがどうなのでしょうか…
No.1
- 回答日時:
9万6千件・・・多すぎます。
時間がかかるのは当然です。mysqlをストップすると、処理中のものが終わるまでまち、コミットが終わるか、
処理中のものを元に戻し、ロールバックが終了するまで待たされます。
それを待たずに終了してしまったら、myqlが立ち上がらなくなってしまいます。
私、前に大型コンピュータで100万件のUpdateをかけました。
何十分たっても終わらないのでキャンセルしたのです。
そしたらログがパンクし、ログの処理を間違え、何もできなくなってしまったので強制終了したのです。
データベースを再インストールするはめに陥りました。
この回答への補足
回答ありがとうございます。
別サイトでほとんど同じテーブル(直近の数千件の中身が違う程度であとは全く同じ)に対して全く同じクエリを投げたところ15秒程度で終わっていたので今回の件に疑問を感じました。10分以上たっても処理が終わる気配がありません。
また、msqldのCPUusageが2%程度まで落ち込んでしまうというのはどういう現象なのでしょうか。
ALTER TABLEの処理では、元のテーブルの一時的なコピーが作成されるとのことなので、処理を中断しても影響が出ないという記事を見たような記憶があり処理を中断した次第です。
key_bufferの上限を上げるのもそのためなのかな、と思っていました。
mysqlに関しての知識がまだまだ浅いため疑問ばかりがうかびます。
原因と対応策をはっきりすることができればと考えていますので、引き続き回答の受付を続けさせて頂ければと思います。
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「テーブルに座って……」という...
-
L2SWはARPテーブルを持っている?
-
飲み会で、座敷orテーブルどち...
-
UTF8のテーブルをODBCドライバ...
-
会社の飲み会の幹事になり、座...
-
お金持ちのテーブル
-
外部キーだけのテーブル(主キ...
-
[DB設計]多対多の問題点とは
-
取数計算
-
【エクセル】データテーブルの...
-
Excelのテーブルでmatch関数の...
-
下記、問題に対しての解答が以...
-
1対1のリレーション(主キー同...
-
SQL2000 ワークテーブルの作成...
-
アクセスのリンクテーブル一覧...
-
リレーションシップが出来ません。
-
AccessのSQL 部分一致したデー...
-
既存テーブルから別テーブルへ...
-
Access データベースを分割した...
-
親子関係のテーブルについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「テーブルに座って……」という...
-
会社の飲み会の幹事になり、座...
-
外部キーだけのテーブル(主キ...
-
テーブルリンク リンク元を知...
-
オーダーの覚え方について
-
下記、問題に対しての解答が以...
-
飲み会で、座敷orテーブルどち...
-
アクセスのリンクテーブル一覧...
-
【エクセル】データテーブルの...
-
L2SWはARPテーブルを持っている?
-
面接のときテーブルが正面に。...
-
男性と2人で飲食店に行きテーブ...
-
UTF8のテーブルをODBCドライバ...
-
お金持ちのテーブル
-
1つのテーブルに同じデータを参...
-
テーブル名の前のドットの意味
-
複雑なSQL文について
-
データベースの接続に失敗して...
-
【PHP】SQL文のSUM関数で出力し...
-
更新されたテーブルを表示したい
おすすめ情報