mysql 5.6.14主从复制(也称mysql AB复制)环境配置方法

   2016-05-18 0
核心提示:这篇文章主要介绍了mysql 5.6.14主从复制(也称mysql AB复制)环境配置方法,需要的朋友可以参考下

一、mysql主(称master)从(称slave)复制的原理:

      (1).master将数据改变记录到二进制日志(binary log)中,也即是配置文件log-bin指定的文件(这些记录叫做二进制日志事件,binary log events)
      (2).slave将master的binary log events拷贝到它的中继日志(relay log)
      (3).slave重做中继日志中的事件,将改变反映它自己的数据(数据重演)

附简要原理图:

mysql 5.6.14主从复制(也称mysql AB复制)环境配置方法

二、mysql主从复制支持的类型:

    (1).基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句.MySQL默认采用基于语句的复制,效率比较高

word-spacing: 0px">   (2).基于行的复制:把改变的内容直接复制过去,而不关心到底改变该内容是由哪条语句引发的 . 从mysql5.0开始支持
word-spacing: 0px">   (3).混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制.

三、主从配置需要注意的地方:

   (1).主DB server和从DB server数据库的版本一致
   (2).主DB server和从DB server数据库数据一致[ 这里就会可以把主的备份在从上还原,也可以直接将主的数据目录拷贝到从的相应数据目录]
   (3).主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一

四、主从配置的简要步骤:

附简要示意图:

mysql 5.6.14主从复制(也称mysql AB复制)环境配置方法

1.主DB SERVER上的配置

   (1).安装数据库
   (2).修改数据库配置文件,指明server_id,开启二进制日志(log-bin)
   (3).启动数据库,查看当前是哪个日志,position号是多少
   (4).登陆数据库,授权用户[ip地址为从机IP地址,如果是双向主从,这里的还需要授权本机的IP地址(此时自己的IP地址就是从IP地址)]
   (5).备份数据库[记得加锁和解锁]
   (6).传送备份到从DB server上
   (7).启动数据库

以下步骤,为单向主从搭建成功,想搭建双向主从需要的步骤:

   (1).登陆数据库,指定主DB server的地址,用户,密码等信息[此步仅双向主从时,需要]

   (2).开启同步,查看状态

2.从DB SERVER上的配置

  (1).安装数据库
  (2).修改数据库配置文件,指明server_id[如果是搭建双向主从的话,也要开启二进制日志(log-bin)]
  (3).启动数据库,还原备份
  (4).查看当前是哪个日志,position号是多少[单向主从此步不需要,双向主从需要]
  (5).指定主DB server的地址,用户,密码等信息
  (6).开启同步,查看状态

五、单向主从环境[也称 mysql A/B复制]的搭建案例:

1.主DB server和从DB server都安装相应版本的数据库,我的两台DB server都已经安装好(5.6.14版本),都会是双实例,这里就不演示安装,可以参考mysql源码编译安装和mysql多实例配置两篇文章
注:两台机器的的selinux都是disable(永久关闭selinux,请修改/etc/selinux/config,将SELINUX改为disabled),防火墙可以选择关闭,开启的话也行[不行的话,添加防火墙策略]
2.修改主DB server的配置文件(/etc/my.cnf),开启日志功能,设置server_id值,保证唯一[client102为主DB server]

[root@client102 scripts]# vim /etc/my.cnf 
# 修改配置文件里,下面两个参数: 
# 设置server_id,一般建议设置为IP,或者再加一些数字 
server_id =102
# 开启二进制日志功能,可以随便取,最好有含义 
log-bin=mysql3306-bin

3.启动数据库服务器,并登陆数据库,授予相应的用户用于同步

