无论逻辑备份还是物理备份,为了获取一致性位点,都强依赖于FTWRL(Flush Table With Read Lock)。这个锁杀伤力非常大,因为持有锁的这段时间,整个数据库实质上不能对外提供写服务的。此外,由于FTWRL需要关闭表,如有大查询,会导致FTWRL等待,进而导致DML堵塞的时间变长。即使是备库,也有SQL线程在复制来源于主库的更新,上全局锁时,会导致主备库延迟。FTWRL这把锁持有的时间主要与非innodb表的数据量有关,如果非innodb表数据量很大,备份很慢,那么持有锁的时间就会很长。即使全部是innodb表,也会因为有mysql库系统表存在,导致会锁一定的时间。为了解决这个问题,Percona公司对Mysql的Server层做了改进,引入了BACKUP LOCK,具体而言,通过"LOCK TABLES FOR BACKUP"命令来获取一致性数据(包括非innodb表);通过"LOCK BINLOG FOR BACKUP"来获取一致性位点,尽量减少因为数据库备份带来的服务受损,我们将这一特性引入到AliSQL,下面详细介绍这个特性。

功能介绍

在MysqlServer层新增2种类型MDL全局范围锁,backup-lock和binlog-lock,并新增了3种语法:

1.LOCK TABLES FOR BACKUP,执行语句申请backup-lock的共享锁,通过unlock tables释放锁。

2.LOCK BINLOG FOR BACKUP,执行语句申请binlog-lock的共享锁,通过unlock binlog释放锁。

3.UNLOCK BINLOG,释放LOCK BINLOG FOR BACKUP持有的锁。

对于backup-lock:

已经持有lock table for backup后,如果在本会话执行更新操作(非innodb表),会报错;如果在其它会话执行更新操作,会等待。show processlit 可以看到会话处于"Waiting for backup lock"状态。

对于binlog-lock:

已经持有lock binlog for backup后,如果本会话执行更新操作,不会报错,因为不会堵塞会话;如果其它会话执行,则会等待。show processlist 可以看到会话处于"Waiting for binlog lock"状态。

下面介绍具体的原理和相关接口的实现

A:备份操作

申请backup-lock,持有(backup,MDL_SHARED,MDL_EXPLICIT)锁

B:库的DDL操作

调用lock_schema_name加库对象锁(修改库操作,schema_lock)

接口(mysql_create_db, mysql_alter_db, mysql_rm_db, mysql_upgrade_db等)

1.如果已经持有全局锁(backup,global),则报错。

2.加库的排它锁(SCHEMA, MDL_EXCLUSIVE, MDL_TRANSACTION)

3.申请IX范围锁,避免后续的global和backup lock进来

(global,MDL_INTENTION_EXCLUSIVE,MDL_STATEMENT)

(backup,MDL_INTENTION_EXCLUSIVE,MDL_STATEMENT)

C:表的DDL操作

调用lock_table_names加表对象锁(修改表操作)

接口(mysql_rename_tables, mysql_rm_table, mysql_drop_view, truncate_table等)

1.加表对象锁(TABLE, MDL_EXCLUSIVE, MDL_TRANSACTION)

2.加上对应schema的对象锁(SCHEMA,MDL_INTENTION_EXCLUSIVE,MDL_TRANSACTION),避免库的ddl操作。

3.如果已经持有全局锁(backup,global),则报错。

4.申请IX范围锁,避免后续的global和backup lock进来

(global,MDL_INTENTION_EXCLUSIVE,MDL_STATEMENT)

(backup,MDL_INTENTION_EXCLUSIVE,MDL_STATEMENT)

D:表的DML操作

调用acquire_protection来申请IX范围锁

接口open_table

这里只针对非innodb引擎,且是写操作的表

mdl_request.type >= MDL_SHARED_WRITE && share->db_type()->flags & HTON_SUPPORTS_ONLINE_BACKUPS

引入备份锁的优势

LOCK TABLES FOR BACKUP
作用:获取一致性数据
1.禁止非innodb表更新
2.禁止所有表的ddl
优化点:
1.不会被大查询堵塞(没有flush tables 导致关闭表操作)
2.不会堵塞innodb表的读取和更新,这点非常重要,对于业务表全部是并innodb的情况,则备份过程中DML完全不受损

LOCK BINLOG FOR BACKUP

作用:获取一致性位点。
1.禁止对位点更新的操作
优化点:
1.允许DDl和更新,直到写binlog为止。
UNLOCK BINLOG

物理备份流程变化

修改前:

1. get redo-lsn

2. copy InnoDB data

3. FLUSH TABLES WITH READ LOCK;

4. copy .frm, MyISAM, etc.

5. get the binary log coordinates

6. finalize the background copy of REDO log

7. UNLOCK TABLES;

修改后:

1. get redo-lsn

2. copy InnoDB data

3. LOCK TABLES FOR BACKUP;

4. copy .frm, MyISAM, etc

5. LOCK BINLOG FOR BACKUP;

6. finalize the background copy of REDO log

7. UNLOCK TABLES;

8. get the binary log coordinates

