MySQL持久化数据——主从分离 Linux下创建2个MySQL的Docker容器 挂载方式启动 配置主从

news2024/11/25 14:33:52

目录

  • 引出
  • 数据库的事务
    • 1.原子性
    • 2.一致性
    • 3.隔离性
    • 4.持久性
  • MySQL持久化数据
    • 0.在宿主机centos创建主的文件夹
    • 1.拷贝my.cnf配置文件
    • 2.挂载方式启动主mysql
    • 3.修改my.cnf文件的权限
      • 【bug】mysql: [ERROR] unknown variable 'server-id=200'.
    • 3.修改主的my.cof文件
    • 4.创建主从账号slave
    • 5.获取主master容器状态
    • 5.获取主mysql_master的ip地址
    • 0.在宿主机centos创建从的文件夹
    • 6.从mysql数据库修改启动的my.cnf文件
    • 7.挂载方式启动从mysql
    • 8.进入从mysql配置主从关系
  • 问题记录:
    • 1.主从的sercer-id一致报错
  • 总结

引出

1.数据库的事务,持久化到数据库——持久性;
2.Linux下MySQL数据库的持久化,挂载启动,主从配置;
3.遇到的问题,及其解决办法;


数据库的事务

1.原子性

事务中所有执行的sql合并成一个执行单元

undolog日志:update emp set age=17 where id=20

执行:update emp set age=18 where id=20

2.一致性

添加事务和不添加事务数据保持一致

3.隔离性

隔离级别:

1)读未提交:READ UNCOMMITTED,会产生脏读

2)读已提交:READ COMMITTED,会产生不可重复读

3)可重复读:REPEATABLE READ,会产生幻读(默认事务隔离级别)

4)串行化:SERIALIZABLE,效率低

4.持久性

持久化到数据库

MySQL持久化数据

主从配置顺序

1.创建mysql master(3306) 容器
2.进入master(3306) docker exec -it mysql_3306 bash
3.显示master状态: show master status; —-记住 mysql-bin , position
4.退出容器
5.创建mysql_3310容器,注意挂载点的文件
6.进入slave(3310) docker exec -it mysql_3310 bash
7.mysql -uroot -p123
8.stop slave;
9.reset slave;
10.change master to master_host=’172.17.0.2’,master_user=’slave’,master_password=’123’,MASTER_LOG_FILE=’mysql-bin.000001’,MASTER_LOG_POS=157;
11.start slave;

对容器的内容进行挂载----移动硬盘

提高数据库读写效率:

  • 主从分离,
  • 读写分离,
  • SQL优化

https://github.com/alibaba/canal

在这里插入图片描述

  • MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
  • MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
  • MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据

首先了解一下mysql主备复制原理:

(1)master主库将改变记录,发送到二进制文件(binary log)中

(2)slave从库向mysql Master发送dump协议,将master主库的binary log events拷贝到它的中继日志(relay log)

(3)slave从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库

canal的工作原理:把自己伪装成slave,从master复制数据。读取binlog是需要master授权的,因为binlog是加密的,授权分用户名密码才能读。master授权后不知道读他的binlog的是从机还是canal,他的所有传输协议都符合从机的标准,所以master一直以为是从机读的。

在这里插入图片描述

0.在宿主机centos创建主的文件夹

[root@192 software]# mkdir -p 3310/conf
[root@192 software]# mv 3310 mysql
[root@192 software]# cd mysql/
[root@192 mysql]# mkdir -p 3310/data
[root@192 mysql]# cp -r 3310 3306
[root@192 mysql]# ls
3306  3310

在这里插入图片描述

在这里插入图片描述

1.拷贝my.cnf配置文件

容器内配置文件的位置/etc/my.conf,拷贝到centos

[root@192 mysql]# docker cp mysql_3306_try:/etc/my.cnf my.cnf
[root@192 mysql]# mv conf ./3310/conf/
[root@192 mysql]# ls
3306  3310

容器内配置文件的位置/etc/my.cnf,拷贝到centos下
使用上传的配置文件my.cnf

[root@localhost conf]# docker cp mysql_3306:/etc/my.cnf ./
[root@localhost conf]# ls
my.cnf

