`
xinklabi
  • 浏览: 1591693 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

mysql 利用binlog增量备份,还原实例(日志备份数据库)

 
阅读更多

一,什么是增量备份

增量备份,就是将新增加的数据进行备份。假如你一个数据库,有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热备份的最好方法,我一直都认为是Replication,xtrabackup等各种热备脚本,都没有Replication安全方便。

  面对一个大规模集群的备份,由于实例太对,没办法创建这么多实例去Replication。之前我的想法一直是通过修改MySQL的源码,扩展MySQL Replication可以创建多个M-S复制,这对MySQL本身有入侵,没办法保证我的代码能有非常高的可靠性,更严重的是要改变MySQL的语法,来支持多Master的Change语句,对.yy文件的修改风险就更大了。

  在这条路不断的碰壁之时,突然想到,mysqlbinlog不是一个很好的工具吗,为什么还要靠修改源码,一个利用mysqlbinlog进行大规模备份的想法就诞生了,但是是否可靠还要去验证下。

  怎么做呢,首先了解下MySQL Replication怎么做的,首先一个Slave IO线程从Master读取binlog,然后解析到Relay-log,另一个Slave SQL线程异步的从Relay-log中读取SQL应用到本地。

  mysqlbinlog有一个参数read-from-remote-server,可以从远程读取binlog,只要创建一个有Replication Client权限的用户即可,这就模拟了Slave IO线程的作用。

  mysqlbinglog –read-from-remote-server -u repl -p -h target_node –start-datetime=’2010-09-01 00:00:00′ –stop-datetime=’2010-09-01 23:59:59′

  通过这条命令就可以获取到2010-09-01这一天的全部SQL,这些SQL可以直接导入到数据库,也可以写到Relaylog,让SLave SQL线程去执行。

  假设我们原来是每5分钟备份一次新产生的binlog,每天一次全备,所有备份都在一个备份机上,利用上述方法,就可以如下操作:

  1. 在备份机启动一个实例,指向任意一个没有操作的Master,使Relay-log文件生成。

  2. 每个要备份的实例从备份机每5分钟发起一次mysqlbinlog请求,获取上5分钟的binlog,写入到一个临时文件,然后等临时文件写完了,去touch一个锁,写Relaylog。

  3. 每天Slave Start一次,Slave Start之前touch一个锁,让Relay-log的写阻塞,等待Slave start执行完毕,删除Relay-log的写锁。

  4. 删除前一天产生的临时文件。

  这样操作就可以保证,每五分钟产生的SQL都被分开记录,方便查找,每天的Slave start则消化掉这些SQL。

  如果想方便一点,不写Relay-log也是可以的,直接每天把SQL丢给MySQL执行一次就好,效果也一样。

原文出处:http://www.penglixun.com/tech/database/backup_mysql_use_mysqlbinlog.h

 

-------------------------------------------------------------------------------------

mysql备份与恢复(binlog)

 (2011-08-06 13:52:05)
标签: 

杂谈

 

 

它是逻辑备份,优点可以备份各种存储引擎
 
1.备份所有的数据库
#mysqldump -uroot -p --all-database >all.sql
 
2.备份指定的数据库
#mysqldump -uroot -p test > test.sql
 
3.备份指定数据库中的表
#mysqldump -uroot -p test s > test_s.sql
 
备份完全恢复实例
(1)上午9点备份数据库
#mysqldump -uroot -p -l -F student > student.dmp
-l 给所有表加读锁
-F 生成一个新的日志文件
此时s表数据如下:
mysql> select * from s;
+------+-------+------+-----------+
| sno  | sname | sex  | address   |
+------+-------+------+-----------+
| 0901 | Jim   | 1    | shanghai  |
| 0902 | helun | 2    | beijing   |
| 0903 | sam   | 1    | sichuan   |
| 0904 | keke  | 1    | xizang    |
| 0905 | gugu  | 1    | suzhou    |
| 0906 | tang  | 2    | guangdong |
+------+-------+------+-----------+
6 rows in set (0.00 sec)
 
备份完毕等到了student.dmp文件,还有mysql-bin.000012
 
(2)9点半备份完毕,然后插入新的数据
mysql> insert into s values('0907','liu','1','jiangxi');
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into s values('0908','wang','2','wuxi');
Query OK, 1 row affected (0.00 sec)
 
(3)10点,数据库突然故障,数据无法访问.需要恢复备份:
#mysql -uroot -p student < student.dmp
恢复后的数据:
mysql> select * from s;
+------+-------+------+-----------+
| sno  | sname | sex  | address   |
+------+-------+------+-----------+
| 0901 | Jim   | 1    | shanghai  |
| 0902 | helun | 2    | beijing   |
| 0903 | sam   | 1    | sichuan   |
| 0904 | keke  | 1    | xizang    |
| 0905 | gugu  | 1    | suzhou    |
| 0906 | tang  | 2    | guangdong |
+------+-------+------+-----------+
6 rows in set (0.00 sec)
 
(4)使用mysqlbinlog 恢复mysqldump 备份以来的BINLOG
#mysqlbinlog mysql-bin.000012 |mysql -uroot -p student
查询完全恢复后的数据:
mysql> select * from s;
+------+-------+------+-----------+
| sno  | sname | sex  | address   |
+------+-------+------+-----------+
| 0901 | Jim   | 1    | shanghai  |
| 0902 | helun | 2    | beijing   |
| 0903 | sam   | 1    | sichuan   |
| 0904 | keke  | 1    | xizang    |
| 0905 | gugu  | 1    | suzhou    |
| 0906 | tang  | 2    | guangdong |
| 0907 | liu   | 1    | jiangxi   |
| 0908 | wang  | 2    | wuxi      |
+------+-------+------+-----------+
8 rows in set (0.00 sec)
恢复完成!
 
基于时间点的恢复(不完全恢复)
由于误操作,比如删除了一张表,使用完全恢复是没有用的,我们需要的是恢复到误操作之前的状态,然后跳过误操作语句,再恢复后面执行的语句,完成恢复;
例:
(1)上午10点发生误操作,可以用如下语句备份和BINLOG将数据恢复到故障前
#mysqlbinlog --stop-date="2010-10-31 9:59:59" /usr/local/mysql/var/mysql-bin.000013 |mysql -uroot -p
 
 
(2)跳过故障时间点,继续执行后面的BINLOG,完成恢复
#mysqlbinlog --start-date="2010-10-31 10:01:00" /usr/local/mysql/var/mysql-bin.000013 |mysql -uroot -p
 
基于位置恢复(不完全恢复)
和基于时间点恢复类是,但是更加精确.因为同一时间点可能有多条SQL语句执行;
例:
#mysqlbinlog --start-date="2010-10-31 9:55:00"  --stop-date="2010-10-31 10:05:00" /usr/local/mysql/var/mysql-bin.000013 > /tmp/mysql_restore.sql
 
该命令将在/tmp/目录下创建小的文件,编辑它找到错误语句前后的位置号,例如前后位置号分别是368312 和 368315
(2)恢复了以前的备份文件后,输入
#mysqlbinlog --stop-position="368312" /usr/local/mysql/var/mysql-bin.000013 |mysql -uroot -p
 
#mysqlbinlog --start-position="368315" /usr/local/mysql/var/mysql-bin.000013 |mysql -uroot -p

 

 

分享到:
评论

相关推荐

    xtrabackup全量+binlog增量实践

    binlog增量备份可以记录自上一次备份以来所有的变化,从而可以快速恢复数据库。使用binlog增量备份可以减少备份和恢复的时间,并且可以提高数据库的可用性。 本文介绍了使用xtrabackup进行全量备份和binlog增量备份...

    基于 mysql-binlog-connector-java 实现增量数据的收集.zip

    `mysql-binlog-connector-java` 是一个用于读取 MySQL 二进制日志(binlog)的Java库,它可以帮助开发者实现实时的数据复制、数据同步以及增量数据收集。在本项目中,我们将深入探讨如何利用这个库来实现这一功能。 ...

    MySQL数据库基础与实例教程所有资源

    MySQL提供了mysqldump工具进行全量备份,以及binlog文件进行增量备份。在发生数据丢失或系统故障时,能够快速恢复数据。 本教程的PPT版和PDF版提供了详细的讲解,配合源代码实例,将帮助你深入理解MySQL数据库的...

    springboot-binlog:基于 mysql-binlog-connector-java 实现增量数据的收集

    `springboot-binlog`项目就是针对这一需求的一个解决方案,它利用`mysql-binlog-connector-java`库来实现MySQL数据库的增量数据捕获。以下是对该项目及相关技术的详细解释。 ### SpringBoot与MySQL Binlog **...

    mysql-binlog-in-realtime 源代码包

    MySQL的binlog是一种记录数据库所有更改的增量日志,包括插入、更新和删除操作。它采用事件的形式存储,每个事件都包含了执行该操作的所有必要信息。binlog有两种格式:Statement和Row,Statement记录的是SQL语句,...

    mysql自动增量备份的实例方法(本地备份与远程备份)

    总的来说,MySQL的自动增量备份是通过编写脚本结合定时任务来实现的,利用`mysqldump`工具进行数据导出,并确保在备份过程中尽可能减少对数据库的影响。定期备份和合理的备份策略对于任何使用MySQL的企业或个人来说...

    MySQL备份策略(全量与增量备份方案详解)

    本文详细介绍了一套基于MySQL的全量与增量备份方案,具体涉及全量备份工具mysqldump以及增量备份使用的mysqlpump、mydumper、xtrabackup等工具的特点比较,并深入探讨了不同备份方法的工作原理,提供了详尽的实例...

    mysql备份恢复代码实例.zip

    总之,这个压缩包提供的代码实例旨在教你如何有效地管理MySQL的备份和恢复,包括全量备份、增量备份的创建以及在不同情况下的恢复策略。通过学习和实践这些例子,你可以更好地理解MySQL的备份恢复机制,并能够为自己...

    MySQL数据库实时增量同步工具源代码.zip

    MySQL数据库实时增量同步工具是一种高效的数据管理解决方案,它允许用户在多个数据库实例之间实时地、持续地传输和更新数据。这种工具通常用于分布式系统、数据备份、数据仓库以及需要跨服务器复制数据的场景。源...

    MySQL binlog闪回工具

    1. **二进制日志(binlog)**:MySQL的binlog是一种记录所有改变数据库状态的非归档日志,包括插入、更新和删除操作。它分为STATEMENT、ROW和MIXED三种模式,其中ROW模式最适合用于闪回操作,因为它记录了每一行数据...

    canal数据binlog同步demo

    "canal数据binlog同步demo" 是一个关于使用Canal工具实现MySQL数据库binlog(二进制日志)同步的实例展示。Canal是阿里巴巴开源的一个数据库实时增量数据订阅与推送组件,它能监听MySQL的binlog事件,并将其转化为...

    一个基于CanalSharp封装的ASP.NET Core组件,可以实时收集MySql数据更改记录并写入修改日志数据表中.zip

    Canal是专门用来捕获和处理MySQL数据库的 binlog(二进制日志)的工具,它能够实时跟踪数据库的增删改操作,非常适合于构建数据同步、数据备份、实时分析等系统。 2. **ASP.NET Core组件的封装** 这个组件将...

    详解监听MySQL的binlog日志工具分析:Canal

    Canal是阿里巴巴开源的一款用于MySQL数据库增量数据订阅与消费的工具,主要基于MySQL的binlog日志解析。MySQL的binlog日志记录了所有对数据库的更改操作,这对于数据同步和备份至关重要。Canal通过模拟MySQL slave的...

    MySQL 数据库误删除后的数据恢复操作说明(详细)

    2. **必备条件**:MySQL必须开启binlog日志功能,并且具备完全备份和所有增量数据。 3. **操作建议**:在数据恢复过程中,应暂停对外提供服务,以避免新的数据更改影响恢复过程。 4. **恢复流程**:先恢复全量数据,...

    基于binlog的异步增量实现MySQL分库分表(kafka做数据源)-luna-mysql.zip

    在这个场景中,我们关注的是如何通过MySQL的binlog(二进制日志)实现异步增量复制,以达到分库分表的目的,并利用Kafka作为中间数据传输层。这个项目"luna-mysql"提供了一个具体的解决方案。下面将详细阐述涉及的...

    基于 java 实现增量数据的收集.zip

    总结来说,基于Java实现增量数据的收集,主要是通过Spring Boot框架配合数据库的变更日志系统,如MySQL的Binlog,实现对数据实时变动的跟踪和处理。这在大数据分析、实时报表更新、数据同步等多个场景中都有广泛应用...

    canal + mysql + rabbitmq步骤(CanalListener)

    Canal是一款由阿里巴巴开源的、基于MySQL binlog的增量日志订阅与消费组件,它能够监听MySQL数据库的增删改查操作,并将这些变更事件转发到各种目标系统,如RabbitMQ消息队列。本教程将详细介绍如何配置Canal监听...

    canal同步mysql

    【标题】:“Canal同步MySQL”是一个用于数据库实时同步的工具,主要利用MySQL的binlog日志来实现数据的高效迁移和复制。在本项目中,它被集成到了SpringBoot 2.0.6框架中,并使用Undertow作为Web服务器。 【描述】...

    mysql备份与恢复原理,操作流程

    4. 备份工具:逻辑备份工具有`mysqldump`和`binlog`,物理备份工具有`Percona Xtrabackup`,MySQL 8.0引入的Clone Plugin提供了一种云原生的物理克隆实例功能。 5. DBA的备份恢复职责包括设计备份策略(如备份周期...

Global site tag (gtag.js) - Google Analytics