Linux中MySQL数据单向&双向同步笔记

2014-11-24 17:39:12 · 作者: · 浏览: 0

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


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


一、准备环境


自己做练习硬件资源少,只能在虚拟器上操作了哈哈!


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 (重启正常,表示配置没错误)