首页 > 数据库 >MySQL 主从复制

MySQL 主从复制

时间:2023-01-15 12:00:33浏览次数:56  
标签:主从复制 slave log ## 数据库 MySQL master mysql

MySQL 主从复制(0.5)

1、概述

MySQL主从复制是一个异步的复制过程,底层是基于MySQL数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。

主从复制可以缓解单台数据库的访问压力,除此之外,当主库或从库发生损毁时,另一个数据库可以作为备份恢复原有数据,提高了安全性。

2、复制过程

MySQL复制过程分成三步:

  1. master将改变记录到二进制日志(binary log)
  2. slave:将master的binary log拷贝到它的中继日志(relay log)
  3. s1ave重做中继日志中的事件,将改变应用到自己的数据库中

image

一、Docker 实现主从复制

  1. 拉取镜像(略)

主服务器

  1. 新建主服务器容器实例3307
docker run --name mysql-master \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=1234  \
--privileged=true \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-d mysql:5.7
  1. 进入/mydata/mysql-master/conf目录下新建my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
  1. 修改配置后重启master实例
docker restart mysql-master
  1. 进入mysql-master容器
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
  1. master容器实例内创建数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '1234';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

从服务器

  1. 新建从服务器容器实例3308
docker run -d -p 3308:3306 --privileged=true \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=1234  \
--name mysql-slave mysql:5.7
  1. 进入/mydata/mysql-slave/conf目录下新建my.cnf
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1
  1. 重启slave实例
docker restart mysql-slave

其他操作

  1. 主数据库中查看主从同步状态
show master status;

image

  1. 进入mysql-slave容器
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
  1. 从数据库中配置主从复制
change master to master_host='宿主机ip', master_user='slave', master_password='1234', master_port=3307, master_log_file='mall-mysql-bin.000004', master_log_pos=617, master_connect_retry=30;

参数说明

  • master_host:主数据库的IP地址;
  • master_port:主数据库的运行端口;
  • master_user:在主数据库创建的用于同步数据的用户账号;
  • master_password:在主数据库创建的用于同步数据的用户密码;
  • master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
  • master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
  • master_connect_retry:连接失败重试的时间间隔,单位为秒。
  1. 从数据库中查看主从同步状态
show slave status \G;

image

  1. 从数据库中开启主从同步
start slave;

发现已同步
image

主从测试

❗注:中文无法插入,修改编码(未解决)后,一定要重新建库建表测试。
建库 > 建表 > 插入数据,查看库状态。

遇到的问题:

Docker ERROR: mysqld failed while attempting to check config

stackoverflow看到一个与这个问题看似无关的答案
image

意思差不多是,docker命令是对(指令的)顺序敏感的;
到底是怎么回事呢,这里说明一下:

这里对于docker命令,有个小细节就是:

docker ${args_to_docker} run ${args_to_run} image_ref ${cmd_in_container}

比如-e是向容器设置环境变量参数、-p是指端口映射
这两项应该是作用于我们run命令的参数,是必须放在run之后,IMAGE_ID之前设置;
如果像上面的那样顺序,就会被mysql容器内部当成要给当前mysql服务设置的参数,mysql当然是不认识它们的,所以才会报错!

❗建议将-d写到最后。

为什么-d 写dao run 后无报错,写道最后会报错?
即运行容器后立刻退出:Exit(1)

无报错
docker run -d -p 3308:3306 --privileged=true \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=1234  \
--name mysql-slave mysql:5.7

报错

docker run --name mysql-master \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=root  \
--privileged=true \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-d mysql:5.7

二、多台服务器实现

标签:主从复制,slave,log,##,数据库,MySQL,master,mysql
From: https://www.cnblogs.com/mengtongblog/p/17053293.html

相关文章

  • Mysql ERROR 1045 (28000):
    MysqlERROR1045(28000):Accessdeniedforuser​​'root'@'localhost'​​这种问题需要强行重新修改密码,方法如下:/etc/init.d/m......
  • -bash: mysql: command not found 解决办法
    root@DB-02~]#mysql-uroot-bash:mysql:commandnotfound原因:这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,当然会找不到命令,我们需要做的就是......
  • 使用 NodeJS 更新 MySQL 中的记录
    在本文中,我们将看到如何使用NodeJS更新MySQL中的记录。我们将从Node.js服务器动态更新MySQL表值。您可以在更新后使用select语句来检查MySql记录是否已更新。在......
  • mysql 数据库设计三大范式
    1.什么是设计范式设计表的依据,按照范式设计出来的表,不会出现数据的冗余数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构清晰的;反之则是......
  • MySQL 事务特性和事务隔离级别
    1.MySQL事务的四大特性2.MySQL事务的并发问题3.MySQL事务的隔离级别---------------------------------------------------------1.MySQL事务的四大特性MySQL事......
  • 用Jersey构建RESTful服务5--Jersey+MySQL5.6+Hibernate4.3
    一、总体说明本例运行演示了用Jersey构建RESTful服务中,如何同过Hibernate将数据持久化进MySQL的过程二、环境1.上文的项目RestDemo2.MySQL5.6下载​​http://dev.mysql.com/......
  • 【MySQL】MySQL8安装
    1.MySQL8安装安装环境操作系统:CentOS7MySQL版本:8.0.28安装方式:二进制Generic软件路径:/app/database数据路径:/data/3306日志路径:/binlog/3306MySQLCommunitySe......
  • MySql查看数据库及表容量大小并排序
    MySql查看数据库及表容量大小并排序带刀医生关注IP属地:江苏2022.04.1120:05:34字数85阅读1,219MySql查看数据库及表容量⼤⼩并排序查看所有数据库容量⼤⼩......
  • 自己动手写一个Mysql到PostgreSQL数据库迁移工具
    1.前言这段时间在进行Mysql到PostgreSQL数据库迁移工作.主要包含三部分工作,其一是构建数据库对象,包括表,视图,存储过程的构建,这部分由于我在项目早期就引入了li......
  • docker之Mysql安装教程
    部署mysql:5.7安装mkdir-p/app/docker/mysql/logmkdir-p/app/docker/mysql/datamkdir-p/app/docker/mysql/confdockerpullmysql:5.7dockerrun-d-p3......