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 复 ...
随机推荐
- 【PRINCE2是什么】PRINCE2认证之七大原则(6)
我们先来回顾一下,PRINCE2七大原则分别是持续的业务验证,经验学习,角色与责任,按阶段管理,例外管理,关注产品,剪裁 第六个原则:关注产品 PRINCE2指出,一个成功的项目必须以产品为导向,而不 ...
- springmvc注解事例
注解有简化 ,灵活性增强的功能 1.引入jar包 com.springsource.javax.validation-1.0.0.GA.jarcom.springsource.org.aopallia ...
- 微软Ignite大会我的Session(SQL Server 2014 升级面面谈)PPT分享
我在首届微软技术大会的Session分享了一个关于SQL Server升级的主题,现在将PPT分享出来. 您可以点击这里下载PPT. 也非常感谢微软中国邀请我进行这次分享.
- Kafka 文档用例
1.2 用例 以下是一些Kafka 常见的用例.关于功能方面的一些概念,可以看这篇博客:http://engineering.linkedin.com/distributed-systems/log- ...
- socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(41)-组织架构
系列目录 本节开始我们要实现工作流,此工作流可以和之前的所有章节脱离关系,也可以紧密合并. 我们当初设计的项目解决方案就是可伸缩可以拆离,可共享的项目解决方案.所以我们同时要添加App.Flow文件夹 ...
- C#多线程之基础篇2
在上一篇C#多线程之基础篇1中,我们主要讲述了如何创建线程.中止线程.线程等待以及终止线程的相关知识,在本篇中我们继续讲述有关线程的一些知识. 五.确定线程的状态 在这一节中,我们将讲述如何查看一个线 ...
- Oracle 故障处理总结
Oracle 故障处理总结(更新中..) 各类数据库问题描述模板 记录一则ORA-00054,ORA-00031解决过程 记录一则ORACLE MOVE操作后重建索引过程被强制中断导致的ORA-810 ...
- ORA-01034:ORACLE not available问题的解决方法
同时在自己电脑上装了oracle客户端和服务器,上次还能用呢,这次突然用不了. [oracle@R39i oracle]$ sqlplus scott/tiger SQL*Plus: Release ...
- android使用PullToRefresh实现上拉加载和下拉刷新效果
其实很早前就在博客园中也写过官方的下拉刷新控件SwipeRefreshLayout,但是这个控件仅仅支持下拉刷新,用起来还算可以.然而在我们实际开发应用中,很多地方都不止有下拉刷新,而且还有上拉加载的 ...