1. 安装mysql8
1.1 新增挂载文件
shell
# 新增mysql挂载文件夹
mkdir -p /root/docker/mysql/m01/log
mkdir -p /root/docker/mysql/m01/data
mkdir -p /root/docker/mysql/m01/conf
1.2 新增mysql配置文件
shell
# 新增mysql配置文件
cd /root/docker/mysql/m01/conf
vim my.cnf
# 下面是my.cnf内容
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
1.3 运行mysql
shell
# 查看mysql镜像 TAG:8.0
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 8.0 3218b38490ce 2 years ago 516MB
# 运行mysql
docker run \
--restart=always \
--privileged=true \
-p 3306:3306 --name bsmysql01 \
-v /root/docker/mysql/m01/log:/var/log/mysql \
-v /root/docker/mysql/m01/data:/var/lib/mysql \
-v /root/docker/mysql/m01/conf/my.cnf:/etc/mysql/my.cnf \
-v /root/docker/mysql/m01/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0
# 进入容器
docker exec -it bsmysql01 /bin/bash
# 连接mysql
mysql -u root -p
Enter password: 123456
mysql> exit
1.4 可能遇到的问题
1.4.1 如果连不上远程mysql, Communications link failure
请配置服务器安全组规则。
1.4.2 如果权限问题, null, message from server: "Host '192.68.128.66' is not allowed to connect to this MySQL server"
这个错误信息表明 MySQL 服务器拒绝了来自 IP 地址 192.68.128.66 的连接请求。MySQL 默认只允许本地主机(即 localhost 或 127.0.0.1)的连接。若要允许其他远程主机连接,你需要在 MySQL 的 mysql.user 表中为相应的用户添加远程主机的权限。
shell
# 更新用户权限
mysql> UPDATE mysql.user SET Host = '%' WHERE User = 'root';
Query OK, 1 row affected (0.00 sec)
# 刷新权限
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
1.5 如果还想再启动一个mysql服务
我们可以再启动一个bsmysql02,基本操作与上面一致, 注意端口映射3307:3306
shell
docker run \
--restart=always \
--privileged=true \
-p 3307:3306 --name bsmysql02 \
-v /root/docker/mysql/m02/log:/var/log/mysql \
-v /root/docker/mysql/m02/data:/var/lib/mysql \
-v /root/docker/mysql/m02/conf/my.cnf:/etc/mysql/my.cnf \
-v /root/docker/mysql/m02/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0
那么, 普通的mysql服务创建结束。
2. 主从复制
2.1 修改my.cnf配置
修改主库my.cnf
shell
# 设置服务器唯一标识,主服务器设置为100
server-id=100
# 开启二进制日志,文件名为mysql-bin,这是主从复制的关键
log-bin=mysql-bin
修改从库my.cnf
shell
# 设置服务器唯一标识,从服务器设置为101,确保每台服务器的server-id都是唯一的
server-id=101
# 开启二进制日志,文件名为mysql-slave-bin,建议开启以便进行链式复制或故障排查
log-bin=mysql-slave-bin
# 设置中继日志的名称,这是从服务器用于存储从主服务器接收到的二进制日志信息的日志
relay_log=edu-mysql-relay-bin
relay_log_recovery=1
2.2 重启容器(我这容器正在运行,如果没有需run启动新容器指令如上文)
shell
docker restart 主容器ID;
docker restart 从容器ID;
2.3 连接到mysql进行配置
配置主库
shell
# 建立账户并授权
# 在主库创建一个用户供从库使用
mysql> CREATE USER 'repl'@'%' IDENTIFIED WITH 'mysql_native_password' BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
# 查询Master的状态, File、Position字段配置从库有用。
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 818 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
配置从库
shell
# 配置需要复制的主机
mysql> CHANGE MASTER TO MASTER_HOST='192.168.92.156',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=818;
Query OK, 0 rows affected, 8 warnings (0.02 sec)
mysql> START SLAVE;
Query OK, 0 rows affected, 1 warning (0.01 sec)
# 查询Slave的状态
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 14.103.92.156
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 818
Relay_Log_File: edu-mysql-relay-bin.000002
Relay_Log_Pos: 324
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
2.4 验证
在主服务器上新建表并插入数据,检查从服务器是否成功同步新增。
至此主从复制配置完成。