mysql复制表原理_MySQL 主从复制原理与实践详解
本文实例讲述了MySQL 主从复制原理与实践。分享给大家供大家参考,具体如下:
简介
MySQL 的主从复制又叫 Replication、AB 复制。至少需要两个 MySQL 服务(可以是同一台机器,也可以是不同机器之间进行)。
比如A服务器做主服务器,B服务器做从服务器,在A服务器上进行数据的更新,通过 binlog 日志记录同步到B服务器上,并重新执行同步过来的 binlog 数据,从而达到两台服务器数据一致。
MySQL 数据库的主从复制方案,与使用 scp/rsync 等命令进行的文件级别复制类似,都是数据的远程传输。
只不过 MySQL 的主从复制是其自带的功能,无需借助第三方工具,而且MySQL的主从复制并不是数据库磁盘上的文件直接拷贝,而是通过逻辑的 binlog 日志复制到要同步的服务器本地,然后由本地的线程读取日志里面的 SQL 语句,重新应用到 MySQL 数据库中。
作用
1. 可以实时灾备,用于故障切换;
2. 读写分离,提供查询服务,实现负载均衡;
3. 数据热备,避免影响业务。
原理
1、主服务器MySQL服务将所有的写操作记录在 binlog 日志中,并生成 log dump 线程,将 binlog 日志传给从服务器MySQL服务的 I/O 线程。
2、从服务器MySQL服务生成两个线程,一个是 I/O 线程,另一个是 SQL 线程。
3、从库 I/O 线程去请求主库的 binlog 日志,并将 binlog 日志中的文件写入 relaylog(中继日志)中。
4、从库的 SQL 线程会读取 relaylog 中的内容,并解析成具体的操作,来实现主从的操作一致,达到最终两个数据库数据一致的目的。
注意点:
- 主从复制是异步的逻辑的 SQL 语句级的复制;
- 复制时,主库有一个 I/O 线程,从库有两个线程,及 I/O 和 SQL 线程;
- 实现主从复制的必要条件是主库要开启记录 binlog 的功能;
- 作为复制的所有 MySQL 节点的 server-id 都不能相同;
- binlog 文件只记录对数据内容有更改的 SQL 语句,不记录任何查询语句。
形式
一主一从
主主复制
一主多从
多主一从(5.7后开始支持)
联级复制
实践
需求
实现一主一从复制模式,同一台主机两个MySQL实例
环境
Mac:10.15.1
Docker:2.0.0.3//采取docker安装MySQL主要是管理维护方便、独立IP、启动秒级
MySQL-master:5.7.29//主服务器
MySQL-master IP:172.17.0.3
MySQL-slave:5.7.29//从服务器
MySQL-slave IP:172.17.0.4
步骤
第一步:准备好两台MySQL服务器
mysql-master(主服务器):
1. 创建目录结构:
master/conf、master/data、master/logs
2. 启动运行实例容器:
docker run --name mysql-master
> -p 3310:3306
> -v ~/docker/master/conf:/etc/mysql/conf.d
> -v ~/docker/master/data:/var/lib/mysql
> -v ~/docker/master/logs:/var/log/mysql
> -e MYSQL_ROOT_PASSWORD=123456
> -d mysql:5.7
3. 进入容器
docker exec -it mysql-master bash
4. 登录MySQL
mysql -uroot -p
mysql-slave(从服务器):
1. 创建目录结构:
slave/conf、slave/data、slave/logs
2. 启动运行实例容器:
docker run --name mysql-slave
> -p 3310:3306
> -v ~/docker/slave/conf:/etc/mysql/conf.d
> -v ~/docker/slave/data:/var/lib/mysql
> -v ~/docker/slave/logs:/var/log/mysql
> -e MYSQL_ROOT_PASSWORD=123456
> -d mysql:5.7
3. 进入容器
docker exec -it mysql-slave bash
4. 登录MySQL
mysql -uroot -p
第二步:配置文件(my.cnf)修改
主服务器:
[mysqld]
port = 3306
server-id = 1
#要同步的数据库
binlog-do-db = school
#要生成二进制日志文件 主服务器一定要开启
log-bin = mysql-bin
重启MySQL: docker restart mysql-master
从服务器:
[mysqld]
port = 3306
server-id = 2
#要同步的数据库
binlog-do-db = school
#要生成二进制日志文件(从服务器可选)
log-bin = mysql-bin
重启MySQL: docker restart mysql-slave
第三步:创建主服务器复制用户及相关权限
create user 'slave'@'%' identified by '123456';//创建用户
grant replication slave,replication client on *.* to 'slave'@'%';//设置用户权限
flush privileges;//刷新权限
show grants for 'slave'@'%';//查看用户权限
第四步:数据备份同步
1. 登录master,执行锁表操作
mysql -uroot -p
FLUSH TABLES WITH READ LOCK;
2. 将master中需要同步的db的数据dump出来
mysqldump -uroot -p school > school.dump
3. 将数据导入slave
mysql -uroot -h172.17.0.4 -p school < school.dump
4. 解锁master
UNLOCK TABLES;
第五步:主服务器复制状态
1. 创建新数据表及增加数据
create table user( id int(10) auto_increment, name varchar(30), primary key (id) )charset=utf8mb4;
insert into user(name) values(222);
2. 主服务器 binlog 记录状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 769 | school | | |
+------------------+----------+--------------+------------------+-------------------+
第六步:从服务器开始复制
1. 连接主服务器及设置复制的起始节点
mysql> change master to master_host='172.17.0.3',
-> master_port=3306,
-> master_user='slave',
-> master_password='123456',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=769;
2. 开始复制
start slave;
3. 查看复制状态
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.0.3
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 961
Relay_Log_File: 87dc5224655d-relay-bin.000003
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes //表示I/O线程读取成功
Slave_SQL_Running: Yes //表示SQL线程执行成功
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 961
Relay_Log_Space: 892
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 45540733-4e0c-11ea-b0ac-0242ac110003
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
4. 查看数据表数据
mysql> show create table user\G
*************************** 1. row ***************************
Table: user
Create Table: CREATE TABLE `user` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4
mysql> select * from user;
+----+------+
| id | name |
+----+------+
| 1 | 222 |
+----+------+
复制的控制相关命令:
stop salve //停止slave连路
reset slave //重置slave连路
start slave //开启slave连路
stop master //停止master连路
reset master //重置master连路
start master //开启master连路
第七步:主从服务器的进程查看
mysql-master:
mysql-slave:
希望本文所述对大家MySQL数据库计有所帮助。
mysql复制表原理_MySQL 主从复制原理与实践详解相关推荐
- mysql 二叉树表设计_Mysql 索引模型 B+ 树详解
一.认识二叉树 首先,在了解 mysql 中的 B+ 树之前,我们需要搞懂什么是二叉树.二叉树是一种常见的非线形数据结构,数据是以一对多的形态组织起来的,我画了一张图来帮助你理解: 在二叉树中,有一种 ...
- MySQL建表(那些字段必须)命令详解
MySQL建表(那些字段必须)命令详解1. create table命令 强调:使用建表命令之前必须使用use命令选择表所在的数据库.create table命令的格式如下: create table ...
- mysql+数据库主从原理_MySQL主从复制原理及实现
MySQL主从复制原理 MySQL主从复制主要基于MySQL的BIN log日志,bin log 日志中包含了几乎所有mysql增删改查的语句,所以bin log日志也是mysql用户备份和数据恢复的 ...
- mysql主从配置原理_MySQL主从复制原理
MySQL主从复制是构建高可用MySQL的基础,复制就是让一台服务器的数据和其它服务器保持同步,一台主库可以同步到多台备库上面,备库也可以作为另一台服务器的主库.主库和备库之间可以有多种不同的组合方式 ...
- mysql数据库杀掉堵塞_Mysql解决USE DB堵塞详解
遇到故障,我们往往想的是如何解决这个故障,而不是从故障的根本去思考出现这个故障的原因?这样的结果,只能使我们得到了鱼,失去了渔.今天,我们就来分享一个由USE DB堵塞故障引发的思考案例. 故障描述 ...
- mysql 配置自动截断_MySql超长自动截断实例详解
MySql超长自动截断实例详解 小伙伴问到一个问题,为啥在项目中调用插入或者更新语句时超长的字无法自动截断,而在navicat中直接执行是可以自动截断的? 如下 CREATE TABLE `p_app ...
- mysql 超长 java 问题_MySql超长自动截断实例详解
MySql超长自动截断实例详解 小伙伴问到一个问题,为啥在项目中调用插入或者更新语句时超长的字无法自动截断,而在navicat中直接执行是可以自动截断的? 如下 CREATE TABLE `p_app ...
- mysql 复制忽略库_MySQL主从复制过滤
MySQL主从复制是逻辑复制,基于Binlog进行主从数据传输,MySQL提供了丰富的参数来配置主从复制过滤条件.在主库可以设置对于库的数据写入是否写入binlog,在从库可以设置对某些库或者表的bi ...
- mysql的更新用法_mysql update语句的用法详解
本节内容: mysql数据库中的update语句. 首先,单表的UPDATE语句: UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr ...
- mysql 秒杀 隔离级别_MySQL 四种隔离级别详解,看完吊打面试官
什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...
最新文章
- 取出url中的字符_如何在JavaScript中解析URL:例如主机名,路径名,查询,哈希?...
- 【排序】归并类排序—归并排序(逆序数问题)
- 关于一个js栈溢出的异常
- BP算法,用梯度下降法更新权值W与偏置项b
- 虚拟主机创建虚拟lan_创建虚拟背景应用
- Ranking the Cows(POJ-3275 )
- Vue深入学习1—mustache模板引擎原理
- 新年春节海报素材精品,再也不怕老板催稿!
- wsl2启动桌面_WSL2使用xrdp实现图形桌面
- HDU2566 统计硬币【暴力】
- 一个开发周期为6个月的中小型软件开发项目成本预算大致表,不足之处请指点...
- springBoot于tomcat7搭建websocket服务
- 通过try、except和else的使用来使Python程序更加“强壮”
- 微型计算机原理及应用考试重点,微型计算机原理及应用考试重点.doc
- python 微信小程序制作教程_微信小程序从零开始开发步骤(一)
- vue 集成环信 web im 加 一对一视频通话
- 什么是跨域?怎么解决跨域问题
- 黔南州委常委、统战部部长潘选一行领导莅临迦太利华调研
- 财政部、税务总局:集成电路设计和软件企业免两年所得税
- 微信小程序-从零开始制作一个跑步微信小程序