# 我这里是多实例mysql,所以启动是这样的,如果大家是单实例的,就直接启动就可以[/etc/init.d/mysqld start] 
[root@client102 scripts]# mysqld_multi start 3306 
# 登陆mysql 服务器 
[root@client102 scripts]# mysql -uroot -S /usr/local/mysql/mysqld3306.sock -p 
# 授予用户权限用于主从同步 
mysql> grant replication slave on *.* to 'kongzhong'@'192.168.1.100' identified by 'kongzhong'; 
Query OK, 0 rows affected (0.00 sec) 
# 刷新授权表信息 
mysql> flush privileges; 
Query OK, 0 rows affected (0.00 sec) 
# 查看position 号,记下position 号(很重要,从机上需要这个position号和现在的日志文件,我这里是414和mysql3306-bin.000001) 
mysql> show master status; 
+----------------------+----------+--------------+------------------+-------------------+
| File         | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 
+----------------------+----------+--------------+------------------+-------------------+
| mysql3306-bin.000001 |   414 |       |         |          | 
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

4.为保证主DB server和从DB server的数据一致,这里采用主备份,从还原来实现初始数据一致

复制代码 代码如下:

# 临时锁表
mysql> flush tables with read lock;
# 我这里实行的全库备份,在实际中,我们可能只同步某一个库,可以只备份一个库
# 新开一个终端,执行如下操作
[root@client102 data]# mysqldump  -p3306 -uroot -p  -S /usr/local/mysql/mysqld3306.sock  --all-databases > /tmp/mysql.sql
# 解锁
mysql> unlock tables;
# 将备份的数据传送到从机上,用于恢复
 [root@client102 data]# scp  /tmp/mysql.sql  root@192.168.1.100:/tmp

5.从DB server配置文件只需修改一项,其余用命令行做

复制代码 代码如下:

[root@client100 ~]# vim /etc/my.cnf
# 设置server_id,一般建议设置为IP,或者再加一些数字
server_id =100

6.启动数据库,还原备份数据

复制代码 代码如下:

# 启动数据库
[root@client100 ~]# mysqld_multi start 3306
# 还原主DB server备份的数据
[root@client100 ~]# mysql -uroot -S /usr/local/mysql/mysqld3306.sock -p < /tmp/mysql.sql

7.登陆数据库,添加相关参数(主DBserver的ip/端口/同步用户/密码/position号/读取哪个日志文件)

复制代码 代码如下:

[root@client100 ~]# mysql -uroot -S /usr/local/mysql/mysqld3306.sock -p
mysql> change master to
    -> master_host='192.168.1.102',
    -> master_user='kongzhong',
    -> master_password='kongzhong',
    -> master_port=3306,
    -> master_log_file='mysql3306-bin.000001',
    -> master_log_pos=414;
#/*  下面是一部分注解:
#/*  指定主DB server的IP地址
master_host='192.168.1.102'
#/*  指定用于同步的用户[这个就是我们在主DB server授权的用户]
master_user='kongzhong'
#/* 指定用于同步的用户的密码
master_password='kongzhong'
#/* 指定主DB server的端口[下面一个例子,可以重点看这个]
master_port=3306
#/*  指定从DB server 从哪个日志文件开始读[在主DB server上使用show master status查看到日志]
master_log_file='mysql3306-bin.000001'
#/*  指定 从哪个POSITION号开始读
master_log_pos=414
# 开启主从同步
mysql> start slave;
# 查看主从同步状态
mysql> show slave status\G;
# 主要看以下两个参数:[这两个参数如果是yes就表示主从同步正常]
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

8.下面大家就可以在主DB server上新建一个表,看是否能同步到从DB server上,我这里就不测试了

[注:千万不要在从DB server手动插入数据,那样数据就不一致,主从就会断开,需要重新配置了]

如果有问题,可以尝试关闭IPTABLES(/etc/init.d/iptables stop)和selinux(setenforce 0:临时关闭selinux,永久关闭selinux,请修改/etc/selinux/config,将SELINUX改为disabled)

