1.登录ECS
2.安装Docker,碰到问题只管yes。
3.pull mysql镜像
docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
68ced04f60ab: Pull complete
......
145ea1f01648: Pull complete
Digest: sha256:4a30434ce03d2fa396d0414f075ad9ca9b0b578f14ea5685e24dcbf789450a2c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
4.创建主从Docker,
创建主数据库Docker。
docker run -d -i -t --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql
再开一个会话连接ECS创建从数据库。
docker run -d -i -t --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 mysql
查看docker
docker container ls
DCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c91bb30b0115 mysql "docker-entrypoint.s…" 32 seconds ago Up 27 seconds 33060/tcp, 0.0.0.0:3306->3306/tcp slave
0278ce572bf3 mysql "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp master
5.在master端创建用户slave并赋权。
在两个会话分别登录主从mysql实例。
mysql -uroot -hlocalhost -P3303 -p
create user 'slave'@'%' identified by '123456';
grant all privileges on *.* to 'slave'@'%';
%表示任意ip。
查询master的日志文件和读写位置。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 155 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
6 在slave端配置主从关系
mysql> CHANGE MASTER TO MASTER_HOST = '宿主机ip', MASTER_USER = 'master', MASTER_PASSWORD = '123456', MASTER_PORT = 3306, MASTER_AUTO_POSITION = 1, MASTER_RETRY_COUNT = 0, MASTER_HEARTBEAT_PERIOD = 10000;
slave通过宿主机来访问master,所以这里的参数根据创建docker时的端口映射关系来填。
MASTER_HOST填宿主机的ip,而不是master docker的ip,同样MASTER_PORT也是宿主机的端口。
start slave;
如果一切顺利的话可以看到。
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以下主要记录我遇到一些问题,虽然解决起来没有技术含量,但是特别费精力,这个时候如果有一个踩过坑的人给你一点帮助也许能省很多时间和心情。
1 The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
这个是因为主从服务器的auto.cnf中的uuid相同导致的。
只需要将其中一个的auto.cnf删掉,然后重启这个docker就会重新生成一个新的auto.cnf。
mv /mysql/data/auto.cnf /mysql/data/auto.cnf.bak
注意不要试图手动修改uuid值。
2
修改my.cnf
各服务器的server-id不能相同。
这里其实不用装vim的,用echo可以直接在文件尾追加一行。
echo "log-bin = mysql-bin" >> /etc/mysql/my.cnf
echo "server-id = 1" >> /etc/mysql/my.cnf
3 执行grant all privileges on . to ‘root’@’%’ identified by ‘密码’
新版SQL授权用户时报错 near ‘IDENTIFIED BY ‘密码’ with grant option’ at line 1
因为新版的的mysql版本已经将创建账户和赋予权限的方式分开了,应该两步走:
创建账户:create user ‘用户名’@’访问主机’ identified by ‘密码’;
赋予权限:grant 权限列表 on 数据库 to ‘用户名’@’访问主机’ 。
4 Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection.
我最后通过重置slave解决的。
stop slave;
reset slave;
start slave;