日期:2014-05-16  浏览次数:20704 次

Llinux中mysql数据单向&双向同步笔记
MySQL数据结构SQLSQL ServerLinux

最近因项目要求,在linux服务器上设置mysql的数据同步,幸好网络资源多啊,google一下全有了,不过实际操作起来,就麻烦了,遇到很多问题,不过多google一下也解决了,

同时学习了很多相关方面的知识,现将总结于此,以备后用,希望对有此需要的JE们有所帮助;

一、准备环境
??? 自己做练习硬件资源少,只能在虚拟器上操作了哈哈!
???
???? linux 版本:Red Hat Enterprise Linux Server release 5.1
???? mysql 版本:MySQL-server-community-5.0.67-0.rhel5.i386.rpm
???????????????? MySQL-client-community-5.0.67-0.rhel5.i386.rpm
???? (PS:mysql的同步机制是基于二进制日志binlog,不同的mysql版本会导致其格式的不同,从而导致不能实现数据同步,因此最好的搭配组合是Master的MySQL版本和Slave的

版本相同或者Slave的版本高于Master的版本,因为mysql是向下兼容的,为此Master的版本不能高于Slave版本,否则有可能不能实现功能;如果要实现双向同步,最好mysql是同

一版本)

???? 虚拟机版本:VMware6.0

???? 在虚拟机上安装两个linux系统,并分别安装上mysql(mysql安装在俺博客的mysql安装有详细说明)

?? mysql默认安装的文件分别为:
???
  /var/lib/mysql/ (数据库目录,其所创建的数据库文件都在该目录下)

  /usr/share/mysql (mysql相关配置文件)

  /usr/bin (mysql相关命令,如mysql mysqladmin等)

?? 为了区分系统,给系统命名一下,便于后面的说名:
???
??? LinuxA 系统: Ip:192.168.59.123 (Master)

??? LinuxB 系统: Ip:192.168.59.124 (Slave)

??? 关闭LinuxA 和 LinuxB 的防火墙 #service iptables stop (保证系统互相可以ping的通)
???
二、设置单向mysql数据同步(LinuxA(Master)->LinuxB(Slave))

??? 1、 LinuxA 为 master

??????? LinuxB 为 slave (同步LinuxA 上mysql上指定的test数据库中的数据);

??? 由于刚安装的mysql,因此分别在LinuxA 和 LinuxB 的 mysql 上创建相同的数据库如 test(表有 stu , class,teacher),保证两个mysql上的数据库名一致其表名及表的

结构一致,若有一个不同,将导致无法实现同步;
??? (PS: 要使数据同步,必须保证数据库名一致其表名及表的结构一致)

??? 2、在作为master(即LinuxA)的mysql上建立一个账户专门用于slave(即LinuxB)来进行数据同步

?????? # mysql (默认用户,如设置了root密码,使用mysql -u root -p 登入mysql)
?????? mysql>grant file on *.* to backa@'192.168.59.124' identified by 'backa'
?????? mysql>flush privileges;

????? (PS:此backa账户只能通过ip为192.168.59.124的访问)
?
????? 在LinuxB上测试账户backa是否可以访问LinxuA上的mysql:
????? #mysql -u backa -p -h 192.168.59.123(输入密码backa,可以访问说明设置正确)
???
??? 3、修改 my.cnf 文件
??????
???? 由于刚安装的mysql ,在/etc目录下可能无my.cnf文件,从/user/share/mysql目录中拷贝my-medium.cnf 到/etc并修改成my.cnf (LinuxA 和LinuxB 上一样)
???? 如 # cp /user/share/mysql/my-medium.cnf? /etc/my.cnf

???? 修改在LinuxA(Master)上的/etc/my.cnf
????
????? log-bin=mysql-bin (日志文件,默认存在/var/lib/mysql下日志文件以mysql-bin为开头)
????? #log_bin= /var/log/mysql/mysql-bin.log(也可以自己指定,在此用# 表示注释掉了)
????? binlog-do-db =test(需要同步的数据库名,如需同步多个数据库,可以另起行如binlog-do-db =test1 )?????
????? server-id= 1 (mysql标示)

???? 修改完后保存退出,并重启mysql 如#service mysql restart (重启正常,表示配置没错误)


???? 修改在LinxuB(Slave)上的/etc/my.cnf

????? server-id= 2 (mysql标示,唯一否则启动会出错误)
????? master-host=192.168.59.123 (同步Master的ip地址)
????? master-user=backa (同步所需的账号)
????? master-password=backa (同步账号的密码)
????? master-port=3306 (LinuxA 中mysql的访问端口)
????? replicate-do-db=test (所需同步的数据库名,如果是同步多个数据库,可以另起一行如 replicate-do-db=test1)
????? #replicate-do-table=test.stu (如果只需同步test数据库中的stu表)
????? #replicate-do-table=test.teacher(如果只需同步test数据库中的stu表)
????? master-connect-retry=60 (主服务器(Master)宕机或连接丢失的情况下,从服务器(slave)线程重新尝试连接主服务器之前睡眠的秒数)

???? 修改完后保存退出,并重启mysql 如#service mysql restart (重启正常,表示配置没错误)

??? 4.启动同步

???? 进到LinuxA(Master)的mysql上:

???? mysql>show master status\G (查看master当前状态)
???? 运行完以上命令显示结果如下:
?
????
??????????? File: mysql-bin.000001 (当前binlog日志文件)
??????? Position: 98 (但前binlog日志文件位置)
??? Binlog_Do_DB: test (同步数据库)
Binlog_Ignore_DB:???? (不需同步的数据,当前为设置)



-------------------------
???? 进到LinuxB(Slave)的mysql上:
?????
???? mysql>show slave status\G (查看slave同步状态)

???? 运行完以上命令显示结果如下:

???????????? Slave_IO_State: Waiting for master to send event (slave 的io线程,获取master的binlog的日志内容,该为其目前的状态)
??????????????? Master_Host: 192.168.59.123 (所需同步Master的ip地址)
??????????????? Master_User: backa(同步所需的账号)
??????????????? Master_Port: 3306(同步所需的mysql端口号)
????