从头重建 mysql 从属

从头重建 mysql 从属

我有一个主/从 mysql 设置。今天晚上,我的主服务器出现了一些问题。我需要重新创建所有数据库,因为它们已损坏。

现在我停止了 mysql 从服务器,但想重新启动它并从头开始重建所有内容。 有办法吗? 无需锁定主服务器...

我还认为应该重置 binlog 文件。这样一切都会恢复正常。

有任何想法吗?

答案1

如果你在主服务器上使用 innodb 引擎 - 只需使用 mysqldump--skip-lock-tables--单笔交易--主数据=2开关。

如果你的从站只是逻辑上损坏——尝试pt-表同步使用 lock=0 选项

答案2

以下是使用 Linux LVM 快照从主服务器重建 MySQL 从服务器的分步说明。当您无法承受太多停机时间来将二进制文件复制到从服务器时,这是理想的方法。还有其他方法可以做到这一点,但我总是质疑从服务器的一致性。我从从服务器获取备份,因此我绝对需要确保我的快照始终一致。

将 innodb max dirty pages percent 设置为零。这将强制 MySQL 将所有页面写入磁盘,从而显著加快重启速度。

set global innodb_max_dirty_pages_pct = 0;

要监视脏页的数量,请运行命令

mysqladmin ext -i10 | grep dirty

一旦数字停止减少,您就到达了继续的点。接下来重置主服务器以清除旧的 bin 日志/中继日志:

RESET MASTER;

执行 lvdisplay 获取 LV 路径

lvdisplay

输出将如下所示

--- Logical volume ---
LV Path                /dev/vg_mysql/lv_data
LV Name                lv_data
VG Name                vg_mysql

使用命令关闭主数据库

service mysql stop

接下来拍摄快照,mysql_snapshot 将是新的逻辑卷名称。如果 binlog 位于 OS 驱动器上,则也需要拍摄快照。

lvcreate --size 10G --snapshot --name mysql_snapshot /dev/vg_mysql/lv_data

使用命令重新启动 master

service mysql start

将脏页设置恢复为默认设置

set global innodb_max_dirty_pages_pct = 75;

再次运行 lvdisplay 以确保快照存在且可见

lvdisplay

输出:

--- Logical volume ---
LV Path                /dev/vg_mysql/mysql_snapshot
LV Name                mysql_snapshot
VG Name                vg_mysql

挂载快照

mkdir /mnt/mysql_snapshot
mount /dev/vg_mysql/mysql_snapshot /mnt/mysql_snapshot

如果你有一个现有的 MySQL 从属服务器正在运行,你需要停止它

service mysql stop

接下来你需要清除 MySQL 数据文件夹

cd /var/lib/mysql
rm -fr *

返回主服务器。现在将快照 rsync 到 MySQL 从服务器

rsync --progress -harz /mnt/mysql_snapshot/ targethostname:/var/lib/mysql/

rsync 完成后,您可以卸载并删除快照

umount /mnt/mysql_snapshot
lvremove -f /dev/vg_mysql/mysql_snapshot

如果旧复制用户不存在或密码未知,则在主服务器上创建复制用户

GRANT REPLICATION SLAVE on *.* to 'replication'@'[SLAVE IP]' identified by 'YourPass';

验证 /var/lib/mysql 数据文件是否归 mysql 用户所有,如果是,则可以省略以下命令:

chown -R mysql:mysql /var/lib/mysql

接下来记录binlog位置

ls -laF | grep mysql-bin

你会看到类似

..
-rw-rw----     1 mysql mysql  1073750329 Aug 28 03:33 mysql-bin.000017
-rw-rw----     1 mysql mysql  1073741932 Aug 28 08:32 mysql-bin.000018
-rw-rw----     1 mysql mysql   963333441 Aug 28 15:37 mysql-bin.000019
-rw-rw----     1 mysql mysql    65657162 Aug 28 16:44 mysql-bin.000020

这里,主日志文件是序列中最高的文件编号,而 bin 日志位置是文件大小。记录这些值:

master_log_file=mysql-bin.000020
master_log_post=65657162

接下来启动从属 MySQL

service mysql start

通过执行以下操作在从属服务器上执行更改主服务器命令:

CHANGE MASTER TO 
master_host="10.0.0.12", 
master_user="replication", 
master_password="YourPass", 
master_log_file="mysql-bin.000020", 
master_log_pos=65657162; 

最后启动从属

SLAVE START;

检查从站状态:

SHOW SLAVE STATUS\G

确保 Slave IO 正在运行,并且没有连接错误。祝你好运!

有关更多信息,请参阅我的完整博客文章:

http://www.juhavehnia.com/2015/05/rebuilding-mysql-slave-using-linux-lvm.html

答案3

请按照以下步骤操作:

  • 断开从属和主控
  • 只需从从属数据库中删除所有数据库
  • 使用单事务从主服务器转储数据
  • 在从属设备上使用转储
  • 重新连接主从,并等待同步

相关内容