【メモ】 MySQLで巨大なテーブルをリストアする場合。


MySQLのリストアがどうも上手く行かなかったのでちょっと調べてまとめてみた。
理解した部分とよく理解していない部分とがあるけどとりあえず書き出しておく。





別のシステムで巨大なテーブルをdumpしそれをリストアする場合、そのままやると次のエラーが出てしまう。

The table ### is full

これは、テーブルをリストアする際に書き出している一時ファイルが、tmp_table_sizeで規定された数字よりも大きくなってしまったということ。テーブルサイズがある程度までであれば、tmp_table_sizeを大きくすれば回避できる。



しかし一時ファイルはディスク上ではなくメモリ上に配置されるため、当然メモリの総量による制限を受ける。32bitの場合メモリは最大でも4GBまでしか使用できない(Windowsではそのうちの3GBしか認識しない)ので、tmp_table_sizeに設定できる数字も4GBが上限になる。ということは、この方法では4GB以上のサイズを持つテーブルはリストアできないし、仮想環境のように極端にメモリ割り当てが制限されている環境ではリストアは難しい。

というわけで、一時ファイルをメモリではなくディスクに書き出すように設定してやる必要がある。

mysql > SET SQL_BIG_TABLES=1;

これを設定すると一時ファイルはディスクに書き出されるようになるので、ディスク容量が十分である限り一時ファイルが溢れることはないが、ディスクアクセスが増えることになるのでリストアに時間が掛かるようになる。ただまぁそれは背に腹は替えられないみたいな感じっぽい。






ちなみに…これでリストアするのに半日以上掛かった。
なんか方法間違ってるような気がする…