我的任务是启动客户端MySQL 5.7.35数据库服务器的全新副本。虽然我在过去观察过其他人在不同的情况下这样做,但我以前从未负责过这个手术,所以我只想确认我的计划是正确的,我没有遗漏任何重要的东西。
数据驻留在XFS格式的LVM逻辑卷中,它位于一个卷组中,该卷组有足够的空闲空间,可以拍摄LVM快照。
该数据库是传统的MyISAM和InnoDB表的混合体,目前的大小超过200 GB。副本服务器是用相同的MySQL版本设置的,以及基于行的二进制日志复制的所有先决条件(复制用户、服务器ID、log_bin等)。都井井有条。
我的过程是:
FLUSH TABLES WITH READ LOCK。保持客户端会话处于打开状态。SELECT查询在运行时处于执行过程中,因此我们将努力确保这一点。SHOW MASTER STATUS来获取binlog文件名和位置。UNLOCK TABLES以恢复正常操作。-t xfs -o nouuid)和数据目录( rsync )从它加载到(关闭的)副本服务器--不包括auto.cnf和自动生成的.pem文件(我们没有使用SSL连接到MySQL,所以它们不应该特别重要)。lvremove快照。CHANGE MASTER提供MASTER_LOG_FILE和MASTER_LOG_POS选项,然后等待副本赶上。我对这个过程进行了测试,以便在无流量的暂存服务器上工作,但我主要关注的是实际生产实例上的FLUSH TABLES WITH READ LOCK。这是否足以阻止长期运行的SELECTs,还是我需要意识到的其他危险?任何试图写入的客户端都会在锁就位时自然失败,但目标是在30秒内完成步骤1-4,这对我们来说是可以接受的部分中断。
而且,由于我们运行的是混合的MyISAM和InnoDB,FLUSH TABLES WITH READ LOCK是我们所需要做的全部,还是其中的一个引擎需要更多的东西来确保LVM快照的一致性?
发布于 2022-04-22 16:45:45
有读锁的同花顺表就足够了。这会锁定表,从而防止新的写入,并且还确保将对表的任何其他写操作刷新到MyISAM表的磁盘卷。对于InnoDB表,一些更改可能仍然存在于缓冲池中,但这些更改也由InnoDB重做日志负责,因此当您启动副本时,这些更改将自动恢复(这与InnoDB崩溃恢复相同)。
在读取锁期间使用SHOW状态是必要的,因为您需要在副本上为您的CHANGE命令提供这些坐标。它基本上类似于书签,所以副本知道从哪里开始读取二进制日志。
听取有关长期运行的查询用读锁阻塞同花顺表的建议仍然很重要。任何查询,即使是只读选择,都会在表上保存元数据锁。但是FTWRL不需要在任何表上持有元数据锁,至少是短暂的。因此,长时间运行的选择将阻止FTWRL。您可以在MySQL的一个测试实例上做一个实验来演示这一点:
在一个窗口中,创建一个MyISAM表:
mysql> create table test.m (i int) engine=myisam;
mysql> insert into test.m values (42);以一种持续一段时间的方式查询它:
mysql> select sleep(120) from m;
(hangs)在第二个窗口中,尝试FTWRL:
mysql> flush tables with read lock;
(hangs)FTWRL正在等待该查询的完成,因此FTWRL可以在元数据锁上得到它自己的回合。如果该查询需要很长时间才能完成,那么FTWRL仍然在等待,而且任何其他查询都会排队等待FTWRL释放所有表上的元数据锁。
Percona在他们的MySQL版本中添加了一个特性来帮助解决这些问题。它是一种在备份期间使用的锁,它不受这种阻塞行为的影响。如果您感兴趣,请阅读https://www.percona.com/blog/2014/03/11/introducing-backup-locks-percona-server-2/获取详细信息,但如果使用主流MySQL,则没有此功能。
考虑到InnoDB表和MyISAM表的混合,LVM快照方法是一个很好的解决方案,因为锁可以简单地完成,只需足够长的时间来获取LVM快照并读取主状态。
我习惯于使用Percona XtraBackup,它不需要锁定,只要数据库只存储InnoDB表(除了mysql表,它们非常小,所以在简短的读锁期间备份它们不是问题)。我倾向于坚持所有表都存储在InnoDB中。MyISAM性能差,易受数据损坏的影响。
https://dba.stackexchange.com/questions/311238
复制相似问题