4.mysql学习笔记:mysql的复制(一)

原创 2015年11月20日 11:17:23

mysql的复制

复制概述

复制要解决的一个基本问题是服务器之间数据的同步,一个master(主库)的数据可以同步到多个备库(slave)上。而且其中一个备库也可以配置成令一个服务器的主库。

mysql支持两种复制方式:

1.基于行的复制
2.基于语句的复制

两种方式都是在主库上记录二进制日志,在备库上重放日志的方式来实现异步的数据复制的(mysql还支持半同步复制,不过效率要略低于异步复制)。这个方式可能会导致备库(slave)上的数据可能与主库(master)上的有所延迟。

一般来讲:msyql的复制大部分是向后兼容的,也就是说新版本的服务器要作为老版本的备库(slave),因为旧版的不一定能够支持新的特性。


复制需要解决的问题

复制常见的用途有:

1.数据分布
2.负载均衡

通过mysql的复制可以将读操作分布到多个服务器上,实现对读密集型应用的优化。

可以采用的技巧是:
(1)DNS轮询
(2)LVS(linux虚拟服务器)

3.高性能和故障分析
帮助应用程序避开单点故障
4.mysql升级测试


复制的如何工作

mysql的复制包含有三个步骤:

1.在主库(master)上把数据更改记录到二进制日志中(Binary Log),这些记录被成为二进制日志事件。
2.备库(slave)将主库上的日志复制到自己的中继日志(Relay Log)中。
3.备库读取中继日志中的事件,将其放到备库数据之上。

如下图所示:
这里写图片描述

注意:mysql会根据事务提交的顺序而非每条语句的执行顺序来记录二进制日志


配置复制

为mysql服务器配置复制一般分为以下几个步骤:

1.在每台服务器上创建复制帐号
2.配置主库(master)和备库(slave)
3.通知备库(slave)连接到主库(master)并从主库复制数据

准备:
主库(master): 192.168.3.245 (server5.example.com)
备库(slave): 192.168.3.242 (server2.example.com)


创建复制帐号

mysql会赋予一些特殊的权限给复制线程,在备库(slave)运行的I/O线程会建立一个到主库(master)的TCP/IP链接,所以就要求我们必须在master上建立一个用户,并赋予其合适的权限,slave通过该用户连接到主库并读取日志。

在192.168.3.245和192.168.3.242做如下操作:

192.168.3.245(master):
这里写图片描述

192.168.3.242(slave):
这里写图片描述

注意:为什么在slave也要创建复制帐号,其中一个好处就是后续如果有需要的话可以方便的交换主备库的角色。


配置主库(master)和备库(slave)

在192.168.3.245(master)mysql的配置文件/etc/my.cnf上做如下修改:

[root@server5 ~]# vim /etc/my.cnf
这里写图片描述

重起192.168.3.245上的mysql服务:
这里写图片描述

确认二进制日志文件已经在master上建立,使用show master status命令:
这里写图片描述


在192.168.3.242上做如下配置:

[root@server5 ~]# vim /etc/my.cnf

这里写图片描述

relay_log 为中继日志的位置和名称
log_slave_updates 允许备库将其重要的事件也记录到自身的二进制日志中
read_only 阻止没有任何特殊权限的线程修改数据(通常不是十分使用,特别针对那些需要建表的应用)

重起mysql数据库:
这里写图片描述


启动复制

备库连接到主库并重放其二进制文件:
这里写图片描述

可以看到Slave_IO_State、Slave_IP_Running、Slave_SQL_Running这三个显示当前备库复制尚未运行。

开始复制:
这里写图片描述

执行该命令没有显示错误,查看状态发现已经开始运行,等待主库更改日志信息。

在主库中做一些修改操作,可以看到备库的文件和日志位置都有可能会增加:

我们在主库中创建了数据库haha:
这里写图片描述

然后查看备库中也多了一个数据库haha,说明复制是成功的:
这里写图片描述