9. UNLOCK BINLOG;

对应的Xtrabackup工具在执行命令流程需要相应的改动。

功能限制

1.对于Myisam表,当delay_key_write=ALL时,索引并没有及时刷盘,导致xtrabackup无法获取一致的备份,因此在这种情况下,加backup-lock失败。

参考文档

https://www.percona.com/doc/percona-server/5.6/management/backup_locks.html#interaction-with-other-global-locks

https://www.percona.com/blog/2014/03/11/introducing-backup-locks-percona-server-2/

MySQL备份锁的更多相关文章

  1. Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录

    Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...

  2. Mysql备份系列(1)--备份方案总结性梳理

    mysql数据库备份有多么重要已不需过多赘述了,废话不多说!以下总结了mysql数据库的几种备份方案: 一.binlog二进制日志通常作为备份的重要资源,所以再说备份方案之前先总结一下binlog日志 ...

  3. MySQL 备份与还原详解

    相关阅读: MySQL备份和恢复具体实施 http://www.linuxidc.com/Linux/2012-12/76257.htm MySQL备份与恢复的三种方法总结 http://www.li ...

  4. centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobackupex/Xtrabackup 第四十节课

    centos   shell编程6一些工作中实践脚本   nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志  直接送给bc做计算  gzip  innobacku ...

  5. mysql 备份与还原

    http://dev.yesky.com/281/35291281.shtml 每一种逻辑错误发生的概率都极低,但是当多种可能性叠加的时候,小概率事件就 放大成很大的安全隐患,这时候备份的必要性就凸显 ...

  6. XtraBackup物理备份 阿里云的Mysql备份方案

    XtraBackup物理备份 Percona XtraBackup是世界上唯一的开源,免费的MySQL热备份软件,为InnoDB和XtraDB 数据库执行非阻塞备份.使用Percona XtraBac ...

  7. MySQL备份常用命令总结

    MySQL备份常用命令总结 1.数据库和数据全部备份 mysqldump -uroot -pPassword -hlocalhost databasename > test.sqlmysqldu ...

  8. MySQL InnoDB锁机制

    概述: 锁机制在程序中是最常用的机制之一,当一个程序需要多线程并行访问同一资源时,为了避免一致性问题,通常采用锁机制来处理.在数据库的操作中也有相同的问题,当两个线程同时对一条数据进行操作,为了保证数 ...

  9. MariaDB/MySQL备份和恢复(一):mysqldump工具用法详述

    本文目录:1.备份分类2.备份内容和备份工具3.mysqldump用法详述 3.1 语法选项 3.1.1 连接选项 3.1.2 筛选选项 3.1.3 DDL选项 3.1.4 字符集选项 3.1.5 复 ...

随机推荐

  1. (转载)JAVA动态编译--字节代码的操纵

    在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...

  2. Nginx 服务器 之Nginx与tomcat实现负载均衡

      本文讲解我们如何使用Nginx做反向带服务器,实现nginx与tomcat服务器集群做负载均衡. 一.nginx与tomcat实现负载均衡 1.在/usr/local/ngnix/conf  创建 ...

  3. DM9000驱动移植在mini2440(linux2.6.29)和FS4412(linux3.14.78)上的实现(deep dive)篇一

    关于dm9000的驱动移植分为两篇,第一篇在mini2440上实现,基于linux2.6.29,也成功在在6410上移植了一遍,和2440非常类似,第二篇在fs4412(Cortex A9)上实现,基 ...

  4. 你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(上)

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  5. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码

    这一篇首先从allitebooks.com里抓取书籍列表的书籍信息和每本书对应的ISBN码. 一.分析需求和网站结构 allitebooks.com这个网站的结构很简单,分页+书籍列表+书籍详情页. ...

  6. NSSortDescriptor 的使用

    NSSortDescriptor  是什么 ? 你可以将它看做是对一个排序规则的描述者  因为我们可以使用它来对我们数组中的对象进行排序操作 假设现在有这样一个需求: 数组里面有十个Person对象 ...

  7. .NET 版本区别,以及与 Windows 的关系

    老是记不住各 Windows 版本中的 .NET 版本号,下面汇总一下: .NET Framework各版本汇总以及之间的关系 Mailbag: What version of the .NET Fr ...

  8. Basic Tutorials of Redis(2) - String

    This post is mainly about how to use the commands to handle the Strings of Redis.And I will show you ...

  9. 【趣味分享】C#实现回味童年的24点算法游戏

    一.24点游戏玩法规则效果展示 1.初始化界面 2.开始游戏界面 3.游戏超时界面 4.查看答案界面 5.答对界面 6.答错界面 7.计算表达式的验证界面 8.一副牌算完开始新一副牌界面 到这里24点 ...

  10. arcengine中自定义工具和自带工具条(ICommand)点击后和其他工具使用的冲突

    自己系统中本身对于放大缩小等功能直接是单独重写的,但是如果在加一个工具条具有相同功能的话两者之间会有一些冲突,为解决该冲突可以重写工具条的OnItemClick事件 该工具条命名为axTool 我本身 ...