9.上面所搭建的是单向主从,也是用的比较多的,有人想了解双向主从是如何搭建,其实,就是主DB server和从DB sever都开启日志功能,然后在主DB SERVER执行授权用户[这里授权的是自己作为从服务器,也就是这里的IP地址是主DB server的IP地址],然后再在主DB server上进行chang master操作.有不理解的可以留言询问.

 
标签: mysql 主从复制
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • sql:mysql:函数:TIMESTAMPDIFF函数实现TimeStamp字段相减,求得时间差
    sql:mysql:函数:TIMESTAMPDIFF函数实现TimeS
     函数内指定是minute,则最终结果value值的单位是分钟,如果函数内指定为hours,则最终结果value值单位为小时。//UPLOAD_TIME 减去 CREATE_DTTM 求得时间差,以分钟数计时select avg(TIMESTAMPDIFF(MINUTE,CREATE_DTTM,UPLOAD_TIME)) value,LEFT(CREATE_DTTM
    03-08
  • mysql下如何执行sql脚本 执行SQL脚本
    1.编写sql脚本,假设内容如下:  create database dearabao;  use dearabao;  create table niuzi (name varchar(20));  保存脚本文件,假设我把它保存在F盘的hello world目录下,于是该文件的路径为:F:\hello world\niuzi.sql2.执行sql脚本,可以有2种方法: 
    02-10
  • MySQL 5.7版本sql_mode=only_full_group_by问题
    用到GROUP BY 语句查询时com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'col_user_6.a.START_TIME' which is not functionally dependent on colu
    02-10
  • Oracle迁移到MySQL性能下降的注意点 oracle数据
    背景:最近有较多的客户系统由原来由Oracle改造到MySQL后出现了性能问题CPU 100%,或是后台的CRM系统复杂SQL在业务高峰的时候出现堆积导致业务故障。在我的记忆里面淘宝最初从Oracle迁移到MySQL期间也遇到了很多SQL的性能问题,记忆最为深刻的子查询,当初的
    02-10
  • MySQL与Oracle 差异比较之六触发器
    触发器编号类别ORACLEMYSQL注释1创建触发器语句不同create or replace trigger TG_ES_FAC_UNIT  before insert or update or delete on ES_FAC_UNIT  for each rowcreate trigger `hs_esbs`.`TG_INSERT_ES_FAC_UNIT` BEFORE INSERT on `hs_esbs`.`es_fac_u
    02-10
  • mysql where条件:某时间字段为今天的sql语句
    1.查询:注册时间为今天的所有用户数:select count(*) from customer where TO_DAYS(createtime) = TO_DAYS(NOW())2.获取当前时间到凌晨24点还有多长时间:(Java中可用于判断某时间是否为今天)final Calendar cal = Calendar.getInstance();    ca
    02-10
  • mysql中的sql
    变量用户变量: 在用户变量前加@系统变量: 在系统变量前加@@运算符算术运算符有: +(加), -(减), * (乘), / (除) 和% (求模) 五中运算位运算符有:(位于), | (位或), ^ (位异或), ~ (位取反),(位右移),(位左移)比较运算符有: = (等于),(大于),(小于), = (大
    02-10
  • mysql5.7配置文件修改sql_mode 重启无效解决方法。this is incompatible with sql_mode=only_full_group_by
    mysql5.7配置文件修改sql_mode 重启无效解决方
    whereis my.cnf找到配置路径:/etc/my.cnf找到[mysqld],在下面添加sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION重要:如果没有[mysqld],一定要先添加[mysqld]再在下
    02-10
  • mysql 8 查询报错(sql_mode=only_full_group_by)
    mysql 8 查询报错(sql_mode=only_full_group_by
    Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_
    02-10
  • Oracle、MySql、Sql Server比对
    MySql:廉价(部分免费):当前,MySQL採用双重授权(DualLicensed),他们是GPL和MySQLAB制定的商业许可协议。假设你在一个遵循GPL的***(开源)项目中使用MySQL,那么你能够遵循GPL协议免费使用MySQL。否则,你须要购买MySQLAB制定的那个商业许可协议。Windows $
    02-10
点击排行