在master中显示进程列表,可以看到id2的进程发送了二进制日志给slave:
这里写图片描述

在slave中也会看到有两个线程在进行处理:
这里写图片描述

小结:
至此,我们通过一个简单的示例介绍了mysql的复制过程,在接下来的章节里将会着重介绍mysql的多种使用和复制原理。敬请期待。

版权声明:本文为博主原创文章,未经博主允许不得转载。

MySQL一主两从复制转换为级联复制

最近有个朋友问我MySQL一主两从复制如何改为级联复制? 我之前没有做过这样的改动,所以自己研究了一下, 让B作为A的从库,C作为B的从库,其实也挺简单的,方法如下。 首先从库B要开启二进制日...
  • sunner5222
  • sunner5222
  • 2015年02月01日 14:20
  • 2110

MYSQL把一张表的数据批量复制到另外一张表

1. 表结构完全一样 insert into 表1 select * from 表22. 表结构不一样(这种情况下得指定列名) insert into 表1 (列名1,列名2,列名3) sel...
  • xjh101010
  • xjh101010
  • 2017年12月04日 14:36
  • 325

史上最简单的 MySQL 教程(二十一)「数据的高级操作 之 蠕虫复制」

数据的高级操作蠕虫复制蠕虫复制:从已有的数据表中获取数据,然后将数据进行新增操作,数据成倍(以指数形式)的增加。根据已有表创建新表,即复制表结构,其基本语法为: create table + 表名 +...
  • qq_35246620
  • qq_35246620
  • 2017年06月03日 21:14
  • 2615

mysql外键,索引等基本操作 和 跨表复制数据操作

前言m_parameter_template参数模板原来为一个包含很多信息的表,目前业务需求,需要把表中一些信息提取出放到另一个表m_parameter_file,pt表通过一个外键parameter...
  • bran_tor
  • bran_tor
  • 2016年03月16日 23:51
  • 321

MySQL 5.6 一主多从的 半同步复制搭建(已纠正)

MySQL 5.6 一主多从的 半同步复制搭建 半同步简介:         在默认情况下,MySQL的复制是异步的,这意味着主服务器及其从服务器是独立的。异步复制可以提供最佳的性能,因...
  • u010098331
  • u010098331
  • 2016年03月04日 15:12
  • 2637

mysql中从一张表复制几条记录到另一张表

1. 语法介绍       有三张表a、b、c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段。对于这种情况,可以使用如下的语句来实现: INSERTINTO db1_name...
  • superbfly
  • superbfly
  • 2013年10月16日 08:29
  • 4195

mysql蠕虫复制

INSERT into user_info(version,create_user_count,create_pc_count) select version,create_user_count,cr...
  • dengfei00100
  • dengfei00100
  • 2016年04月05日 14:23
  • 618

mysql中复制表结构与数据的方法小结(5.7版本)

实践所有user表的DDl    CREATE TABLE `user` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `username` varch...
  • shadow_zed
  • shadow_zed
  • 2017年05月12日 22:01
  • 406

mysql同一个表和不同表的一列复制到另一列的方法

1.同一个表的一列复制到另一列 update table1  set field1 = field2; 2.不同表一列复制到另一个列 update table1,table2 set tabl...
  • duzhanxiaosa
  • duzhanxiaosa
  • 2015年09月29日 20:24
  • 363

Mysql 5.7 主从复制的多线程复制配置方式以及读写分离中间件 MaxScale

mysql主从复制配置 配置思路 1. 修改master和slave的配置文件,使用二进制日志,指定serverid 目的是让各自都有了自己的唯一标示,并以二进制文件格式进行交流 2. master...
  • u011871037
  • u011871037
  • 2016年08月17日 17:19
  • 4098
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:4.mysql学习笔记:mysql的复制(一)
举报原因:
原因补充:

(最多只允许输入30个字)