ラベル

Server (108) work (77) Idea (68) Car (31) PC (29) DAW (28) other (19) MakingWEBsite (18) 趣味 (18) health (13) CentOS (11) drupal (11) (9) android (4) スマホ (4) communication (3) drupal7 (3) hint (3) meno (3) モバイル (3) 歯医者 (3) 第二種電気工事士 (3) 英語 (3) PC Server (2) drupal8 (2) ms access (2) uwp C# (2) めし (2) 整備 (2) 音楽 (2) MIDI (1) diy (1) 会計 (1) 動画再生 (1) 生活 (1) 郵便 (1) 食べ物 (1)

2015年3月12日木曜日

rsyncを使ったバックアップとmysqldumpを使ったmysqlのバックアップ centos

フォルダ、ファイルのバックアップ(同期)。

自分のバックアップの取り方は自宅にあるCentOSサーバーのhtml以下のディレクトリやmysqlのデータをサーバー内のバックアップ用sambaディレクトリにいったんまとめて保存して、そこにアクセスしたWindowにそれをBunbackupでバックアップしている。

容量的には差分バックアップがいいのだろうけど、サーバーのディスクが壊れた時に手っ取り早く復旧させるのにはディレクトリが丸々残っていたほうがやりやすいだろう。ということで、
rsync -av --delete /var/www/html /mybackup/
を使うことにした。
あとはWindows側で、新しいバックアップは一週間分、それより古いものは一か月ごとに半年分バックアップを取っておけば、トラブルが起きてもどうにかなるだろう。

差分バックアップは写真とか、そういうもののバックアップにはいいんじゃないかな。と思った。

rsyncコマンドをcronで動かす。---------------------------------------

rsync -av /var/www/html /mybackup/

元ファイル、フォルダと完全に同期を取りたい時は、
--deleteオプションをつけて、
rsync -av --delete /var/www/html /mybackup/

差分バックアップ
rsync -av --delete --link-dest=前回取得したバックアップ バックアップ元 最新バックアップ

/hoge/hogehoge/を除いてバックアップを取りたい場合は、
rsync -av --exclude='/hoge/hogehoge/' /var/www/html /mybackup/
オプションaはアーカイブ

オプションvは詳細な情報を表示(cron登録時はいらない。)

--excludeは除外するディレクトリ。
リンクの貼ってあるディレクトリを安全のために除外する場合など。
Windows上のエクスプローラーからLinux(samba)上のリンクされたファイルを操作、削除すると警告無しで実行されてしまう。


次の2つのコマンドは、CentOSのリンク関係コマンドなど。
リンクだけをディレクトリから外すには以前シンボリックのところで書いたように
unlink
コマンドを使う。

リンクの貼ってあるディレクトリを探す。
find / -type l




バックアップ元のディレクトリ、ファイルにリンクがあるときは注意

例えば

/backup
というファイルを同じサーバー内の別のhddにバックアップしたとして、その中の
/backup/workdata
がどこか別のhddなどに入っている
/data
にシンボリックリンクを貼ってあった場合。
/backupを削除すると、CentOS内/data内に入っているファイルも削除されてしまう。

バックアップされたディレクトリ
/backup

/backup2
として2重にバックアップしてバックアップが取れているかどうかの実験をしていたのだけど、
うまくいったから、そのコピー/backup2を削除したら、リンク先の元ファイルが全て消えてしまった。
バックアップをしようとして、ファイルを削除してしまうという悲しいことをしてしまった。


mysqlのデータベースのバックアップ。-------------------------------------


sql文をテキスト形式で保存できるので、
戻すのが楽なmysqldumpコマンドを使う。
(ただ単にデータベースを丸々コピーコマンドでコピーは危険。戻すのに失敗するときがある。)

mysqldump --single-transaction --default-character-set=binary -u root --password=パスワード バックアップデータベース名 > /backupcentos/test.sql
(--single-transactionはバックアップ時間が長くかかっても、整合性のとれたバックアップを取るオプション
--default-character-set=binaryは文字コードを変換せずにそのままで)


