为了数据安全,数据库需要定期备份,这个大家都懂,然而数据库备份的时候,最怕写操作,因为这个最容易导致数据的不一致,松哥举一个简单的例子大家来看下:
假设在数据库备份期间,有用户下单了,那么可能会出现如下问题:
- 库存表扣库存。
- 备份库存表。
- 备份订单表数据。
- 订单表添加订单。
- 用户表扣除账户余额。
- 备份用户表。
如果按照上面这样的逻辑执行,备份文件中的订单表就少了一条记录。将来如果使用这个备份文件恢复数据的话,就少了一条记录,造成数据不一致。
为了解决这个问题,MySQL 中提供了很多方案,我们来逐一进行讲解并分析其优劣。
1. 全库只读
要解决这个问题,我们最容易想到的办法就是在数据库备份期间设置数据库只读,不能写,这样就不用担心数据不一致了,设置全库只读的办法也很简单,首先我们执行如下 SQL 先看看对应变量的值:
show variables like 'read_only';
可以看到,默认情况下, read_only 是 OFF,即关闭状态,我们先把它改为 ON,执行如下 SQL:
set global read_only=1;
1 表示 ON,0 表