MySQL 全局锁:全量备份数据要怎么操作?
文章目录
- 全局锁的概念与数据备份
- 使用全局锁备份数据的步骤
- 使用全局锁备份数据的缺陷
- 不加锁进行数据备份的步骤
全局锁的概念与数据备份
全局锁会把整个数据库实例锁定,当某个客户端会话对数据库加上全局锁之后,其他客户端的操作会受到限制。具体来说,在全局锁生效期间,整个数据库就处于只读状态,其他客户端无法执行数据的更新操作(如 INSERT、UPDATE、DELETE 等)和创建、修改表结构等操作,只能进行读操作(如 SELECT)。
全局锁的最常见使用场景是进行全量逻辑备份。在进行全量逻辑备份时,为了保证备份数据的一致性,需要确保在备份过程中数据不会被修改。加全局锁可以防止其他事务对数据进行更新,从而保证备份的数据是一个时间点上的一致性副本。例如,一个电商系统,要对商品信息、订单信息等全量数据进行备份,使用全局锁可以避免在备份期间有新的订单产生或商品信息被修改,保证备份数据的准确性。
使用全局锁备份数据的步骤
-
添加全局锁;
在 MySQL 中,可以使用以下语句来加全局锁:
FLUSH TABLES WITH READ LOCK;
当执行该语句后,当前会话就对整个数据库实例加上了全局锁。其他会话可以继续执行查询操作,但任何试图进行数据更新或表结构修改的操作都会被阻塞,直到持有全局锁的会话释放锁。
-
进行数据备份;
mysqldump
是 MySQL 中为数据备份提供的一个工具,可以通过mysqldump
进行数据备份:mysqldump -h `主机地址` -u `用户名` -p`密码` `数据库名` > `数据库名`.sql;
例如:
mysqldump -h 192.168.1.100 -u root -ppassword123 testdb > /home/user/backup/testdb.sql
需要注意的是,
mysqldump
不是一个 SQL 语句,而是 MySQL 提供的一个工具。所以mysqldump
不能在 MySQL 的命令行中作为 SQL 来执行,而是要通过操作系统的命令行执行。 -
释放全局锁:
UNLOCK TABLES;
使用全局锁备份数据的缺陷
数据库中加全局锁,是一个比较重的操作,存在以下问题:
- 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
- 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。
不加锁进行数据备份的步骤
在 InnoDB 引擎中,可以通过给 mysqldump
添加 --single-transaction
参数进行不加锁的数据一致性备份:
mysqldump --single-transaction -h`主机地址` -u`用户名` -p`密码` `数据库名` > `数据库名`.sql;
这种方式本质上在 InnoDB 存储引擎底层上的实现是通过快照读的方式。