ネットサービスの開発に役立ちそうな話題を中心にお届けします。
F.Ko-Jiの「一秒後は未来」 > MySQL
2011年07月20日 16:30

大量データのあるテーブルにはALTER TABLEよりmysqldumpしてインポートのほうがよさげ

MySQLで大量にデータのあるテーブルにALTER TABLEなどを実行しようとすると果てしなく時間がかかることがある。

» 大きめのテーブルにカラムやインデックスを追加する際の注意 - Slow Dance

処理中に show processlist; を見ると State の欄にたいてい「copy to tmp table」という状態が出力されていて、その状態が延々と続く。コピーが一体どこまで進んでいるのか把握できないので精神衛生上よろしくない。

で、代替の方法としてさっきの記事の最後のほうで紹介されている「copy to tmp table - 刺身☆ブーメランのはてなダイアリー」に書かれている「mysqldump してから新しく作成したテーブルにインポート」という方法がある。

試してみたらこの方法はかなり良い。まず mysqldump は --quick オプションを使って比較的早く終わる。さらに、ダンプ中に書きこまれているファイルのサイズが増えていくのが見えるので、どの程度ダンプが進んでいるかがわかる。

ダンプしたデータを再インポートする際も、show processlist; には「Info」の欄にINSERT文が表示されるので、どこまでインポートが進んでいるかが把握できる。

全体の実行時間もALTER TABLEより速かった。と言っても自分の環境の場合6時間かかっても終わらなかったものが3時間くらいで終わったというレベルなので、時間がかかることは変わらないが。

ちなみに元データが消えてしまうのはちょっと怖いので、mysqldumpを実施する際に --no-create-info オプションでCREATE TABLE情報は出力しないようにして、元のテーブルを別名にRENAME、新しく元のテーブル名で CREATE TABLE を実行してテーブルを作成し、そのテーブルにダンプデータを流し込むようにした。

2011年05月29日 02:12

MySQLがクラッシュして勝手に終了する原因はファイル破損らしい

2010年12月24日 14:28

単純なミスでMySQLのプロセスが溜まってしまった話

2010年11月23日 01:31

MySQLでdefault-character-setを指定する前にデータベースを作成するとこうなる

2010年10月13日 19:23

MySQLを複数起動した時にstatusで個別に状態を確認する方法

2010年09月16日 01:53

Mac OS X(Snow Leopard)のMacPortsでApache2, PHP5, MySQL5をインストールし直した

2010年08月02日 13:48

MySQLのスロークエリが解消しないのでメモリ設定を調整

2010年07月01日 05:38

ADOdbのセッション管理でスロークエリ

2010年04月29日 14:26

MySQLのGeomFromTextなどで使うPOINTにはコンマ不要

2009年12月15日 11:49

MT3.6でSQLiteからMySQLに移行

2009年01月24日 01:35

DailyFeed復旧しました。。

2008年05月04日 16:48

MacPortsでのMySQLインストールで初歩的ミス

2006年04月20日 17:44

MySQLのGRANT

2006年04月20日 00:58

MySQLとlocalhost

2006年02月06日 14:21

MySQLの文字化けに苦労した