docker实现mysql主从复制的示例代码

目录
  • 一、概述
    • 1、原理
    • 2、实现
  • 三、创建Slave实例
  • 四、主从配置
    • 总结:
  • 五、参考

一、概述

1、原理

  • master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
  • slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
  • 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

主从流程图

2、实现

主库:192.168.3.13:3310从库:192.168.3.14:3310二、创建master主库进入服务器192.168.3.13

1、安装镜像

docker pull mysql:8.0.26

2、新建目录

mkdir -p /home/apps/mysql-master/{config,log,data}

3、创建并启动

docker run -d --name mysql-master \
--restart=always \
--privileged=true \
-p 3310:3306 \
-v /home/apps/mysql-master/config:/etc/mysql/conf.d \
-v /home/apps/mysql-master/log:/var/log/mysql \
-v /home/apps/mysql-master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.26

4、新增/修改master基本配置

vim /home/apps/mysql-master/config/my.cnf

添加以下内容

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

三、创建Slave实例

进入服务器192.168.3.14

1、同上面操作一样

# 创建目录
mkdir -p /home/apps/mysql-slave-01/{config,log,data}

# 启动容器
docker run -d --name mysql-slave-01 \
--restart=always \
--privileged=true \
-p 3310:3306 \
-v /home/apps/mysql-slave-01/config:/etc/mysql/conf.d \
-v /home/apps/mysql-slave-01/log:/var/log/mysql \
-v /home/apps/mysql-slave-01/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.26

# 修改Slave基本配置
vim /home/apps/mysql-slave-01/config/my.cnf

# 添加以下内容
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

四、主从配置

1、添加master配置

vim /home/apps/mysql-master/config/my.cnf
server_id=1

# 开启二进制日志
log-bin=mysql-bin
read-only=0

# 需要同步的数据库
binlog-do-db=rapid-cloud
binlog-do-db=rapid-cloud-test

# 需要忽略的数据库
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

2、重启容器

docker restart mysql-master

3、添加Slave配置

vim /home/apps/mysql-slave-01/config/my.cnf

server_id=2
log-bin=mysql-bin
read-only=1
binlog-do-db=rapid-cloud
binlog-do-db=rapid-cloud-test

replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

4、重启容器

docker restart mysql-slave-01

5、master添加帐号,用来同步的用户

# 进入容器
docker exec -it mysql-master /bin/bash

# 进入主库mysql数据库
mysql -u root -p

# 授权root可以远程访问( 主从无关,为了方便我们远程连接mysql)

# 授权远程
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

# 刷新
flush privileges;

# 创建backup用户

# 应先创建新用户
create user 'backup'@'%' identified by '123456';

# 执行授权
grant all privileges on *.* to 'backup'@'%';

# 刷新
flush privileges;

# 授权远程
ALTER USER 'backup'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

# 刷新
flush privileges;

# 查看主库状态
show master status;

6、在从库里设置主库连接

# 进入容器
docker exec -it mysql-slave-01 /bin/bash

# 进入主库mysql数据库
mysql -u root -p

change master to master_host='192.168.3.13',master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3310;

7、启动从库同步

先将主库的数据复制一份到从库,包含表结构及数据

将主库binlog清除一下,这样它的位置就从0开始了

purge master logs to'mysql-bin.000001';

开启同步

# 开始同步
start slave;

# 停止同步
# stop slave;

# 查看同步状态
show slave status\G;

8、错误排查

如果无法实现主从同步,可以通过以下排查

总结:

主从数据库在自己配置文件中声明需要同步哪个数据库,忽略哪个数据库等信息。并且server-id不能一样主库授权某个账号密码来同步自己的数据从库使用这个账号密码连接主库来同步数据

五、参考

https://www.cnblogs.com/heian99/p/12104189.html

https://blog.csdn.net/lilygg/article/details/98187015

binlog清除:https://www.cnblogs.com/kiko2014551511/p/11532426.html

