关闭

时间:2015-07-12 11:21:45

标签: mysql mariadb database-replication

我有远程主机(centos6)与mariadb(10.0.17-MariaDB-log - MariaDB Server)作为主人:

server-id   = 1
log-bin=mysql-bin
binlog_do_db = mydatabase

和本地(win8.1)与mariadb(10.0.16-MariaDB-log - mariadb.org二进制发行版)作为奴隶:

server-id = 2

作为初始程序,我将数据库转储到远程主机上,将其导入本地主机,然后执行SHOW MASTER STATUS,获取文件名和偏移量并运行:

CHANGE MASTER TO MASTER_HOST='$host', MASTER_USER='$user', MASTER_PORT = $port, MASTER_PASSWORD='$pass', MASTER_LOG_FILE='$fname', MASTER_LOG_POS=$pos
STOP SLAVE
START SLAVE

复制开始。我在主人桌上所做的一切都反映在奴隶身上。

但是如果奴隶宕机,在它上升之后没有任何变化(在主人身上),而奴隶离线则反映给奴隶!看起来我的奴隶应该总是在线,但它是一台笔记本电脑! 然而,在奴隶启动之后,实时复制仍然有效 - 它不记得离线的所有更改,但是如果我在主机上更改数据库,当奴隶在线并启动时,所有更改都完美地反映到从属。当然我知道复制是基于语句的,所以我得到的不是数据差异而是指令。但我认为大师会记得它发送了什么,什么没发送。因此,在下一次操作中,它只发送所有未交付的更改。我错了吗?

我的复制方案:主服务器与客户端(移动设备)交互并更改数据库。我不时会启动我的笔记本电脑,启动复制,获取更新的数据库并进行一些繁重的分析(这对我的2核便宜服务器来说太难了)。 也许有更好的方法?有没有办法像ICQ messenger那样获得“离线变更”? :) 现在我只能看到一个解决方案 - 完全数据库转储,但它不方便,占用太多时间并且负载很重。

1 个答案:

答案 0 :(得分:0)

当Slave未连接到Master时,Master正在写入其binlog(s)。奴隶已经记住了从那些binlogs中读取的地方。当Slave重新连接时,它会选择"它停止的地方",将更改从Master的binlog(s)复制到Slaves relay-log(s)并执行它们。这个"追赶"过程需要一点时间,多长时间取决于很多因素。

在Slave上执行SHOW SLAVE STATUS;以验证它已连接并正在运行("是")。

通常,Slave的版本不应该比Master的版本旧。 (我怀疑10.0.17 vs 16之间是否存在任何问题.10.0.17的更改日志中没有任何内容跳出来。)

您使用"并行复制"?请参阅bug fixed in 10.0.18