概述
怎么保证备份数据的一致性
- 1.全库只读
- 2.全局锁
- 3.事务
1.全库只读
要解决这个问题,我们最容易想到的办法就是在数据库备份期间设置数据库只读,不能写,这样就不用担心数据不一致了。
set global read_only=1;
但是 read_only 我们通常用来标识一个 MySQL 实例是主库还是从库:
- read_only=0,表示该实例为主库。数据库管理员 DBA 可能每隔一段时间就会对该实例写入一些业务无关的数据来判断主库是否可写,是否可用,这就是常见的探测主库实例是否活着的。
- read_only=1,表示该实例为从库。每隔一段时间探活,往往只会对从库进行读操作,比如select 1;这样进行探活从库。
所以, read_only 这个属性其实并不适合用来做备份,而且如果使用了 read_only 属性将整个库设置为 readonly 之后,如果客户端发生异常,则数据库就会一直保持 readonly 状态,这样会导致整个库长时间处于不可写状态,风险很高。
2.全局锁
顾名思义,就是讲整个库锁起来,不能增删改只能读
flush tables with read lock (FTWRL);
指令可以锁定表,解锁则使用
unlock tables;
- 与第一个方案相比,如果执行后客户端发生异常断开,那么全局锁会自动释放,而不会一直处于只读状态。
- 但加了全局锁,就意味着整个数据库在备份期间都是只读状态,业务在此期间只能停摆。
3.事务
数据库隔离级别——可重复读(REPEATABLE READ) ,这也是 MySQL 默认的隔离级别
在这个隔离级别下,如果用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。(因为正在执行的事务所产生的数据变化不能被外部看到)。
换言之,在 InnoDB 这种支持事务的存储引擎中,那么我们就可以在备份数据库之前先开启事务,此时会先创建一致性视图,然后整个事务执行期间都在用这个一致性视图,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作,并且这些更新操作不会被当前事务看到。
在可重复读的隔离级别下,即使其他事务更新了表数据,也不会影响备份数据库的事务读取结果,这就是事务四大特性中的隔离性,这样备份期间备份的数据一直是在开启事务时的数据。
具体操作也很简单,使用 mysqldump 备份数据库的时候,加上 -–single-transaction 参数即可。
总结一下,加事务备份似乎是一个不错的选择,不过这个方案也有一个局限性,那就是只适用于支持事务的引擎如 InnoDB,对于 MyISAM 这样的存储引擎,如果要备份,还是乖乖的使用全局锁吧。
作者:牛客944585318号
链接:https://www.nowcoder.com/discuss/971437?source_id=discuss_experience_nctrack&channel=-1
来源:牛客网
最后
以上就是能干小蚂蚁为你收集整理的Mysql怎么保证备份数据的一致性1.全库只读2.全局锁3.事务的全部内容,希望文章能够帮你解决Mysql怎么保证备份数据的一致性1.全库只读2.全局锁3.事务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复