逻辑备份:mysqldump
全量备份
所谓逻辑备份就是把数据库表结构+数据以sql的形式导出。
以下是备份命令。
mysqldump -uroot -ppwd --databases databasename --tables tablename --single-transaction --flush-logs --master-data=2 >/home/work/download/backup/test2.sql
-uroot -ppwd:这两个是数据库的用户名和密码。
--databases databasename :这个表示数据库名。
--tables tablename :这个表示要备份的表,如果不加这个就表示备份数据库的所有表
--single-transaction :使用参数 --single-transaction,适用于InnoDB表,与--lock-tables参数互斥,备份期间不锁表。为确保得到有效的备份文件,使用该参数备份期间应避免使用DDL(ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE.)语句,因为连续性的读并没有对这些语句进行隔离,备份期间使用这些DDL语句会导致潜在的select获取到的返回的数据不一致或错误,比如数据读出一半表被删了。
--flush-logs :全量前刷新所有日志到binlog文件,并创建一个新的binlog文件,用于增备。
--master-data=2 :该参数有两个值1和2,默认为1,mysqldump导出数据时,当这个参数的值为1的时候,mysqldump出来的文件就会包括CHANGE MASTER TO这个语句,CHANGE MASTER TO后面紧接着就是file和position的记录,在slave上导入数据时就会执行这个语句,salve就会根据指定这个文件位置从master端复制binlog。当这个值是2的时候,chang master to也是会写到dump文件里面去的,但是这个语句是被注释的状态。
备份参数讲解:http://www.cnblogs.com/qq78292959/p/3637135.html
相关博客:http://www.cnblogs.com/chenmh/p/5300370.html
Linux下添加定时任务定时备份
首先需要写个脚本来备份,脚本文件名保存为mysqldumpcron.sh。
语言用shell
#!bin/bash
cd /home/work/download/backup
echo "start backup!"
echo "rm old dbs backup file!" #删除七天前的文件
lastday=`date -d '-7 days' +%Y%m%d` #指定七天前的文件名
lastfilename="/home/work/download/backup/backup-${lastday}.sql" #组装文件名
if [ -e "$lastfilename" ];then #如果存在就删除文件
rm -rf "$lastfilename"
fi
datename=`date +%Y%m%d` #当前日期格式
filename="backup-${datename}.sql" #当前备份文件名
mysqldump -uroot -pleyanmysql886 --databases business --single-transaction --flush-logs --master-data=2 >/home/work/download/backup/$filename #开始备份
echo "Your database backup successfully completed!" #备份完成
然后编写定时器
执行命令crontab -e
0 1 * * * sh /home/work/cron/mysqldumpcron.sh 这个是每天一点执行shell脚本。
crontab -l可以查看定时器
定时器相关介绍查看:http://note.youdao.com/noteshare?id=a2d94042a23c507893aff0e148d81c65
恢复
通过mysql命令,直接把逻辑备份文件恢复到数据库business中。
备份文件是某个时间点生成的,在这个时间点文件就是全量。
而在这个时间点到下次备份文件生成的时候,对数据库的操作都是增量。
所以在执行恢复之前需要看下备份文件中记录备份操作后增量操作对应的二进制文件就是我们需要的增量部分。
备份文件搜索下面内容
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=106;
没错就是这个文件。在增量恢复的时候就需要执行他mysql-bin.000003。执行起始位置是106。
然后在去这个文件所在目录执行ll命令,查看当前大小。这个大小是用来增量恢复的时候的结束位置。
如果在查看这个二进制文件大小之前就执行全量备份恢复的操作会导致mysql-bin.000003这个二进制文件大小改变(因为增加了全量恢复的操作日志,所以文件变大),不能用这个12054这个位置,否则会导致重复执行全量备份,可能会出问题(比如没有主键的表就会数据重复)。
这个时候可以进入mysql客户端中执行show binlog events in 'mysql-bin.000003'; 的命令来看这个文件的变化。
如下
这里面记录了867位置提交了之前的修改,867-969是删除表,969之后就是全量恢复的操作。所以增量恢复的位置应该是到867为止。
下面是全量恢复的操作。
mysql -uroot -ppwd databasename </home/work/download/backup/test2.sql
恢复增量数据
注意:此时需要切换到root用户,因为对于当前用户如果没有/var/lib/mysql下的读写权限的话,会出错:mysqlbinlog: File 'mysql-bin.000003' not found (Errcode: 13)
全量恢复后执行下面的增量恢复命令
mysqlbinlog --stop-position="587" mysql-bin.000003 | mysql -uroot -ppwd
--stop-position这个是指定结束为止,还可以设置起始位置 --start-position
还可以指定日期:--start-date="2017-08-16 18:00:00" --stop-date="2017-08-16 18:00:00"。
到此为止全部恢复完成。