小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,就不太可能每天进行一次完整备份了,这时候就可以使用增量备份。增量备份的原理就是使用了mysql的binlog日志。

本次操作的MySQL版本为5.5.40 for Linux (x86_64)

增量备份要确保打开了二进制日志,参考mysql的日志系统

1
mysql> show variables like '%log_bin%';

首先对pak数据库做一个完整备份:

1
$ mysqldump -h localhost -upak -ppwd -P3306 --master-data=2 --single-transaction --opt pak > pak_bak_full.sql

这时候就会得到一个全备文件pak_bak_full.sql。mysqldump操作会导致滚动一次log,假设新的binlog文件是mysql-bin.000002。

1. 模拟插入数据和误操作

a. 在pak库的某个表插入一些数据,然后执行flush logs命令。这时将会产生一个新的二进制日志文件mysql-bin.000003,mysql-bin.000002则保存了全备过后的所有更改,既增加记录的操作也保存在了mysql-bin.00002中。

b. 再在pak库中的t_user表中增加两条记录,然后误删除t_user表。t_user中增加记录的操作和删除表的操作都记录在mysql-bin.000003中。

2. 开始恢复

恢复过程不要记录日志:

1
mysql > set global sql_log_bin=0;

3. 首先导入全备数据

1
2
3
$ mysql -h localhost -upak -ppwd < pak_bak_full.sql
mysql> source /path/backup/pak_bak_full.sql

我们也可以看到全备时的binlog位置:

1
2
head -50 backup-file.sql |grep 'CHANGE MASTER'
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4321;

查看当前所在二进制日志中的位置:

1
mysql> show master status;

根据上面两个position能大概确定需要完整恢复哪几个binlog文件。

4. 恢复mysql-bin.000002

在待恢复的position或时间点以前、全备以后的binlog需要全部恢复,多个文件以空格隔开

1
$ mysqlbinlog /var/lib/mysql/mysql-bin.000002 | mysql -uroot -p

此时查询可以得到前两条数据。

5. 恢复部分mysql-bin.000003

这个日志中包括了新增记录和误删表两个部分,我们需要恢复到新增记录之后、误删操作以前的位置。

如果知道误操作的命令如DROP TABLE,则可以通过下面的方法在binlog文件中找到误操作之前的那个position:
(如下面的信息显示,误操作DROP TABLE之前的pos是775,在datetime 141204 15:08:04或pos 882时完成DROP TABLE操作)

1
2
3
4
5
6
7
8
9
$ mysqlbinlog /var/lib/mysql/mysql-bin.000003 |grep -C 5 'DROP TABLE'
#141204 15:07:05 server id 1 end_log_pos 775 Xid = 376
COMMIT/*!*/;
# at 775
#141204 15:08:04 server id 1 end_log_pos 882 Query thread_id=10 exec_time=0 error_code=0
SET TIMESTAMP=1417676884/*!*/;
DROP TABLE `t_user` /* generated by server */
/*!*/;
# at 882

恢复命令:

1
$ mysqlbinlog /var/lib/mysql/mysql-bin.000003 --stop-position=775 | mysql -h localhost -uroot -p

如果position难以确定,但知道需要恢复到的确切(服务器)时间,也可以使用datetime:

1
$ mysqlbinlog /var/lib/mysql/mysql-bin.000003 --stop-datetime="2014-12-04 15:08:00" | mysql -uroot -p

如果不是误操作导致的,而是迁移数据库,那么不需要position或datetime,使用所有binlog文件增量恢复即可。

确定恢复成功后记得打开日志记录:

mysql > set global sql_log_bin=1;

报错

    1. unknown variable ‘default-character-set=utf8’
      在使用mysqlbinlog查看二进制日志的时候,提示下面的错误:

      /usr/local/mysql/bin/mysqlbinlog: unknown variable ‘default-character-set=utf8’

      原因是在我为了统一mysql客户端到服务端的的字符编码,在/etc/my.cnf文件的[client][mysqld]等节加入了default-character-set = utf8mysqlbinlog会从my.cnf中的[client]读取配置,但奈何mysqlbinlog并不认识这个选项(据说是个bug)导致的。

      应对这个bug的方法有两个:
      第一,自然是注释到[client]中的这个字符集配置;
      第二,改用loose-default-character-set = utf8。在选项前加了loose-,表示当程序不认识此选项时会略过此选项,并给出一个警告。

