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;
相关推荐
脚本自动化开发2 小时前
玩影之刃零,两张四千元级显卡怎么挑
后端
用户47949283569156 小时前
从一句话或代码仓到可交互 HTML:开源 Agent 画图技能 Archify v3.2 实测与选型边界
前端·后端·面试
努力的小雨7 小时前
别再复制日志给AI了!我让Codex自己去观测云查报错
后端
afumu9 小时前
Go 写一个只监听 127.0.0.1 的控制服务:鉴权、白名单、危险命令拦截
后端·安全·go
johnjincaaaa9 小时前
猿人学第 18 题「jsvmp 洞察先机」逆向通关实录
javascript·后端
用户47027840040510 小时前
C语言编译与链接
后端·开源
你三大爷10 小时前
从 Hessian 迁移到 protostuff:深嵌套模型反序列化耗时与高并发类加载锁的根治实战
后端·架构
IT枫斗者枫哥10 小时前
子线程断言失败,JUnit 为什么还显示通过?
java·后端
stark张宇11 小时前
Vibe Coding 入门实战:用 Claude Code 跑通 AI 产品开发流程(上)
后端·claude·vibecoding
考虑考虑12 小时前
JDK27中的Set.ofLazy
java·后端·java ee