到此这篇关于docker实现mysql主从复制的示例代码的文章就介绍到这了,更多相关docker mysql主从复制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mysql实现简易版搜索引擎的示例代码

    目录 前言 简介 ngram 全文解析器 创建全文索引 检索方式 1.自然语言检索(NATURAL LANGUAGE MODE) 2.布尔检索(BOOLEAN MODE) 与 Like 对比 总结 前言 前段时间,因为项目需求,需要根据关键词搜索聊天记录,这不就是一个搜索引擎的功能吗? 于是我第一时间想到的就是 ElasticSearch 分布式搜索引擎,但是由于一些原因,公司的服务器资源比较紧张,没有额外的机器去部署一套 ElasticSearch 服务,而且上线时间也比较紧张,数据量也不大,

  • MySQL数据库 Load Data 多种用法

    目录 MySQL Load Data 的多种用法 一.LOAD 基本背景 二.LOAD 基础参数 三.LOAD 示例数据及示例表结构 四.LOAD 场景示例 五.LOAD 总结 MySQL Load Data 的多种用法 一.LOAD 基本背景 我们在数据库运维过程中难免会涉及到需要对文本数据进行处理,并导入到数据库中,本文整理了一些导入导出时常见的场景进行示例演示. 二.LOAD 基础参数 文章后续示例均使用以下命令导出的 csv 格式样例数据(以 , 逗号做分隔符,以 " 双引号作为界定符)

  • 当面试官问mysql中char与varchar的区别

    目录 char与varchar的区别 char与varchar的区别 以上就是当面试官问mysql中char与varchar的区别的详细内容,更多关于char与varchar的区别的资料请关注我们其它相关文章!

  • 详解MySQL的Seconds_Behind_Master

    Seconds_Behind_Master 对于mysql主备实例,seconds_behind_master是衡量master与slave之间延时的一个重要参数.通过在slave上执行"show slave status;"可以获取seconds_behind_master的值. 原始实现 Definition:The number of seconds that the slave SQL thread is behind processing the master binary

  • MySQL的从库Seconds_Behind_Master延迟总结

    目录 MySQL从库Seconds_Behind_Master延迟总结 一.延迟分类 1.第一类(成服务器有较高的负载) 2.第二类(不会造成服务器有较高的负载) 二.相关测试 1.Innodb层的行锁造成的延迟 2.MySQL层的MDL LOCK造成的延迟 三.总结 MySQL从库Seconds_Behind_Master延迟总结 一.延迟分类 延迟我们可将其分为两类: 1.第一类(成服务器有较高的负载) 这一类延迟情况可能造成服务器有较高的负载,可能是CPU/IO的负载.因为从库在实际执行E

  • MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因

    目录 问题描述 原理简析 问题分析 拓展一下 总结一下 问题描述 用户在主库上执行了一个 alter 操作,持续约一小时.操作完成之后,从库发现存在同步延迟,但是监控图表中的 Seconds_Behind_Master 指标显示为 0,且 binlog 的延迟距离在不断上升. 原理简析 既然是分析延迟时间,那么自然先从延迟的计算方式开始入手.为了方便起见,此处引用官方版本 5.7.31 的源代码进行阅读.找到计算延迟时间的代码: ./sql/rpl_slave.cc bool show_slav

  • MySQL命令无法输入中文问题的解决方式

    发现问题 近期通过 mysql 命令连接 mysql server 的时候, 出现了不能输入中文的现象, 如下所示: mysql> SELECT 'Chinese characters <> are stripped'; +------------------------------------+ | Chinese characters <> are stripped | +------------------------------------+ | Chinese ch

  • MySQL数据库Shell import_table数据导入

    目录 MySQL Shell import_table数据导入 1. import_table介绍 2. Load Data 与 import table功能示例 2.1 用Load Data方式导入数据 2.2 用import_table方式导入数据 3. import_table特定功能 3.1 多文件导入(模糊匹配) 3.2 并发导入 3.3 导入速率控制 3.4 自定义chunk大小 4. Load Data vs import_table性能对比 MySQL Shell import_

  • python3文件复制、延迟文件复制任务的实现方法

    使用python版本3.6.1 工作中测试客户端传输报文速率,写了以下两个脚本. 第一个,简单的复制文件并重命名. 第二个,在循环中增加延时的功能. 使用场景将文件复制并重命名(重命名方式在文件末尾加生成的随机数) #!/usr/bin/python3 #coding=GB2312 import os import os.path import random import shutil count = 0 #源文件夹 src="E:\\file\\CEB411Message__201711151

  • Mysql数据库的主从同步配置

    目录 Mysql主从同步配置 1.安装两个 mysql 2.编写mysql配置文件 3.初始化数据 4.其他mysql 相关命令 Mysql主从同步配置 配置准备: 需要两个数据库 mysql 可视化工具,当然使用用命令行也可以 我这里演示使用 docker 启动两个 mysql 容器, 你也可以安装两个 mysql 前提版本一致 1.安装两个 mysql 创建 msyql 挂载目录 [root@localhost /]# mkdir -p /opt/docker/mysql1/conf/ [r

随机推荐