前言

MySQL主从复制简介

MySQL主从复制的目的是实现数据库冗余备份,将master数据库的数据定时同步到slave库中,一旦master数据库宕机,可以将Web应用数据库配置快速切换到slave数据库,确保Web应用有较高的可用性。

MySQL主从同步是一个异步复制的过程,要实现复制,首先需要在master上开启bin-log日志功能,bin-log日志用于记录在master库执行的增删改更新操作的sql语句,整个过程需要开启3个线程,分别是master开启I/O线程,slave开启I/O线程和SQL线程。

主从复制大致流程

  • slave上执行slave start,slave I/O线程会通过在master创建的授权用户连接到master,并请求master从指定的文件和位置发送bin-log日志内容。
  • master接收到slave的IO线程请求后,master的IO线程根据slave发送的指定bin-log日志position点之后的内容,然后返回给slave的IO线程。
  • 返回的信息中除了bin-log日志内容外,还有master最新的bin-log文件名以及在bin-log中的下一个指定更新position点。
  • slave的IO线程接收到信息后,将接收到的日志内容依次添加到slave端的relay-log文件的末端,并将读取到的master端的bin-log文件名和position点记录到master.info文件中,以便在下一次读取的时候能告知master从相应的bin-log文件名及最后一个position点开始发起请求
  • slave SQL线程检测到relay-log中内容有更新,会立刻解析relay-log的内容,将解析后的SQL语句在slave中执行,执行成功后主库和从库数据一致。

准备

  • 主节点IP:192.168.0.11
  • 从节点IP:192.168.0.10
  • 待同步的数据库:test

步骤

配置主节点

  1. vim /etc/my.cnf

  2. [mysqld]字段中添加:

log-bin=master-bin
binlog-format=ROW
server-id=1
  1. 重启mysqld:
systemctl restart mysqld
  1. 登入mysql,创建用于同步的账户tongbu,注意修改IP段和密码:
create user 'tongbu'@'192.168.%' identified by '123456';
  1. 授权,注意修改IP段和密码:
grant replication slave on *.* to 'tongbu'@'192.168.%' identified by '123456';
  1. 查看master状态:
# 注意File字段和Position字段
show master status;

配置从节点

  1. vim /etc/my.cnf

  2. 在[mysqld]字段中添加:

log-bin=master-bin
binlog-format=ROW
server-id=2
  1. 重启mysql
  2. 登入mysql,配置从库连接主库,注意修改主库的IP,用于同步的账户名和密码,master_log_file为show master status;中的File值,master_log_posshow master status;中的Position
change master to master_host='192.168.0.11',master_user='tongbu',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154;
  1. 启用从库:
start slave;
  1. 查看从库状态
# 注意看 Slave_IO_Running和Slave_SQL_Running是否为yes
show slave status\G

测试

在主库创建一个数据库:create database test123;

在数据库中新建一个表:create table t0(id int,name varchar(20));

查看从库有没有新建的表

只同步部分库或表

方式一:限制master端

在/etc/my.cnf中添加:binlog-do-db=test(多个数据库用逗号隔开,不加这一行默认同步所有库)

方式二:限制slave端

在/etc/my.cnf中添加:replicate-do-db=test

指定需要同步的表:replicate-do-table=test.test_table

解决主从复制问题

如果发生网络异常导致主从同步错误,或者在已有数据基础上搭建主从复制,需要解决数据不一致问题。

主从数据差别不大时的不同步问题

  1. master端执行:flush tables with read lock;,将数据库设置为全局读锁。
  2. slave端:
    1. 停止IO及SQL线程,stop slave;
    2. 将同步错误的SQL跳过一次,set global sql_slave_skip_counter=1;
    3. 启动slave,start slave;
  3. master端执行:unlock tables;解锁。

主从数据差别很大时的不同步问题

  1. master端执行:flush tables with read lock;,将数据库设置为全局读锁。
  2. 使用mysqldump、mysqlpump、xtrabackup等工具对master数据库进行完整备份
  3. 将完整数据导入到从库
  4. 重新配置主从关系
  5. master端执行:unlock tables;解锁。

主键冲突,错误代码1062

情况:从库上执行show slave status\G,报错last_error:1062,sql线程已停止工作。

原因:从库上执行了写操作,然后在主库上执行了相同的SQL语句,主键冲突,主从复制状态就会报错。

解决:

  1. 利用perconna-toolkit工具中的py-slave-restart命令在从库跳过错误(因为主从库有相同的数据)。

主库更新数据,从库找不到而报错,错误代码1032

在从库执行delete删除操作,再在主库执行更新操作,由于从库已经没有该数据,导致主从数据不一致。

解决方法:在从库执行show slave status,根据错误信息所知道的binlog文件和position号,在主库上通过mysqlbinlog命令查找在主库执行的哪条SQL语句导致的主从报错。把从库上丢失的这条数据补上,然后执行跳过错误。如果从库丢失了很多数据,需要考虑重新配置主从环境。

