我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL 增量备份

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL 增量备份

增量备份的特点

        增量备份的优点是没有重复数据,备份量不大,时间短。缺点也很明显,需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且对所有增量进行逐个反推恢复,操作较为繁琐。

       MySQL 没有提供直接的增量备份方法,但是可以通过MySQL  的二进制间接实现增量备份。二进制日志对备份的意义如下:

(1)二进制日志保存了所有更新或者可能更新数据库的操作。

(2)二进制日志在启动MySQL 服务器后开始记录,并在文件到达 max_binlog_size 所设置的大小或者接收到 flush logs 命令后重新创建新的日志文件。

(3)只需要订时执行 flush logs 方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份。


在数据库school 中的表 info  的基础上进行增量备份操作

mysql> select * from info;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | tom  | 89.00 |
|  2 | lili | 92.00 |
+----+------+-------+

一 增量备份

1.实现增量备份,首先要开启二进制功能。在mysql 配置文件中添加 log-bin=mysql-bin   语句,然后重新启动服务

[root@bogon data]# vim /etc/my.cnf

[mysqld]

log-bin=mysql-bin         //开启二进制功能

[root@localhost ~]# systemctl restart mysqld.service      //重启 mysql 服务,生成二进制文件
[root@localhost ~]# cd /usr/local/mysql/data/
[root@localhost data]# ls
auto.cnf        ib_logfile0  mysql             performance_schema
ib_buffer_pool  ib_logfile1  mysql-bin.000001  school             //二进制文件序列
ibdata1         ibtmp1       mysql-bin.index   sys

2.使用 mysqldump 命令,对数据库 school 中的表 info 进行完全备份

[root@localhost data]# mysqldump -uroot -p school info > /opt/info.sql
Enter password:
[root@localhost data]# cd /opt/
[root@localhost opt]# ls
info.sql  mysql-5.7.17  rh                           //表info 备份文件

3.向 info 表中插入数据,执行flush-logs 操作,生成新的二进制增量备份文件

[root@localhost data]# mysql -uroot –p              //进入mysql数据库
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.

mysql> use school;            //进入库 school
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> insert into info (name,score) values ('test01',88);        //插入信息
Query OK, 1 row affected (0.37 sec)

mysql> insert into info (name,score) values ('test02',76);
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+--------+-------+
| id | name   | score |
+----+--------+-------+
|  1 | tom    | 89.00 |
|  2 | lili   | 92.00 |
|  3 | test01 | 88.00 |
|  4 | test02 | 76.00 |
+----+--------+-------+

mysql> quit
Bye
[root@localhost data]# mysqladmin -uroot -p flush-logs              //进行增量备份
Enter password:
[root@localhost data]# ls
auto.cnf        ib_logfile0  mysql             mysql-bin.index     sys
ib_buffer_pool  ib_logfile1  mysql-bin.000001  performance_schema
ibdata1         ibtmp1       mysql-bin.000002  school                    //生成新的二进制增量备份文件

4.虽然生成新的二进制增量备份文件  mysql-bin.000002   但此时数据变化保存在编号 000001 中,而000002 是一个空的日志文件,使用 mysqlbinlog 命令查看二进制文件内容。

