MySQL

 

ファイル出力無しでリモートでmysqldumpしてローカルにリストアする

リモートにあるMySQLをmysqldumpでローカルにリストアしたい事ってありますね。この時リモートでdumpのsqlファイルを出力してからローカルにscpしてそれを取り込むと、余計に時間を食います。今回はファイル出力無しに直接リモートDBのdumpをローカルにリストアしてみます。

新サイト、tree-mapsを公開しました!!

tree-maps: 地図のWEB TOOLの事ならtree-mapsにお任せ!

地図に関するWEB TOOL専門サイトです!!

大画面で大量の緯度経度を一気にプロット、ジオコーディング、DMS<->DEGの相互変換等ができます!

◯ 広告

まずはリモートサーバ側でdumpを出力します。

mysqldump --single-transaction -uuser -ppassword schema > /tmp/dump.sql

ローカル側でdump.sqlをscpで取得し、リストアします。

scp ./dump.sql user@host:/tmp
mysql -uuser -ppassword schema < /tmp/dump.sql

場合によってはリモートサーバでgzipするかもしれませんね。

これだとdump.sqlのファイル出力と、scpが必要になります。

dumpしたsqlのファイルサイズが10G程度になると、無駄なIOが発生して時間がかかります。

場合によっては「ディスク容量がギリギリ足りない!!」なんていう状況もあるでしょう。

ではこのIOを極力減らしてみます。

以下のようにすると、ファイル出力無しで直接dumpしてリストアできます。

ssh user@host "mysqldump --single-transaction -uuser -ppassword schema" | mysql -uuser -ppassword schema

少し解り難いですね。

パイプ「|」を基準に左右に分けて考えます。

左側:リモートサーバ上での処理

ssh user@host "mysqldump --single-transaction -uuser -ppassword schema"

ユーザ・パスはリモートMySQLのものを設定します。

リモートsshコマンドで、リモート上でmysqldumpをさせています。

mysqldumpはdumpのsqlを標準出力するだけのコマンドです。

この標準出力をパイプで右側(ローカル)に渡します。

右側:ローカル上での処理

mysql -uuser -ppassword schema

ユーザ・パスはローカルMySQLのものを設定します。

パイプで渡された標準出力を、mysqlコマンドでリストアしています。

この場合、リモートMySQLにローカルからのアクセスを許可する必要がありません。

左側で行ったmysqldumpは、リモートsshで「ローカル接続でmysqldumpをさせた」のです。

リモート接続でmysqldumpをさせたのではない部分がポイントです。

これだと巨大なsqlが標準出力で転送されるので、圧縮してみます。

ssh user@host "mysqldump --single-transaction -uuser -ppassword schema| gzip" | zcat | mysql -uuser -ppassword schema

リモートで行うのは、dump出力とgzip圧縮です。ローカルにはgzip圧縮結果が転送されます。

ローカルで行うのは、パイプの結果をzcatで解凍して、mysqlコマンドでリストアします。

このやり方だとgzipとzcatでリモートとローカルの両者に圧縮+解凍の負荷がかかります。

ディスクが遅い場合はgzipとzcatが逆にボトルネックになるので、やめた方がいいかもしれません。

◯ 広告