启动三个 MySQL 容器

mkdir -p /root/docker/mysql{1,2,3}/config
cp my.cnf mysql1/config/ && cp my.cnf mysql2/config/ && cp my.cnf mysql3/config/
chmod -R 755 mysql*

docker run --name=mysql1 -v /root/docker/mysql1/config/my.cnf:/etc/my.cnf \
  -v /root/docker/mysql1/data:/var/lib/mysql -d -p 19013:3306 mysql/mysql-server
docker run --name=mysql2 -v /root/docker/mysql2/config/my.cnf:/etc/my.cnf \
  -v /root/docker/mysql2/data:/var/lib/mysql -d -p 19014:3306 mysql/mysql-server

获取初始密码并重置:

docker logs mysql1 2>&1 | grep GENERATED
docker exec -it mysql1 mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
USE mysql;
UPDATE user SET host='%' WHERE user='root';
FLUSH PRIVILEGES;

配置 Master

vim mysql1/config/my.cnf

[mysqld]
log-bin=/var/lib/mysql/binlog
server-id=1

进入 mysql1,查看 binlog 位置,并创建复制用户:

SHOW MASTER STATUS;
-- 记录 File 和 Position 值

CREATE USER 'repl'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'slavepass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

配置 Slave

vim mysql2/config/my.cnf

[mysqld]
server-id=2

进入 mysql2:

CHANGE MASTER TO
  MASTER_HOST='宿主机IP或域名',
  MASTER_PORT=19013,
  MASTER_USER='repl',
  MASTER_PASSWORD='slavepass',
  MASTER_LOG_FILE='binlog.000003',
  MASTER_LOG_POS=156;

START SLAVE;
SHOW SLAVE STATUS\G

Laravel 连不上 MySQL 8.0

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';