如果Master和Slave有不同的数据库备份Mysql复制,如何重新同步Mysql DB?
Mysql Server1
正在作为MASTER运行。
Mysql Server2
作为SLAVE运行。
现在数据库复制正在发生从MASTER到SLAVE 。
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