<< Prev Page Next Page >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


大きなテーブルをmysqldumpでエクスポートしてWindows上のmysqlでレストアするとき(長っ)

何万行もある大きなテーブルをmysqldumpでバックアップすると、できたSQLファイルのINSERT文がめちゃくちゃ長くなってしまう。

これを、僕の手元のWindows版Mysqlで

mysql -u root -p database < dumpsql
とかやってレストアしようとすると
ERROR 2013 (HY000) at line 5915 in file: dump.sql': Lost connection to MySQL server during query
とかで怒られる。

その行番号の所を見ると、どうもINSERT文がものすごい長いところでコケてるみたいなので、INSERT文を短くしようと思った。

最初は簡単に、「),」を「); INSERT INTO テーブル名 VALUES 」に置換すればいいかなーと思ったんだけど、こうするとINSERTを何万回も発行することになってめちゃくちゃ処理が遅かった。

しかたないのでINSERT INTOの中身を50個ずつで区切るようにしてみたらなんとかうまくいった。というわけでRubyスクリプト。

Rubyテキにカッコ悪いところとかヘボいところとか指摘ぷりーず。あ、ファイル名はコマンドラインで指定すべきとか50がマジックナンバーとかそういうのはいいんで。


class Dumpmod

def mod(filename)
inserting = false
fout = File.open filename + "_mod", "w"
open(filename) {|file|
while line = file.gets
if line =~ /^INSERT INTO \`(\w+)\`/ then
table = $1
counter = 0
values = line.split(/\),/)
values.each {|val|
if counter != values.size && counter % 50 == 49 then
fout.puts "INSERT INTO \`" + table + "\` VALUES " + val + "),\n"
elsif counter != values.size && counter % 50 == 48 then
fout.puts val + ");\n"
elsif val !~ /;$/ then
fout.puts val + "),\n"
else
fout.puts val + "\n"
end
counter += 1
}
else
fout.puts line
end
end
}
fout.close
end

end

m = Dumpmod.new
m.mod "dump.sql"

この記事に対するコメント

お、File.foreachとか使えたんだった

【2008/01/08 15:19】URL | とっくり #-[ 編集]

この記事に対するコメントの投稿



管理者にだけ表示を許可する

この記事に対するトラックバック

トラックバックURL
http://tockri.blog78.fc2.com/tb.php/115-e5be4435
この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。