FreeBSD 下的 MySQL 备份方案
生活随笔
收集整理的這篇文章主要介紹了
FreeBSD 下的 MySQL 备份方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作/譯者:葉金榮(Email: ),來源:http://imysql.cn,轉載請注明作/譯者和出處,并且不能用于商業用途,違者必究。 核心提示:如何在 FreeBSD 下實現 MySQL 的全量及增量備份,確保數據的最大可靠性。在這里利用了 MySQL 的復制以及新版本的 FreeBSD 集成的快照功能。 約定:本備份方案是在 MySQL 的 復制從服務器 上執行。關于 MySQL 的復制設置方法請看 MySQL 同步(一)。MySQL 安裝在 /usr/local/mysql 下,datadir 則為 /data/mysql,而日志以及 innodb 的 log_file 均保存在 /logs/mysql/ 下。用于保存備份文件的目錄為 /backup/mysql/,備份方案分成 每天全量備份 一次以及 每小時增量備份 一次。因此,如果 MySQL 發生誤操作以及其他情況導致數據丟失,那么在采用本方案的情況下,最壞的情況只會丟失不到一個小時所產生的數據。當然了,也可以實現實時增量備份,這會在以后的文章中講到。 一、全量備份
先來看看全量備份的腳本:#!/bin/sh # # created by yejr,2007/06/03 # # 本腳本用于定期做全量備份,備份的對象是slave上的全部數據 # 每次備份之前都先執行"STOP SLAVE; FLUSH TABLES;",然后將所有文件拷貝到備份目錄下 # echo "[backupmysql_fullly]" date today=`date +"%Y_%m_%d"` logdir=/logs/mysql datadir=/data/mysql bkdir=/backup/mysql/$today/full_backup expdays=7 if [ ! -d $bkdir/$today ] ; thenmkdir -p $bkdir fi #停止同步,刷新日志,刷新表 echo "stop slave; flush logs; flush tables;" mysqladmin -uroot stop-slave mysqladmin -uroot flush-logs mysqladmin -uroot flush-tables cd $logdir #備份日志文件 echo "backup errro log" cp $logdir/error.log* $bkdir/ echo "backup ib_logfile* master.info relay.info" cp ib_logfile* master.info relay.info $bkdir/ #拷貝所有文件 echo "backup my.cnf" cp /usr/local/mysql/my.cnf $bkdir/ ##如果是老版本的 FreeBSD 不支持快照功能,就拷貝全部數據庫文件 #cd $datadir #cp -rf * $bkdir/ ##如果是新版本的 FreeBSD,則采用其特有的 snapshot 功能,先制作鏡像,而后掛載鏡像,再拷貝數據文件 echo "make snapshot of /backup" /sbin/mksnap_ffs /data/ /data/.snap/mysql_snap_$today #執行 slave-start; mysqladmin -uroot start-slave #掛載鏡像文件,而后拷貝數據 /sbin/mdconfig -a -t vnode -f /data/.snap/mysql_snap_$today -u 4 /sbin/mount -r /dev/md4 /backup/.snap cp -rf /backup/.snap/mysql/data/* $bkdir/ /sbin/umount /backup/.snap /sbin/mdconfig -d -u 4 #刪除7天前的過期文件 find /backup/mysql -type d -mtime +$expdays -maxdepth 1 | xargs rm -rf find /data/.snap -type f -mtime +$expdays -maxdepth 1 | xargs rm -f #修改備份文件的屬主 chown -R nobody:nobody $bkdir echo "[/backupmysql_fullly]" 接下來就是在 crontab 中增加一條記錄,使得每天都執行本備份腳本。0 0 * * * (/bin/sh /backup/mysql/backupmysql_fullly.sh >> /backup/mysql/backupmysql.log) 二、增量備份
下面是增量備份的腳本:#!/bin/sh # # created by yejr,2007/06/03 # # 本腳本用于定期做增量備份,備份的對象是binlog # 每次備份之前都先執行 flush-logs,然后將最近的binlog移動到備份目錄下 # echo "[backupmysql_hourly]" date logdir=/logs/mysql bkdir=/backup/mysql now=`date +"%Y_%m_%d_%H"` today=`date +"%Y_%m_%d"` if [ ! -d $bkdir/$today ] ; thenmkdir -p $bkdir/$today fi #執行 "flush logs" echo "flush logs; backup error log" mysqladmin -uroot flush-logs #去的 binlog 文件總數,去掉最后一個以及 binlog.index total=`ls $logdir/logbin.*|wc -l` total=`expr $total - 2` #循環移動所有的 binlog 文件 echo "backup binary logs" for f in `ls $logdir/logbin.*|head -n $total` dobf=`basename $f`mv -if $f $bkdir/$today/$bf done chown -R nobody:nobody $bkdir echo "[/backupmysql_hourly]" 然后在 crontab 中增加一條記錄,使得每小時都執行本備份腳本。0 */` * * * (/bin/sh /backup/mysql/backupmysql_hourly.sh >> /backup/mysql/backupmysql.log) 在 linux 下,也可以采用本備份方案,不過執行的是不支持 snapshot 情況下的備份策略,即拷貝所有文件。或者,也可以利用 linux 自帶的 lvm 功能實現類似 FreeBSD 的快照功能。
以上腳本在 FreeBSD 6.2 + MySQL 5.0.37 環境下實驗通過。 本文出自 “MySQL中文網”博客 http://www.imysql.cn/ 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
先來看看全量備份的腳本:#!/bin/sh # # created by yejr,2007/06/03 # # 本腳本用于定期做全量備份,備份的對象是slave上的全部數據 # 每次備份之前都先執行"STOP SLAVE; FLUSH TABLES;",然后將所有文件拷貝到備份目錄下 # echo "[backupmysql_fullly]" date today=`date +"%Y_%m_%d"` logdir=/logs/mysql datadir=/data/mysql bkdir=/backup/mysql/$today/full_backup expdays=7 if [ ! -d $bkdir/$today ] ; thenmkdir -p $bkdir fi #停止同步,刷新日志,刷新表 echo "stop slave; flush logs; flush tables;" mysqladmin -uroot stop-slave mysqladmin -uroot flush-logs mysqladmin -uroot flush-tables cd $logdir #備份日志文件 echo "backup errro log" cp $logdir/error.log* $bkdir/ echo "backup ib_logfile* master.info relay.info" cp ib_logfile* master.info relay.info $bkdir/ #拷貝所有文件 echo "backup my.cnf" cp /usr/local/mysql/my.cnf $bkdir/ ##如果是老版本的 FreeBSD 不支持快照功能,就拷貝全部數據庫文件 #cd $datadir #cp -rf * $bkdir/ ##如果是新版本的 FreeBSD,則采用其特有的 snapshot 功能,先制作鏡像,而后掛載鏡像,再拷貝數據文件 echo "make snapshot of /backup" /sbin/mksnap_ffs /data/ /data/.snap/mysql_snap_$today #執行 slave-start; mysqladmin -uroot start-slave #掛載鏡像文件,而后拷貝數據 /sbin/mdconfig -a -t vnode -f /data/.snap/mysql_snap_$today -u 4 /sbin/mount -r /dev/md4 /backup/.snap cp -rf /backup/.snap/mysql/data/* $bkdir/ /sbin/umount /backup/.snap /sbin/mdconfig -d -u 4 #刪除7天前的過期文件 find /backup/mysql -type d -mtime +$expdays -maxdepth 1 | xargs rm -rf find /data/.snap -type f -mtime +$expdays -maxdepth 1 | xargs rm -f #修改備份文件的屬主 chown -R nobody:nobody $bkdir echo "[/backupmysql_fullly]" 接下來就是在 crontab 中增加一條記錄,使得每天都執行本備份腳本。0 0 * * * (/bin/sh /backup/mysql/backupmysql_fullly.sh >> /backup/mysql/backupmysql.log) 二、增量備份
下面是增量備份的腳本:#!/bin/sh # # created by yejr,2007/06/03 # # 本腳本用于定期做增量備份,備份的對象是binlog # 每次備份之前都先執行 flush-logs,然后將最近的binlog移動到備份目錄下 # echo "[backupmysql_hourly]" date logdir=/logs/mysql bkdir=/backup/mysql now=`date +"%Y_%m_%d_%H"` today=`date +"%Y_%m_%d"` if [ ! -d $bkdir/$today ] ; thenmkdir -p $bkdir/$today fi #執行 "flush logs" echo "flush logs; backup error log" mysqladmin -uroot flush-logs #去的 binlog 文件總數,去掉最后一個以及 binlog.index total=`ls $logdir/logbin.*|wc -l` total=`expr $total - 2` #循環移動所有的 binlog 文件 echo "backup binary logs" for f in `ls $logdir/logbin.*|head -n $total` dobf=`basename $f`mv -if $f $bkdir/$today/$bf done chown -R nobody:nobody $bkdir echo "[/backupmysql_hourly]" 然后在 crontab 中增加一條記錄,使得每小時都執行本備份腳本。0 */` * * * (/bin/sh /backup/mysql/backupmysql_hourly.sh >> /backup/mysql/backupmysql.log) 在 linux 下,也可以采用本備份方案,不過執行的是不支持 snapshot 情況下的備份策略,即拷貝所有文件。或者,也可以利用 linux 自帶的 lvm 功能實現類似 FreeBSD 的快照功能。
以上腳本在 FreeBSD 6.2 + MySQL 5.0.37 環境下實驗通過。 本文出自 “MySQL中文網”博客 http://www.imysql.cn/ 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的FreeBSD 下的 MySQL 备份方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NHibernate for .NET
- 下一篇: 推荐曹济的FPA培训课程