MySQL备份锁
无论逻辑备份还是物理备份,为了获取一致性位点,都强依赖于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/blog/2014/03/11/introducing-backup-locks-percona-server-2/
MySQL备份锁的更多相关文章
- Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录
Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...
- Mysql备份系列(1)--备份方案总结性梳理
mysql数据库备份有多么重要已不需过多赘述了,废话不多说!以下总结了mysql数据库的几种备份方案: 一.binlog二进制日志通常作为备份的重要资源,所以再说备份方案之前先总结一下binlog日志 ...
- MySQL 备份与还原详解
相关阅读: MySQL备份和恢复具体实施 http://www.linuxidc.com/Linux/2012-12/76257.htm MySQL备份与恢复的三种方法总结 http://www.li ...
- centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobackupex/Xtrabackup 第四十节课
centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobacku ...
- mysql 备份与还原
http://dev.yesky.com/281/35291281.shtml 每一种逻辑错误发生的概率都极低,但是当多种可能性叠加的时候,小概率事件就 放大成很大的安全隐患,这时候备份的必要性就凸显 ...
- XtraBackup物理备份 阿里云的Mysql备份方案
XtraBackup物理备份 Percona XtraBackup是世界上唯一的开源,免费的MySQL热备份软件,为InnoDB和XtraDB 数据库执行非阻塞备份.使用Percona XtraBac ...
- MySQL备份常用命令总结
MySQL备份常用命令总结 1.数据库和数据全部备份 mysqldump -uroot -pPassword -hlocalhost databasename > test.sqlmysqldu ...
- MySQL InnoDB锁机制
概述: 锁机制在程序中是最常用的机制之一,当一个程序需要多线程并行访问同一资源时,为了避免一致性问题,通常采用锁机制来处理.在数据库的操作中也有相同的问题,当两个线程同时对一条数据进行操作,为了保证数 ...
- 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 复 ...
随机推荐
- 读取xml数据装配到字典中之应用场景
前段时间看到支付宝设置里面有个多语言这个功能,蛮有意思的,就想双休没事的话做个相关的demo玩玩,可是礼拜六被妹子拽出去玩了一天,来大上海有大半年了,基本没有出去玩过,妹子说我是超级宅男,也不带她出去 ...
- 从零开始编写自己的C#框架——框架学习补充说明
非常感谢轩辕公子提出了对本框架的看法与意见,所以这里也将回复贴出来,让大家都了解一下 本系列的快速开发指的是,框架构建完毕后,在这个基础上开发新功能非常快捷方便,基本不用写太多代码就可以在短时间内完成 ...
- Hawk 1.2 快速入门2 (大众点评18万美食数据)
本文将讲解通过本软件,获取大众点评的所有美食数据,可选择任一城市,也可以很方便地修改成获取其他生活门类信息的爬虫. 本文将省略原理,一步步地介绍如何在20分钟内完成爬虫的设计,基本不需要编程,还能自动 ...
- TortoiseSVN的使用
1.安装和下载client客户端 (1)下载windows端程序:http://tortoisesvn.net/downloads.一般而言,如果是32bit操作系统,运行TortoiseSVN-1. ...
- angularJS实用的开发技巧
一.开端 真的是忙完这一阵子就可以忙下一阵子了啊... 最近在做一个angularJS+Ionic的移动端项目...记录一些技巧,方便自己以后查阅,也方便需要的人可以看一看...^_^ 二.基础原则了 ...
- Ionic2系列——使用DeepLinker实现指定页面URL
Ionic2使用了近似原生App的页面导航方式,并不支持Angular2的路由.这种方式在开发本地App的时候比较方便,但如果要用来开发纯Web页面就有点问题了,这种情况下Angular2的route ...
- Razor语法中绑定一个值给checkbox
在ASP.NET MVC开发中,需要绑定一个值给checkbox标签,如下面写法,它们运行时是没有问题,照样能跑. 看看上面的语法,在绑定时,它却出现绿浪线.提不绑定的值is not a valid ...
- Entity Framework 教程——模型浏览器
模型浏览器: 在之前的章节中,我们创建了第一个关于学校的实体数据模型.但是EDM设计器并没有将他所创建的所有对象完全显示出来.它只将数据库中的被选择的表与视图显示出来了. 模型浏览器可以将EDM所创建 ...
- 基于redis的处理session的方法
一个基于redis的处理session的方法,如下. <?php class Session_custom { private $redis; // redis实例 private $prefi ...
- 深入Collection集合
List集合 一.ArraryList: 最基本的集合不多做介绍 二.Vector Vector cn=new Vector(); A:有特有功能 a:添加 public void ad ...