一、 实验环境部署

主服务器(MySQL-01) IP: 192.168.8.241  端口3306  ,操作系统:Centos6.5 64位

从服务器(MySQL-02)  IP: 192.168.8.242  端口3306,操作系统:Centos6.5 64位

虚拟机配置:内存2G,硬盘28G,2块网卡(1块网卡也可以),注意复制虚拟机 时候选择生成不同的MAC地址,虚拟机生成之后,网卡的的名称会变为eth2、eth3,修改/etc/udev/rules.d/70-persistent-net.rules文件,将无效的MAC记录屏蔽掉,将真实的MAC对应的记录改名为eth0、eth1。
两台虚拟机的网络配置好,配置网关、配置DNS,将虚拟机网卡设置为物理桥接模式,使之能够访问外网,通过 ping www.baidu.com 测试是否能访问外网。
通过yum安装mysql数据库server/client/develop:
yum -y install mysql-server mysql mysql-devel

二、mysql单向主从同步配置

I. 主服务器的操作
1. 关于主服务器的相关配置
1.1  设置server-id值并开启binlog参数
根据mysql的同步原理:关键因素就是binlog日志。
编辑/etc/my.cnf配置文件,修改和添加相关参数。

[root@localhost ~]# vi /etc/my.cnf        
        [mysqld]
        server-id = 1
        log-bin = mysql-bin

备注:
#. 上面两参数放在my.cnf中的[mysqld]模块下,否则会出错;
#. 要先在my.cnf文件中查找相关参数,并按具体要求修改,不存在时添加相关参数,切记,参数不能重复;
#binlog-do-db = test :需要备份数据,多个写多行,不写全部都备份
#binlog-ignore-db = mysql :不需要备份的数据库,多个写多行

修改完配置文件,检查配置后的结果:
[root@localhost ~]# grep -E "server-id|log-bin" /etc/my.cnf

重启mysql数据库
service mysqld restart

设置数据库根用户root的密码:
mysqladmin -u root password 'mysql'

设置的密码是“mysql"

1.2 建立用于主、从数据同步的帐号 "rep"
[root@localhost ~]#mysql -u root -pmysql 
mysql>select user();
mysql>grant replication slave on *.* to 'rep'@'192.168.8.%' identified by '123456';

mysql>flush privileges;

备注:
#replication slave:为mysql同步的必须权限,此处不要授权all
#*.*:表示所有库所有表,库也是可以指定具体的库和表进行复制,如test.test1(test库的test1表);
# rep@192.168.8.%: rep为同步账号,192.168.1.%为授权主机,使用了%表示允许整个192.168.8.0网段以rep用户访问;
#identified by "123456" : 123456为密码,实际环境用复杂密码

1.3 对主数据库锁表只读:
注:实际环境中,操作主从复制,需要申请停机时间,锁表会影响业务。
mysql>flush tables with read lock;

注:这个锁表命令的时间,在不同引擎的情况,会受下面参数的控制,锁表超过设置时间不操作会自动解锁;
默认情况下的时长为:
mysql>show variables like "%timeout%"; 可以查看到默认锁表时间最大值。
mysql> show variables like "%timeout%";
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
..........
| interactive_timeout        | 28800 |
........
| wait_timeout               | 28800 |
+----------------------------+-------+
10 rows in set (0.00 sec)

完成后测试是否锁表成功:打开另一窗口创建一test1表,是不会执行的,证明锁表不能更新,但可读,不可写,因为是read读锁,锁表主要是为了导出数据库文件,从而取得正确的偏移量的值,保证导入从数据库,数据一致。

1.4 查看主库状态
查看主库状态,即当前日志文件名和二进制日志偏移量
mysql>show master status;
命令显示的信息要记录在案,后面的从库复制时是从这个位置开始的。

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      619 |              | mysql            |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

1.5  导出主数据库数据
[root@localhost ~]#mkdir /backup
[root@localhost ~]#mysqldump -uroot -pmysql -A -B |gzip >/backup/mysql_bak.$(date +%F)sql.gz
注:-A表示备份所有库, -B表示增加user DB和drop等参数(导库时会直接覆盖所有的)。

[root@mysql-master backup]# ll
total 144
-rw-r--r-- 1 root root 144884 Feb 23 08:58 mysql_bak.2016-02-23sql.gz

为了确保导库期间,数据库没有数据插入,可以再检查下主库状态信息
[root@mysql-master backup]# mysql -uroot -pmysql -e "show master status"
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      619 |              | mysql            |
+------------------+----------+--------------+------------------+

注:无特殊情况,binlog文件及位置点是保持不变的。
导库后,解锁主库,恢复可写;
mysql>unlock tables;
Query OK, 0 rows affected (0.00 sec)

特别提示,有读者这里犯迷糊,实际上做从库的,无论主库更新多少数据了,最后从库都会从上面show master status 的位置很快赶上主库的位置进度的。

1.6  把主库备份的mysql数据迁移到从库
[root@mysql-master backup]# scp /backup/mysql_bak.2016-02-23sql.gz 192.168.8.242:/backup/

