docker安装mysql8.0主备

mac环境,网上没有找到docker部署8.0的文章,踩了两个小时坑

  1. 拉取master镜像: 注意要先登录一下docker账户,不然不让拉取镜像,科学上网一下才能登录
bash 复制代码
docker run -p 3307:3306 --name mysql-master -v ~/data/mysql-master/log:/var/log/mysql -v ~/data/mysql-master/data:/var/lib/mysql -v ~/data/mysql-master/conf/my.cnf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0

在~/data/mysql-master/conf/my.cnf下面要创建一个my.cnf文件,内容如下:

ini 复制代码
[mysqld]
server_id=101
binlog-ignore-db=mysql
log-bin=mall-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062

然后登入到容器里面创建用户

bash 复制代码
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot

mysql> create user 'slave'@'%' identified with mysql_native_password by '123456';
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> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File                  | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000003 |      682 |              | mysql            |                   |
+-----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

show master status;命令一会要用到。

  1. 拉取slave
bash 复制代码
docker run -p 3308:3306 --name mysql-slave -v ~/data/mysql-slave/log:/var/log/mysql -v ~/data/mysql-slave/data:/var/lib/mysql -v ~/data/mysql-slave/conf/my.cnf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0

进入到容器里面, 设置主库的信息,不需要额外配置docker网络,两个容器的网络就通,写本机的ifconfig的ip就行。

yaml 复制代码
docker exec -it mysql-slave /bin/bash

mysql -uroot -proot

mysql> change master to master_host='192.168.199.192',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000003',master_log_pos=682,master_connect_retry=30;

Query OK, 0 rows affected, 10 warnings (0.03 sec)

mysql> start slave;

Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> show slave status \G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for source to send event

                  Master_Host: 192.168.199.192

                  Master_User: slave

                  Master_Port: 3307

                Connect_Retry: 30

              Master_Log_File: mall-mysql-bin.000003

          Read_Master_Log_Pos: 682

               Relay_Log_File: mall-mysql-relay-bin.000002

                Relay_Log_Pos: 331

        Relay_Master_Log_File: mall-mysql-bin.000003

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB: 

          Replicate_Ignore_DB: 

           Replicate_Do_Table: 

       Replicate_Ignore_Table: 

      Replicate_Wild_Do_Table: 

  Replicate_Wild_Ignore_Table: 

                   Last_Errno: 0

                   Last_Error: 

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 682

              Relay_Log_Space: 546

              Until_Condition: None

               Until_Log_File: 

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File: 

           Master_SSL_CA_Path: 

              Master_SSL_Cert: 

            Master_SSL_Cipher: 

               Master_SSL_Key: 

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error: 

               Last_SQL_Errno: 0

               Last_SQL_Error: 

  Replicate_Ignore_Server_Ids: 

             Master_Server_Id: 101

                  Master_UUID: 27bdea8f-624f-11f0-81d0-0242ac110002

             Master_Info_File: mysql.slave_master_info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates

           Master_Retry_Count: 86400

                  Master_Bind: 

      Last_IO_Error_Timestamp: 

     Last_SQL_Error_Timestamp: 

               Master_SSL_Crl: 

           Master_SSL_Crlpath: 

           Retrieved_Gtid_Set: 

            Executed_Gtid_Set: 

                Auto_Position: 0

         Replicate_Rewrite_DB: 

                 Channel_Name: 

           Master_TLS_Version: 

       Master_public_key_path: 

        Get_master_public_key: 0

            Network_Namespace: 

1 row in set, 1 warning (0.00 sec)

一般有问题都是Last_IO_Error有问题,网络不通,或者server_id重复。server_id重复说明my.cnf没挂上,检查一下之前挂载目录的命令。show variables like 'server_id';可以查看当前的server_id。

  1. 测试环节 主库建表,从库能访问到就成功。
sql 复制代码
create databse test;
use test;
insert into t1 values(1,1);
select * from t1;
相关推荐
Memory_荒年11 小时前
SpringBoot事务:从“一键开关”到“踩坑大全”的生存指南
java·后端·spring
PFinal社区_南丞11 小时前
一文讲透 .trae 文件夹 - Trae IDE 配置指南和最佳实践
后端
段小二12 小时前
Spring AI Agent 完整实战:Function Calling + RAG + Memory + SafeGuard 构建机票助手
后端
编码忘我12 小时前
Spring源码又看了一遍
后端
希望永不加班12 小时前
SpringBoot 主启动类解释:@SpringBootApplication 到底做了什么
java·spring boot·后端·spring
一只叫煤球的猫12 小时前
为什么不用 RAG 做记忆系统 ——压缩上下文与 memory.md 的架构选择
人工智能·后端·ai编程
智能工业品检测-奇妙智能12 小时前
国产化系统的性价比对比
人工智能·spring boot·后端·openclaw·奇妙智能
编码忘我13 小时前
java强引用、软引用、弱引用、虚引用
后端
蝎子莱莱爱打怪13 小时前
别再裸用 Claude Code 了!32 个亲测Skills + 8 个 MCP,开发效率直接拉满!
java·后端·claude
犯困的饭团13 小时前
4_【自动化引擎Ansible Runner】将 Runner 嵌入灵魂 - Python API 编程
后端