如果Master和Slave有不同的数据库备份Mysql复制,如何重新同步Mysql DB?

Mysql Server1正在作为MASTER运行。
Mysql Server2作为SLAVE运行。

现在数据库复制正在发生从MASTERSLAVE

Server2将从networking中删除,并在1天后重新连接。 在这之后,主站和从站的数据库就会出现不匹配。

如何恢复数据库再次同步恢复数据库采取从主到从也没有解决问题?

这是从零开始重新同步主从复制的完整分步过程:

主人:

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

并将最后一个命令的结果的值复制到某个地方。

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

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

现在即使转储尚未结束,您仍可以释放locking。 要做到这一点,请在MySQL客户端执行以下命令:

 UNLOCK TABLES; 

现在使用scp或您喜欢的工具将转储文件复制到从属。

在奴隶:

打开一个到mysql的连接并input:

 STOP SLAVE; 

使用此控制台命令加载主数据转储:

 mysql -uroot -p < mysqldump.sql 

同步从站和主日志:

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

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

最后,input:

 START SLAVE; 

要检查一切是否正常工作,键入后:

 SHOW SLAVE STATUS; 

你应该看到:

 Slave_IO_Running: Yes Slave_SQL_Running: Yes 

而已!

这个在MySQL网站上的文档是过时的,充满了脚步枪(比如interactive_timeout)。 作为主导出口的一部分,使用READ LOCK发布FLUSH TABLES通常只有在与LVM或zfs等存储/文件系统快照协调时才有意义。

如果您打算使用mysqldump,则应该依靠–master-data选项来防止人为错误,并尽快释放主控锁。

假设主机为192.168.100.50,从机为192.168.100.51,每台服务器都configuration了不同的服务器标识,主机已经二进制login,从机在my.cnf中只读= 1

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

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

在主设备上发出GRANT以供从设备使用:

 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 

将replication.sql.gz文件复制到从属设备,然后使用zcat将其导入到从设备上运行的MySQL实例中:

 zcat replication.sql.gz | mysql 

通过向从站发出命令启动复制:

 slaveserver> START SLAVE; 

(可选)更新从服务器上的/root/.my.cnf以存储与主服务器相同的根密码。

如果你是5.1+,最好先把master的binlog_format设置为MIXED或者ROW。 请注意,对于缺less主键的表,行logging的事件速度较慢。 这通常比binlog_format = statement(在master上)的替代(和默认)configuration要好,因为在slave上产生错误的数据的可能性较小。

如果您必须(但可能不应该)过滤复制,请使用从属选项来复制replicate-wild-do-table = dbname。%或replicate-wild-ignore-table = badDB。%并仅使用binlog_format = row

这个进程将在mysqldump命令的持续时间内对主进程进行全局locking,但不会影响主进程。

如果您想使用mysqldump –master-data –all-databases –single-transaction(因为您只使用InnoDB表),您可能更好地使用MySQL Enterprise Backup或称为xtrabackup的开源实现Percona的)

除非您直接写入从站(Server2),否则唯一的问题应该是Server2缺less自断开以来发生的任何更新。 只需用“START SLAVE”重新启动从站 应该让所有的东西都回来加速。

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

这是我通常做的,当一个MySQL奴隶不同步。 我已经看了mk表同步,但认为风险部分是可怕的看。

主人:

 SHOW MASTER STATUS 

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

在奴隶:

 STOP SLAVE 

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

然后运行以下内容:

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

其中[文件]和[位置]是从上面运行的“SHOW MASTER STATUS”输出的值。

希望这可以帮助!

跟随大卫的回答…

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

有时你只需要给奴隶一个踢就可以了

尝试

停止奴隶;
复位从机;
开始奴隶;
显示奴隶状态;

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

我对这个问题已经很晚了,但是我确实遇到了这个问题,经过多次search,我发现了Bryan Kennedy的这个信息: http : //plusbryan.com/mysql-replication-without-downtime

在Master上采取这样的备份:
mysqldump –skip -lock-tables –single-transaction –flush-logs –hex-blob –master-data = 2 -A>〜/ dump.sql

现在,检查文件头并记下MASTER_LOG_FILE和MASTER_LOG_POS的值。 稍后您将需要它们: head dump.sql -n80 | grep“MASTER_LOG”

将“dump.sql”文件复制到Slave并恢复: mysql -u mysql-user -p <〜/ dump.sql

