我有一个主/从 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
请按照以下步骤操作:
- 断开从属和主控
- 只需从从属数据库中删除所有数据库
- 使用单事务从主服务器转储数据
- 在从属设备上使用转储
- 重新连接主从,并等待同步