问题
我在两台服务器之间设置了 MySQL 复制,主服务器(A)和奴隶(乙我需要添加一个新的从属设备(C)。我希望此从服务器直接从主服务器获取更新,我不希望从从服务器进行链式复制。但是,主服务器是“热的”,我通常使用 Xtrabackup 创建主服务器的完整备份,但这会将其锁定 10 分钟,因为数据库大小约为 20GB。
可能的解决方案
在从属服务器上刷新表并锁定读乙,使用 SHOW SLAVE STATUS乙,记录binlog和位置。然后用Xtrabackup备份数据库,将备份发送到C并使用它来创建从属,并设置复制以指向A与我刚刚记下的binlog位置一致。
问题
有没有更好的方法,不需要我锁定乙这么长时间?还是更容易实现自动化?
答案1
嘿,我知道一个疯狂的方法来创建一个从服务器,而无需增加主服务器(服务器A)或从服务器(服务器B)的任何操作
步骤 1)设置新服务器(ServerC)
步骤2)在ServerC上安装MySQL(与ServerB相同的版本)
步骤 3)在 ServerC 上,service mysql stop
步骤4)将/etc/my.cnf从ServerB复制到ServerC
步骤5)在ServerC上,将server_id更改为与ServerA和ServerB不同的值
步骤 6)将 ServerB 上的 /var/lib/mysql rsync 到 ServerC
步骤7)当rsync完成后,在ServerB上运行“STOP SLAVE;”
步骤 8)将 ServerB 上的 /var/lib/mysql rsync 到 ServerC
步骤9)在ServerB上,运行“START SLAVE;”
步骤 10)在 ServerC 上,启动 mysql 服务
步骤11)在 ServerC 上,运行“START SLAVE;”(如果 skip-slave-start 位于 /etc/my.cnf 中,则执行此操作)
试一试 !!!
顺便说一句,我非常有信心这会成功,因为我在过去两天里刚刚为客户做了这件事。客户在从服务器上有 2.7TB 的数据。我在从服务器仍处于活动状态时 rsyncd 到另一台服务器。rsync 花了 11 个小时。然后我在第一个从服务器上运行 STOP SLAVE; 并再次运行 rsync。这又花了一个小时。然后我执行了上述步骤,一切都完成了。
答案2
当我们向混合中添加从属设备时,我们会执行以下操作:
- 使一个从站脱机
- 将数据库数据目录复制到新的从属服务器(从属服务器设置 - binlog 位置、主机等 - 因为我们是从从属服务器复制的,所以是正确的)
- 启动原来的从站
- 修改 my.cnf 中新从站的 server-id
- 启动新的从站
答案3
我做了什么@RolandoMySQLDBA建议,但也添加6'和8'步骤(这解决了什么@侯赛因·坦博利评论。):
步骤 1)设置新服务器(ServerC)
步骤2)在ServerC上安装MySQL(与ServerB相同的版本)
步骤 3)在 ServerC 上,service mysql stop
步骤4)将/etc/my.cnf从ServerB复制到ServerC
步骤5)在ServerC上,将server_id更改为与ServerA和ServerB不同的值
步骤 6)将 ServerB 上的 /var/lib/mysql rsync 到 ServerC
步骤 6')rsync /var/日志ServerB 上的 /mysql 到 ServerC
步骤7)当rsync完成后,在ServerB上运行“STOP SLAVE;”
步骤 8)将 ServerB 上的 /var/lib/mysql rsync 到 ServerC
步骤 8')rsync /var/日志ServerB 上的 /mysql 到 ServerC
步骤9)在ServerB上,运行“START SLAVE;”
步骤 10)在 ServerC 上,启动 mysql 服务
步骤11)在 ServerC 上,运行“START SLAVE;”(如果 skip-slave-start 位于 /etc/my.cnf 中,则执行此操作)
答案4
我尝试了 Rolando 的答案并且工作正常,但它从头开始重播,我不得不添加更多错误代码来跳过(我知道不推荐这样做,但我知道自己在做什么)。
完成第 7 步后,我检查了 mysql 日志并记下了 bin 日志名称和位置,然后继续执行第 9 步。在第 10 步之前,我仅执行了change master
日志文件和日志位置。然后从第 11 步继续。一切看起来都很好。