mysql复制原理与机制一
复制原理:复制需要二进制日志记录数据库上的改变

slave的IO线程复制把master上的Binary log读取到本地的relay log里
SQL线程负责把relay log恢复到数据库数据里
show slave status\G;
Slave_IO_State: Waiting for master to send event
Master_Host: 10.105.7.108
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 630
Relay_Log_File: mysqld-relay-bin.000006
Relay_Log_Pos: 793
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes 关闭slave的io线程
stop slave io_thread;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 10.105.7.108
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 630
Relay_Log_File: mysqld-relay-bin.000006
Relay_Log_Pos: 793
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: No
Slave_SQL_Running: Yes
到master
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 143 |
| mysql-bin.000002 | 367 |
| mysql-bin.000003 | 120 |
| mysql-bin.000004 | 630 |
+------------------+-----------+
4 rows in set (0.00 sec)
日志轮换
mysql> flush logs;
Query OK, 0 rows affected (0.02 sec) mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 143 |
| mysql-bin.000002 | 367 |
| mysql-bin.000003 | 120 |
| mysql-bin.000004 | 677 |
| mysql-bin.000005 | 120 |
+------------------+-----------+
mysql> use hk;
Database changed
mysql> show tables;
+--------------+
| Tables_in_hk |
+--------------+
| test |
+--------------+
1 row in set (0.01 sec) mysql> select * from test;
+----+---------------------+
| id | time |
+----+---------------------+
| 1 | 2017-02-04 10:04:12 |
| 2 | 2017-02-04 13:53:35 |
| 3 | 2017-02-08 19:46:49 |
+----+---------------------+
3 rows in set (0.00 sec) mysql> insert into test values(4,now());
Query OK, 1 row affected (0.05 sec) mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 143 |
| mysql-bin.000002 | 367 |
| mysql-bin.000003 | 120 |
| mysql-bin.000004 | 677 |
| mysql-bin.000005 | 344 |
+------------------+-----------+
5 rows in set (0.00 sec) mysql> show binlog events in 'mysql-bin.000005';
+------------------+-----+-------------+-----------+-------------+--------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+--------------------------------------------+
| mysql-bin.000005 | 4 | Format_desc | 108 | 120 | Server ver: 5.6.35-log, Binlog ver: 4 |
| mysql-bin.000005 | 120 | Query | 108 | 203 | BEGIN |
| mysql-bin.000005 | 203 | Query | 108 | 313 | use `hk`; insert into test values(4,now()) |
| mysql-bin.000005 | 313 | Xid | 108 | 344 | COMMIT /* xid=110 */ |
+------------------+-----+-------------+-----------+-------------+--------------------------------------------+
可以看到一件记录到二进制日志里 mysql> select * from test where id=4;
+----+---------------------+
| id | time |
+----+---------------------+
| 4 | 2017-02-08 20:34:49 |
+----+---------------------+
到从库
Database changed
mysql> select * from test;
+----+---------------------+
| id | time |
+----+---------------------+
| 1 | 2017-02-04 10:04:12 |
| 2 | 2017-02-04 13:53:35 |
| 3 | 2017-02-08 19:46:49 |
+----+---------------------+
查看此时 Relay_Log_File: mysqld-relay-bin.
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 10.105.7.108
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 630
Relay_Log_File: mysqld-relay-bin.000006
Relay_Log_Pos: 793
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: No
Slave_SQL_Running: Yes
开启io线程 mysql> start slave io_thread;
Query OK, 0 rows affected (0.01 sec) mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.105.7.108
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 344
Relay_Log_File: mysqld-relay-bin.000009
Relay_Log_Pos: 507
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
发现中继日志发生变化
Relay_Log_File: mysqld-relay-bin.
mysql> select * from test where id=4;
+----+---------------------+
| id | time |
+----+---------------------+
| 4 | 2017-02-08 20:34:49 |
+----+---------------------+
1 row in set (0.00 sec) 此时sql进程 从中继日志 读取数据 写入数据库
在mysql外执行
mysqlbinlog mysqld-relay-bin.000009
[root@bogon mysql]# mysqlbinlog mysqld-relay-bin.000009
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#170208 20:39:46 server id 163 end_log_pos 120 CRC32 0xbdb725c4 Start: binlog v 4, server v 5.6.35 created 170208 20:39:46
BINLOG '
khGbWA+jAAAAdAAAAHgAAABAAAQANS42LjM1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAcQl
t70=
'/*!*/;
# at 120
#170208 20:39:46 server id 108 end_log_pos 0 CRC32 0x0649f72c Rotate to mysql-bin.000005 pos: 4
# at 167
#170208 20:33:47 server id 108 end_log_pos 120 CRC32 0x045c4ff1 Start: binlog v 4, server v 5.6.35-log created 170208 20:33:47
BINLOG '
KxCbWA9sAAAAdAAAAHgAAAAAAAQANS42LjM1LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAfFP
XAQ=
'/*!*/;
# at 283
#170208 20:34:49 server id 108 end_log_pos 203 CRC32 0xb10230cc Query thread_id=9 exec_time=0 error_code=0
SET TIMESTAMP=1486557289/*!*/;
SET @@session.pseudo_thread_id=9/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.time_zone='SYSTEM'/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 366
#170208 20:34:49 server id 108 end_log_pos 313 CRC32 0x59ee4c4e Query thread_id=9 exec_time=0 error_code=0
use `hk`/*!*/;
SET TIMESTAMP=1486557289/*!*/;
insert into test values(4,now())
/*!*/;
# at 476
#170208 20:34:49 server id 108 end_log_pos 344 CRC32 0x1735772f Xid = 110
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
复制特点
1.sql更新,没写binary log 不可能复制
2.正在执行的sql更新,也不可能被复制
3.只有执行完成而且成功的语句才会被复制
mysql复制原理与机制一的更多相关文章
- MySQL复制原理-加强版
mysql从3.23开始提供复制功能,复制指将主库的ddl和dml操作通过binlog文件传送到从库上执行,从而保持主库和从库数据同步.mysql支持一台主库同时向多台从库复制,从库同时也可以作为其他 ...
- MySQL复制原理
mysql从3.23开始提供复制功能,复制指将主库的ddl和dml操作通过binlog文件传送到从库上执行,从而保持主库和从库数据同步.mysql支持一台主库同时向多台从库复制,从库同时也可以作为其他 ...
- MYSQL复制原理及其流程
Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其他主机(slave)上,并重新执行一遍来实现 ...
- mysql 复制原理与实践
复制功能是将一个mysql数据库上的数据复到一个或多个mysql从数据库上. 复制的原理:在主服务器上执行的所有DDL和DML语句都会被记录到二进制日志中,这些日志由连接到它的从服务器获取,并复制到从 ...
- mysql 复制原理详解
http://www.cnblogs.com/kristain/articles/4142970.html
- MySQL复制之理论篇
一.MySQL复制概述 MySQL支持两种复制方式:基于行的复制和基于语句的复制(逻辑复制).这两种方式都是通过在主库上记录 二进制日志.在备库重放日志的方式来实现异步的数据复制,其工作原理如下图: ...
- 31.Mysql复制
31.Mysql复制复制是指将主数据库的DDL和DML操作通过二进制日志传到从数据库上,然后在从数据库上对重做日志,从而使从库与主库保持同步.Mysql支持一台主库同时向多台从库复制,从库也可以作为其 ...
- mysql之 MySQL 主从基于position复制原理概述
1 .主从复制简介MySQL 主从复制就是将一个 MySQL 实例(Master)中的数据实时复制到另一个 MySQL 实例(slave)中,而且这个复制是一个异步复制的过程.实现整个复制操作主要由三 ...
- 高性能Mysql主从架构的复制原理及配置详解
温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...
随机推荐
- Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists).
Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists). Git fet ...
- Jni_Linux_01_转
1.Linux下JNI的使用(http://www.cnblogs.com/bastard/archive/2012/05/17/2506877.html) Linux下 JNI的使用 学习Andro ...
- spring的AOP动态代理--JDK代理和CGLIB代理区分以及注意事项
大家都知道AOP使用了代理模式,本文主要介绍两个代理模式怎么设置以及区别,对原文一些内容进行了引用后加入了自己的理解和更深入的阐述: 一.JDK代理和CGLIB代理的底层实现区别* JDK代理只能 ...
- 第七届蓝桥杯C-B-10-最大比例/gcd变形
最大比例 X星球的某个大奖赛设了M级奖励.每个级别的奖金是一个正整数.并且,相邻的两个级别间的比例是个固定值.也就是说:所有级别的奖金数构成了一个等比数列.比如:16,24,36,54其等比值为:3/ ...
- CUDA初试
1.基本概念 CUDA,全称是Compute Unified Device Architecture,意即统一计算架构,是NVIDIA推出的一种整合技术,开发者可以利用NVIDIA的GeForce 8 ...
- WinForm---进度条的实现方法
(转自:http://www.cnblogs.com/Sue_/articles/2024932.html) 看了好几个WinForm程序了,发现他们对进度条的处理完全失去了进度条的作用.他们都是采用 ...
- Django rest_framewok框架的基本组件
快速实例 序列化 视图三部曲 认证与权限组件 解析器 分页 回到顶部 快速实例 Quickstart 回到顶部 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web ...
- New Concept English three (30)
27W/m 32 words the death of ghost For years, villagers believed that Endley Farm was hunted. The far ...
- 【设计模式】calendar的单例需求和实现
calendar单例需求: 参数:有default的calendar file 1.如果无实例,无参数调用,取default,检查是否合法,存入实例 2.如果无实例,有参数调用,检查是否合法,存入实例 ...
- python 魔法方法补充(__setattr__,__getattr__,__getattribute__)
python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...