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

引出

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.遇到的问题,及其解决办法;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将MySQL配置主从复制并使用Docker加载数据卷,你可以按照以下步骤进行操作: 1. 创建一个用于主库的MySQL容器: ``` docker run --name mysql-master -e MYSQL_ROOT_PASSWORD=<root_password> -d mysql:tag ``` 请将`<root_password>`替换为你想要设置的实际root密码,并将`tag`替换为所需的MySQL版本。 2. 创建一个用于从库的MySQL容器: ``` docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=<root_password> -d mysql:tag ``` 同样,请将`<root_password>`替换为你想要设置的实际root密码,并将`tag`替换为所需的MySQL版本。 3. 将主库的数据目录挂载数据卷中: ``` docker run --name mysql-master -v /path/to/master:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=<root_password> -d mysql:tag ``` 将`/path/to/master`替换为你希望挂载数据目录的实际路径。 4. 将从库的数据目录挂载数据卷中: ``` docker run --name mysql-slave -v /path/to/slave:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=<root_password> -d mysql:tag ``` 将`/path/to/slave`替换为你希望挂载数据目录的实际路径。 5. 在主库中启用二进制日志。在主库容器中执行以下命令: ``` docker exec -it mysql-master mysql -uroot -p<root_password> -e "SET GLOBAL binlog_format = 'ROW'; FLUSH TABLES WITH READ LOCK;" ``` 确保将`<root_password>`替换为你之前设置的实际root密码。 6. 获取主库的二进制日志文件名和位置。在主库容器中执行以下命令: ``` docker exec -it mysql-master mysql -uroot -p<root_password> -e "SHOW MASTER STATUS;" ``` 记下显示的binlog文件名和位置。 7. 在从库中配置主从复制。在从库容器中执行以下命令: ``` docker exec -it mysql-slave mysql -uroot -p<root_password> -e "CHANGE MASTER TO MASTER_HOST='<master_host>', MASTER_USER='<replication_user>', MASTER_PASSWORD='<replication_password>', MASTER_LOG_FILE='<binlog_file>', MASTER_LOG_POS=<binlog_position>;" ``` 请将`<master_host>`替换为主库的IP地址或主机名,将`<replication_user>`和`<replication_password>`替换为配置主从复制所需的实际复制用户和密码。将`<binlog_file>`和`<binlog_position>`替换为之前记录的主库的binlog文件名和位置。 8. 启动从库的复制。在从库容器中执行以下命令: ``` docker exec -it mysql-slave mysql -uroot -p<root_password> -e "START SLAVE;" ``` 确保将`<root_password>`替换为之前设置的实际root密码。 现在,你的Docker容器中的MySQL主从复制已经配置完成,并且数据卷已经加载。请确保在配置和操作过程中使用合适的用户名和密码进行替换,并根据实际情况调整命令中的路径和其他参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arya's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值