专栏首页腾讯云数据库专家服务MySQL 8.0新特性 — 备份锁
原创

MySQL 8.0新特性 — 备份锁

前言

在MySQL 8.0中,引入了一个轻量级的备份锁,这个锁可以保证备份一致性,而且阻塞的操作相对比较少,是一个非常重要的新特性,接下来我们就来了解一下。

FTWRL

我们知道,在之前版本中,在物理备份的最后阶段,需要执行flush table with read lock,简称FTWRL,以获取一致性状态;FTWRL会关闭所有打开的表,并加上一把全局读锁,因此这个命令杀伤性非常大,容易造成各种阻塞。下面这个场景,相信大家都非常熟悉,FTWRL被慢查询 或 大事务 或 大表DDL阻塞,后续select和DML又被FTWRL阻塞,最终甚至导致实例崩溃。

mysql> select * from information_schema.processlist where user='test' and command<>'sleep';
+----+------+-----------+------+---------+------+---------------------------------+-------------------------------------------------------------------------------------------------+
| ID | USER | HOST      | DB   | COMMAND | TIME | STATE                           | INFO                                                                                            |
+----+------+-----------+------+---------+------+---------------------------------+-------------------------------------------------------------------------------------------------+
| 18 | test | localhost | test | Query   |   59 | executing                       | select * from sbtest1 order by pad limit 1                                                      |
| 20 | test | localhost | test | Query   |   56 | Waiting for table metadata lock | alter table sbtest1 add column a int                                                            |
| 21 | test | localhost | test | Query   |   52 | Waiting for global read lock    | flush table with read lock                                                                      |
| 22 | test | localhost | test | Query   |   49 | Waiting for table metadata lock | select * from sbtest1 limit 1                                                                   |
| 23 | test | localhost | test | Query   |   15 | Waiting for table metadata lock | select * from sbtest1 limit 1                                                                   |
+----+------+-----------+------+---------+------+---------------------------------+-------------------------------------------------------------------------------------------------+
6 rows in set (0.00 sec)

就算我们把备份放在从库执行,同样也不能完全避免;如果从库需要同步大事务 或 分担读压力,就有可能会阻塞FTWRL,进而再阻塞后续操作;另外,MTS和FTWRL的死锁bug,也可能会导致类似问题。

因此,总的来说,FTWRL还是一个重量级的锁,因为其既会被读写阻塞、又会阻塞读写,容易造成各种阻塞甚至实例崩溃。Oracle官方团队当然也意识到了这个问题,并在MySQL 8.0中提供了新的解决方案,让我们接着往下看。

Backup Lock

在MySQL 8.0中,为了解决备份FTWRL的问题,引入了轻量级的备份锁;可以通过LOCK INSTANCE FOR BACKUP和UNLOCK INSTANCE,以获取和释放备份锁,执行该语句需要BACKUP_ADMIN权限。

(1)backup lock不会阻塞读写操作

session 1:
mysql> lock instance for backup;
Query OK, 0 rows affected (0.00 sec)

session 2:
mysql> select * from sbtest1 order by pad limit 1;

session 3:
mysql> insert into sbtest2 select * from sbtest1;

mysql> select * from information_schema.processlist where user='root' and command<>'sleep';
+----+------+-----------+------+---------+------+-----------+-------------------------------------------------------------------------------------+
| ID | USER | HOST      | DB   | COMMAND | TIME | STATE     | INFO                                                                                |
+----+------+-----------+------+---------+------+-----------+-------------------------------------------------------------------------------------+
| 19 | test | localhost | test | Query   |    8 | executing | select * from sbtest1 order by pad limit 1                                          |
| 20 | test | localhost | test | Query   |    3 | executing | insert into sbtest2 select * from sbtest1                                           |
+----+------+-----------+------+---------+------+-----------+-------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

(2)不过,backup lock会阻塞大部分DDL操作,包括创建/删除表、加/减字段、增/删索引、optimize/analyze/repair table等

mysql> select * from information_schema.processlist where user='root' and command<>'sleep' order by id;
+----+------+-----------+------+---------+------+-------------------------+-------------------------------------------------------------------------------------------------+
| ID | USER | HOST      | DB   | COMMAND | TIME | STATE                   | INFO                                                                                            |
+----+------+-----------+------+---------+------+-------------------------+-------------------------------------------------------------------------------------------------+
| 20 | test | localhost | test | Query   |  270 | Waiting for backup lock | create table sbtest2 like sbtest1                                                               |
| 21 | test | localhost | test | Query   |  220 | Waiting for backup lock | alter table sbtest2 add column a int                                                            |
| 22 | test | localhost | test | Query   |  253 | Waiting for backup lock | drop table sbtest2                                                                              |
| 35 | test | localhost | test | Query   |  195 | Waiting for backup lock | alter table sbtest2 drop column a                                                               |
| 36 | test | localhost | test | Query   |  165 | Waiting for backup lock | alter table sbtest2 add index idx_c(c)                                                          |
| 37 | test | localhost | test | Query   |  144 | Waiting for backup lock | alter table sbtest2 drop index idx_c                                                            |
| 38 | test | localhost | test | Query   |  123 | Waiting for backup lock | optimize table sbtest2                                                                          |
| 39 | test | localhost | test | Query   |  102 | Waiting for backup lock | analyze table sbtest2                                                                           |
| 40 | test | localhost | test | Query   |   75 | Waiting for backup lock | repair table sbtest2                                                                            |
| 41 | test | localhost | test | Query   |   15 | Waiting for backup lock | truncate table sbtest2                                                                          |
+----+------+-----------+------+---------+------+-------------------------+-------------------------------------------------------------------------------------------------+
11 rows in set (0.00 sec)