连接到从机mysql并运行如下命令: CHANGE MASTER TO MASTER_HOST ='master-server-ip',MASTER_USER ='replication-user',MASTER_PASSWORD ='slave-server-password',MASTER_LOG_FILE ='value from above', MASTER_LOG_POS =上面的值; START SLAVE;

检查从属进程: SHOW SLAVE STATUS;

如果一切正常,Last_Error将为空白,并且Slave_IO_State将报告“等待主控发送事件”。 findSeconds_Behind_Master,表明它背后有多远。 因人而异。 🙂

这是一个完整的答案,希望可以帮助别人…


我想使用主从设置mysql复制,因为我唯一知道的是它使用日志文件进行同步,如果从服务器脱机并且不同步,理论上它应该只需要连接回到它的主人,并不断从中断的地方读取日志文件,正如用户malonso提到的。

所以这里是testing结果在configuration主和奴隶之后提到: http : //dev.mysql.com/doc/refman/5.0/en/replication-howto.html …

如果使用推荐的主/从configuration,而不写入从服务器,那么他和我就在哪里(就mysql-server 5.x而言)。 我甚至不需要使用“START SLAVE”,只是赶上了它的主人。 但有一个默认的88000东西每60秒重试,所以我想如果你用尽,你可能不得不启动或重新启动奴隶。 无论如何,对于像我这样的人想知道是否有一个奴隶离线和备份需要人工干预..不,它不。

也许原来的海报在日志文件中有腐败? 但最有可能的不只是一台服务器在一天之内脱机。


从/usr/share/doc/mysql-server-5.1/README.Debian.gz中拉出来,这对于非Debian服务器来说也是有意义的:

  *关于复制的进一步注意事项
 ===============================
如果MySQL服务器充当复制从服务器,则不应该这样做
将--tmpdir设置为指向基于内存的文件系统上的目录
服务器主机重新启动时清除的目录。 复制
奴隶需要一些临时文件,以保持机器重新启动
它可以复制临时表或LOAD DATA INFILE操作。 如果
服务器重新启动时,临时文件目录中的文件将丢失,
复制失败。

你可以使用像SQL一样的东西: 显示variables像'tmpdir'; 找出。

添加到stream行的答案,包括这个错误:

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

一次性从机复制:

在一个terminal窗口中:

 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 | | +------------------+----------+--------------+------------------+ 

导出类似于他所描述的“ 使用另一个terminal ”的转储

退出并连接到你自己的数据库(这是奴隶):

 mysql -u root -p 

键入下面的命令:

 STOP SLAVE; 

如上所述导入转储(当然在另一个terminal!)并input下面的命令:

 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 

一旦logging,设置server_id参数(通常,对于新的/非复制的数据库,这不是默认设置),

 set global server_id=4000; 

现在,启动奴隶。

 START SLAVE; SHOW SLAVE STATUS\G; 

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

  Slave_IO_Running: Yes Slave_SQL_Running: Yes 

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

我用脚本创build了一个GitHub仓库来快速解决这个问题。 只需更改一些variables并运行它(首先,脚本会创build数据库的备份)。

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

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

使用LVM重build从站

这里是我们使用Linux LVM重buildMySQL从站的方法。 这保证了一致的快照,同时要求主站的停机时间最短。

在主MySQL服务器上将innodb max脏页面百分比设置为零。 这将迫使MySQL将所有页面写入磁盘,这将显着加速重新启动。

 set global innodb_max_dirty_pages_pct = 0; 

要监视运行命令的脏页数

 mysqladmin ext -i10 | grep dirty 

一旦数字停止减less,你已经到了这个点继续。 接下来重置主服务器以清除旧的日志/中继日志:

 RESET MASTER; 

执行lvdisplay获取LVpath

 lvdisplay 

输出将如下所示

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

使用命令closuresmaster数据库

 service mysql stop 

下一步快照,mysql_snapshot将是新的逻辑卷名称。 如果binlogs放在操作系统驱动器上,那么也需要快照。

 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 * 

回到主人。 现在rsync快照到MySQL从属

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

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

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

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

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

validation/ var / lib / mysql数据文件是否属于mysql用户,如果是这样的话,可以省略下面的命令:

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

接下来loggingbinlog位置

 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 

这里主日志文件是顺序最高的文件编号,文件日志位置是文件大小。 logging这些值:

 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 

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

BR,Juha Vehnia

我最近写了这个在我的博客这是在这里find…这里有更多的细节,但故事是一样的。

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