docker 配置 mysql8.0.27 主从复制(详细)

docker 配置 mysql8.0.27 主从复制(详细)

    • 介绍
    • 准备环节
    • 开始配置
    • 细节

介绍

为什么使用主从?

自行查阅。

告知版本,不耍流氓

docker 版本:

[root@iZwz9glz4h0uc4whkyr7hiZ conf]# docker version
Client: Docker Engine - Community
 Version:           20.10.17

msyql 版本:

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.27    |
+-----------+
1 row in set (0.00 sec)

准备环节

本次mysql主从配置是在同一台阿里云上

  • 准备一台aliyun服务器
  • 安全组中开放端口
    • 3306
    • 3307

配置 aliyun 镜像,可以提高下载速度,同时提高效率,从而心情愉悦!

自行查阅。

安装 docker

自行查阅。

开始配置

1、拉取 mysql 镜像

docker pull mysql

2、查看镜像

docker images

3、创建mysql容器实例

docker run -p 3306:3306 --name mysql01 --privileged=true \
-v /songshu/mysql01/log:/var/log/mysql \
-v /songshu/mysql01/data:/var/lib/mysql \
-v /songshu/mysql01/conf:/etc/mysql/conf.d/ \
-e MYSQL_ROOT_PASSWORD=密码 -d mysql
  • -p 宿主机端口:容器端口
  • –name 给容器取名
  • –privileged 以特权的方式启动,防止一些权限不够的错误
  • -v 挂载目录;
    • 这里需要注意 /etc/mysql/conf.d/
    • 在MySQL中 cond.d 是一个目录,一定要注意!
  • -e env 环境的意思,MYSQL_ROOT_PASSWORD设置密码
  • -d 守护进程方式启动

4、挂载注意点

不挂载卷的情况下启动,通过命令进入MySQL容器中:

docker run -it [容器名或容器ID] /bin/bash

less /etc/mysql/my.cnf

#可以查看到文件内容
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL

# Custom config should go here
!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/conf.d/ 这里可以看到自定义 **.cnf **文件需要放在 conf.d 目录下。

5、在属主机上 /songshu/mysql01/conf 目录中创建自定义文件

# 创建自定义文件
touch my01.cnf
# 添加内容
vim my01.cnf

#内容如下:
[mysqld]
server_id=109
read-only=0
  • 注意:一定是 [mysqld]

  • server_id: 用来标记binlog event的源产地,就是SQL语句最开始源自于哪里; 用于IO_thread对主库binlog的过滤。

  • read-only:0代表可以读写,1代表只能读。

  • 注意是 server_id ,千万不要配成 server-id

  • 由于 MySQL8.0 以上的版本默认情况下,日志就是二进制,所以配置文件不需要配置启动二进制日志。

其余的一些乱码等等配置自行查阅,这里不配置也可以。

修改了配置文件需要重启容器实例(一定记得)

docker restart [容器名或容器ID]

6、进入容器登录 mysql 中配置

登录命令

# 进入容器
docker run -it [容器名或容器ID] /bin/bash

# 登录mysql
mysql -uroot -p

注意:

  • 登录可能会出现几种情况
  • 第一种:挂载配置不正确,密码登录不了
  • 第二种:不需要密码,直接回车就进入
  • 第三种:输入密码

更多的情况请自行查阅资料!

如果是以第二种情况进入的,需要更改密码:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';

查看 server_id 是否修改,同时可以检测挂载目录是否成功

select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         109 |
+-------------+
1 row in set (0.00 sec)

创建一个用户用于给从数据库登录访问获取数据

create user 'slave'@'%' identified WITH mysql_native_password by '密码';

注意:

  • 一定要带 WITH mysql_native_password,不然从数据库会连接不到。

赋予创建用户权限:replication slave,replication client

grant replication slave,replication client on *.* to 'slave'@'%';

更多权限可以自行查阅。

查看主状态

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

到此,主数据库已配置完毕,不要在动主数据库,如果一定要动,可以查阅资料,锁住数据库。

主数据库配置,与主数据库差不多,只补充一些细节

启动实例命令

docker run -p 3307:3306 --name mysql02 --privileged=true \
-v /songshu/mysql02/log:/var/log/mysql \
-v /songshu/mysql02/data:/var/lib/mysql \
-v /songshu/mysql02/conf:/etc/mysql/conf.d/ \
-e MYSQL_ROOT_PASSWORD=密码 -d mysql
  • 由于是同一台服务器,修改属主机的访问端口 3307
  • 修改新挂载的目录,否则会启动失败
  • 记得去 /songshu/mysql02/conf 目录下创建新配置文件 my02.cnf
  • 注意:一定记得重启

my02.cnf 内容区别

#内容如下:
[mysqld]
server_id=110
read-only=1
  • server_id:一定要与主数据库不同

登录数据库,不需要创建用户

查看 server_id 确保是否成功

执行绑定主数据库命令

change replication source to source_host='ip',source_port=3306,master_user='slave',master_password='密码', source_log_file='binlog.000006', source_log_pos=680;
  • source_host:主数据库ip
  • source_port:主数据库端口
  • master_user:登录用户
  • master_password:用户密码
  • source_log_file:二进制文件
  • source_log_pos:

查看状态

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 47.106.111.226
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000006
          Read_Master_Log_Pos: 680
               Relay_Log_File: c3d9de9fa6e6-relay-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: binlog.000006
             Slave_IO_Running: NO
            Slave_SQL_Running: NO
  • Slave_IO_Running: NO
  • Slave_SQL_Running: NO

还未执行复制启动命令。

启动复制

# 启动复制
start slave;

# 停止复制,用于重新执行配置
stop slave;

再次查看

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 47.106.111.226
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000006
          Read_Master_Log_Pos: 680
               Relay_Log_File: c3d9de9fa6e6-relay-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: binlog.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

当 Slave_IO_Running: Yes,Slave_SQL_Running: Yes 都为 yes ,表示成功!

细节

查看 docker 容器日志

docker logs [容器名或容器ID]

停止和删除 docker 容器

# 删除一个已停止的容器
docker rm [容器名或容器ID]

# 强制删除一个运行中的容器
docker rm -f [容器名或容器ID]

如有错误请指正,谢谢!

你可能感兴趣的:(docker,linux,运维,mysql)