mysql表同步

表同步,一般有3种思路:

[1]最常见的是配置主从,强调replicate-do-table=myhome.tbl_name //只同步表

[2]使用mysqldump来crontab定时任务;注意如果是每天同步的话,要做逐日的增量备份;

[3]使用触发器来同步; 

===============

http://www.xuebuyuan.com/1870628.html

 

MySQL触发器数据表同步

2014年01月25日 ⁄ 综合 ⁄ 共 489字 ⁄ 字号    ⁄ 评论关闭
create table T(id integer, strName varchar(50));
create table tempT(id integer, strName varchar(50));

DELIMITER && 
CREATE TRIGGER tri_memory_update AFTER UPDATE ON T FOR EACH ROW 
BEGIN
    UPDATE T SET strName=NEW.strName WHERE strName=OLD.strName; 
END && 
DELIMITER ;

DELIMITER && 
CREATE TRIGGER tri_memory_insert AFTER Insert ON T FOR EACH ROW 
BEGIN
    insert into tempT(id,strName) VALUES(NEW.id,NEW.strName);
END && 
DELIMITER ;

DELIMITER && 
CREATE TRIGGER tri_memory_delete AFTER DELETE ON T FOR EACH ROW 
BEGIN
    DELETE From tempT where tempT.id = OLD.id;
END && 
DELIMITER ;

 http://www.jb51.net/article/35123.htm

分别创建增加、删除、更新的触发器(Trigger)来达到两张表之间数据同步的目的。 
1:数据同步增加: 
如有两张表——A表和B表,创建触发器使当A表插入数据后B表也同步插入数据。其中B表插入数据的字段需要同A表中的字段相对应。 

复制代码代码如下:

CREATE TRIGGER 触发器名称 
ON A表 
AFTER INSERT 
AS BEGIN INSERT INTO 
B表(B表字段1,B表字段2,B表字段3) 
SELECT A表字段1,A表字段2,A表字段3 
FROM INSERTED 
END 


2.数据同步删除: 
如有两张表——A表和B表,创建触发器使当A表删除数据后B表也同步删除数据。其中B表与A表应有相应主键关联。 

复制代码代码如下:

CREATE TRIGGER 触发器名称 
ON A表 
AFTER DELETE 
AS BEGIN DELETE B表 
WHERE 
B表主键 IN( 
SELECT A表主键 
FROM DELETED) 
END 


3.数据同步更新: 
如有两张表——A表和B表,创建触发器使当A表数据更新后B表也同步更新数据。 

复制代码代码如下:

CREATE TRIGGER 触发器名称 
ON A表 
AFTER UPDATE 
AS 
update B表 
SET 
B.B表字段1=A.A表字段1 
FROM 
B表 AS B,INSERTED AS A 
WHERE B.B表主键=A.A表主键 

 ===============================

http://www.xiongl.com/syncshell/

#---------------------------------------------------------------------------------------------
#!/bin/bash
# Program:
#	Sync the table M_ADMIN of different databases 
# History:
# 2013/09/16	XiongLiang	First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# 1. shell屏幕打印当前脚本运行时间;
TODAY=`date +%Y%m%d`
TODAY1=`date +%Y/%m/%d`
echo "TODAY1=$TODAY1  ==  TODAY=$TODAY "

# 2. shell脚本中常量定义;
TMPFILE="`basename $0`.$$"
ADMINFILE="M_ADMIN.$$"
#echo "TMPFILE=$TMPFILE"
MYSQL=/home/mysql/mysql56/bin/mysql
ALIPMS_ADDR=192.168.58.161
ALIPMS_PORT=3306
ALIPMS_USERNAME=root
ALIPMS_PASSWD=123456
ALIPMS_DATABASE=ALIPMS_SERVER
ALMAMS_ADDR=192.168.58.164
ALMAMS_PORT=3306
ALMAMS_USERNAME=root
ALMAMS_PASSWD=123456
ALMAMS_DATABASE=ALMAMS1_SERVER

# 3. 导出数据库查询结果值文件M_ADMIN.xxx;
$MYSQL -u $ALIPMS_USERNAME --password=$ALIPMS_PASSWD -D $ALIPMS_DATABASE  -N -e "select concat(admin, ';', 0, ';', password, ';', passwordtype, ';',  '', ';',  '', ';',  '', ';', '00', ';', 0, ';', 0, ';', '1,', ';', 1, ';', 1, ';', 'linkage', ';', 1, ';', 'linkage@lianchuang.com', ';', '52209888', ';',  '', ';',  '', ';', '南京', ';', '210096', ';', '52202288', ';', '联创公司操作员', ';', now(), ';', 'linkage', ';', now(), ';', now(), ';', 'linkage', ';',  '', ';',  '', ';', now(), ';',  '', ';', now()) from M_ADMIN" > $ADMINFILE