总的来说,备份锁还是非常实用的,毕竟其不会影响业务的正常读写;至于备份锁和DDL操作的冲突,还是有很多方法可以避免,比如错开备份和变更的时间、通过pt-online-schema-change/gh-ost避免长时间阻塞等等。随着备份锁的引入,Oracle官方备份工具MEB 8.0和Percona开源备份工具XtraBackup 8.0,也是更新了对backup lock的支持,具体参考如下:

MEB 8.0:https://docs.oracle.com/cd/E17952_01/mysql-enterprise-backup-8.0-en/mysqlbackup.backup.html

XtraBackup 8.0:https://www.percona.com/doc/percona-server/8.0/management/backup_locks.html

总结

备份锁,还是一个非常实用的新特性,可以解决非常多的日常生产问题,值得大家关注一下。

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • MySQL 8.0新特性 — 增强版逻辑备份恢复

    关于MySQL逻辑备份恢复,相信大家都不陌生,平时使用频率也是比较高;这里就简单介绍下:

    brightdeng@DBA
  • MySQL 8.0复制新特性

    截止2017年8月,MySQL 8.0 仍然是 beta 版本,复制功能有一些很棒的改进。最初,这些改进是为组复制(GR)开发的,但由于 GR 在底层使用常规复...

    wubx
  • MySQL 8.0复制新特性

    截止目前(2017年8月),MySQL 8.0 仍然是 beta 版本,复制功能有一些很棒的改进。最初,这些改进是为组复制(GR)开发的,但由于 GR 在底层使...

    wubx
  • MySQL 8.0 新特性:极速“备份恢复工具”,Clone 插件

    备份恢复是 DBA 必备的技能,开源数据库 MySQL 在社区中有不少常用的备份恢复方案,xtrabackup,mypump,mydumper,mysqldum...

    王文安@DBA
  • 新特性解读 | mysql 8.0 memcached api 新特性

    资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构...

    爱可生开源社区
  • MySQL 8.0新特性:函数索引

    之前的文章中分别介绍了MySQL 8.0在索引方面的新特性--隐藏索引 和 降序索引,详细内容可查看之前的文章内容;

    SEian.G
  • MySQL8.0新特性集锦

    在8.0版本之前,默认字符集为latin1,utf8指向的是utf8mb3,8.0版本默认字符集为utf8mb4,utf8默认指向的也是utf8mb4。

    MySQL技术
  • MySQL 8.0新特性:降序索引

    上两篇文章分别介绍了MySQL8.0的相关的新特性《MySQL 8.0新特性:隐藏索引》和《MySQL 8.0新特性:隐藏字段》,本文继续介绍MySQL8.0的...

    SEian.G
  • MySQL 8.0新特性 — 用户管理

    在最新的8.0版本中,MySQL在用户管理这一块,也是引入了很多新特性,包括操作系统认证、用户分类、新的权限、角色等等,接下来我们就看一看。

    brightdeng@DBA
  • MySQL 8.0 新特性:WriteSet 复制

    MySQL 的主从同步应该是被各个 DBA 熟知的技术了,从 MySQL 3.23.15 开始一直迭代改进到 8.0 版本。经过这么多年的改进,目前 8.0 提...

    王文安@DBA
  • MySQL 8.0新特性:隐藏索引

    MySQL 8.0 支持隐藏索引(invisible index),也称为不可见索引。隐藏索引不会被优化器使用。它允许快速启用/禁用MySQL Optimize...

    SEian.G
  • 新特性解读 | MySQL 8.0 增强逻辑备份恢复工具介绍

    资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构...

    爱可生开源社区
  • MySQL 8.0新特性 — 管理端口

    下面这个报错,相信大多数童鞋都遇见过;那么碰到这个问题,我们应该怎么办呢?在MySQL 5.7及之前版本,出现“too many connection”报错,超...

    brightdeng@DBA
  • MySQL 8.0新特性 — 密码管理

    作为世界上最流行的开源数据库,MySQL各方面的功能都在不断完善,比如密码管理这一块,从一开始最简单的用户名密码、到5.7版本的validate_passwor...

    brightdeng@DBA
  • 新特性解读 | MySQL 8.0 直方图

    MySQL 8.0 推出了histogram,也叫柱状图或者直方图。先来解释下什么叫直方图。

    田帅萌
  • MySQL 8.0新特性 — 降序索引

    相信大家都知道,索引是有序的;不过,在MySQL之前版本中,只支持升序索引,不支持降序索引,这会带来一些问题;在最新的MySQL 8.0版本中,终于引入了降序索...

    brightdeng@DBA
  • MySQL 8.0新特性:隐藏字段

    上一篇介绍了MySQL8.0新特性之隐藏索引《MySQL 8.0新特性:隐藏索引》,这篇文章主要给大家介绍了关于MySQL 8.0新特性之隐藏字段;

    SEian.G
  • MySQL 8.0新特性 — 函数索引

    在MySQL之前版本中,一直不支持函数索引,这也是被不少人诟病的一点;虽然可以通过generated column实现类似功能,但始终是不太方便;不过,在最新的...

    brightdeng@DBA
  • MySQL 8.0新特性:InnoDB ReplicaSet

    InnoDB ReplicaSet在 MySQL 8.0.19 版本之后开始支持;本文将针对 InnoDB ReplicaSet这一新特性做一些测试,包括环境部...

    SEian.G

扫码关注腾讯云开发者

领取腾讯云代金券