文章目录
- 单机部署
- 集群部署
- master 部署
- slave 部署
- 错误记录
单机部署
- 通过 dockerhub 或 docker search 查找镜像。
- 拉取 mysql 镜像。
docker pull mysql:8.0.27
- 创建挂载目录,并赋予权限。
mkdir -p /var/docker_data/mysql/data mkdir -p /var/docker_data/mysql/conf mkdir -p /var/docker_data/mysql/log mkdir -p /var/docker_data/mysql/mysql-files chmod -R 770 /var/docker_data/mysql
- 启动容器查看 my.cnf 配置文件位置,并复制到宿主机目录下。
# 运行并进入 mysql 容器 docker run --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.27 docker exec -it mysql8 /bin/bash # 通常 mysql 配置文件在 /etc/mysql 目录下,不同版本 mysql 有所差异 # 找到 my.cnf 文件后,将其复制到宿主机目录下 docker cp mysql8:/etc/mysql/my.cnf conf/my.cnf # 编辑 my.cnf 文件 vim /var/docker_data/mysql/conf/my.cnf
# 添加如下内容: [client] # 客户端默认字符编码 default_character_set=utf8 [mysqld] pid-file=/var/run/mysqld/mysqld.pid socket=/var/run/mysqld/mysqld.sock datadir=/var/lib/mysql # 设置允许数据导出的目录,8 版本以后可能需要指定 # 若此处为 NULL,则 /var/docker_data/mysql/mysql-files 无需创建与挂载 secure-file-priv=/var/lib/mysql-files # 服务端设置字符编码与规则 collation_server=utf8_general_ci character_set_server=utf8 # 传输过程当中允许的最大数据包大小 max_allowed_packet=1024M # 最大连接数 max_connections=1000 # 服务器关闭非交互(客户端)连接之前等待活动的秒数 wait_timeout=2147483 # 服务器关闭交互式(mysql终端)连接前等待活动的秒数 interactive_timeout=2147483 # 连接超时 connect_timeout=20 # 客户端线程最大数量 thread_cache_size=256 # 表名大小写敏感设置(mysql8之后仅初始化时有效): # 0 表名存储为给定的大小和比较是区分大小写的 # 1 表名存储为小写的,但是比较的时候是不区分大小写 # 2 表名存储为给定的大小写,但是比较的时候是小写的 # Windows下默认值是 1,Mac OS X下默认值是 2 lower_case_table_names=1 # 设置默认时区 default_time-zone='+08:00' # Custom config should go here !includedir /etc/mysql/conf.d/
- 启动 mysql 容器。
docker run --name mysql -d \ -p 3306:3306 \ -v /root/docker_data/mysql/data:/var/lib/mysql \ -v /root/docker_data/mysql/conf/my.cnf:/etc/mysql/my.cnf \ -v /root/docker_data/mysql/log:/var/log/mysql \ -v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files \ -e MYSQL_ROOT_PASSWORD=123456 \ --restart always \ --privileged=true \ mysql:8.0.27
- 测试 mysql 是否可用。
# 进入容器内部 docker exec -it mysql8 bash # 进行 mysql 交互式连接 mysql -uroot -p123456 # 查看 mysql 配置的字符编码 SHOW VARIABLES LIKE 'character%'; # 如下图结果,则安装成功
集群部署
master 部署
- 拉取镜像。
- 创建挂载目录并授权。
mkdir -p /var/docker_data/mysql_master/data mkdir -p /var/docker_data/mysql_master/conf mkdir -p /var/docker_data/mysql_master/log mkdir -p /var/docker_data/mysql_master/mysql-files chmod -R 770 /var/docker_data/mysql_master
- 将容器内的 my.cnf 文件拷贝到宿主机,并修改。
# 在单机部署的 my.cnf 配置文件基础上添加: [mysqld] log-bin=mysql-bin #[必须]启用二进制日志 server-id=101 #[必须]服务器唯一ID(唯一即可)
- 创建并启动 mysql 容器。
docker run --name mysql_master -d \ -p 33061:3306 \ -v /root/docker_data/mysql/data:/var/lib/mysql \ -v /root/docker_data/mysql/conf/my.cnf:/etc/mysql/my.cnf \ -v /root/docker_data/mysql/log:/var/log/mysql \ -v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files \ -e MYSQL_ROOT_PASSWORD=123456 \ --restart always \ --privileged=true \ mysql:8.0.27
- 进入容器内部,创建用于主从复制的用户,并赋予权限。
# 进入容器内部 docker exec -it mysql_master bash # 进行 mysql 交互式连接 mysql -uroot -p123456 # 数据同步的用户 # mysql8 版本默认使用 caching_sha2_password 密码插件。 # 需要添加 with mysql_native_password,否则从机会无法验证密码 # 旧版本不需要 create user 'lxl'@'%' identified with mysql_native_password by 'root'; # 授权(REPLICATION SLAVE为允许从主服务器中读取日志权限) GRANT REPLICATION SLAVE ON *.* to 'lxl'@'%'; # 刷新权限(低版本的MySQL) flush privileges;
- 查看master同步状态。
slave 部署
- 拉取镜像。
- 创建挂载目录并授权。
mkdir -p /var/docker_data/mysql_slave/data mkdir -p /var/docker_data/mysql_slave/conf mkdir -p /var/docker_data/mysql_slave/log mkdir -p /var/docker_data/mysql_slave/mysql-files chmod -R 770 /var/docker_data/mysql_slave
- 将容器内的 my.cnf 文件拷贝到宿主机,并修改。
# 在单机部署的 my.cnf 配置文件基础上添加: [mysqld] server-id=102 #[必须]服务器唯一ID(唯一即可)
- 创建并启动 mysql 容器。
docker run --name mysql_slave -d \ -p 33062:3306 \ -v /root/docker_data/mysql/data:/var/lib/mysql \ -v /root/docker_data/mysql/conf/my.cnf:/etc/mysql/my.cnf \ -v /root/docker_data/mysql/log:/var/log/mysql \ -v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files \ -e MYSQL_ROOT_PASSWORD=123456 \ --restart always \ --privileged=true \ mysql:8.0.27
- 进入容器内部,执行绑定主数据库命令。
# 进入容器内部 docker exec -it mysql_slave bash # 进行 mysql 交互式连接 mysql -uroot -p123456 # 设置主管地址与同步主库的日志位置 # mysql5.7 # change master to master_host='192.168.70.88',source_port=3306,master_user='lxl',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=397; # mysql8.0.27 版本 change replication source to source_host='192.168.70.88',source_port=3306,master_user='lxl',master_password='root', source_log_file='mysql-bin.000001', source_log_pos=397; # master_host : 主库的IP地址 # master_user : 访问主库进行主从复制的用户名(上面在主库创建的) # master_password : 访问主库进行主从复制的用户名对应的密码 # master_log_file : 从哪个日志文件开始同步(上述查询master状态中) # master_log_pos : 从指定日志文件的哪个位置开始同步(上述查询master状态中)
- 启动从机同步机制,并查看同步状态。
# 开启从服务器的2个线程服务 start slave; show slave status; # 推荐这种,单例查看 show slave status\G; # 若如下图所示,则设置成功!
错误记录
问题 1:
Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)
原因:
MYSQL新特性 secure_file_priv 限制读写文件、输出数据的所在目录。 限制了如 LOAD DATA, SELECT … OUTFILE 等一类操作的操作目录。
解决:
# 在 my.cnf 配置文件中添加 secure-file-priv # 设置允许数据导出的目录,8 版本以后可能需要指定 secure-file-priv=/var/lib/mysql-files # 同时在启动 mysql8 版本的容器时,添加挂载目录 -v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files
问题 2:
error connecting to master: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061
原因:
mysql8.0 更新了密码加密方式 caching_sha2_password,而 mysql_native_password 作为 MySQL 5.7 的默认密码插件。在此处进行主从复制时,slave 机还是以旧的加密方式去连接 master 机,故报错!
解决:
# 创建主从同步的用户,设置密码时指定以 mysql_native_password 为使用的密码插件。 # 需要添加 with mysql_native_password create user 'lxl'@'%' identified with mysql_native_password by `root`;
问题 3:
The slave I/O thread stops because master and slave have equal MySQL s erver UUIDs; these UUIDs must be different for replication to work.
原因:
master 与 slave 使用了共同的 server_id/server_uuid 导致。
解决:
# 解决 server_id 相同 [mysqld] # master 与 slave 必须不同的 server_id server-id=102 # 解决 server_uuid 相同 # 温和方式:在 mysql 客户端中生成 uuid,修改到 auto.cnf 文件中 select uuid(); # 暴力方式:直接删除容器内 /var/lib/mysql/auto.cnf 文件,重启后自动生成新的 # 温和或暴力方式后,都需要重启 mysql (docker 环境重启容器即可)