MySQL增量备份与恢复实例的更多相关文章

  1. MySQL增量备份与恢复实例【转】

    小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,就不太可能每天进行一次完整备份了,这时候就可以使用增量备份.增量备份的原理就是使用了mysql的binlog日志.本次操作的 ...

  2. MYSQL增量备份与恢复

    vim /etc/my.cnf在[mysqld]下添加max_binlog_size = 1024000 //二进制日志最大1M 要进行mysql的增量备份,首先要开启二进制日志功能方法一:在/etc ...

  3. 七、linux-mysql下mysql增量备份与恢复

    1.备份的意义 运维工作:保护公司的数据     .  网站7*24小时服务 但相当来说,数据更加重要,而数据最核心的就是数据库数据,所以数据库的备份和恢复就显得十分重要. 2.备份的几个参数 mys ...

  4. MySQL 完整和增量备份与恢复

    MySQL 完全备份与恢复 1.数据备份的重要性 在企业中数据的价值至关重要,数据保障了企业的业务的运行,因此数据的安全性及可靠性是运维的重中之重,任何数据的丢失都有可能会对企业产生严重的后果.造成数 ...

  5. Percona XtraBackup 实现全备&增量备份与恢复【转】

    percona-xtrabackup主要是有两个工具,其中一个是xtrabackup,一个是innobackupex,后者是前者封装后的一个脚本.在针对MySQL的物理备份工具中,大概是最流行也是最强 ...

  6. MYSQL的备份与恢复--逻辑备份mysqldump

    目录 0.备份与恢复概述 1.逻辑备份-完整备份与恢复 2.逻辑备份-增量备份与恢复 (1)环境准备 (2)恢复全量数据 (3)恢复增量备份 3.新来的开发妹子删了库! (1)模拟环境准备 (2)全备 ...

  7. MYSQL的备份与恢复--物理备份xrabackup

    目录 1.数据库完整备份与恢复 (1)环境准备 (2)完全备份恢复流程 2.数据库增量备份与恢复 (1)增量和差异概述 (2)增量备份和恢复 3.数据库差异备份与恢复 4.简单命令进行物理备份 5.实 ...

  8. 2020重新出发,MySql基础,MySql数据库备份与恢复

    @ 目录 MySQL数据库备份与恢复 数据库为什么需要备份 MySQL备份类型 MySQL热备份及恢复 逻辑备份 mysqldump SELECT INTO-OUTFILE mydumper 裸文件备 ...

  9. Canal:同步mysql增量数据工具,一篇详解核心知识点

    老刘是一名即将找工作的研二学生,写博客一方面是总结大数据开发的知识点,一方面是希望能够帮助伙伴让自学从此不求人.由于老刘是自学大数据开发,博客中肯定会存在一些不足,还希望大家能够批评指正,让我们一起进 ...

随机推荐

  1. python 中密码处理函数

    一个简单的对某字符串进行 MD5加密 import hashlib def md5_pwd(pwd): """ 为了防止解密,hashlib.md5时加入自己的字段 将密 ...

  2. (六)利用JackSon工具将JSON文件和对象互转

    1. 需要下载JackSon工具,并导入到: 2. 编写html页面: <!DOCTYPE html> <html> <head> <meta charset ...

  3. rdd的元素打印

    在集群上运行spark程序时,rdd的操作都在worker机上,因此输出rdd的元素将在worker机的标准输出上进行,驱动节点上不会运行,故直接才程序中写如下代码 rdd.foreach(print ...

  4. Spring Cloud(6.2):搭建OAuth2 Client

    配置web.xml 添加spring-cloud-starter-security,spring-security-oauth2-autoconfigure和spring-boot-starter-o ...

  5. win7下安装IIS7

    在Windows 7下如何安装IIS7,以及IIS7在安装过程中的一些需要注意的设置,以及在IIS7下配置ASP的正确方法. 在Windows 7下面IIS7的安装方法: 一.进入Windows 7的 ...

  6. json转字符串 —— jsonObj.toJSONString()与JSON.stringify(jsonObj)json to string

    json 转变成 string方法介绍: var people = { "programmers": [{ "firstName": "Brett&q ...

  7. Python3之匿名函数

    当我们在传入函数时,有些时候,不需要显式定义函数.直接传入匿名函数更方便,例如 >>> list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9])) [1, ...

  8. CSS基础(html+css基础)

    css: CSS全称为“层叠样式表 (Cascading Style Sheets)”,它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小.颜色.字体加粗等. 1.CSS代码语法: css ...

  9. react-developer-tools

    链接: https://pan.baidu.com/s/1g7kLC3fF-u-lQySLqpivog 提取码: 92j9 复制这段内容后打开百度网盘手机App,操作更方便哦 安装:1.点击--> ...

  10. SQL 语句是如何执行的

    SQL 语句是如何执行的,虽然SQL是声明式语言,我们可以像使用英语一样使用它,不过在RDBMS(关系型数据库管理系统)中,SQL的实现方式还是有差别的.极客教程从数据库的角度来思考一下SQL是如何被 ...