背景
我想设置一个 mariadb 副本服务器,它将复制现有的实时 mariadb 服务器——目标是拥有现有服务器的热备用副本。
我的理解
按照文档中的设置复制指南,在“获取主站的二进制日志坐标”段落中,我阅读了(列表描述了更多步骤,我保留了我有问题的3个,重点是也是我的):
- 在主服务器上,通过运行 FLUSH TABLES WITH READ LOCK 来刷新并锁定所有表。保持此会话运行 - 退出它将释放锁定。
[...]- 现在,在锁仍然存在的情况下,将数据从主机复制到从机。有关如何执行此操作的详细信息,请参阅备份、恢复和导入。
- 数据复制完成后,您可以通过运行 UNLOCK TABLES 来释放主服务器上的锁定。
此过程建议基本上暂停主数据库上的活动(至少是写入活动)以初始化副本端的数据库。
我的问题
有没有一种方法可以初始化副本而不锁定主数据库以实现数据的完整转储+加载?
例如,如果一个工具能够:
然后我可以使用
MASTER_USE_GTID = slave_pos
指示副本开始复制。
xtrabackup
和 mariabackup
声称能够从实时服务器备份数据库,他们是否也能够设置正确的同步点以从该备份启动副本?
我们正在 debian bookworm 系统上使用 MariaDB 10.11.6。
MariaDB 知识库上的使用 Mariabackup 设置副本文章描述了使用
mariadbackup
设置副本的过程。
$ mariabackup --backup --target-dir=/var/mariadb/backup/ \
--user=mariabackup --password=mypassword
$ rsync -avP /var/mariadb/backup dbserver2:/var/mariadb/backup
$ mariabackup --copy-back --target-dir=/var/mariadb/backup/
$ chown -R mysql:mysql /var/lib/mysql/
CREATE USER 'repl'@'dbserver2' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'dbserver2';
可以通过检查
xtrabackup_binlog_info
文件找到复制的起始位置,其中最后一个值是备份的 GTID 位置。
# The last value (0-1-2) is the GTID position
$ cat xtrabackup_binlog_info
mariadb-bin.000096 568 0-1-2
然后可以使用以下命令设置复制:
-- This value is from the xtrabackup_binlog_info
SET GLOBAL gtid_slave_pos = "0-1-2";
-- This configures replication
CHANGE MASTER TO
MASTER_HOST="dbserver1",
MASTER_PORT=3306,
MASTER_USER="repl",
MASTER_PASSWORD="password",
MASTER_USE_GTID=slave_pos;
-- This starts replication
START SLAVE;