为什么使用主从?
自行查阅。
告知版本,不耍流氓
docker 版本:
[root@iZwz9glz4h0uc4whkyr7hiZ conf]# docker version
Client: Docker Engine - Community
Version: 20.10.17
msyql 版本:
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.27 |
+-----------+
1 row in set (0.00 sec)
本次mysql主从配置是在同一台阿里云上
配置 aliyun 镜像,可以提高下载速度,同时提高效率,从而心情愉悦!
自行查阅。
安装 docker
自行查阅。
1、拉取 mysql 镜像
docker pull mysql
2、查看镜像
docker images
3、创建mysql容器实例
docker run -p 3306:3306 --name mysql01 --privileged=true \
-v /songshu/mysql01/log:/var/log/mysql \
-v /songshu/mysql01/data:/var/lib/mysql \
-v /songshu/mysql01/conf:/etc/mysql/conf.d/ \
-e MYSQL_ROOT_PASSWORD=密码 -d mysql
4、挂载注意点
不挂载卷的情况下启动,通过命令进入MySQL容器中:
docker run -it [容器名或容器ID] /bin/bash
less /etc/mysql/my.cnf
#可以查看到文件内容
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Custom config should go here
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/conf.d/ 这里可以看到自定义 **.cnf **文件需要放在 conf.d 目录下。
5、在属主机上 /songshu/mysql01/conf 目录中创建自定义文件
# 创建自定义文件
touch my01.cnf
# 添加内容
vim my01.cnf
#内容如下:
[mysqld]
server_id=109
read-only=0
注意:一定是 [mysqld] 下
server_id: 用来标记binlog event的源产地,就是SQL语句最开始源自于哪里; 用于IO_thread对主库binlog的过滤。
read-only:0代表可以读写,1代表只能读。
注意是 server_id ,千万不要配成 server-id
由于 MySQL8.0 以上的版本默认情况下,日志就是二进制,所以配置文件不需要配置启动二进制日志。
其余的一些乱码等等配置自行查阅,这里不配置也可以。
修改了配置文件需要重启容器实例(一定记得)
docker restart [容器名或容器ID]
6、进入容器登录 mysql 中配置
登录命令
# 进入容器
docker run -it [容器名或容器ID] /bin/bash
# 登录mysql
mysql -uroot -p
注意:
更多的情况请自行查阅资料!
如果是以第二种情况进入的,需要更改密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';
查看 server_id 是否修改,同时可以检测挂载目录是否成功
select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 109 |
+-------------+
1 row in set (0.00 sec)
创建一个用户用于给从数据库登录访问获取数据
create user 'slave'@'%' identified WITH mysql_native_password by '密码';
注意:
赋予创建用户权限:replication slave,replication client
grant replication slave,replication client on *.* to 'slave'@'%';
更多权限可以自行查阅。
查看主状态
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000006 | 680 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
到此,主数据库已配置完毕,不要在动主数据库,如果一定要动,可以查阅资料,锁住数据库。
主数据库配置,与主数据库差不多,只补充一些细节
启动实例命令
docker run -p 3307:3306 --name mysql02 --privileged=true \
-v /songshu/mysql02/log:/var/log/mysql \
-v /songshu/mysql02/data:/var/lib/mysql \
-v /songshu/mysql02/conf:/etc/mysql/conf.d/ \
-e MYSQL_ROOT_PASSWORD=密码 -d mysql
my02.cnf 内容区别
#内容如下:
[mysqld]
server_id=110
read-only=1
登录数据库,不需要创建用户
查看 server_id 确保是否成功
执行绑定主数据库命令
change replication source to source_host='ip',source_port=3306,master_user='slave',master_password='密码', source_log_file='binlog.000006', source_log_pos=680;
查看状态
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 47.106.111.226
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000006
Read_Master_Log_Pos: 680
Relay_Log_File: c3d9de9fa6e6-relay-bin.000002
Relay_Log_Pos: 321
Relay_Master_Log_File: binlog.000006
Slave_IO_Running: NO
Slave_SQL_Running: NO
还未执行复制启动命令。
启动复制
# 启动复制
start slave;
# 停止复制,用于重新执行配置
stop slave;
再次查看
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 47.106.111.226
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000006
Read_Master_Log_Pos: 680
Relay_Log_File: c3d9de9fa6e6-relay-bin.000002
Relay_Log_Pos: 321
Relay_Master_Log_File: binlog.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
当 Slave_IO_Running: Yes,Slave_SQL_Running: Yes 都为 yes ,表示成功!
查看 docker 容器日志
docker logs [容器名或容器ID]
停止和删除 docker 容器
# 删除一个已停止的容器
docker rm [容器名或容器ID]
# 强制删除一个运行中的容器
docker rm -f [容器名或容器ID]
如有错误请指正,谢谢!