注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

一起走进MySQL备份身后的故事(篇一 备份的秘密)  

来自郭忆   2014-04-01 23:09:42|  分类: MySQL |举报 |字号 订阅

  下载LOFTER 我的照片书  |
数据库作为一个系统中唯一或者主要的持久化组件,对服务的可用性和数据的可靠性要求较高。 作为能够有效应对因为系统软硬件故障、人工误操作导致数据丢失的预防手段,备份是目前最为常见的数据库运维操作。 考虑到备份操作对数据库可用性的影响, MySQL官方将备份方式划主要划分为以下三类:
  • 热备:备份过程中,MySQL实例始终是运行的,所有用户的读写请求都不会受到影响。
  • 冷备:备份前首先需要停止MySQL实例的运行,整个备份过程中,用户均无法访问数据库。
  • 温备:备份过程中,虽然MySQL实例是运行的,但是为了保证数据的一致性,允许用户通过加锁的方式来防止可能的更新或者修改操作。备份过程中,数据是只读的,所有的写请求会被阻塞。
针对MySQL数据库,目前主流的备份软件主要有mysqldumpXtraBackup两种。

mysqldump
mysqldumpMySQL自带的备份工具,通过create tabledrop tableinsert into 等SQL语句,将数据库中的数据导出成.sql文件。由于该文件是可读的,所以称之为逻辑备份。为了保证备份数据的一致性,mysqldump为用户提供了以下参数
  • --add-locks 为了保证一张表的数据一致性,对该表执行lock table xxx read,无论是innodb表还是myisam表,插入、删除、更新、带X锁的读(select for update)和DDLalter)请求均会被阻塞,不影响快照读和S锁读(select lock in share mode)请求。该参数不保证表之间的数据一致性,如果涉及到跨表的查询,备份不能保证表之间数据是一致的。
  • --lock-tables  锁定某一个数据库的所有的表,能够保证某一个库中的所有表的数据一致性,但是不保证库之间的数据一致,相当于在一个数据库的所有表上执行了—add-locks参数,此外该库的DDL语句均会给阻塞。
  • --lock-all-tables 锁定某个实例的所有表,可以保证所有库的数据一致性,相当于所有的库同时指定lock tables参数,此外,实例的所有DDL语句(create database)均会阻塞。除非指定—single-transaction选项,如果指定,则mysqldump仅在备份开始时,加一个flush tables with read lock的全局锁,防止所有的DDL和写操作,在开启事务后,释放该锁,备份过程中,如果是innodb表则不受影响。
  • --single-transaction 针对支持MVCC(多版本)事务的存储引擎,例如innodb,mysqldump提供了在导出数据之前,开启一个事务,由数据库保证单次导出数据的一致性,此时针对Innodb表的所有读写操作,均不会被阻塞。
  • --master-data 获取备份数据的Binlog位置和Binlog文件名,用于通过备份恢复的实例之间建立复制关系时使用,该参数会默认开启。
从对mysqldump参数的分析我们可以看出,之所以备份过程中要上锁,主要基于以下几个原因:
  • 备份的数据库中包含不支持事务的表,需要通过锁来保证单个表、一个库中的表之间、同一个实例的不同库的表之间的数据一致性。该锁可以表锁、库级别的锁甚至实例级别的锁,应根据实际业务对一致性的需求选择不同粒度的锁,最大程度的减少锁对用户读写请求的影响。
  • 为了保证备份时,表结构的一致性,需要通过锁来阻止对表、库和实例的DDL操作。
  • 为了保证获取正确的Binlog位置和文件名,需要短暂的锁定整个实例的所有库,因为Binlog是实例级别的,一个实例的所有库是共享Binlog文件和位置的。同时值得注意的是,无论是innodb表还是myisam表,此都为必须步骤,只是innodb表可以在开启事务后即释放该锁,而myisam需要在整个备份过程中,一直持有该锁,对用户访问的影响时间长短区别。
mysqldump由于依赖数据库层的转换,所以并不关心底层的存储引擎,既适用于支持事务的,也适用于不支持事务的,并且可以同时在不同MySQL版本之间进行转换,由于是逻辑备份,用户可以在备份的过程中,同时对数据进行修改。但是也正是因为需要经过数据库层的转换,mysqldump生成的备份文件往往很大,而且速度较慢,备份过程对数据库的访问有较大的影响,对于数据量大、业务压力高的实例并不适用。
  评论这张
 
阅读(719)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017