在这里插入图片描述

2.挂载方式启动主mysql

在mysql的docker容器中/var/lib/mysql是存放数据的地方;/etc/mysql/my.conf是配置文件的位置;

-v相当于挂载,冒号:前面是宿主机,相当于centos,

docker run -itd --name mysql_3306_main --privileged=true -p 3306:3306 -v /root/software/mysql/3306/data:/var/lib/mysql -v /root/software/mysql/3306/conf/my.cnf:/etc/mysql/my.cnf -v /root/software/mysql/3306/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123 mysql

在这里插入图片描述
-v后面是centos的路径

在这里插入图片描述

在这里插入图片描述

3.修改my.cnf文件的权限

chmod 777 my.cnf

在这里插入图片描述

chmod命令

在这里插入图片描述

【bug】mysql: [ERROR] unknown variable ‘server-id=200’.

在这里插入图片描述

网上的解决方案,失败

https://blog.csdn.net/zcbdandan/article/details/89500578

在这里插入图片描述

3.修改主的my.cof文件

主的my.conf文件配置

server-id=201
log-bin=mysql-bin
binlog_format=row

在这里插入图片描述

然后再重启一下:

docker restart mysql_3306_main

4.创建主从账号slave

docker exec -it mysql_3306_main bash
mysql> create user 'slave'@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave,replication client on *.* to 'slave'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> alter user 'slave'@'%' identified with mysql_native_password by '123';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

在这里插入图片描述
在这里插入图片描述

出现加密方式异常的选择以下处理方案:由于mysql8.x的密码加密方式改变,如果之后主从出现问题,需要修改密码加密方式,如果之前在mysql_3306中设置过的则可以跳过此处。

进入mysql的主服务器:

[root@localhost ~]# docker exec -it mysql_3306 bash
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123';

5.获取主master容器状态

mysql> show master status
    -> ;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000010 |     1162 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> 

在这里插入图片描述
在这里插入图片描述

5.获取主mysql_master的ip地址

在这里插入图片描述

docker inspect mysql_3306

[root@192 conf]# docker inspect mysql_3306_main | grep IPA
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAMConfig": null,
                    "IPAddress": "172.17.0.3",
[root@192 conf]# 

在这里插入图片描述

序列名称
1日志文件:filemysql-bin.000002
2日志文件位置:Position95744
3主服务器的ip172.17.0.2

0.在宿主机centos创建从的文件夹

在这里插入图片描述

6.从mysql数据库修改启动的my.cnf文件

要点:

  • 打开读写权限
  • 进行修改vim,添加
server-id=202
relay_log=edu-mysql-relay-bin
read-only=1

在这里插入图片描述

在这里插入图片描述

7.挂载方式启动从mysql

docker run -itd --name mysql_3310_slave --privileged=true -p 3310:3306 -v /root/software/mysql/3310/data:/var/lib/mysql -v /root/software/mysql/3310/conf/my.cnf:/etc/mysql/my.cnf -v /root/software/mysql/3310/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123 mysql

在这里插入图片描述

8.进入从mysql配置主从关系

"IPAddress": "172.17.0.3",

mysql> show master status
    -> ;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000010 |     1162 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
change master to master_host='172.17.0.3',master_user='slave',master_password='123',MASTER_LOG_FILE='binlog.000013',MASTER_LOG_POS=157

在这里插入图片描述

在这里插入图片描述

show variables like 'server_id';

在这里插入图片描述

问题记录:

1.主从的sercer-id一致报错

Last_IO_Error: Fatal error: The replica I/O thread stops because source and replica have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on replica but this does not always make sense; please check the manual before using it).

在这里插入图片描述
在这里插入图片描述

报错原因:

可能是之前的挂载启动方式没有生效,导致server-id都是1,冲突,IO线程没有启动成功;因此在容器内直接修改server_id,尝试后修改成功;

解决方案:

用到的相关代码如下:

mysql> change master to master_host='172.17.0.3',master_user='slave',master_password='123',MASTER_LOG_FILE='binlog.000013',MASTER_LOG_POS=157;
mysql> start slave;
mysql> show slave status \G
mysql> SET GLOBAL server_id = 123
    -> ;
