mysql 利用binlog增量备份,还原实例

张映 发表于 2010-09-29

分类目录: mysql

标签:binlog, mysql, mysqldump, 增量备份

一,什么是增量备份

增量备份,就是将新增加的数据进行备份。假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,很显然,我只要备份增加的数据。这样减少服务器的负担。

二,启用binlog

vi my.cnf

log-bin=/var/lib/mysql/mysql-bin.log,如果是这样的话log-bin=mysql-bin.log默认在datadir目录下面

[root@BlackGhost mysql]# ls |grep mysql-bin
mysql-bin.000001
mysql-bin.000002
mysql-bin.000003
mysql-bin.000004
mysql-bin.000005
mysql-bin.000006
mysql-bin.index

启动后会产生mysql-bin这样的文件,每启动一次,就会增加一个或者多个。

mysql-bin.000002这样文件存放的是数据库每天增加的数据,所有数据库的数据增量都在这里面。

三,查看mysql-bin.000002这样的文件里面到底是什么东西

[root@BlackGhost mysql]# mysqlbinlog   /var/lib/mysql/mysql-bin.000002 > /tmp/add.sql

  1. [root@BlackGhost mysql]# cat /tmp/add.sql   // 下面是根据mysql-bin生成的文件(部分内容)
  2. /*!40019 SET @@session.max_insert_delayed_threads=0*/;
  3. /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
  4. DELIMITER /*!*/;
  5. # at 4
  6. #100929 21:23:52 server id 1  end_log_pos 106     Start: binlog v 4, server v 5.1.50-log created 100929 21:23:52 at startup
  7. # Warning: this binlog was not closed properly. Most probably mysqld crashed writing it.
  8. ROLLBACK/*!*/;
  9. BINLOG '
  10. 6D2jTA8BAAAAZgAAAGoAAAABAAQANS4xLjUwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  11. AAAAAAAAAAAAAAAAAADoPaNMEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
  12. '/*!*/;
  13. # at 106
  14. #100929 21:29:35 server id 1  end_log_pos 134     Intvar
  15. SET INSERT_ID=16/*!*/;
  16. # at 134
  17. #100929 21:29:35 server id 1  end_log_pos 237     Query    thread_id=1    exec_time=0    error_code=0
  18. use test/*!*/;           //这里是test数据库
  19. SET TIMESTAMP=1285766975/*!*/;
  20. SET @@session.pseudo_thread_id=1/*!*/;
  21. SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1/*!*/;
  22. SET @@session.sql_mode=0/*!*/;
  23. SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
  24. /*!\C utf8 *//*!*/;
  25. SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
  26. SET @@session.lc_time_names=0/*!*/;
  27. SET @@session.collation_database=DEFAULT/*!*/;
  28. insert into aa(name)values('cccccccccc')
  29. /*!*/;
  30. # at 237
  31. #100929 21:32:21 server id 1  end_log_pos 265     Intvar
  32. SET INSERT_ID=12/*!*/;
  33. # at 265
  34. #100929 21:32:21 server id 1  end_log_pos 370     Query    thread_id=1    exec_time=0    error_code=0
  35. SET TIMESTAMP=1285767141/*!*/;
  36. insert into user(name)values('cccccccccc')
  37. /*!*/;
  38. # at 370
  39. #100929 21:35:25 server id 1  end_log_pos 440     Query    thread_id=1    exec_time=0    error_code=0
  40. SET TIMESTAMP=1285767325/*!*/;
  41. BEGIN
  42. /*!*/;
  43. # at 440
  44. #100929 21:35:25 server id 1  end_log_pos 468     Intvar
  45. SET INSERT_ID=45/*!*/;
  46. # at 468
  47. #100929 21:35:25 server id 1  end_log_pos 573     Query    thread_id=1    exec_time=0    error_code=0
  48. use blog/*!*/;             //这里是blog数据库
  49. SET TIMESTAMP=1285767325/*!*/;
  50. insert into city(CityName)values('asdf')
  51. /*!*/;
  52. # at 573
  53. #100929 21:35:25 server id 1  end_log_pos 600     Xid = 205
  54. COMMIT/*!*/;
  55. DELIMITER ;
  56. # End of log file
  57. ROLLBACK /* added by mysqlbinlog */;
  58. /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

下面还有一个重要索引文件就是mysql-bin.index

  1. [root@BlackGhost mysql]# cat mysql-bin.index
  2. ./mysql-bin.000001
  3. ./mysql-bin.000002
  4. ./mysql-bin.000003
  5. ./mysql-bin.000004
  6. ./mysql-bin.000005
  7. ./mysql-bin.000006

