How to re-sync the Mysql DB if Master and slave have different database incase of Mysql replication?

Mysql Server1 is running as MASTER.
Mysql Server2 is running as SLAVE.

Now DB replication is happening from MASTER to SLAVE.

Server2 is removed from network and re-connect it back after 1 day. After this there is mismatch in database in master and slave.

How to re-sync the DB again as after restoring DB taken from Master to Slave also doesn't solve the problem ?

283734 次浏览

我认为,Maatkit 实用程序可以帮助你! 你可以使用 mk-table-sync。请看这个链接: http://www.maatkit.org/doc/mk-table-sync.html

除非您直接写入从服务器(Server2) ,否则唯一的问题应该是 Server2缺少自断开连接以来发生的任何更新。只需使用“ START SLAVE;”重新启动从服务器,就可以让所有事情恢复到最快速度。

当 mysql 从属程序失去同步时,我通常会这样做。我看过 mk-table-sync,但觉得风险板块看起来很吓人。

关于主人:

SHOW MASTER STATUS

输出的列(文件,位置)将对我们有用的位。

关于奴隶:

STOP SLAVE

然后转储主数据库并将其导入到从数据库。

然后运行以下命令:

CHANGE MASTER TO
MASTER_LOG_FILE='[File]',
MASTER_LOG_POS=[Position];
START SLAVE;

其中[ File ]和[ Position ]是上面运行的“ SHOW MASTER STATUS”输出的值。

希望这个能帮上忙!

这是从头开始重新同步主从复制的完整步骤:

在主人面前:

RESET MASTER;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

还有最后一个命令的 复制结果的值

在不关闭到客户端的连接(因为它会释放读锁)的情况下,发出命令来获取主服务器的转储:

mysqldump -u root -p --all-databases > /a/path/mysqldump.sql

现在你可以打开锁了,即使转储还没有结束。为此,请在 MySQL 客户端中执行以下命令:

UNLOCK TABLES;

现在,使用 scp 或您首选的工具将转储文件复制到从文件。

对着奴隶:

打开到 mysql 的连接并键入:

STOP SLAVE;

使用以下控制台命令加载 master 的数据转储:

mysql -uroot -p < mysqldump.sql

同步从日志和主日志:

RESET SLAVE;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;

其中上述字段的值是您之前复制的值。

最后,输入:

START SLAVE;

在输入以下命令后,检查一切是否正常:

SHOW SLAVE STATUS;

你应该看到:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

就是这样!

这里有一个完整的答案,希望能帮助其他人..。


我想设置 mysql 复制使用主机和从机,因为我唯一知道的是它使用日志文件来同步,如果从机脱机并失去同步,在理论上,它应该只需要连接回它的主机,并继续读日志文件从它停止,正如用户 malonso 提到。

下面就是 http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html提到的主从配置后的测试结果。

如果您使用推荐的主/从配置,并且不写到从配置,那么他和我就是对的(就 mysql-server 5.x 而言)。我甚至不需要使用“ START SLAVE;”,它只是追上了它的主人。但是有一个默认的88000东西每60秒重试一次,所以我猜想,如果你耗尽,你可能不得不启动或重新启动从。无论如何,对于那些像我一样想知道是否有一个奴隶关闭和备份再次需要手动干预。.不,不是的。

也许原来的海报在日志文件中有损坏?但最有可能的不仅仅是一台服务器停机一天。


从/usr/share/doc/mysql-server-5.1/README.Debian.gz 获取,这对非 debian 服务器可能也有意义:

* FURTHER NOTES ON REPLICATION
===============================
If the MySQL server is acting as a replication slave, you should not
set --tmpdir to point to a directory on a memory-based filesystem or to
a directory that is cleared when the server host restarts. A replication
slave needs some of its temporary files to survive a machine restart so
that it can replicate temporary tables or LOAD DATA INFILE operations. If
files in the temporary file directory are lost when the server restarts,
replication fails.

您可以使用 sql 比如: 显示诸如“ tmpdir”之类的变量;来查找。

根据大卫的回答。

使用 SHOW SLAVE STATUS\G将提供人类可读的输出。

增加这个错误的流行答案:

"ERROR 1200 (HY000): The server is not configured as slave; fix in config file or with CHANGE MASTER TO",

从奴隶一次性复制:

在一个终端窗口中:

mysql -h <Master_IP_Address> -uroot -p

连接之后,

RESET MASTER;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

状态显示如下: 请注意,位置数量变化!

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      98  | your_DB      |                  |
+------------------+----------+--------------+------------------+

导出类似于他所描述的“ 使用另一个终端”的转储文件!

退出并连接到您自己的数据库(也就是从数据库) :

mysql -u root -p

输入以下命令:

STOP SLAVE;

导入前面提到的 Dump (当然是在另一个终端中)并键入以下命令:

RESET SLAVE;
CHANGE MASTER TO
MASTER_HOST = 'Master_IP_Address',
MASTER_USER = 'your_Master_user', // usually the "root" user
MASTER_PASSWORD = 'Your_MasterDB_Password',
MASTER_PORT = 3306,
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 98; // In this case

记录日志后,设置 server _ id 参数(通常,对于新的/未复制的 DBs,默认情况下不设置这个参数) ,

set global server_id=4000;

现在,启动奴隶。

START SLAVE;
SHOW SLAVE STATUS\G;

输出应该与他描述的一样。

  Slave_IO_Running: Yes
Slave_SQL_Running: Yes

注意: 一旦复制,主机和从机共享相同的密码!

MySQL 站点上关于这个问题的文档已经过时了,而且充斥着各种各样的问题(比如 Interactive _ timeout)。将 FLUSH TABLES WITHREADLOCK 作为主导出的一部分,通常只有在与存储/文件系统快照(如 LVM 或 zfs)协调时才有意义。