・すべてのデータベースを一つにまとめてバックアップする方法(でも、これは復元するときにまとめてしか戻せないようなので何かと不便だった。データが全滅したときなどはこれがあると助かるかもしれないけど、データは別々に分けてとっておいたほうがいいと思う。)

mysqldump -u root -x --all-databases > mybackup/mydatabase.sql
上の方法では動かなかった。
全データベースをバックアップするときはeventsオプションが必要。
mysqldump --all-databases --events --default-character-set=binary -u root --password=パスワード > /backup/mydatabase.sql
全てのデータベースの保存。
xは、データをロックさせるためのオプション。
オプションxはデータベース間の整合性を取りたいときには必要だそうだ。
データベースがそれぞれ独立しているときには必要ないみたいだ。

http://qiita.com/crimson_21/items/6171a95f8ddb2861e2e6
を参考にしてスクリプト文を作った。
/usr/local/bin
にファイル名を
backup4mysql.sh
として/usr/local/bin/にでも置いておく。
-------------------------------------------------------------------
#!/bin/sh

# 他のユーザからバックアップを読み込めないようにする
#umask 077

# バックアップファイルを何日分残しておくか(一ヶ月分)
period=31
# バックアップファイルを保存するディレクトリ
dirpath='/mybackup/mydata'

# ファイル名を定義(※ファイル名で日付がわかるようにする。)
filename=`date +%y%m%d`

# mysqldump実行(ファイルサイズ圧縮の為gzで圧縮。)
# 特定のデータベースのバックアップを取りたい時
mysqldump --single-transaction --default-character-set=binary -u root -pパスワード バックアップデータベース名 | gzip > $dirpath/$filename.sql.gz

# 全部のデータベースのバックアップを取りたい時
mysqldump --single-transaction --all-databases --events --default-character-set=binary -u root --password=パスワード | gzip > $dirpath/$filename.whole.sql.gz

# 古いバックアップファイルを削除
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql.gz
rm -f $dirpath/$oldfile.whole.sql.gz

----------------------------------------------------------------------------
保存する。
保存をするときに、
chmod +x backup4mysql.sh
実行権限をつけるのを忘れないように。

ちなみに
.gz
の解凍は
gunzip filename

--------------------------------------------------------------------------------

バックアップの設定をcronへ登録する。

/etc/rc.d/init.d/crond status
で、動いているかどうかの確認。

設定場所は
/etc/crontab

crontab -e
で設定できる(この場合の設定ファイルの場所は/var/spool/cron以下のユーザー名のテキストファイルの中)、
crontab -rでcronの設定を消してしまうので、eとrの近さを考えると怖くて使わない人が結構いるらしい。
crontab -lでcronのリスト表示。

自分はcrontab -eで設定してしまった。
16 4 * * * rsync -av --exclude='/hoge/hogehoge/' /var/www/html /mybackup/
16 4 * * * rsync -av --delete /var/www/html /mybackup/
46 4 * * * backup4mysql.sh
46 4 * * * /usr/local/bin/backup4mysql.sh
backup4mysql.shの場所を指定してやらないと動かなかった。

cronがうまく動かないとき、又はcronが動いていてもシェルの実行がされないとき。
12 * * * * /usr/local/bin/backup4mysql.sh >> /backup/zzzz.log 2>>/backup/zzzz-err.log
などとしてbackupディレクトリなどにエラーログを出してやる。
自分の場合はcronは動くけど、シェルの実行はされない状態で、
/bin/sh: backup4mysql.sh: command not found
とエラーログに出てきたので、シェルの場所を指定したら動き出した。


今頃になって初めて知ったが、centos6からanacronとかいうのもデフォルトで動いているらしい。
anacronはcronによって動いているらしい。
それはそれで横に置いといて、

0 件のコメント:

コメントを投稿