kider 发表于 2012-5-16 11:21:29

不同地域服务器MySQL数据库之间更新数据同步方案讨论

出处:mysqlpub.com

一个朋友的问题。
环境:
A(windows 2008 core r2+mysql 5.6) 主要服务器,会有更新数据。
B(windows 2008 core r2+mysql 5.6) 分发服务器,把A中的更新数据同步过来,再分发给其他服务器。
现在的问题是如何把A中的更新(包含DB数据和磁盘文件),同步到B中来。

需求:
1、同步增量数据,可以是网络也可以是离线方式
2、保证数据一致性
3、有数据库数据+实际文件,也就是数据库中的数据库可能还会对应服务上的一些文件,要一起同步。
4、主要是更新几个表,做增量更新,现在的问题是怎么样可以计算时间,把想要时间内的导出,导入时在原有的基础上增加?
5、只增量相关的几个表,是要在一个系统的数据库中把近期发布的信息导出,更新到另一个数据库中,有两种方式,一种是只导和文章标题 、内容等信息相关的表,如果有其它的需要,可以选择同时导出其它的表,就是导出时可以选择。



kider 发表于 2012-5-16 11:25:54

我的建议是:

方案一
如果A与B之间有网络互通,哪怕就是每天或每周的限时互通,那么就可以用MySQL同步机制(MySQL Replication )实现,方便快捷,有数据库来保证数据的一致性。 把B配置成A的slave机器,联机一次就同步一次,自动同步,或手动start slave。


如果A、B之间不能有网络的互通,且在异地,只能用中间介质传递,那么大体思路是:主要分清楚那些是增加(如多表多数据)即可,记录下,导入到B中。
方案二
具体可用mysqldump加where参数,导出更新的数据 + 关联的文件,如.
mysqldump --where=name    Dump only selected records. Quotes are mandatory.

方案三
如果就分不出来数据表中的数据那些是更新的,那么就用触发器,在数据库中建立几个触发器,把需要同步的表数据触发到一个新表中,每次都只导出这个触发后的表,然后导入B,导入时也可以选择性导入。

DELIMITER $
DROP TRIGGER /*!50032 IF EXISTS */ `ha`.`tr_ttt`$
CREATE
    /*!50017 DEFINER = 'root'@'%' */
    TRIGGER `tr_ttt` BEFORE INSERT ON `content`
    FOR EACH ROW BEGIN
   IF ( new.a IS NOT NULL ) THEN
   INSERT INTO b(a) VALUES(new.a);
   END IF;
END;
$当然如果表多更新多,整个机制是需要脚本配合...

方案四
如果还考虑表结构变化和数据变化,或什么都不想考虑,A和B就几乎是完全一样,那么就用binlog同步。
把A库中的binlog复制下来,直接拿到B中导入即可。
具体,
A上,flush logs;会产生一个新的binlog文件(记录从此刻开始以后的更新),你就可以放心的把从这个新文件之前的binlog拷贝下来,到上次的记录点(要分清楚,不然会有重复导入)。
B上,导入 mysql -uxxx -pxxx DB < binlog(A上拷贝出来的)   (至于MySQL的binlog在那里长什么样查查资料即可)
好处:从目前应用场景来看,比较符合,而且这样做出错率少,操作简单,适应性强(包括一切A上的变更)。



s7765991 发表于 2012-6-20 22:56:08

1. 想要实现的功能 比如一台服务器上面有A和B两个数据库   每个数据库下面有两种类型的表
比如:
a_jia_xxx
a_yi_xxx
比如A经常更新。。。B同步A(即B的数据从A中来)
但是B只需要同步A库下面的jia前缀的表(yi的不要)。。。
请教大家如何实现这个功能。。
2.能不能实现直接镜像。。。。比如B站点的jia表其实自己是没有的。。直接用A站点的jia表。这个可以省下一倍的数据空间。。。。。。。。
3.如果A跟B不在一个服务器。。这两种功能又要如何实现??
希望能通过phpmyadmin实现这些功能。。。。菜鸟不懂命令。。只能图形管理工具。。。

kider 发表于 2012-6-21 10:51:36

你可以参考一下 楼上例子 ...
页: [1]
查看完整版本: 不同地域服务器MySQL数据库之间更新数据同步方案讨论