# 4. 使用Mysql Load Data命令导入数据;
echo "load data local infile '`pwd`/${ADMINFILE}' ignore into table M_ADMIN  character set gb2312 fields terminated by ';';" > $TMPFILE
$MYSQL -u $ALMAMS_USERNAME --password=$ALMAMS_PASSWD -D $ALMAMS_DATABASE  -P $ALMAMS_PORT -h $ALMAMS_ADDR < $TMPFILE
#cat $TMPFILE

# 5. 删除中间结果文件;
rm -rf $ADMINFILE
rm -rf $TMPFILE
#----------------------------------------------------------------------------------------------

 

1 修改脚本中的配置如下:
	MYSQL=/home/mysql/mysql56/bin/mysql #当前服务器mysql安装路径
	ALIPMS_ADDR=192.168.58.161          #ALIPMS管理平台数据库地址
	ALIPMS_PORT=3306		    #ALIPMS管理平台数据库端口
	ALIPMS_USERNAME=root		    #ALIPMS管理平台数据库用户名
	ALIPMS_PASSWD=123456                #ALIPMS管理平台数据库密码
	ALIPMS_DATABASE=ALIPMS_SERVER       #ALIPMS管理平台数据库
	ALMAMS_ADDR=192.168.58.164          #ALMAMS管理平台数据库地址
	ALMAMS_PORT=3306                    #ALMAMS管理平台数据库端口
	ALMAMS_USERNAME=alipms              #ALMAMS管理平台数据库用户名
	ALMAMS_PASSWD=alipms123             #ALMAMS管理平台数据库密码
	ALMAMS_DATABASE=ALMAMS1_SERVER      #ALMAMS管理平台数据库数据库
2 建立crontab定时任务
	/etc/init.d/crond start             #启动crontab进程 
	键入crontab  -e编辑crontab服务文件,添加定时执行计划

 =============================

 http://holy2010.blog.51cto.com/1086044/473008

转自:http://blog.haohtml.com/index.php/archives/2546

1: 首先确定Master和Slave的数据库版本,Master数据库的版本不能高于Slave数据的版本。

这里我是使用MySql 5.0.27 作为Master数据库,MySql 6.0.3(alpha)作为Slave进行测试。

2:首先在Master数据库的配置文件my.ini (windows)里添加log-bin 和 server-id 两项

eg: [mysqld]

server-id = 1  //服务器编号

log-bin = mysql-bin  //使用的二进制日志文件名
binlog-do-db=test = maindb //同步的数据库(不记录二进制日志)

binlog-ignore-db=bbs //不允许同步的数据库(不记录二进制日志)
binlog-ignore-db=ceshi   //不允许同步的数据库库(不记录二进制日志)

在Slave数据库的配置文件my.ini里添加server-id 项

eg:[mysqld]

server-id = 2
replicate-do-db=backup   //告诉slave只做backup数据库的更新(可选)
replicate-ignore-db=bbs //告诉slave忽略这两个数据库的更新(可选
)
replicate-ignore-db
=ceshi// 同上

replicate-ignore-table=db_name.tbl_name //忽略指定数据库里的指定表,多个表重复写此语句

·         --replicate-ignore-table=db_name.tbl_name

告诉从服务器线程不要复制更新指定表的任何语句(即使该语句可能更新其它的表)。要想忽略多个表,应多次使用该选项,每个表使用一次。同--replicate-ignore-db对比,该选项可以跨数据库进行更新。请读取该选项后面的注意事项。

·         --replicate-wild-do-table=db_name.tbl_name

告诉从服务器线程限制复制更新的表匹配指定的数据库和表名模式的语句。模式可以包含‘%’和‘_’通配符,与LIKE模式匹配操作符具有相同的含义。要指定多个表,应多次使用该选项,每个表使用一次。该选项可以跨数据库进行更新。请读取该选项后面的注意事项 。

如果上面的最后两行不写的话,默认为同步所有数据库

(这里需要理解的是Slave本身也是一个独立的服务器,它作为‘从数据库’是从它通过‘主服务器’日志更新数据角度上理解的。可以把 server-id 想象成为IP地址:这些ID标识了整个同步组合中的每个服务器。如果没有指定server-id 的值,如果也没定义 master-host,那么它的值就为1,否则为2。注意,如果没有设定 server-id,那么master就会拒绝所有的slave连接,同时slave也会拒绝连接到master上。)

