前言

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. 2022-10-21:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。 你要用 所有的火柴棍 拼成一个正方形。 你 不能折断 任何一根火柴

    2022-10-21:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度. 你要用 所有的火柴棍 拼成一个正方形. 你 不能折断 任何一根火柴 ...

  2. 2022-10-17:特殊的二进制序列是具有以下两个性质的二进制序列: 0 的数量与 1 的数量相等。 二进制序列的每一个前缀码中 1 的数量要大于等于 0 的数量。 给定一个特殊的二进制序列 S,以

    2022-10-17:特殊的二进制序列是具有以下两个性质的二进制序列: 0 的数量与 1 的数量相等. 二进制序列的每一个前缀码中 1 的数量要大于等于 0 的数量. 给定一个特殊的二进制序列 S,以 ...

  3. 2020-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据。数据库不能停,并且还有增删改操作。请问如何操作?

    2020-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据.数据库不能停,并且还有增删改操作.请问如何操作?福哥答案2020-01-20: 陌陌答案:用pt_onl ...

  4. C语言之环形队列

    一.环形队列的优势 环形队列是一种特殊的队列,它可以解决普通队列在使用时空间利用不充分的问题.在环形队列中,当队列满时,队列的尾指针指向队列的起始位置,而不是指向队列的最后一个元素.这样可以在不浪费空 ...

  5. Java商城网站系统设计与实现(带源码)

    基于Java的商城网站系统设计与实现 功能介绍 平台采用B/S结构,后端采用主流的Springboot框架进行开发,前端采用主流的Vue.js进行开发. 整个平台包括前台和后台两个部分. 前台功能包括 ...

  6. Python从零到壹丨图像增强的顶帽运算和底帽运算

    摘要:这篇文章详细介绍了顶帽运算和底帽运算,它们将为后续的图像分割和图像识别提供有效支撑. 本文分享自华为云社区<[Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算>, ...

  7. Springboot 开启异步任务Async,邮件发送任务,定时任务

    异步任务 1.主启动类开启异步注解 2.service目录下开启异步任务注解 @Service public class AsyncService { @Async//异步任务注解的标志 public ...

  8. 图书机读目录MARC简介,ISO格式目录数据生成

    一.简介 机读目录(Machine-Readable Catalogue,MARC),是利用计算机读取和处理书目信息,是计算机编目的产品. 它以代码形式和特定的结构将书目信息记录在计算机的存储载体上, ...

  9. 最小编译器和 UI 框架「GitHub 热点速览」

    如果有一个关键词来概述本周的 GitHub 热门项目的话,大概就是 van 和 sectorc 都用到的 smallest.只不过一个是前端的响应式框架,一个是搞编译的 C 编译器.它们除了轻量化这个 ...

  10. 前后端是怎么交互的呢?(Jvav版)

    一.什么是前端 在网上,我也去找了一些观点,其实都是应用层面的,什么使用一个地址,回车以后就能拿到 .html文件等等 说的也没问题,前端简单点说呢,就是负责展示和美化的页面,大部分在网上我们所看到的 ...