如果要使用 mysqldump,则应该依靠—— master-data 选项来防止人为错误,并尽快释放主数据上的锁。

假设主服务器是192.168.100.50,从服务器是192.168.100.51,每个服务器配置了不同的服务器 ID,主服务器有二进制登录,从服务器在 my.cnf 中只读 = 1

为了使从服务器能够在导入转储之后立即开始复制,请发出 CHOGE MASTER 命令,但是省略日志文件名和位置:

slaveserver> CHANGE MASTER TO MASTER_HOST='192.168.100.50', MASTER_USER='replica', MASTER_PASSWORD='asdmk3qwdq1';

向主人发放补助金,供奴隶使用:

masterserver> GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.100.51' IDENTIFIED BY 'asdmk3qwdq1';

使用压缩导出主控(在屏幕上)并自动捕获正确的二进制日志坐标:

mysqldump --master-data --all-databases --flush-privileges | gzip -1 > replication.sql.gz

将 plication.sql.gz 文件复制到从属文件,然后用 zcat 将其导入到在从属文件上运行的 MySQL 实例:

zcat replication.sql.gz | mysql

通过向从属服务器发出命令开始复制:

slaveserver> START SLAVE;

可以选择更新从机上的/root/. my.cnf,以存储与主机相同的 root 密码。

如果是在5.1 + 上,最好首先将 master 的 binlog _ format 设置为 MIXED 或 ROW。请注意,对于缺少主键的表,行日志记录的事件速度很慢。这通常比 blog _ format = statement (on master)的替代(和默认)配置要好,因为它不太可能在从服务器上生成错误的数据。

如果必须(但可能不应该)筛选复制,那么使用从选项 copy-wild-do-table = dbname.% 或 copy-wild-恨-table = badDB.% 进行筛选,并且只使用 binlog _ format = row

这个过程将在 mysqldump 命令期间对主服务器持有一个全局锁,但不会影响主服务器。

如果您想使用 mysqldump —— master-data —— all-database —— single-action (因为您只使用 InnoDB 表) ,那么使用 MySQL Enterprise Backup 或称为 xtrabackup 的开源实现(由 Percona 提供)可能会更好

有时候你也需要给奴隶一脚

试试看

stop slave;
reset slave;
start slave;
show slave status;

很多时候,奴隶,他们只是卡住了家伙:)

我用一个脚本创建了一个 GitHub 回购来快速解决这个问题。只需更改几个变量并运行它(首先,脚本创建数据库的备份)。

我希望这能帮助你(和其他人)。

如何重置(重新同步) MySQL 主从复制

使用 LVM 重新构建从服务器

下面是我们使用 Linux LVM 重新构建 MySQL 从服务器的方法。这保证了一致的快照,同时对主服务器的停机时间要求非常少。

在主 MySQL 服务器上将 inodb max 脏页面百分比设置为零。这将迫使 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 _ fast 将是新的逻辑卷名。如果在操作系统驱动器上放置了副日志,那么这些副日志也需要快照。

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

用命令再次启动主人

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 *

现在将快照同步到 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;

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

我最近在我的博客上写了这篇文章,可以在这里找到... ... 那里有一些更多的细节,但是故事是一样的。

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

对于这个问题我已经很晚了,但是我确实遇到了这个问题,经过多次搜索,我从布莱恩 · 肯尼迪那里找到了这个信息: http://plusbryan.com/mysql-replication-without-downtime

在主人身上采取这样的备份:
Mysqldump ——跳过锁表——单个事务——刷新日志——十六进制块—— master-data = 2-A > ~/dump. sql

现在,检查文件的头部并记下 MASTER _ LOG _ FILE 和 MASTER _ LOG _ POS 的值。你以后会需要它们的: Head dump. sql-n80 | grep“ MASTER _ LOG”

将“ dump p.sql”文件复制到 Slave 并还原它: Mysql-u mysql-user-p < ~/dump. sql

连接到 Slavemysql 并运行如下命令: 将 MASTER 改为 MASTER _ HOST = “ MASTER-server-ip”,MASTER _ USER = “ copy-user”,MASTER _ PASSWORD = “ SLAVE-server-password”,MASTER _ LOG _ FILE = “ value from above”,MASTER _ LOG _ POS = value from above;

为了检查奴隶的进度: 显示奴隶状态;

如果一切正常,Last _ Error 将为空,Slave _ IO _ State 将报告“等待主发送事件”。 查找“秒落后”,这表示它落后了多少。 YMMV:)

我们正在使用 MySQL 的主-主复制技术,如果一个 MySQL 服务器说1被从网络中删除,它将在连接恢复后重新连接自己,并且在服务器2中提交的所有记录在网络中被传输到服务器1,该服务器在恢复后失去了连接。 默认情况下,MySQL 中的从线程每隔60秒重新尝试连接到它的主线程。此属性可以更改为 MySQL 标记“ master _ connect _ retry = 5”,其中5以秒为单位。这意味着我们需要每5秒钟重试一次。

但是,当您得到重复的键错误错误代码: 1062时,您需要确保失去连接的服务器不会在数据库中进行任何提交

大师 :

mysqldump -u root -p --all-databases --master-data | gzip > /tmp/dump.sql.gz

将转储文件移动到从服务器

奴隶: 强壮

STOP SLAVE;

zcat /tmp/dump.sql.gz | mysql -u root -p

START SLAVE;
SHOW SLAVE STATUS;

注意 :
在主机上,你可以运行 SET GLOBAL expire_logs_days = 3来保持3天的记录,以防出现从站问题。