四,增量备份和增量还原

1,增量备份

既然我们知道了,mysql里面新增加的数据在mysql-bin这样的文件里面,我们只要把mysql-bin这样的文件进行备份就可以了。

cp /var/lib/mysql/mysql-bin* /data/mysql_newbak/

2,增量还原,讲几个常用的,比较有用的

a),根据时间来还原 --start-date,--stop-date

[root@BlackGhost
mysql]# /usr/local/mysql/bin/mysqlbinlog --start-date="2010-09-29
18:00:00" --stop-date="2010-09-29 23:00:00"
/var/lib/mysql/mysql-bin.000002 |mysql -u root -p

根据条件看一下数据

  1. [root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog  --start-date="2010-09-29 18:00:00"
  2. --stop-date="2010-09-29 23:00:00"  /var/lib/mysql/mysql-bin.000002
  3. //下面是部分内容,其实也就是一些对数据进行操作的sql语句
  4. # at 237
  5. #100929 21:32:21 server id 1  end_log_pos 265     Intvar
  6. SET INSERT_ID=12/*!*/;
  7. # at 265
  8. #100929 21:32:21 server id 1  end_log_pos 370     Query    thread_id=1    exec_time=0    error_code=0
  9. SET TIMESTAMP=1285767141/*!*/;
  10. insert into user(name)values('cccccccccc')
  11. /*!*/;
  12. # at 370
  13. #100929 21:35:25 server id 1  end_log_pos 440     Query    thread_id=1    exec_time=0    error_code=0
  14. SET TIMESTAMP=1285767325/*!*/;
  15. BEGIN
  16. /*!*/;
  17. # at 440
  18. #100929 21:35:25 server id 1  end_log_pos 468     Intvar
  19. SET INSERT_ID=45/*!*/;
  20. # at 468
  21. #100929 21:35:25 server id 1  end_log_pos 573     Query    thread_id=1    exec_time=0    error_code=0

b),根据起始位置来还原,--start-position,--stop-position

[root@BlackGhost
mysql]# /usr/local/mysql/bin/mysqlbinlog --start-position=370
--stop-position=440  /var/lib/mysql/mysql-bin.000002 |mysql -u root -p

//查看插入的内容,根a)中是一样的

[root@BlackGhost
mysql]# /usr/local/mysql/bin/mysqlbinlog --start-position=370
--stop-position=440  /var/lib/mysql/mysql-bin.000002

--start-position=370 --stop-position=440 这里面数字从哪儿来的呢?
# at 370
#100929 21:35:25 server id 1  end_log_pos 440 Query    thread_id=1    exec_time=0    error_code=0
SET TIMESTAMP=1285767325/*!*/;

上面的红色加粗的就是,一个是start-position,一个是stop-position

c),根据数据库名来进行还原 -d

在这里是小写的d,请不要把它和mysqldump中的-D搞混了。哈哈。

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog -d test  /var/lib/mysql/mysql-bin.000002

查看内容,请参考a)

d),根据数据库所在IP来分-h

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog -h 192.1681.102  /var/lib/mysql/mysql-bin.000002

查看内容,请参考a)

e),根据数据库所占用的端口来分-P

有的时候,我们的mysql用的不一定是3306端口,注意是大写的P

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog -p 13306  /var/lib/mysql/mysql-bin.000002

查看内容,请参考a)

f),根据数据库serverid来还原--server-id

在数据库的配置文件中,都有一个serverid并且同一集群中serverid是不能相同的。

[root@BlackGhost mysql]# /usr/local/mysql/bin/mysqlbinlog --server-id=1  /var/lib/mysql/mysql-bin.000002

查看内容,请参考a)

注意:上面的几个例子,我都是一个一个说的,其实可以排列组合的。例如

[root@BlackGhost
mysql]# /usr/local/mysql/bin/mysqlbinlog --start-position="2010-09-29
18:00:00" -d test -h 127.0.0.1 /var/lib/mysql/mysql-bin.000002 |mysql -u
root -p

五,后续

增量备份的时候,有一点让人不爽,就是mysql-bin这样的文件,每启动一次mysql就会增加一些,如果你不去管他的话,时间长了,他会把你的磁盘占满。

./mysqldump --flush-logs -u root  myblog > /tmp/myblog.sql

备份myblog数据库,清除增量备份里面的有关myblog的数据

./mysqldump --flush-logs -u root  --all-databases > /tmp/alldatabase.sql

备份所有数据库,清除增量备份

mysql-bin.index的起索引作用,因为增量的数据不一定在一个mysql-bin000这样的文件里面,这个时候,我们就要根据mysql-bin.index来找mysql-bin这样的增量文件了。

