MySQL的主从复制是指将一个MySQL数据库实例(即主库)上的数据变更,通过二进制日志的方式复制到另一个MySQL数据库实例(即从库)上的过程,以达到数据同步的目的。
具体来说,在主从复制中,主库会在进行数据更新操作时,将更新操作的内容记录在二进制日志(binlog)中,并且通知从库这一操作。从库在接收到主库通知后,就会开启一个I/O线程,从主库的二进制日志中读取事件,并将这些事件写入自己的中继日志(relay log)中。随后,从库会开启一个SQL线程,执行中继日志中的事件来更新自己的数据。
主从复制的好处是可以增加系统的可用性和扩展性,同时也可以提高系统的性能。但同时也存在一些缺点,比如从库可能会有数据延迟
docker run --name master -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --lower_case_table_names=1
docker run --name slave1 -p 3312:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --lower_case_table_names=1
docker run --name slave2 -p 3313:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --lower_case_table_names=1
1.docker exec -it master bash
2. cd /etc/mysql/conf.d/
3. vi docker.cnf
此法问题颇多,不建议用
1. 复制出来
docker cp master:/etc/mysql/conf.d/docker.cnf master.cnf
docker cp slave1:/etc/mysql/conf.d/docker.cnf slave1.cnf
docker cp slave2:/etc/mysql/conf.d/docker.cnf slave2.cnf
如果提示找不到文件则自己创建相关文件再将其写入对应内容后cp到容器
2:修改完后写回去
docker cp master.cnf master:/etc/mysql/conf.d/docker.cnf
docker cp slave1.cnf slave1:/etc/mysql/conf.d/docker.cnf
docker cp slave2.cnf slave2:/etc/mysql/conf.d/docker.cnf
以下是写入的内容
主机:
skip-host-cache
skip-name-resolve
server-id = 1
#服务器的唯一标识
log_bin = master.bin
# 开启日志功能
从机:
server-id = 2 #服务器的唯一标识
进入主机:
create user 'master'@'%' identified by '123456';
grant replication slave on *.* to 'master'@'%';
flush privileges;
show master status;
//记住file名和position,从服务器配置要用
//如在下图中的 master.000001 和 154
从机:
change master to
master_host="192.168.128.132",master_port=3307,
// host 是主机的ip地址,port是映射的端口号,从服务器的配置相同
master_user="master",
master_password="123456",
master_log_file="master.000001",
master_log_pos=154;
正在做
原因:配置文件错误,二进制日志没配置好
解决:重新写入配置文件
原因: MySQL 配置文件中存在语法错误,在配置文件的某个位置缺少一个有效的组声明而导致的。每个配置文件中都必须包含至少一个有效的组声明,例如 [mysqld],用于指定应用哪些设置。
错误演示
skip-host-cache
skip-name-resolve
server-id = 1
log_bin = master.bin
正确写法:
[mysqld]
skip-host-cache
skip-name-resolve
server-id = 1
log_bin = master.bin
如图:
原因:输入MYSQL_ROOT_PASSWORD的时候少打了个字母
原因: MySQL 官方 Docker 镜像中已经取消了 docker.cnf 文件,取而代之的是 /etc/mysql/conf.d 目录下的 .cnf 配置文件。
解决办法:直接自己创建一个就好了
原因:当前用户权限不够用,需要SUPER, REPLICATION权限
SUPER:允许用户执行需要超级用户特权的操作
REPLICATION:允许用户查看关于复制状态的信息。
解决办法:
法1:切换root用户
法2:给当前用户权限,设当前用户的名称为:libai(我没试过,但理论上可行)
GRANT SUPER ON *.* TO 'libai'@'host';
GRANT REPLICATION CLIENT ON *.* TO 'libai'@'host';