dump+rsync+ssh でバックアップ 2010-10-04

rsyncを使った同期方法についてまとめてみる。
rsyncの経路としてsshを使用し,ローカルからリモート側へファイルを転送することでバックアップとする。

パスワードを空にしておくのはちょっと...と思ったんだけど,ssh2の鍵ペアを作成しローカル側とリモート側で秘密鍵と公開鍵を使って認証する。
でもって,リモート側でrsyncで接続してきた場合には,特定のコマンドしか実行できないようにしておく。

ssh2鍵ペアの作成

# ssh-keygen -t dsa -N "" -f rsync
Generating public/private dsa key pair.
Your identification has been saved in rsync.
Your public key has been saved in rsync.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx who@samone.example.com
The key's randomart image is:
+--[ DSA 1024]----+
|  x.x            |
|   x x           |
|      x x        |
|     x x         |
|      x x        |
|   x x x  x x x  |
|    x x x   x    |
|     x x x x     |
|   xx  xxxx xx x |
+-----------------+
# ls
rsync rsync.pub

rsyncが秘密鍵,rsync.pubが公開鍵が作成されたので,出来上がった公開鍵をリモートの.ssh/authorized_keyに追加する。
というかリモート側の.sshにはauthorized_keysが無かったので,rsync.pubをローカル側からリモート側へコピーし更に.sshに移動した。
まず,コマンドにlsを設定し,ローカル側からリモートへ接続しテストしてみる。

remort> cat /who/.ssh/authorized_keys
from="相手のIPアドレス",no-port-forwarding,no-x11-forwarding,no-agent-forwarding,no-pty,command="/bin/ls" ssh-rsa AAAAB....
local> ssh -i /who/.ssh/rsync who@remote
 :
 :
Connection to ローカル closed.

リモート側のファイルが表示されれば接続はOK

rsyncするためのauthorized_keysの設定とローカル側の指定

ということで,ローカル側で指定したコマンドとリモート側のauthorized_keysのcommandが一致しているとauthorized_keysに指定されたコマンドが実行される。

remote> cat /who/.ssh/authorized_keys
from="相手のIPアドレス",no-port-forwarding,no-x11-forwarding,no-agent-forwarding,no-pty,command="rsync --server -av そーす でぃすてぃねーしょん" ssh-rsa AAAA....
local> rsync -av -e "ssh -i /who/.ssh/rsync" そーす who@remote:/でぃすてぃねーしょん

とするとローカル側からリモート側へファイルの同期が実行される。というかコピーされる。
実際には,--deleteオプションを指定するとローカル側で削除されたファイルはリモート側でも削除され同期が行われる。

mysqldump

rsyncを使うもともとの動機は,とあるWebシステムのバックアップ。いまどきはWebサーバ(Apache使ってる)単体で 使うことなくRDBを使用している。mysqlを使ったりpostgreSQLを使ったりしていたんだけど,ここのところ,mysqlだったりするので,mysqlに特化した方法というかメモです。

全データをテキスト形式にして保存する。

> mysqldump -u root -p --all-databases > dump_all.sql
Password:

データベースを指定してバックアップするには,

> mysqldump -u root -p --databases データベース名 > dump.sql

全データを復元する

> mysqldump -u root -p < dump_all.sql

特定のデータベースを復元する

> mysqldump -u root -p データベース名 < dump.sql

一連の作業をまとめて自動化する。

一連の作業をスクリプトにしてcronで自動的にバックアップすりゃいいんじゃないかと思ってる。<今,ここ

  1. mysqldumpでバックアップを保存
  2. コンテンツとmysqldumpの結果をrsyncでリモート側へ転送
  3. 転送されたデータベースを復元

参考


Last-modified: 2022-05-05 (木) 22:27:10