[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v  mysql-bin.000001        //查看编号000001 的日志文件

# at 348                                                                                     //不会生成乱码
#180904 16:45:20 server id 1  end_log_pos 398 CRC32 0x398bd3e5     Write_rows: table id 118 flags: STMT_END_F
### INSERT INTO `school`.`info`
### SET
###   @1=3                                              //表info 中插入的信息
###   @2='test01'
###   @3=88.00
# at 398
#180904 16:45:20 server id 1  end_log_pos 429 CRC32 0xd2d905fe     Xid = 63
COMMIT;

# at 623
#180904 16:45:32 server id 1  end_log_pos 673 CRC32 0x4164c313     Write_rows: table id 118 flags: STMT_END_F
### INSERT INTO `school`.`info`
### SET
###   @1=4
###   @2='test02'
###   @3=76.00
# at 673
#180904 16:45:32 server id 1  end_log_pos 704 CRC32 0x8287a8b1     Xid = 64
COMMIT;

二。增量备份恢复

增量恢复比完全恢复操作更加繁琐,每个增量备份都是单独的个体,数据不重复,需要控制的更加准确。

完全备份之后丢失所有数据的恢复步骤

         当完全备份和增量备份之后,所有数据丢失,需要把完全备份和所有增量备份文件逐个恢复,这里演示对库 school 中的info 表的恢复操作。

(1)模拟数据库 school 中表info 数据丢失,使用drop 删除info 表

[root@localhost ~]# mysql -uroot -p
Enter password:

mysql> use school;

mysql> select * from info;
+----+--------+-------+
| id | name   | score |
+----+--------+-------+
|  1 | tom    | 89.00 |
|  2 | lili   | 92.00 |
|  3 | test01 | 88.00 |
|  4 | test02 | 76.00 |
+----+--------+-------+
4 rows in set (0.00 sec)


mysql> drop table info;                  //删除info 表
Query OK, 0 rows affected (0.01 sec)


mysql> select * from info;
ERROR 1146 (42S02): Table 'school.info' doesn't exist

(2)先使用mysql 命令进行完全备份恢复的操作。

[root@localhost ~]# mysql -uroot -p school < /opt/info.sql       //恢复school 库中 info 表,备份文件为/opt/info.sql
Enter password:
[root@localhost ~]# mysql -uroot -p -e 'use school;show tables;select * from info;'     //不进入数据库查看info 表的恢复情况
Enter password:
+------------------+
| Tables_in_school |
+------------------+
| info             |
+------------------+
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | tom  | 89.00 |                     //完全备份操作已经恢复
|  2 | lili | 92.00 |
+----+------+-------+

(3)被删除的表中数据又可以查询出来,说明完全恢复是成功的。接下来使用二进制文件进行增量恢复操作,需要注意的是恢复的顺序,要恢复最先生成的二进制文件,然后依次执行

[root@localhost ~]# cd /usr/local/mysql/data/
[root@localhost data]# ls
auto.cnf        ib_logfile0  mysql             mysql-bin.000003    school
ib_buffer_pool  ib_logfile1  mysql-bin.000001  mysql-bin.index     sys
ibdata1         ibtmp1       mysql-bin.000002  performance_schema
[root@localhost data]# mysqlbinlog --no-defaults mysql-bin.000001 | mysql -uroot –p         //使用二进制文件恢复
Enter password:
[root@localhost data]# mysql -uroot -p -e 'use school;select * from info;'     //查看恢复情况
Enter password:
+----+--------+-------+
| id | name   | score |
+----+--------+-------+
|  1 | tom    | 89.00 |
|  2 | lili   | 92.00 |
|  3 | test01 | 88.00 |
|  4 | test02 | 76.00 |
+----+--------+-------+

三。基于时间点与位置的恢复

        利用二进制日志可实现基于时间点与位置的恢复,例如由于误操作删除了一张表,这是完全恢复是没有用的,因为日志里面还存在误操作的语句,我们需要的是恢复到误操作前的状态,然后跳过操作语句,在恢复后面操作的语句。

       假定需要往数据库中插入两条数据,但由于误操作,两条语句中间删除了一条数据,而这条数据是不应该删除的。

由于误操作,在添加完 test04 后 将  ‘tom’ 给误删除,有添加了test 05.

(1)基于时间点的恢复,就是讲某个起始时间的二进制日志导入数据库中,从而跳过某个发生错误的时间点实现数据恢复。

使用 mysqlbinlog   加上 --stop-datetime   选项,表示在哪个时间点结束,后面误操作的语句不执行。

使用 mysqlbinlog  加上  --start-datetime   选项,表示执行后面的语句,结合使用跳过误操作语句,完成恢复。需要注意的是,二进制文件中保存的日期格式需要调整为 “ –“  分割。

mysql> select * from info;
+----+--------+-------+
| id | name   | score |
+----+--------+-------+
|  2 | lili   | 92.00 |
|  3 | test01 | 88.00 |
|  4 | test02 | 76.00 |
|  5 | test04 | 80.00 |
|  6 | test05 | 90.00 |
+----+--------+-------+
5 rows in set (0.00 sec)

[root@localhost data]# ls                     //有错误操作的增量备份的二进制文件
auto.cnf        ib_logfile0  mysql             mysql-bin.000003  performance_schema
ib_buffer_pool  ib_logfile1  mysql-bin.000001  mysql-bin.000004  school
ibdata1         ibtmp1       mysql-bin.000002  mysql-bin.index   sys

[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v  mysql-bin.000003                  //查看增量备份二进制文件

# at 2272        //位置点,上一次可以执行的位置
#180904 20:26:49 server id 1  end_log_pos 2322 CRC32 0x50dbd722     Write_rows: table id 222 flags: STMT_END_F   //时间点
### INSERT INTO `school`.`info`       //正确操作语句
### SET
###   @1=5
###   @2='test04'
###   @3=80.00
# at 2322
#180904 20:26:49 server id 1  end_log_pos 2353 CRC32 0x9ffdf83c     Xid = 93
COMMIT;

# at 2547     
#180904 20:27:19 server id 1  end_log_pos 2594 CRC32 0xaed6d12c     Delete_rows: table id 222 flags: STMT_END_F
### DELETE FROM `school`.`info`         //误操作语句
### WHERE
###   @1=1
###   @2='tom'
###   @3=89.00
# at 2594                         // 下一次可以被执行的位置
#180904 20:27:19 server id 1  end_log_pos 2625 CRC32 0x84e5fdb3     Xid = 94
COMMIT;

# at 2819
#180904 20:32:27 server id 1  end_log_pos 2869 CRC32 0x5babb6b2     Write_rows: table id 222 flags: STMT_END_F
### INSERT INTO `school`.`info`       //正确操作语句
### SET
###   @1=6
###   @2='test05'
###   @3=90.00
# at 2869
#180904 20:32:27 server id 1  end_log_pos 2900 CRC32 0x73283b1b     Xid = 95
COMMIT;

(2)删除info 表,先进性完全备份恢复,在按顺序进行增量备份恢复

mysql> use school;                       //进入school 数据库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> drop table info;                 //删除info 表
Query OK, 0 rows affected (0.35 sec)

mysql> quit
Bye
[root@localhost data]# mysql -uroot -p school < /opt/info.sql           //先进行完全备份
Enter password:
[root@localhost data]# mysql -uroot -p -e 'use school;show tables;select * from info;'Enter password:       //查看完全备份info 表
+------------------+
| Tables_in_school |
+------------------+
| info             |
+------------------+
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | tom  | 89.00 |
|  2 | lili | 92.00 |
+----+------+-------+

[root@localhost data]#  mysqlbinlog --no-defaults mysql-bin.000001|mysql -uroot –pabc123        //进行第一次增量备份恢复
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost data]# mysql -uroot -p -e 'use school;show tables;select * from info;'
Enter password:
+------------------+
| Tables_in_school |
+------------------+
| info             |
+------------------+
+----+--------+-------+
| id | name   | score |
+----+--------+-------+
|  1 | tom    | 89.00 |
|  2 | lili   | 92.00 |
|  3 | test01 | 88.00 |
|  4 | test02 | 76.00 |

                                                                                                                         //删除‘tom’语句错误操作时间

[root@localhost data]# mysqlbinlog --no-defaults --stop-datetime='2018-09-04 20:27:19' /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p
Enter password: 
[root@localhost data]# mysql -uroot -p -e 'use school;show tables;select * from info;'
Enter password:
+------------------+
| Tables_in_school |
+------------------+
| info             |
+------------------+
+----+--------+-------+
| id | name   | score |
+----+--------+-------+
|  1 | tom    | 89.00 |
|  2 | lili   | 92.00 |
|  3 | test01 | 88.00 |
|  4 | test02 | 76.00 |
|  5 | test04 | 80.00 |
+----+--------+-------+

                                                                                               //下一次正确操作时间点

[root@localhost data]# mysqlbinlog --no-defaults --start-datetime='2018-09-04 20:32:27 ' /usr/local/mysql/data/mysql-bin.000003 | mysql -uroot -p
Enter password:

[root@localhost data]# mysql -uroot -p -e 'use school;show tables;select * from info;'Enter password:
+------------------+
| Tables_in_school |
+------------------+
| info             |
+------------------+
+----+--------+-------+
| id | name   | score |
+----+--------+-------+
|  1 | tom    | 89.00 |
|  2 | lili   | 92.00 |
|  3 | test01 | 88.00 |                               //info 表恢复正确
|  4 | test02 | 76.00 |
|  5 | test04 | 80.00 |
|  6 | test05 | 90.00 |
+----+--------+-----

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL 增量备份

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL定时备份(全量备份+增量备份)

参考 zmcyu 的 mysql数据库的完整备份、差异备份、增量备份 更多binlog的学习参考马丁传奇的 MySQL的binlog日志,这篇文章写得认真详细,如果看的认真的话,肯定能学的很好的。 如果查看binlog是出现语句加密的情况,参考 mysql r
MySQL定时备份(全量备份+增量备份)
2016-10-03

mysql备份策略的实现(全量备份+增量备份)

目录设计场景技术点服务器信息准备工作编写全量备份脚本(Mysql-FullyBak.sh)编写增量备份脚本设置定时任务crontab恢复操作最近项目需要对数据库数据进行备份,通过查阅各种资料,设计了一套数据库备份策略,通过调试运行一周后,目
2022-05-21

mysql如何备份增量

mysql 增量备份方法:使用 binlog 和 change master:启用二进制日志并记录起始位点,使用 mysqldump 备份并更新起始位点。使用 pt-table-checksum:创建初始快照,使用 pt-table-che
mysql如何备份增量
2024-06-15

MySQL怎么增量备份

本篇内容主要讲解“MySQL怎么增量备份”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL怎么增量备份”吧!添加自动任务每小时或者更短时间执行就好了#!/bin/sh#author RuM
2023-06-27

mysql中xtrabackup全量备份/增量备份及恢复

目录一、测试前准备mysql数据库创建数据库创建备份目录 二、开始测试1、全量备份数据库2、全量备份恢复(先准备,再恢复)三、增量备份 1、先全量备份 2、全量备份之后增加些数据3、第一次增量备份(1)查看全量备份的to_lsn(2)第一次
mysql中xtrabackup全量备份/增量备份及恢复
2024-09-15

什么是mysql增量备份

MySQL增量备份是一种备份策略,用于仅备份发生更改的数据和日志,以减少备份时间和存储空间的消耗,常见的MySQL增量备份方法有两种:1、二进制日志备份,服务器会记录所有对数据库的修改操作,并将这些操作以二进制日志的形式存储起来;2、基于事
2023-08-02

Windows环境MySQL全量备份+增量备份的实现

目录一、环境准备二、创建测试数据库和表2.1.创建测试数据库2.2.创建测试数据表三、全量备份恢复数据库3.1.全量备份数据库3.2全量恢复数据库 四、增量备份恢复数据库4.1.增量备份数据库4.2.增量恢复数据库 五、定时执行备份任务5
Windows环境MySQL全量备份+增量备份的实现
2024-08-15

mysql增量备份怎么实现

MySQL增量备份可以通过以下几种方法实现:使用MySQL的二进制日志(Binary Log):MySQL的二进制日志记录了数据库的所有更新操作,包括增、删、改等操作。通过定期备份二进制日志,可以实现增量备份。备份时只需要备份上次备份后产生
mysql增量备份怎么实现
2024-04-09

MySQL数据库完全备份与增量备份详解

目录定义完全备份与恢复演示定义完全备份就是将数据库中的数据及所有对象全部备份。由于 mysql 服务器中的数据文件是基于磁盘的文本文件,所以完全备份就是复制数据库文件,是最简单也是最快速的方式。但 MySQL 服务器的数据文件在服务器
2022-08-10

编程热搜

目录