mysql>  show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 123   |
+---------------+-------+
1 row in set (0.00 sec)

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.17.0.3
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000013
          Read_Master_Log_Pos: 157
               Relay_Log_File: 52d169c47849-relay-bin.000003
                Relay_Log_Pos: 323
        Relay_Master_Log_File: binlog.000013
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

在这里插入图片描述
在这里插入图片描述

进行测试

在这里插入图片描述


总结

1.数据库的事务,持久化到数据库——持久性;
2.Linux下MySQL数据库的持久化,挂载启动,主从配置;
3.遇到的问题,及其解决办法;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/753986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql索引实战

Mysql索引实战 一:概述1.1 索引如何提高查询效率: 二:结构2.1 主要索引结构2.2 详解BTree2.2.1 二叉树2.2.2 红黑树2.2.3 B-Tree2.2.4 BTree2.2.5 为什么InnoDB存储引擎选择使用Btree索引结构? 三:索引分类3.1 按照作用…

使用fast测试的错误

错误:Connection refused: connect 分析&解决 检查服务的端口号和fast生成请求时的端口号是否一致,不一致会报上面的错误 分析:设置服务配置的方法很多,可以写在配置文件里,也可以写在命令行里,当有多…

windows nodejs 版本切换

一、按健winR弹出窗口,键盘输入cmd,然后敲回车。然后进入命令控制行窗口,并输入where node查看之前本地安装的node的路径。 二、找到上面找到的路径,将node.exe所在的父目录里面的所有东西都删除。 三、从官网下载安装包 https://github.com/…

轻量级性能测试工具 wrk 应该如何使用?

项目设计之初或者是项目快要结束的时候,大佬就会问我们,这个服务性能测试的结果是什么,QPS 可以达到多少,RPS 又能达到多少?接口性能可以满足未来生产环境的实际情况吗?有没有自己测试过自己接口的吞吐量&a…

MongoDB安装配置教程(详细版)

前言:MongoDB是前端开发人员普遍使用的数据库,因为MongoDB不需要图形界面,是一个基于分布式文件存储的开源数据库系统。MongoDB 将数据存储为一个文档,数据结构由键值对(key>value)组成;MongoDB 文档类似于 JSON 对…

Flutter:自定义错误显示

为什么要自定义错误处理 以下面数组越界的错误为例&#xff1a; class _YcHomeBodyState extends State<YcHomeBody> {List<String> list [苹果, 香蕉];overrideWidget build(BuildContext context) {return Center(child: Column(children: [Text(list[0]),Tex…

小区物业管理信息系统设计与实现(论文+源码)

小区物业管理信息系统设计与实现(论文源码) 本篇 论文源码私我 以上内容只是精简版 还有很多原创类型论文 摘 要 随着互联网的发展&#xff0c;网络技术的发展变得极其重要&#xff0c;所以依靠计算机处理业务成为了一种社会普遍的现状。管理方式也自然而然的向着现代化技术方…

python_day8_timeline

