1.1、引入docker-compose.yml。linux下自己随便找个位置创建
version: '3' services: masterMysql: image: 717160040/mysql5.5 container_name: masterMysql tty: true restart: always ports: - "3307:3306" volumes: - /data/docker/dockerdata/mysqlWork/master/data:/var/lib/mysql ##注意这个/data/docker/dockerdata/mysqlWork/master/data宿主机目录要自己创建 - /data/docker/dockerdata/mysqlWork/master/etc/my.cnf:/etc/my.cnf ##注意这个/data/docker/dockerdata/mysqlWork/master/etc/my.cnf宿主机目录要自己创建 - /etc/localtime:/etc/localtime environment: - MYSQL_ROOT_PASSWORD=123456 - MASTER_SYNC_USER=masteradmin #设置脚本中定义的用于同步的账号 - MASTER_SYNC_PASSWORD=123456 #设置脚本中定义的用于同步的密码 - ADMIN_USER=root #当前容器用于拥有创建账号功能的数据库账号 - ADMIN_PASSWORD=123456 - TZ=Asia/Shanghai #解决时区问题 slaveMysql: image: 717160040/mysql5.5 container_name: slaveMysql tty: true restart: always ports: - "3308:3306" volumes: - /data/docker/dockerdata/mysqlWork/slave/data:/var/lib/mysql - /data/docker/dockerdata/mysqlWork/slave/etc/my.cnf:/etc/my.cnf - /etc/localtime:/etc/localtime environment: - MYSQL_ROOT_PASSWORD=123456 - MASTER_SYNC_USER=masteradmin #设置脚本中定义的用于同步的账号 - MASTER_SYNC_PASSWORD=123456 #设置脚本中定义的用于同步的密码 - ADMIN_USER=root #当前容器用于拥有创建账号功能的数据库账号 - ADMIN_PASSWORD=123456 - TZ=Asia/Shanghai #解决时区问题
2.2、然后创建宿主机目录
注意:对应yml的
volumes:
- /data/docker/dockerdata/mysqlWork/master/data:
Master的etc下的my.cnf
一定要注意service_id 不能重复
要注意这个service_id不能重复。
bin_log开启二进制日志
[mysqld]
server_id = 112
# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db = mysql
# 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin = mysql-bin
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days = 7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
user=mysql
Slave目录跟Master一样只是父目录不一样
Slave的etc下的my.cnf
一定要注意service_id 不能重复
[mysqld]
server_id = 113
binlog-ignore-db = mysql
log-bin = mysql-slave1-bin
binlog_cache_size = 1M
binlog_format = mixed
expire_logs_days = 7
slave_skip_errors = 1062
relay_log = mysql-relay-bin
log_slave_updates = ON
read_only = 1
user=mysql
2.3 运行docker-compose.yml文件,这里需要进入你放docker-compose.yml文件的目录运行
运行docker-mysql.yml
命令: docker-compose -f xxx.yml up -d
xxx:你的yml名字
-d:后台运行,不加会有详细日志。看自己加不加
docker ps -a 查看运行的容器
注意这个healthy:健康,启动成功
俩个mysql启动完成一个3307端口一个3308端口
进入docker的mysql容器:docker exec -it xxx /bin/bash
xxx:可以是的容器名字或者容器Id
登录mysql服务
服务启动完毕后,创建用于同步的用户并授权
创建的用户名称为slave
密码为123456
CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
# 设置远程链接的密码和用户方便后面用于可视化工具连接
grant all on *.* to root@'%' identified by '123456' with grant option;
#刷新权限:FLUSH PRIVILEGES;
查看master状态:show master status;
这俩个后面从库需要用到。
最后退出
-u:用户名;-p:密码
切换到Slave数据库
连接slave并关联master节点
CHANGE MASTER TO
MASTER_HOST='masterMysql',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=682;
MASTER_HOST
:直接使用container_nameMASTER_LOG_FILE/MASTER_LOG_POS
:直接使用安装master上面圈的俩个对应MASTER_LOG_FILE:File下面的mysql-bin.000004 你的File下面是多少就写多少; MASTER_LOG_POS : position下面对应的682你的position下面是多少就写多少;
管理完成后 启动salve
start slave;
最后查看Slave状态
show slave status\G
注意:可能会报错
1、mysqld: File './mysql-bin.index' not found (Errcode: 13) 我也不知道为什么会报这样的错误,我看网上的docke-compose.yml运行多个mysql服务都是直接运行起来了我看了好多博客,没报这样的错误。
我是 用下面的命令解决的
chown -R mysql:mysql /data/docker/dockerdata/mysqlWork/master/
chown -R mysql:mysql /data/docker/dockerdata/mysqlWork/slave/
赋予mysql目录权限解决的
2、权限问题
Master command COM_REGISTER_SLAVE failed: Access denied for user 'slave'@'%'(using password: YES) (Errno: 1045)
回到master修改权限
show grants for 'slave'@'%';
查你创建的用户权限
这个是不对的!!!
下面这个是对的
用这个命令修改
mysql> GRANT REPLICATION SLAVE ON *.* TO '你创建的用户名'@'%' identified by '自己用户的密码';
mysql> show grants for '你创建的用户名'@'%';
+----------------------------------------------+
| Grants for repl@% |
+----------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' |
+----------------------------------------------+
一定要注意service_id 不能重复
这是我第一次使用docker-compose.yml部署主从mysql。欢迎指出问题,又不懂得地方可以留言。谢谢!