回答
MySQL 的锁机制用于处理数据库并发控制,确保数据的一致性和完整性。它分为全局锁、表级锁和行级锁。
一、全局锁(Global Lock)
全局锁指对整个数据库加锁,让整个数据库处于只读状态,所有更新操作停止。全局锁通常用于全库备份。
- FTWRL
// 全库只支持查询操作,DML、DDL以及事务类语句会被阻塞。
// 正在进行的写操作在执行完毕后被阻塞,不能再进行新的写操作。
// 锁定期间,所有对表的读操作仍然可以进行,但是写操作被阻塞。
FLUSH TABLES WITH READ LOCK;
// 执行备份操作 ……
// 解锁,恢复正常
UNLOCK TABLES;
FTWRL 可以确保全库备份的一致性视图,避免备份过程中数据不一致问题。但是由于它会阻塞所有写操作,可能导致长时间停机,影响正常业务的运行。对于高并发、高写入场景的数据库不适用。
- GLOBAL READ_ONLY
// 将整个 MySQL 实例设置为只读模式,阻止所有的写操作。
SET GLOBAL READ_ONLY = ON;
// 执行备份操作 ……
// 恢复正常
SET GLOBAL READ_ONLY = OFF;
SET GLOBAL READ_ONLY
设置 MySQL 为只读模式仍然允许读操作,对业务影响较小。适用于从库的备份操作,避免对主库的影响。
- mysqldump 备份命令
mysqldump --all-databases --single-transaction --quick --lock-all-tables > backup.sql
全局锁通常用于全库备份和主从复制初始化,确保数据的一致性和完整性。但是需要注意其对业务的影响,避免长时间锁定。
二、表级锁(Table-Level Lock)