目录
1.使用官方安装脚本自动安装docker(主从服务器都运行)
1.'caching_sha2_password' reported error: authentication
4.Access denied for user 'lzy'@ 192.168.231.130(using password:YES)
5.Can't connect to MySQL server on '192.168.231.138:3306' (110)
1.使用官方安装脚本自动安装docker(主从服务器都运行)
curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun
启动 Docker。
sudo systemctl start docker
2.安装MySQL(主从服务器都运行)
1.拉取 MySQL 镜像
latest是最新版,可以根据自己需要去选择(链接)
docker pull mysql:latest
2.查看本地镜像
使用以下命令来查看是否已安装了 mysql:
docker images
3.运行容器
以下命令来运行 mysql 容器|启动MySQL服务
docker run -itd --restart=always --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
- -p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
- MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。
- --restart=always:关机重启。重启docker容器后,MySQL会自动启动。
拓展一点点:
docker run --name mysql --privileged=true -v /home/mysql/master-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql-slaver
在执行上述命令之后,docker首先会检测本地有没有目标镜像,即mysql-slaver,如果没有,则会下载该镜像,然后根据配置的参数运行该镜像。上述命令中各个参数的含义如下:
--name指定运行之后的容器的名称为mysql;
--privileged指定了当前容器是否真正的具有root权限,所谓的root权限是指具有宿主机的root权限,而不仅仅只是在容器内部有root权限;
-v指定了容器中指定目录挂载到宿主机上的某个目录,这样做的目的在于防止容器中配置的数据丢失,因为docker容器在重启之后是不会保留前一次在其内部运行的相关数据的;
-p表示宿主机上的某个端口映射到docker容器内的某个端口,这里也就是将宿主机的3306端口映射到容器内部的3306端口;
-e表示指定当前容器运行的环境变量,该变量一般在容器内部程序的配置文件中使用,而在外部运行容器指定该参数。这里的MYSQL_ROOT_PASSWORD表示容器内部的MySQL的启动密码;
-d参数指定了当前容器是在后台运行。
4.通过 docker ps 命令查看是否安装成功:
在master容器启动完成之后,我们通过docker ps命令即可看到这个运行的容器:
5.开端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
6.进入docker的MySQL容器
docker exec -it mysql bash
其他方式:
# 通过容器id方式,这里的id就是上面docker ps中展示的id
docker exec -it fa4afaeb24c4 /bin/bash
# 通过容器名称方式,这里的名称就是创建容器时指定的名称,也就是mysql-master
docker exec -it mysql-master /bin/bash
7.登录mysql
mysql -u root -p
本地连接MySQL:
mysql -h 服务器IP -u root -p
mysql -h 192.168.231.138 -u root -p
3.开启主从设置
1.主服务器:
1.修改主的日志文件:
# 进入docker的MySQL容器中
docker exec -it mysql bash
# 修改配置文件
vi /etc/mysql/my.cnf
在 [mysqld] 节点最后加上:
server_id = 1
log-bin = mysql-bin(MySQL8默认开启,可以不写)
log-bin=mysql-bin 使用binary logging,mysql-bin是log文件名的前缀
server-id=1 唯一服务器ID,非0整数,不能和其他服务器的server-id重复
重启mysql服务
docker ps -a
docker stop CONTAINER ID (选择mysql的 CONTAINER ID)
docker start CONTAINER ID (选择mysql的 CONTAINER ID)
2.创建用于数据同步的用户
# CREATE USER '用户名'@'%' IDENTIFIED BY '密码';
CREATE USER 'lzy'@'%' IDENTIFIED BY '123456';
# GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '用户名'@'%';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'lzy'@'%';
进入Master库mysql客户端:输入show master status;查看Master状态:
1.从服务器:
1.修改从的日志文件
# 进入docker的MySQL容器中
docker exec -it mysql bash
# 修改配置文件
vi /etc/mysql/my.cnf
在[mysqld]下添加内容
server_id=2
log-bin = mysql-bin(MySQL8默认开启,可以不写)
重启
docker ps -a
docker stop CONTAINER ID (选择mysql的 CONTAINER ID)
docker start CONTAINER ID (选择mysql的 CONTAINER ID)
2.执行
change master to master_host='192.168.231.138', master_user='lzy', master_password='123456', master_port=3306, master_log_file='binlog.000002', master_log_pos=708, master_connect_retry=30;
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
3.查看主从同步状态
在从服务器中的mysql终端执行show slave status \G,查看主从同步状态。
1.NO,NO
Slave_IO_Running 和 Slave_SQL_Running是查看主从是否运行的关键字段,默认为NO,表示没有进行主从复制。
2.使用start slave;开启主从复制过程
然后再次查询主从同步状态show slave status \G;
3.Connecting,Yes
使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的(详情见第四步,错误整理),我们可以根据 Last_IO_Error提示予以排除。
4.Yes,Yes
表示主从复制成功,可以进行测试,例如在navicat中主服务器上创建test数据库后,从服务器刷新后,也会出现该服务器。
4.错误整理
1.'caching_sha2_password' reported error: authentication
error connecting to master 'lzy@192.168.231.138:3306' - retry-time: 30 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires
验证插件“caching_sha2_password”报告错误:验证需要
修改一下master中lzy用户的plugin,从caching_sha2_password改为mysql_native_password即可
主:
查询
select user,host,plugin from mysql.user;
修改
update mysql.user set plugin ="mysql_native_password" where user = 'lzy' and host = '%';
刷新
flush privileges;
2.从服务器启动新同步线程时报错,怎么关闭之前的线程:
关闭
stop slave io_thread;
启动
change master to master_host='192.168.231.138', master_user='lzy', master_password='123456', master_port=3306, master_log_file='binlog.000006', master_log_pos=156, master_connect_retry=30;
启动slave同步进程:
start slave;
或者:
stop slave;
启动
change master to master_host='192.168.231.138', master_user='lzy', master_password='123456', master_port=3306, master_log_file='binlog.000006', master_log_pos=156, master_connect_retry=30;
启动slave同步进程:
start slave;
3.navicat连接不上服务器(192.168.231.1 host is not allowd to c):或者
重启231.140对应从服务器docker
# 停止docker
systemctl stop docker.socket
# 启动docker
systemctl start docker
不需要再启动MySQL了。因为MySQL配置了自动重启
4.Access denied for user 'lzy'@ 192.168.231.130(using password:YES)
重新认证主服务器的lzy用户的密码
5.Can't connect to MySQL server on '192.168.231.138:3306' (110)
没有开该服务器(这是我的MySQL主服务器)的端口,上面有步骤。或者用navicat连接数据库,我的是主报第三个错,重启docker解决的。