首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于LVM快照的MySQL复制设置--我忘了什么吗?

问基于LVM快照的MySQL复制设置--我忘了什么吗?
EN

Database Administration用户
提问于 2022-04-22 14:37:46
回答 1查看 136关注 0票数 3

我的任务是启动客户端MySQL 5.7.35数据库服务器的全新副本。虽然我在过去观察过其他人在不同的情况下这样做,但我以前从未负责过这个手术,所以我只想确认我的计划是正确的,我没有遗漏任何重要的东西。

数据驻留在XFS格式的LVM逻辑卷中,它位于一个卷组中,该卷组有足够的空闲空间,可以拍摄LVM快照。

该数据库是传统的MyISAM和InnoDB表的混合体,目前的大小超过200 GB。副本服务器是用相同的MySQL版本设置的,以及基于行的二进制日志复制的所有先决条件(复制用户、服务器ID、log_bin等)。都井井有条。

我的过程是:

  1. 在主机上运行FLUSH TABLES WITH READ LOCK。保持客户端会话处于打开状态。
    • 根据珀科纳的说法,重要的是避免长期运行的SELECT查询在运行时处于执行过程中,因此我们将努力确保这一点。

  2. 在另一个客户端会话中(不知道为什么,但文档会这么说),运行SHOW MASTER STATUS来获取binlog文件名和位置。
  3. 从MySQL数据卷创建LVM快照。(不包含绑定日志或中继日志。)
  4. 在原始MySQL客户端会话中,运行UNLOCK TABLES以恢复正常操作。
  5. 将快照(-t xfs -o nouuid)和数据目录( rsync )从它加载到(关闭的)副本服务器--不包括auto.cnf和自动生成的.pem文件(我们没有使用SSL连接到MySQL,所以它们不应该特别重要)。
  6. 卸载并lvremove快照。
  7. 在副本上启动MySQL,并执行MySQL文档中概述的正常的binlog复制初始化步骤,使用步骤2中的值向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快照的一致性?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2022-04-22 16:45:45

有读锁的同花顺表就足够了。这会锁定表,从而防止新的写入,并且还确保将对表的任何其他写操作刷新到MyISAM表的磁盘卷。对于InnoDB表,一些更改可能仍然存在于缓冲池中,但这些更改也由InnoDB重做日志负责,因此当您启动副本时,这些更改将自动恢复(这与InnoDB崩溃恢复相同)。

在读取锁期间使用SHOW状态是必要的,因为您需要在副本上为您的CHANGE命令提供这些坐标。它基本上类似于书签,所以副本知道从哪里开始读取二进制日志。

听取有关长期运行的查询用读锁阻塞同花顺表的建议仍然很重要。任何查询,即使是只读选择,都会在表上保存元数据锁。但是FTWRL不需要在任何表上持有元数据锁,至少是短暂的。因此,长时间运行的选择将阻止FTWRL。您可以在MySQL的一个测试实例上做一个实验来演示这一点:

在一个窗口中,创建一个MyISAM表:

代码语言:javascript
复制
mysql> create table test.m (i int) engine=myisam;
mysql> insert into test.m values (42);

以一种持续一段时间的方式查询它:

代码语言:javascript
复制
mysql> select sleep(120) from m;
(hangs)

在第二个窗口中,尝试FTWRL:

代码语言:javascript
复制
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性能差,易受数据损坏的影响。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/311238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档