带时间线的柱状图 导包 from pyecharts.charts import Bar, Timeline from pyecharts.options import * from pyecharts.globals import *创建柱状图1 bar1 Bar() bar1.add_xaxis([中国, USA, 不列颠]) bar1.add_yaxis(GDP, [30, 20, 10],label_optsLabelOpts(position&quo…

【Linux详解】——文件系统(磁盘结构、软硬链接、动静态库)

&#x1f4d6; 前言&#xff1a;本期介绍文件系统。 目录 &#x1f552; 1. 磁盘结构&#x1f558; 1.1 物理结构&#x1f558; 1.2 存储结构&#x1f558; 1.3 逻辑结构 &#x1f552; 2. 文件系统&#x1f558; 2.1 对 IO 单位的优化&#x1f558; 2.2 磁盘分区与分组&#x…

一套电子病历系统源码(EMR)

EMR电子病历系统源码 电子病历系统面向门诊医生和病房临床医生&#xff0c;实现了医生日常阅读、书写病历和医院管理病历的需求&#xff0c;它包括知识库管理、病历模版制作、医生书写病历、开各种检查检验申请单、查询各种报告单、电子病历浏览、病历质量控制等功能。 它将病…

JMeter基础 — JMeter聚合报告详解

提示&#xff1a;聚合报告组件的使用和察看结果树组件的使用方式相同。本篇文章主要是详细的介绍一下聚合报告组件内容&#xff0c;不做示例演示。 1、聚合报告介绍 在使用JMeter进行性能测试时&#xff0c;聚合报告(Aggregate Report)可以说是必用的监听器。 &#xff08;1&…

【微信小程序创作之路】- 小程序窗口整体配置(导航栏、标题)

【微信小程序创作之路】- 小程序窗口导航栏配置 第五章 微信小程序窗口导航栏配置 文章目录 【微信小程序创作之路】- 小程序窗口导航栏配置前言一、入口文件的配置二、页面配置三、全局默认窗口配置1.navigationBarTitleText&#xff1a;导航栏标题文字2.navigationBarBackgr…

基于ChatGPT上线《你说我猜》小游戏

摘要 AIGC、GPT、休闲小游戏三者可以怎么结合&#xff1f; AIGC、GPT与小游戏的结合为游戏体验带来了新的可能性。AIGC&#xff08;Artificial Intelligence Game Content&#xff09;作为一种人工智能技术&#xff0c;可以自动生成任务、剧情和角色对话等游戏元素&#xff0c…

安卓:Fragment

一、Fragment介绍 Fragment 是 Android 平台上的一种 UI 组件&#xff0c;用于构建灵活且可复用的界面模块。每个 Fragment 都有自己的生命周期&#xff0c;可以嵌入到 Activity 中&#xff0c;并在一个 Activity 内部管理其自己的布局和行为。通过使用 Fragment&#xff0c;可…

1000多道大厂Java真题汇总。刷完这一套高质量题集,这个金九银十妥妥的

又是一年金九银十&#xff01; 纵观今年的技术招聘市场&#xff0c;Java依旧是当仁不让的霸主&#xff01;即便遭受Go等新兴语言不断冲击&#xff0c;依旧岿然不动。究其原因&#xff1a; Java有着极其成熟的生态&#xff0c;这个不用我多说&#xff1b;Java在运维、可观测性…

el-table实现动态表头,自定义斑马纹等功能

需求&#xff1a;1.根据选择的日期时间&#xff0c;实现表头的动态显示功能 2.修改默认表头灰色样式&#xff0c; 3.斑马纹偶数灰色改为奇数为灰色 4.表格某一行加分割线区分 1.效果 2.动态表格实现 1.height&#xff1a;表格的高度设置&#xff0c;内容超出后会显示滚动条&a…

类和对象(二)

目录 一、类的六个默认成员函数 二、构造函数 2.1 概念 2.2 特性 三、析构函数 3.1 概念 3.2 特性 四、拷贝构造函数 4.1 概念 4.2 特性 五、赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载特性 六、const修饰成员函数 七、取地址及const取地址操作符重载 一…

Html基础知识学习——css精灵(十五)

这里写自定义目录标题 定义示例一示例二 定义 将网页用到的图片放在一张图片上&#xff0c;进行定位展示 优点:防止网页http请求次数过多&#xff0c;从而提高页面性能 缺点&#xff1a;降低开发效率。维护难度加大 示例一 使用图 网页制作图 <!DOCTYPE html> <…

如何能够极速浏览大体积tif影像文件?

在无人机航拍的高清正射影像中&#xff0c;大体积文件是普遍现象&#xff0c;几十GB的TIFF文件很常见。常规的浏览方式特别容易导致卡顿&#xff0c;用户需要花费半天时间等待影像图的呈现。 建议您尝试将tiff格式快速转换为mbtiles或lrp格式&#xff0c;mbtiles和lrp格式专门…

JSP+MySql实战

0目录 JSPMySql实战 创建maven工程和包 创建2张表 User表 Employee表 实体类封装 Util 包BaseDao类 Dao包 EmployeeDao类 UserDao类 实现接口方法 Dao包新建impl包 UserDaoImp EmployeeDaoImpl 新建Service包 接口方法 UserService EmployeeSe…