II.  从服务器的操作
1. 关于从服务器的相关配置
1.1 设置server-id值并关闭binlog设置
注:数据库的server-id在LAN内是唯一的,这里的server-id要和主库及其他从库不同,并注释掉从库的binlog参数配置;
编辑/etc/my.cnf配置文件,修改相关的参数设置
master-connect-retry=60 #如果从服务器发现主服务器断掉,重新连接的时间差

[root@localhost ~]# vi /etc/my.cnf     
    [mysqld]
    server-id = 2
    #log-bin = mysql-bin

检查配置后的结果
[root@localhost ~]#grep -E "server-id|log-bin" /etc/my.cnf

设置数据库根用户root的密码:
mysqladmin -u root password 'mysql'
设置的密码是“mysql"

重启从数据库
[root@localhost ~]#service mysqld restart
1.2 还原主库导出的数据到从库
gunzip mysql_bak.2016-02-23sql.gz 
mysql -uroot -pmysql <mysql_bak.2016-02-23sql

1.3 登录从库配置同步参数

mysql>change master to #连接主数据库
mysql>master_host="192.168.8.241",  #主库的IP地址
mysql>master_port=3306, #主库的端口,从库的端口可以和主库不同
mysql>master_user="rep", #主库上建立的用于数据同步的用户《rep》
mysql>master_password="123456", #用户《rep》的密码
mysql>master_log_file="mysql-bin.000003",  #是mysql>show master status时看到的二进制日志文件名称,不能多空格。
mysql>master_log_pos=619;  #是mysql>show master status时查看到的二进制日志偏移量,不能多空格。
(change master to master_host="192.168.8.241",master_port=3306,master_user="rep",master_password="123456",master_log_file="mysql-bin.000003",master_log_pos=619; )

1.4  启动从库同步开关
启动从库同步开关,并查看同步状态
[root@localhost backup]#mysql -uroot -pmysql -e "start slave"
[root@localhost backup]#mysql -uroot -pmysql -e "show slave status\G"

也可以登录从库,在数据库下面执行相关命令:
mysql>start slave;
mysql>show slave status\G;

判断搭建是否成功就看如下IO和SQL两个线程是否显示为“yes”状态

Slave_to_Running:YES #负责从库去主库读取binlog日志,并写入从库中继日志中
Slave_SQL_Running:YES #负责读取并执行中继日志中的binlog转换sql语句后应用到数据库汇总。

也可以执行命令过滤查看如下:

[root@mysql-slave tmp]# mysql -uroot -pmysql  -e "show slave status\G" | egrep "IO_Running|SQL_Running"
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

1.5 测试主从同步

在主库创建 —>数据库以及查看
在主库中创建库“mytable”用于主从同步:

[root@localhost ]#mysql -uroot -pmysql -e "show databases;"
[root@localhost ]#mysql -uroot -pmysql -e "create database mytable;"

在从库查看是否主从同步:
[root@mysql-master ~]# mysql -uroot -pmysql -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mytable            |
| test               |
+--------------------+
[root@mysql-master ~]#

[root@mysql-slave tmp]# mysql -uroot -pmysql -e "show databases;"

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mytable            |
| test               |
+--------------------+
[root@mysql-slave tmp]#

到此!单向主从数据库同步成功完成;从数据库可以实现数据同步。

三、mysql双向主从同步的配置

3.1在MySQl-01上操作,用户授权,略过,是因为在做单向主从的时候已经对192.168.8.0/24整个网段都进行了授权。如果单向主从关系创建复制用户“rep”的时候只制定了单独地址192.168.8.242,那么就需要增加对地址192.168.8.241的授权。执行下面的命令:

mysql -u root -pmysql
mysql> grant replication slave on *.* to 'rep'@'192.168.8.241' identified by '123456'; //建立权限
mysql> flush privileges;
注:因为做的是所有库的主从,所以在MySQL-01上的操作会同步到MySQL-02上

3.2在MySQL-02上的操作
修改MySQL-02的数据库文件,在[mysql]下修改如下内容  
server_id = 2
log_bin = mysql-bin

重启 MySQL-02的mysql数据库:
service mysqld restart
查看MySQL-02上的日志文件:
mysql> show master status;

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      106 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

3.3在MySQL-01上操作
mysql> change master to master_host='192.168.8.242',master_user='rep',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106;
mysql> start slave;
检查是否成功

mysql>show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

表示成功。
至此,mysql的双向主从同步已完成

附:mysql主从同步常见异常及恢复方法

1. 一般的异常只需要跳过一步即可恢复
>slave stop;
>SET GLOBAL sql_slave_skip_counter = 1;
>slave start;

2.断电导致主从不能同步时,通主库的最后一个bin-log日志进行恢复
在主库服务器上,mysqlbinlog mysql-bin.xxxx > binxxxx.txt
tail -n 100000  binxxxx.txt > tail-binxxxx.txt
vim tail-binxxxx.txt 打开tail-binxxxx.txt文件找到最后一个postion值
然后在从库上,change host to 相应正确的值
>slave stop;
>change master to master_host='ip', master_user='username', master_password='password', master_log_file='mysql-bin.xxxx', master_log_pos=xxxx;
>slave start;
>show slave status\G;

