LOAD DATA INFILE を使った MySQLのデータインポート
一年に一回やるかやらないかぐらいの頻度で、毎回ググって回ってるので備忘録。
mysqldump -u user -p --default-character-set=utf8 --lock-tables --single-transaction database table > table.sql gzip table.sql scp table.sql.gz new-server:/tmp/ ssh new-server cd /tmp zcat table.sql.gz | mysql -u user -p database
基本この流れで問題ないんだけど、千万件辺りからいつまでたっても終わらなくなる感じになるので、LOAD DATA INFILE を使うようにする。
SELECT * INTO OUTFILE '/tmp/table.tsv' FROM table
で書き出して
LOAD DATA INFILE '/tmp/table.tsv' INTO TABLE table;
で読み込む。
必要であれば読み込む前に以下をやっておく
SET foreign_key_checks=0; SET sql_log_bin=0; SET unique_checks=0; SET @@character_set_database=binary
あと、基本だけどこの手の時間がかかる作業はscreenなりtmuxなりやっておかないと、悲しい気持ちになります。
手元にあるデータは新たに更新されることは無いので、最近は昔に書きだしたtsvを再インポートするだけになっている。
参考元:
もっとクソでかいデータを扱う時:
参考先のmaatkitとfifoを使う
次に実行する時に、毎度参考サイトが有るとは限らないのでアーカイブしておきたい所。