从原始主文件恢复mysql从文件,而不是mysqldump



我的DB从属服务器的文件已损坏(丢失磁盘阵列(,现在我们在尝试恢复时被卡住了。数据库相当大(每个100GB(,使用mysqldump映像在经过一整天的处理后,会崩溃,从40GB到69GB不等。我们尝试过个别数据库,但一直存在类似的问题。事实上,重新加载DB需要很长时间,我正在寻找使用主文件中的"原始文件"创建从文件时的指导。

我能够获得维护停机时间的批准,从主文件中克隆出整个/var/lib/mysql,我需要知道不应该从这些数据文件复制到我的从属文件中。我会假设一切。"slave"只丢失了数据(/data/lib/mysql(,而没有其他任何东西。我已经在slave的my.conf中启用了"跳过slave启动",所以它不会很快同步。我还收集了主数据信息,而所有项目都被锁定了,所以我也有这些细节。

那么,在我尝试重新启动slave的mysqld以及稍后启动slave之前,/var/lib/mysql中主控和从控之间应该有什么不同的呢?

您将需要/var/lib/mysql的整个,并且如果:

1( 所有的mysql文件,包括binlog和事务日志,都在/var/lib/mysql中和

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

确保使用安全设置运行(flush_logs_at_trx_commit=1,sync_binlog=1(。

假设你在ZFS上,数据/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 snapshot命令。

现在,您可以使用tar(或zfs-send(通过netcat或ssh传输快照的内容。

在恢复之前完全清除目标上的/var/lib/mysql。

恢复后删除目标上的/var/lib/mysql/master.info。

在启动mysqld之前,请注意最新的binlog名称和大小。

可选但建议:在目标服务器上的my.cnf中设置read_only=1。

现在启动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;

您新重新初始化的从属服务器现在应该已启动并正在复制。

最新更新