3.主键冲突、表已存在等错误代码如1062,1032,1060等,可以在mysql主配置文件指定
略过此类异常并继续下条sql同步,这样也可以避免很多主从同步的异常中断
[mysqld]

slave-skip-errors = 1062,1032,1060

mysql 之 主从同步(单向同步和双向同步)的更多相关文章

  1. Oracle主从同步、双向同步的配置

    (本教程展示了Windows环境的oracle数据库主从同步,Linux环境一样也可以) (把主数据库obpm 和从数据库orcl 用实际的数据库名给替换掉) (配置主从同步后,再配置双向同步,可能会 ...

  2. 文件同步 单向rsync 双向unison 监控inotifywait 免密登录

    1.负载均衡中文件同步必不可少,我这边选择rsync来实现文件同步 rsync同步文件机制更适用于单向文件同步,可配合unison实现双向同步功能. 实现同步的两种方法 一:ssh方法 rsync - ...

  3. MySQL主从双向同步复制

    本文介绍了mysql主从,实现mysql的双向同步复制. MySQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护日 ...

  4. 配置MySQL主从双向同步

    原文地址:http://www.cnblogs.com/zhongshengzhen/ 原主数据库:192.168.137.33 原从数据库:192.168.137.197   需要先阅读并操作:ht ...

  5. Centos 配置 Mysql 主从双向同步

    配置之前,请先阅读mysql主从复制: Mysql-主从复制 原:  主从环境: 主服务器:192.168.153.130 从服务器:192.168.153.131 1.从数据库创建同步用户,将主数据 ...

  6. MySQL主从双向同步

    最近部署测试环境,涉及到MySQL数据库主从双向同步的部署,记录一下部署过程,正常读写都发生在主库,从库作为备选数据库(热备份),当主库发生异常,数据库自动切换到从库,这里面是怎么监控数据库异常并触发 ...

  7. Centos下MySQL数据库主从双向同步配置

    MYSQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环.当一个从服务器连接到主服务 ...

  8. mysql5.6数据库同步,单向双向同步问题

    windows下MySQL5.6实现主从数据库同步数据   mysql5.6数据库同步,单向双向同步问题 一.单向同步 主数据库(mysql5.6)192.168.1.104 从数据库(mysql5. ...

  9. MySQL 数据库双向同步复制

    MySQL 复制问题的最后一篇,关于双向同步复制架构设计的一些设计要点与制约. 问题和制约 数据库的双主双写并双向同步场景,主要考虑数据完整性.一致性和避免冲突.对于同一个库,同一张表,同一个记录中的 ...

随机推荐

  1. POJ3616--Milking Time(动态规划)

    Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that sh ...

  2. 20155326 2006-2007-2 《Java程序设计》第4周学习总结

    20155326 2006-2007-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承共同行为 (1)继承基本上就是避免多个类间重复定义共同行为,关键词为extends. ( ...

  3. 无法链接glew的解决办法-编译开源库出现: error LNK2001: 无法解析的外部符号

    无法链接glew的解决办法-编译开源库出现: error LNK2001: 无法解析的外部符号 参考官方配置指南:http://glew.sourceforge.net/install.html 1. ...

  4. hdu 4282 枚举,非二分

    http://acm.hdu.edu.cn/showproblem.php?pid=4282 对于方程X^Z + Y^Z + XYZ = K,已知K求此方程解的个数,其中要求X<Y,Z>1 ...

  5. 冲刺博客NO.4

    今天开站立会议时,有一点分歧,原本我认为的隐私保护和其他人认为的不一样,在沟通后这部分功能达成共识. 今天做了什么:组员完成了用户输入部分,信息输入.添加了一些组件和活动完善界面. 遇到的苦难,界面 ...

  6. SRM472

    这次是rng_58出的题目,思维难度还是相当大的的..很值得一做. 250pt: 题意:盒子里有n 个 potatoes,甲乙两个人,每次只能拿4的幂次方数(1,4,16...),最后不能拿的输.求谁 ...

  7. [javascript]jsonp-function 代码段

    (function($1454395832823,arr_infoList /**/) { $1454395832823.push(' '); for(var i in arr_infoList) { ...

  8. 利用 TFLearn 快速搭建经典深度学习模型

      利用 TFLearn 快速搭建经典深度学习模型 使用 TensorFlow 一个最大的好处是可以用各种运算符(Ops)灵活构建计算图,同时可以支持自定义运算符(见本公众号早期文章<Tenso ...

  9. 【NumberValidators】工商营业执照号码和统一社会信用代码验证

    从本质上讲,工商营业执照号码和统一社会信用代码是两套完全不一样的编码规则,识别结果也仅有行政区划部分为两者共有,但因为这两种编码同时存在的原因,所以如果需要在系统中唯一标志一家企业时,还是可以通过工商 ...

  10. ConcurrentHashMap源码解析(1)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注:在看这篇文章之前,如果对HashMap的层不清楚的话,建议先去看看HashMap源码解析. http:/ ...