如果mysql里面做了这样的配置binlog-do-db=test1,增量备份里面只会有test1这个数据库的数据

http://blog.51yip.com/mysql/1042.html

mysql 利用binlog增量备份,还原实例的更多相关文章

  1. MySQL 利用binlog增量备份+还原实例

    一,什么是增量备份 增量备份,就是将新增加的数据进行备份.假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,很显然 ...

  2. 挖一挖MongoDB的备份与还原(实现指定时间点还原和增量备份还原)

    一  研究背景需求 目前作者所在公司的MongoDB数据库是每天凌晨做一次全库完整备份,但数据库出现故障时,只能保证恢复到全备时间点,比如,00:30 做的完整备份,而出现故障是下午18:00,那么现 ...

  3. mysql数据库的增量备份和全备

    还有一种简单的方法 参考 https://blog.csdn.net/u010098331/article/details/50932064 (注意:5.6版本以上新加了gtid 功能,gtid开启之 ...

  4. mysql利用binlog进行数据恢复

    目录 mysql利用binlog进行数据恢复 binlog基本配置和格式 binlog基本配置 查看binlog状态 binlog的三种格式 转换成sql mysql自带的mysqlbinlog 利用 ...

  5. xtra+binlog增量备份脚本

    目录 一.备份原理 innobackupex原理 binlog原理 特点 备份策略 二.环境准备 开启binlog 创建授权用户 安装innobackupex 三.添加脚本 全量备份 增量备份 bin ...

  6. MYSQL的日志与备份还原

    一.错误日志 当数据库出现任何故障导致无法使用时,第一时间先去查看该日志 1.服务器启动关闭过程中的信息 2.服务器运行过程中的错误信息 日志存放路径,可以通过命令查看: 日志文件命名格式:host_ ...

  7. 转载:MySQL:亲测备份策略实例(线上真实备份案例)

    是否为线上库的备份而烦恼过,这里提供一个完整的备份从属数据库的备份方案,亲测可用 说明: 备份从库,按周计,每周进行一次全备 每周一的早上六点进行全备,其他时间备份中继日志 在从库上启用rsync服务 ...

  8. mysql全备和增量备份以及恢复过程(percona工具)

    实验环境 系统环境,内核版本和xtrabackup工具版本 [root@linux-node1 mysql]# cat /etc/redhat-release CentOS Linux release ...

  9. MySQL之mysqldump数据备份还原

    一 mysqldump指令实现数据备份.mysql指令实现数据还原 经常有朋友问我,DBA到底是做什么的,百科上说:数据库管理员(Database Administrator,简称DBA),是从事管理 ...

随机推荐

  1. Windows下mysql忘记密码的解决方法

    Windows下mysql忘记密码的解决方法 mysql5.0 http://www.jb51.net/article/21984.htm方法一: 1.在DOS窗口下输入 net stop mysql ...

  2. js 如何清除setinterval

    var id=window.setInterval(function(){ },1000);window.clearInterval(id);

  3. Ninject简单的Demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. SQL将一张表中的数据插入到另一张表

    将表T_wz_wz中的部分数据插入到表t_wz_kc: ,,'Y' from t_wz_wz where yxbz='Y' --去重复 -- and wzid not in (select wzid ...

  5. Perl Print Win32 Console Windows 控制台 print Unicode 问题

    参考资料: https://stackoverflow.com/questions/15224400/perl-on-windows-problems-with-encoding https://te ...

  6. Using Amazon API Gateway with microservices deployed on Amazon ECS

    One convenient way to run microservices is to deploy them as Docker containers. Docker containers ar ...

  7. Can't add self as subview的困惑

    2016-05-27 09:40:43.4043 UMLOG: event: session_id=B63F36D84AD478B9F95C7D0F05DD819B, event=user_choos ...

  8. [转] 被遗忘的Logrotate

    FROM : http://huoding.com/2013/04/21/246 我发现很多人的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相 ...

  9. weka数据预处理

    Weka数据预处理(一) 对于数据挖掘而言,我们往往仅关注实质性的挖掘算法,如分类.聚类.关联规则等,而忽视待挖掘数据的质量,但是高质量的数据才能产生高质量的挖掘结果,否则只有"Garbag ...

  10. 《30天自制操作系统》08_day_学习笔记

    harib05a: 鼠标解读(01)P145 前一天已经让鼠标成功接收数据了,这些数据是什么意思? 笔者在这一部分来解读数据:让鼠标动起来啊,停在那不动有什么意思啊! 前面已经知道,鼠标每一次动作都是 ...