配置MySQL主从复制(一主一从)的更多相关文章

  1. MySQL(14)---Docker搭建MySQL主从复制(一主一从)

    Docker搭建MySQL主从复制(一主一从) 上一篇博客写了MYSQL主从复制原理 : MySQL(13)---MYSQL主从复制原理 这篇我们来写 Docker搭建MYSQL主从复制(一主一从) ...

  2. 配置MySQL主从复制报错Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work

    配置MySQL主从复制报错 ``` Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave ha ...

  3. centos 配置mysql主从复制

    mysql+centos7+主从复制   MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公 ...

  4. 配置MySQL主从复制和读写分离

    实验环境 序号 主机名 IP地址 备注 1 mysql-master 192.168.204.201 MySQL主库 2 mysql-slave 192.168.204.202 MySQL从库 3 a ...

  5. docker上配置mysql主从复制

    1.在docker上启动2台mysql容器:(这里3306为主,3307为从) docker run -d  -e MYSQL_ROOT_PASSWORD=123456  -p 3306:3306 - ...

  6. linux配置mysql主从复制

    1.准备工作,2台服务器都安装最好一个版本的mysql 主:192.168.100.1 从:192.168.100.2 a.修改主数据库/etc/my.cnf,mysqld下添加.修改之后重启. [m ...

  7. Linux下配置MySQL主从复制

    一.环境准备 本次准备两台Linux主机,操作系统都为CentOS6.8, 都安装了相同版本的MySQL.(MySQL5.7). 主从服务器的防火墙都开启了3306端口. 相关信息如下: [主服务器] ...

  8. ansible配置mysql主从复制

    配置主机1.下载安装所需安装包 [root@server1 ansible]# lsansible-2.7.8-1.el7.noarch.rpmansible-tower-setup-bundle-3 ...

  9. Mysql学习总结(33)——阿里云centos配置MySQL主从复制

    1.安装jdk1.8 首先确定没有安装过jdk 2.yum –y list java*查询系统自带的jdk安装包情况. 3.安装jdk1.8 4. 验证安装结果. 安装mysql 1. rpm -Uv ...

  10. docker起容器配置MySQL主从复制

    https://www.jianshu.com/p/0439206e1f28

随机推荐

  1. Django笔记三十八之发送邮件

    本文首发于公众号:Hunter后端 原文链接:Django笔记三十八之发送邮件 这一篇笔记介绍如何在 Django 中发送邮件. 在 Python 中,提供了 smtplib 的邮件模块,而 Djan ...

  2. python Unitest和pytest 介绍和安装

    前言 目前有两种纯测试的测试框架,pytest和unittest,这系列文章主要介绍pytest为主 UnitTest测试框架理论 python 自带的单元测试框架,常用在单元测试 在自动化测试中提供 ...

  3. 2023-04-16:给定一个长度为N的数组,值一定在0~N-1范围,且每个值不重复 比如,arr = [4, 2, 0, 3, 1] 0 1 2 3 4 把0想象成洞

    2023-04-16:给定一个长度为N的数组,值一定在0~N-1范围,且每个值不重复 比如,arr = [4, 2, 0, 3, 1] 0 1 2 3 4 把0想象成洞,任何非0数字都可以来到这个洞里 ...

  4. 2022-03-26:给定一个无向图, 从任何一个点x出发,比如有一条路径: x -> a -> b -> c -> y, 这条路径上有5个点并且5个点都不一样的话,我们说(x,a,b,c,y)是一条

    2022-03-26:给定一个无向图, 从任何一个点x出发,比如有一条路径: x -> a -> b -> c -> y, 这条路径上有5个点并且5个点都不一样的话,我们说(x ...

  5. 2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分累加和}的最大值是多少? 整个过程要求时间复杂度O(N)。

    2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分 ...

  6. vue全家桶进阶之路31:Vue3 数据和方法的双向绑定ref、reactive、toRefs

    ref 在 Vue 3 中,你可以使用 setup 函数来定义组件的数据和方法.在 setup 函数中,你可以使用 ref.reactive 和 computed 等 Vue 3 的响应式 API 来 ...

  7. Vue 全局避免按钮重复点击

    这里用到的 Vue.directive 自定义指令 自定义指令是对普通DOM元素进行的底层操作,它是一种有效的的补充和扩展,不仅可以用于定义任何的dom操作,并且是可以复用的 在 main.js 中写 ...

  8. ERROR: Failed to install the following Android SDK packages as some licences have not been accepted.

    android studio 配置sdk时提示如下错误 麻麻蛋~ 根据accepted 了解到是安装android-26时未被允许:于是执行如下步骤 1.cd 到sdk目录 D:\develop\An ...

  9. Python异步编程之web框架 异步vs同步 文件IO任务压测对比

    测试基本信息 主题:比较异步框架和同步框架在文件IO操作的性能差异 python版本:python 3.8 压测工具:locust web框架:同步:flask 异步:aiohttp.starlett ...

  10. java(方法定义、调用、重载)

    1.方法 Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则:就是一个方法只完成一个功能, ...