Heim  >  Artikel  >  Datenbank  >  再谈 MySQL 备份

再谈 MySQL 备份

WBOY
WBOYOriginal
2016-06-07 15:25:37998Durchsuche

作/译者:叶金荣(Email: ),来源:http://imysql.cn 之前已经写过一篇关于 MySQL 备份和恢复 的文章,讲述了几种比较常见的备份和恢复策略。本文则是以一个实际的案例来讲解全量备份和增量备份。 一、前提条件 首先,需要设定一个同步的环境出来,可以在两

作/译者:叶金荣(Email: 再谈 MySQL 备份),来源:http://imysql.cn

之前已经写过一篇关于 MySQL 备份和恢复 的文章,讲述了几种比较常见的备份和恢复策略。本文则是以一个实际的案例来讲解全量备份和增量备份。

一、前提条件

首先,需要设定一个同步的环境出来,可以在两个独立的主机或者同一个主机上实现,详细请参考MySQL做同步实例。接下来的备份工作就都是在Slave上实现了。
下面就拿一个实际的例子来讲解,MySQL Slave的版本为 5.0.27。
假定 datadir 为 /usr/local/mysql/data,备份文件存放目录为 /backup/mysql/,两种备份都由shell脚本来自动完成。

二、全量备份

全量备份的原理是停止slave之后,将数据刷新到磁盘中,然后直接拷贝数据文件。如果数据量相对较小,推荐使用mysqldump来做,较大的话,直接拷贝文件就更便捷了。

shell脚本文件名 backupmysql_fullly.sh:

#!/bin/sh<br>#<br># created by yejr,2006/11/29<br>#<br># 本脚本用于定期做全量备份,备份的对象是slave上的全部数据<br># 每次备份之前都先执行"STOP SLAVE; FLUSH TABLES;",然后将<br># 所有文件拷贝到备份目录下<br>#<br><br>#取得当前日期,作为备份目录名<br>today=`date +"%Y_%m_%d"`<br><br>#源目录<br>datadir=/usr/local/mysql/data<br><br>#目标目录<br>bkdir=/backup/mysql<br>today_bkdir=$bkdir/$today<br>today_full_bkdir=$today_bkdir/full_backup<br><br>#修改上级目录属性<br>chattr -i $bkdir<br><br>#判断目标目录是否已经存在<br>if [ ! -d $today_bkdir ] ; then<br> mkdir -p $today_bkdir<br>else<br> chattr -i $today_bkdir<br>fi<br><br>#执行 slave-stop && flush-logs,停止slave,并且刷新缓存内容到磁盘<br>mysqladmin -hlocalhost -uroot -ppasswd stop-slave<br>mysqladmin -hlocalhost -uroot -ppasswd flush-tables<br><br>cd $datadir<br>#将ibdata*以及其它需要备份的数据库目录拷贝到目标目录下<br>cp -rf ib* forum my.cnf mysql news yejr $today_full_bkdir/<br>#修改文件属主<br>chown -R nobody:nobody $bkdir<br><br>#执行 slave-start,启动slave<br>mysqladmin -hlocalhost -uroot -ppasswd start-slave<br><br>#删除过期文件<br>cd $bkdir<br><br>#找出6天前创建的目录<br>for d in `find . -type d -mtime +6 -maxdepth 1`<br>do<br> #修改当前目录及其子目录属性,然后删除<br> chattr -i $d<br> chattr -i $d/full_backup<br> rm -fr $d<br>done<br><br>#增加属性标志位<br>chattr +i $bkdir<br>

三、增量备份

增量备份的原理是利用binlog的特性,定期刷新binlog,然后将旧的binlog备份起来,再加上以前的全量备份,就能在较短时间内得到当前的运行数据。
shell脚本文件名 backupmysql_hourly.sh:

#!/bin/sh<br>#<br># created by yejr,2006/11/29<br># 本脚本用于定期做增量备份,备份的对象是binlog<br># 每次备份之前都先执行 flush-logs,然后将最近的binlog移动<br># 到备份目录下<br>#<br><br>#取得当前日期,作为备份目录名<br>today=`date +"%Y_%m_%d"`<br><br>#源目录<br>datadir=/usr/local/mysql/data<br><br>#目标目录<br>bkdir=/backup/mysql<br>today_bkdir=$bkdir/$today<br><br>#修改上级目录属性<br>chattr -i $bkdir<br><br>#判断目标目录是否已经存在<br>if [ ! -d $today_bkdir ] ; then<br> mkdir -p $today_bkdir<br>else<br> chattr -i $today_bkdir<br>fi<br><br>#先执行"flush logs",创建出新的log文件<br>mysqladmin -hlocalhost -uroot -ppasswd flush-logs<br><br>#去的binlog文件总数,去掉最后一个以及binlog.index<br>total=`ls $logdir/bin_log.*|wc -l`<br>total=`expr $total - 2`<br><br>for f in `ls $logdir/bin_log.*|head -n $total`<br>do<br> #备份日志文件<br> bf=`basename $f`<br> mv $f  $today_bkdir/$bf<br>done<br><br>#修改属主及目录属性<br>chown -R nobody:nobody $bkdir<br>chattr +i $bkdir<br>

最后,在crontab中新增如下两行记录:

#从1-23时,每小时增量备份一次<br>0 1-23/1 * * * (/bin/sh /backup/mysql/backupmysql_hourly.sh /<br>>> /backup/mysql/backup.log &)<br><br>#周一、三、六、日凌晨0点全量备份<br>0 0 * * 0,1,3,6 (/bin/sh /backup/mysql/backupmysql_fullly.sh /<br>>> /backup/mysql/backup.log &)<br>

如果觉得备份的频率太低了,可以自己适当调整crontab的频率。
以上脚本来自实际运行环境后稍作修改。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn