从原始主文件恢复 mysql 从站,而不是 mysql 转储?

Restoring a mysql slave from raw Master files, instead of mysqldump?

我的数据库从属文件已损坏(磁盘阵列丢失),现在我们在尝试恢复时卡住了。数据库相当大(每个 100GB),在处理一整天后,使用 mysqldump 图像会在 40GB 到 69GB 的任何地方崩溃。我们已经尝试过单独的数据库,但我们一直遇到类似的问题。重新加载数据库需要很长时间,我正在寻找使用主服务器的 "raw files" 创建从服务器的指导。

我能够获得维护停机时间批准,以便从主服务器上克隆整个 /var/lib/mysql,我需要知道哪些数据文件不能复制到我的从服务器上。我会承担一切。 "slave" 只丢失了数据 (/data/lib/mysql) 而没有丢失任何其他内容。我已经在 slave 的 my.conf 中启用了 "skip-slave-start",所以它不会很快同步。我还收集了主数据信息,而所有项目都被锁定了,所以我也有这些细节。

那么,在我尝试重新启动从属服务器的 mysqld 以及稍后启动从属服务器之前,/var/lib/mysql 中主从服务器之间应该 不同 的是什么?

您将需要 /var/lib/mysql 的 全部 ,并且在以下情况下您不需要任何停机时间:

1) 你所有的 mysql 文件包括二进制日志和事务日志都在 /var/lib/mysql 和

2) 您在 LVM 上有 /var/lib/mysql(或在 ZFS 上更好)

确保您是 运行 安全设置(flush_logs_at_trx_commit=1,sync_binlog=1)。

假设你在 ZFS 上 data/mysql 安装在 /var/lib/mysql 上(因为我不记得肌肉记忆中的 LVM 咒语),你会做这样的事情:

$ sudo mysql
mysql> FLUSH TABLES WITH READ LOCK;
mysql> \! sync
mysql> \! zfs snapshot data/mysql@transfer
mysql> UNLOCK TABLES;

将上面的 "zfs snapshot" 行替换为您系统的相关 LVM 快照命令。

您现在可以使用 tar(或 zfs 发送)通过 netcat 或 ssh 传输该快照的内容。

在 target 上完全清除 /var/lib/mysql,然后再恢复。

删除 /var/lib/mysql/master.info 在 tar 恢复后得到。

在你 start mysqld.

之前记下最新的 binlog 名称和大小

可选但推荐:在 target 服务器上的 my.cnf 中设置 read_only=1。

现在 start mysqld。 运行:

CHANGE MASTER TO ... MASTER_LOG_FILE='<name of latest binlog you noted earlier>', MASTER_LOG_POS=<size if binlog you noted above>;
START SLAVE;

您新重新初始化的从站现在应该启动并正在复制。