3:修改配置后启动Master数据服务。在Master数据库上建立一个用户,用于Slave数据连接以便同步数据。一般来说Slave数据只用于同步数据,所以我们在建立这个用户时只授予它REPLICATION SLAVE 权限。

eg: GRANT REPLICATION SLAVE ON *.* TO ‘slaver’@’%’ IDENTIFIED BY ‘slaver’;

4:在Master数据库上执行

FLUSH TABLES WITH READ LOCK;

命令以刷新数据并阻止对Master数据的写入操作。然后将Master数据的data目录复制一份覆盖Slave数据库的data目录,这样Master和Slaver就有了相同的数据库了。在复制时可能不需要同步 mysql 数据库,因为在slave上的权限表和master不一样。这时,复制的时候要排除它。同时不能包含任何`master.info~ 或 `relay-log.info` 文件。覆盖好后执行:

mysql>UNLOCK TABLES;

释放锁定。

5:在Master数据库上执行

SHOW MASTER STATUS;

查看当前Master数据库上的一些我们将要使用的信息:

mysql

File 表示 Master用于记录更新数据操作的日志文件,Position 表示当前日志的记录位置,这也是Slave 需要开始同步数据的位置。

6:启动Slave数据库 执行:(这点连接Master数据库所要的参数)

mysql> CHANGE MASTER TO

->  MASTER_HOST='127.0.0.1', //Master服务器地址(我是在本机上安装两个数据库的)

->  MASTER_USER='slaver, //Slave服务器更新时连接Master使用的用户名

->  MASTER_PASSWORD='slaver', // Slave服务器更新时连接Master使用的密码

->  MASTER_LOG_FILE='mysql-bin.000004', //更新操作日志

->  MASTER_LOG_POS=837016; //同步数据的开始位置

另一种办法也可以直接在my.ini配置文件里做配置,本人未做测试

修改B的my.ini文件,在mysqld配置项中加入下面配置:
server-id=2
master-host=10.10.10.22
master-user=backup #同步用户帐号
master-password=1234
master-port=3306
master-connect-retry=60 预设重试间隔60秒
上面的master_log_file='mysql-bin.000004'和master_log_pos=837016 这两项不知用不用写的,
replicate-do-db=backup 告诉slave只做backup数据库的更新
binlog-ignore-db=bbs,ceshi 告诉slave忽略这两个数据库的更新

 

上面命令执行完毕后,执行START SLAVE; 命令启动数据更新。在Slave 数据库上执行:

SHOW SLAVE STATUS\G; 查看从数据跟主数据库的连接状态是否正常,如果显示的信息中的 Slave-IO-Running 和 Slave_SQL_Running 值为 yes,表示用于数据同步的 io线程和sql操作线程已经成功启动。如果发现其中一个值为NO,则说明配置失败,详细原因,

7:到此已经建立Master和Slave数据库的同步了。你可以在Master数据库上更新一个表的数据,然后查看Slave数据库上对应表是否做了相应的更改。

注: slave开始同步后,就能在数据文件目录下找到2个文件 `master.info` 和`relay-log.info`。slave利用这2个文件来跟踪处理了多少master的二进制日志。master.info 记录了slave 连接master进行数据同步的参数,relay-log.info 记录了slave进行数据更新使用的中续日志的的信息。

 

=============================

http://www.mysqlpub.com/thread-31055-1-1.html

出处: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、只增量相关的几个表,是要在一个系统的数据库中把近期发布的信息导出,更新到另一个数据库中,有两种方式,一种是只导和文章标题 、内容等信息相关的表,如果有其它的需要,可以选择同时导出其它的表,就是导出时可以选择。

我的建议是:

方案一
如果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,导入时也可以选择性导入。

  1. DELIMITER $
  2. DROP TRIGGER /*!50032 IF EXISTS */ `ha`.`tr_ttt`$
  3. CREATE
  4.     /*!50017 DEFINER = 'root'@'%' */
  5.     TRIGGER `tr_ttt` BEFORE INSERT ON `content`
  6.     FOR EACH ROW BEGIN
  7.      IF ( new.a IS NOT NULL ) THEN
  8.      INSERT INTO b(a) VALUES(new.a);
  9.      END IF;
  10. END;
  11. $
复制代码

当然如果表多更新多,整个机制是需要脚本配合...

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

 

 

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实现这些功能。。。。菜鸟不懂命令。。只能图形管理工具。。。

=============================

http://blog.sina.com.cn/s/blog_4de07d5e0100wj0b.html

MySQL的主从服务器环境用于备份与同步,主从环境(master/slave)可以把一个MySQL服务器上的数据复制到另一个服务器上去。使用单向同步的好处是稳健、高速、系统易于管理。

 

有了master/slave机制后,就更稳健了。当master上发生问题时,可以把slave作为备用切换过去。可以在slave和master之间分担一些查询,这就能加速响应时间。SELECT 查询就可以在slave上执行以减少master的负载。更新数据的语句则要放在mater上执行以保持master和slave的同步。当非更新操作占多数时,负载均衡就很有效了,不过这只是普通情况而言。

另一个好处是可以在slave上备份数据,无需干扰master。备份数据时master照样继续运作。

 

搭建方法:

1.  首先创建两个mysql实例,由于在实际中一台服务器只运行一个实例(mysql线程),这里,我们在一台机器上进行模拟,安装两个mysql程序,选择两个不同的端口8892和8893。8892作为主服务器,8893作为从服务器。

2.  设置配置文件

在配置文件my.cnf中有一条语句:

[mysqld]

!include /home/mysql/mysql8892/etc/mysqld.cnf

表示包含/home/mysql/mysql8892/etc/mysqld.cnf文件的配置,所以只需要修改mysqld.cnf中的内容。

主服务器中mysqld.cnf的内容如下:

[mysqld]

# server-id必须是唯一的,在1 到 2^32 – 1之间取值

server-id   = 210110051

 

# 二进制日志 – 主库必须开启

log-bin = mysql-bin-m

 

从服务器中mysqld.cnf的内容如下:

[mysqld]

server-id   = 210110052

 

#在从库开启该选项,避免在从库上进行写操作,导致主从数据不一致(对super权限无效)

read-only

 

report-user = mysqlsync  (从库连接主库使用该用户名,便于主库统计信息)

report-host = localhost  (从库连接主库的主机名,便于主库统计信息)

report-port = 8893              (从库使用的端口号)

 

skip-slave-start             (启动数据库后,需手动开启同步进程)

 

master-host = 127.0.0.1        (主库地址,必须使用IP,不能使用域名)

master-user = mysqlsync          (从库连接主库使用该用户名)

master-port = 8892

 

relay-log = mysql-relay           (中继日志,从库开启)

relay-log-info-file = mysql-relay.info(中继日志信息文件,默认为mysql-relay.info)

 

replicate-wild-do-table = example1.% (需要同步的表,支持正则表达式,数据库example1下的所有表)

replicate-do-table = example1.table1 (需要同步的表,多个表需多次指定,数据库example1下的table1)

 

# 同步过程中需要忽略的表,支持正则表达式。全库同步时,必须屏蔽mysql系统库和test测试库

replicate-wild-ignore-table = mysql.% 

replicate-wild-ignore-table = test.%

 

replicate-rewrite-db = from_name->to_name  (同步库重命名)

 

slave-net-timeout = 3600 (在所设置的时间内如果没有接收到来自主库的更新,从库则认为和主库的连接断开或失效,重新建立和主库的连接,默认为3600秒,可根据实际需求调整)

 

max_allowed_packet = 32M (任何生成的中间字符串的最大大小。默认为16M,最低配置32M,且不能小于主库该项的值)

 

3.  配置完成后,启动主服务器和从服务器。首先查看从服务器的状态 mysql> show slave status \G ,如果主服务器信息需要更改,则执行以下语句

    mysql>    change master to

        ->    MASTER_HOST='127.0.0.1',  (在本地使用时不可以使用localhost或127.0.0.1必须使用实际ip地址 查看ip地址的方法 ifconfig 或 hostname -i)

       ->    MASTER_USER='mysqlsync',

       ->    MASTER_PASSWORD='123456',

       ->    MASTER_PORT=8892;

配合mysql> show slave status \G 语句可以每一项单独进行修改。

4.  然后在主服务器中增加同步用并设置其权限:

同步用户的权限设置见规范文档

命令:mysql> grant replication slave  on *.*  to mysqlsync@127.0.0.1 identified by '123456';

关于mysql用户管理见其他日志。

5.  从库启动同步mysql> start slave;

主库可以查看状态

mysql> show processlist \G

mysql> show master status;

从库查看状态:

mysql> show slave status;

从库的Slave_IO_Running和Slave_SQL_Running状态都为Yes,说明同步正在执行。

同步过程如下图所示:

mysql主从服务器的搭建

posted @ 2014-11-20 17:39  陳聽溪  阅读(1138)  评论(0)    收藏  举报