如果你有空闲的机器,不妨采用这种方式来备份。由于作为 slave 的机器性能要求相对不是那么高,因此成本低,用低成本就能实现增量备份而且还能分担一部分数据查询压力,何乐而不为呢?
具体方案:
一、主从同步
可以参考http://kerry.blog.51cto.com/172631/110206
二、增量备份:
每天中午12点和晚上12点做一次全备,每隔一小时备份binlog,也就是增量备份,具体操作如下:
Linux下开启binlog
/etc/my.cnf中的mysqld部分加入:
[mysqld]
log-bin=../logs/mysql-bin
max-binlog-size=50M
windows下开启binlog
%mysql%/my.ini中的mysqld部分加入:
[mysqld]
log-bin =../logs/mysql-bin
max-binlog-size=50M
完整备份脚本 (仅提供部分作参考)
如果数据库数据量比较大,可以一天全备一次, 再每隔一小时增量备份一次;
#!/bin/sh
# mysql data backup script #
# use mysqldump --help,get more detail.
BakDir=/backup/mysql
LogFile=/backup/mysql/mysqlbak.log
DATE=`date +%Y%m%d`
echo " " >> $LogFile
echo " " >> $LogFile
echo "-------------------------------------------" >> $LogFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
echo "--------------------------" >> $LogFile
cd $BakDir
DumpFile=$DATE.sql
GZDumpFile=$DATE.sql.tgz
mysqldump --quick --all-databases --flush-logs
--delete-master-logs --lock-all-tables
> $DumpFile
echo "Dump Done" >> $LogFile
tar czvf $GZDumpFile $DumpFile >> $LogFile 2>&1
echo "[$GZDumpFile]Backup Success!" >> $LogFile
rm -f $DumpFile
#delete previous daily backup files:采用增量备份的文件,如果完整备份后,则删除增量备份的文件.
cd $BakDir/daily
rm -f *
cd $BakDir
echo "Backup Done!"
echo "please Check $BakDir Directory!"
echo "copy it to your local disk or ftp to somewhere !!!"
ls -al $BakDir
上面的脚本把mysql备份到本地的/backup/mysql目录,增量备份的文件放在/backup/mysql/daily目录下.
增量备份
增量备份的数据量比较小,但是要在完整备份的基础上操作
增量备份使用bin log,脚本如下:
#!/bin/sh
# mysql binlog backup script
/usr/bin/mysqladmin flush-logs
DATADIR=/var/lib/mysql
BAKDIR=/backup/mysql/daily
###如果你做了特殊设置,请修改此处或者修改应用此变量的行:缺省取机器名,mysql缺省也是取机器名
HOSTNAME=`uname -n`
cd $DATADIR
FILELIST=`cat $HOSTNAME-bin.index`
##计算行数,也就是文件数
COUNTER=0
for file in $FILELIST
do
COUNTER=`expr $COUNTER + 1 `
done
NextNum=0
for file in $FILELIST
do
base=`basename $file`
NextNum=`expr $NextNum + 1`
if [ $NextNum -eq $COUNTER ]
then
echo "skip lastest"
else
dest=$BAKDIR/$base
if(test -e $dest)
then
echo "skip exist $base"
else
echo "copying $base"
cp $base $BAKDIR
fi
fi
done
echo "backup mysql binlog ok"
增量备份脚本是备份前flush-logs,mysql会自动把内存中的日志放到文件里,然后生成一个新的日志文件,所以我们只需要备份前面的几个即可,也就是不备份最后一个.
因为从上次备份到本次备份也可能会有多个日志文件生成,所以要检测文件,如果已经备份过,就不用备份了.
数据还原:
先还原最近的完全备份数据:
mysql -hhostname -uusername -ppassword databasename < backupfile.sql
再还原binlog :
./mysqlbinlog --start-date="2016-04-10 17:30:05" --stop-date="2016-04-10 17:41:28" /usr/local/mysql/data/mysql-bin.000002 |mysql -u root -p123456
缺点是rsync是根据文件修改时间做的增量备份,所以备份数据库都是全备,并且配置比较麻烦.
7.利用BigDump工具导入超大MySQL数据库备份文件
常用的 MySQL 数据库恢复工具(也能进行备份操作)是 phpMyAdmin,这是一个开源、免费的工具,大多数主机商(例如 Hawkhost)都会免费提供 。相信很多站长也用过 phpMyAdmin 来进行网站数据库的备份和恢复,确实很方便,并且有多国语言界面。不过,有一种情况可能你还没碰到,就是当你的数据库体积比较大时,例如 SQL 备份文件大于 2MB,甚至大于 10MB,这个时候如果你通过 phpMyAdmin 来进行数据库的恢复,就会出错,显示如下的提示:
这是因为你的 SQL 文件体积太大,超过了 phpMyAdmin 的处理能力,这种情况在网络速度比较慢的情况下尤为突出,例如站长在周末晚上8点这个网络拥挤的时段尝试使用 phpMyAdmin 来恢复大型 MySQL 数据库备份,就容易遇到这种问题。
很显然 phpMyAdmin 只适用于恢复比较小的 SQL 文件备份。对于超大 MySQL 数据库备份的恢复,你必须换一个专用的恢复工具,那就是:BigDump! 工具下载地址 http://www.jb51.net/codes/37147.html
8.使用bacula(www.bacula.org)进行备份 zZ
bacula采用模块化设计,采用c/s构架,理论上可以把任意n台主机的资料备份到任意n台
中,而你不需要在每台机器上都写一个配置文件控制他们运作,所有主要的工作都在一
台director上控制。登陆上director你就可以知道什么备份正在运行,什么备份成功了
,什么备份失败了,所有的log也会集中到你指定的地方,让管理工作更简单一点。恢复
的时候也很简单,简单运行几个命令你就可以把指定的备份恢复。支持完全备份,差异
备份,增量备份;支持把备份写到硬盘文件中,也支持写到磁带中。支持平台相当多,
设置包括win平台(备份win,还不支持备份到win)。当然也有一些缺点,比如对并发备
份支持未经彻底测试,作者宣称最好不要尝试,除非你自己经过测试。还有一点就是文
档中没有一个quick start。。。。文档太详细了点,没有点耐心读不完。。。。
1,前期准备
bacula有三个模块组成。一个是Director,用于指挥整个系统运行,job schedule,通知
另外两个模块工作。一个是Storage Daemon,它是存储端,负责把网络中传来的数据备
份到本机,恢复的时候负责把数据传出去。最后一个是File Daemon,备份时把文件传出
,恢复时接受数据并恢复。其实上面的三个模块并不能让bacula运行,另外一个模块是
数据库模块。这个模块可以通过SQLite(编译进bacula),也可以使用MySql和PostgreS
ql,作者推荐的是mysql。还需要一些第三方库才能编译:GZIP和Readline。文档中没有
说明,但其实还需要另外一个软件才能保证正常运行:ntp。因为差异备份和增量备份都
依赖于文件修改时间来决定是否备份。单机备份问题不大,网络备份就需要考虑各个主
机的时间差异了。所以我推荐所有主机每天运行两次ntpdate来调准时间。如果你在sjtu
网络里面,可以使用dns.sjtu.edu.cn来调校时间。
如果你使用的是磁带机备份,还需要检查一下你的磁带机是否被支持。而且最好去阅读
文档中的Understanding Pools, Volumes and Labels一节。否则配置的时候你会搞得晕
乎乎的。
2,编译
编译过程很简单,文档也很详细,就不具体介绍了。注意一点是被备份机器上可以使用-
-enable-client-only编译。
3,数据库建立
下面说说mysql的建立过程。首先在代码根目录中
cd src/cats/
./grant_mysql_privileges
./create_mysql_database
./make_mysql_tables
如果mysql不是在本机上,可以增加-h参数指定。默认采用空密码的root用户,可以用-p
参数使其采用密码验证。如果要采用其它用户就只能修改脚本了,很简单的。
默认建立的bacula用户,而且是空密码。推荐还是修改密码。
bacula可以使用任意多的数据库,也就是说你可以使用两个数据库,然后再让这两个数
据库互相备份。
4,运行File Daemon(fd)
配置前先说明一点需要注意的,配置中指定主机地址时,最好使用ip,我配置时使用主机
名貌似不可以。。。而且要是对外的ip,用127.0.0.1不行
fd运行在被备份主机上。配置相当简单,指定哪个Director可以运行调度它,密码是什
么,fd的名字,工作目录,log往哪里发就可以了。修改修改标配就可以了。
5,运行Storage Daemon(sd)
sd运行在接受备份的机器上。配置也相当简单,只是比fd多出了一个device用于指定使
用什么硬件备份数据。可以把多个数据备份到一个device,如果是磁带机备份bacula在
恢复的时候会告诉你要使用哪个磁带。因为我使用的是文件备份的模式,所以就给每个
备份配置一个device,把不同的备份放到不同目录去,下面是一个简单文件备份device
配置
Device {
Name = dbdev
Media Type = File #这个随便写,但是在配置Director中的Storage时,必须写一
样的
Archive Device = /var/bak/db #备份到哪个目录,必须存在
LabelMedia = yes; # 自动label
Random Access = Yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
}
6,运行Director(dir)
这个配置最麻烦,因为所有配置都集中到这里,包括备份工作调度,数据库配置,fd和s
d协作配置都在这里。
Director项目的配置不说了,很简单
Client项目告诉dir去哪里找被备份机器
Client {
Name = dbfd #必须跟fd配置的名字相同
Address = 202.120.x.x
FDPort = 9102
Catalog = 225catalog #使用哪个数据库存储信息
Password = "6662f353d83dc85013690aefc00f" # 与fd配置相同即可
AutoPrune = yes # 自动清除过期的Jobs/Files
}
Storage项目告诉dir去哪里找接受备份的机器
Storage {
Name = dbsd #与sd配置相同
Address = 202.120.x.x
SDPort = 9103
Password = "6662f353d83dc85013690aefc00f"
Device = dbdev #必须在sd中存在
Media Type = File #必须与sd中相应device相同
}
Schedule项目告诉dir何时调度备份,比较独立,可以在不同的job中重用
Schedule {
Name = dbscd
Run = Level=Full mon at 7:00 #在周一7点作一次全备份
Run = Level=Full fri at 7:00 #在周五7点作一次全备份
Run = Level=Differential sat at 7:00 #在周六7点作一次差异备份
Run = Level=Differential sun at 7:00 #在周日7点作一次差异备份
Run = Level=Differential tue-thu at 7:00 #在周二到周四7点作差异备份
}
当然可以schedule还可以配置很多东西,比如增量备份以及更灵活的时间调度。可以参
考文档。
FileSet项目告诉dir应该备份什么文件,不应该备份什么文件
FileSet {
Name = dbfs
Include = compression=GZIP { #备份运行fd机器上的/var/db目录,用gzip
压缩,
/var/db/
}
Exclude = { #不包括所有的.log文件
*.log
}
}
FileSet也可以灵活配置,甚至可以在job运行时才指定备份文件
Catalog告诉dir去哪里找数据库
Catalog {
Name = dbcatalog
dbname = bacula
user = bacula
password = xxxxxxxxx
DB Address = 202.120.x.x #不要用localhost
DB Port = 3306
}
Pool告诉dir使用哪个Pool备份数据,这个概念比较搞,到配置job的时候会清晰一点。
Pool{
Name = dbpool
Pool Type = Backup
Maximum Volume Jobs = 1 #每次备份使用一个文件
Recycle = yes #重复使用
AutoPrune = yes #自动清除
Volume Retention = 15 days #备份保留时间
Maximum Volumes = 30 #最多保存多少个文件
Recycle Current Volume = yes #使用最近过期的文件存储新备份
#文件如何命名,下面的格式会产生如下的命名形式db-2004-03-19-id20
Label Format =
"db-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}-id${JobId}"
}
Message项目告诉dir如何保存log,以及保存格式
Messages {
Name = Standard
# mailcommand = "/usr/local/bacula/bin/smtp -h 202.120.x.x -f /"/(Bacula/)
%r/
" -s /"Bacula: %t %e of %c %l/" %r"
# operatorcommand = "/usr/local/bacula/bin/smtp -h 202.120.x.x -f
/"/(Bacula/)
%r/" -s /"Bacula: Intervention needed for %j/" %r"
# mail = [email protected] = all, !skipped
# operator = [email protected] = mount
# console = all, !skipped, !saved
#
# WARNING! the following will create a file that you must cycle from
# time to time as it will grow indefinitely. However, it will
# also keep all your messages if they scroll off the console.
#
append = "/var/log/bacula.log" = all, !skipped
append ="/var/log/bacula.err.log" = error, warning, fatal
}
我保留了两份log,一份包括所有信息,一份只包括错误信息
可以看到,bacula支持把log发到邮箱中~~被我注释掉了。
Job是上面所有配置的一个组合,给用户最大的灵活性配置
Job {
Name = dbjob
Type = Backup #还有restore之类的类型,也有一些其它选项,可以实现一
些很有意思的功能
Level = Full #默认备份程度,schedule中的配置会覆盖这里的选择
Client = dbfd
FileSet = dbfs
Messages = Standard
Pool = dbpool
Storage = dbsd
Schedule = dbscd #如果没有指定schedule,默认不运行,可以通过console
调度
}
还有一个counter的配置。。不配置他也能运行,不说了
7,console运行
console是你动态管理bacula的窗口,配置很简单。运行console可以实现很多很有价值
的管理活动。具体可以参考文档说明。
8,让整个系统运行。
没什么好说的,只要配置正确,就没有什么挫折。不能正常运行就去看看log,bacula的
log非常详细。
9,性能和稳定性。
性能不错,瓶颈明显在带宽,cpu占用不高(不使用gizp)。稳定性尚不清楚,据作者说
非常好。稳定运行一年半载不成问题。
10,有趣的工作。
用bacula你可以实现一个额外的功能,类似tripwire文件系统检查机制。具体看文档。
我说了很多具体看文档~~~~bacula的文档确实很不错,很翔实,如果你需要借重他来备
份,多看看不会错。
11,the end
= = =
source : http://linux.chinaunix.net/docs/2006-08-03/2382.shtml
Xtrabackup是由 Percona 开发的一个开源软件,可实现对 InnoDB 的数据备份,支持在线热备份(备份时不影响数据读写)。备份时,Xtrabackup 会将 Master 的 binlog 信息记录在 xtrabackup_slave_info 文件中,通过此信息可以方便的搭建主从复制。
XtraBackup 有两个工具:xtrabackup 和 innobackupex:
官网:http://www.percona.com/software/percona-xtrabackup
文档:http://www.percona.com/doc/percona-xtrabackup/2.2/index.html
注:本文服务器环境为 CentOS,其他环境请自行修改实现。
例如执行增量备份的命令是:
# ./xtrabackup --backup --target-dir=/backup/delta --incremental-basedir=/backup/base
通过 XtraBackup 实现不停机不锁表搭建主从同步 https://segmentfault.com/a/1190000002575399(MySQL-Front2,SQLyogEnt3,CSE 、Mysql Administrator都是客户端工具)
【附录和参考资料】
1、开源数据备份软件库: http://www.oschina.net/project/tag/198/backup
2、Mysql备份工具xtraback全量和增量测试-鸟哥のlinux:http://blog.chinaunix.net/uid-25266990-id-3314699.html
3、数据库管理工具 : http://www.oschina.net/project/tag/80/db-mgr-tools
企业级分布式NoSQL数据库 SequoiaDB:http://www.oschina.net/p/sequoiadb