一、docker上拉取mysql镜像
docker pull mysql:5.7
二、docker添加MySQL容器启动并设置MySQL容器root密码
1、添加第一个MySQL容器
docker run --name mysql-1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
2、添加第二个MySQL容器
docker run --name mysql-2 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
注释:
run 启动容器
--name 设置容器的名称
-p 3307:3306 设置容器端口号 (容器端口号:镜像端口号)
-e MYSQL_ROOT_PASSWORD 设置容器的root密码
-d 容器会进入到后台,用户无法看到容器中的信息,也无法进行操作
mysql:5.7 选择镜像
三、设置主从mysql复制
1、进入mysql-1容器
docker exec -it mysql-1 bash
2、进入vim /etc/mysql/my.cnf
如果是首次进入mysql容器需要配置vim,首先更新 apt-get update,然后安装vim:apt-get install vim
vim /etc/mysql/my.cnf
进入mysql-1的my.cnf 之后把下面代码复制进去
[mysqld]
server-id = 1 #id唯一值,从数据库可以为2,3,4....
log-bin=mysql-bin
binlog-ignore-db = mysql,information_schema #忽略写入binlog日志的库
log-slave-updates = 1 #从库的写操作记录到
bin-logexpire_logs_days = 30 #日志存在的天数,30天
auto-increment-increment = 2 #字段变化增量值
auto-increment-offset = 1 #初始字段ID为1,从库为2
slave-skip-errors = all
保存,然后执行 service mysql restart 重启mysql,执行完成重启之后会关闭mysql的服务
需要重新在docker里面启动docker start mysql-1
配置从数据mysql-2
[mysqld]
server-id = 2
log-bin=mysql-bin
binlog-ignore-db = mysql,information_schema
log-slave-updates = 1
expire_logs_days = 30
auto-increment-increment = 2
auto-increment-offset = 2
slave-skip-errors = all
保存,然后执行 service mysql restart 重启mysql,执行完成重启之后会关闭mysql的服务
需要重新在docker里面启动docker start mysql-2
四、为主从数据库添加用户分配权限
获取数库ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器ID or 容器名称
链接主数据库,为从数据库分配权限
mysql -u root -p
####
GRANT REPLICATION SLAVE ON *.* TO 'root'@'从数据库IP' IDENTIFIED BY '从数据库密码';
flush privileges;
链接从数据库,为主数据库分配权限
mysql -u root -p
####
GRANT REPLICATION SLAVE ON *.* TO 'root'@'主数据库IP' IDENTIFIED BY '主数据库密码';
flush privileges;
遇到报错可能是密码过于简单
修改validate_password_policy参数的值(0 or LOW / 1 or MEDIUM / 2 or STRONG)
mysql> set global validate_password_policy=0;
修改密码的长度
mysql> set global validate_password_length=1;
五、配置主从双向复制
如果不是docker,是两个服务器上面的MySQL需要开放防火墙的MySQL端口
firewall-cmd --query-port=3306/tcp ##查询端口是否打开
firewall-cmd --permanent --add-prot=3306/tcp ##把端口添加到防火墙里面外网可访问
systemctl restart firewalld ##重启防火墙执行
分别在主库和从库执行下面代码
show master status;
在主数据库执行以下命令
change master to master_host='从数据库IP', master_user='从数据用来链接库的用户名', master_password='从数据库密码', master_log_file='mysql-bin.000001', master_log_pos=1554;
*master_log_file与master_log_pos以在从库查询的数据为准,master_log_file对应图上的File下面的数据,master_log_pos对应图上Position的数据
在从数据库执行以下命令
change master to master_host='主数据库IP', master_user='主数据用来链接库的用户名', master_password='主数据库密码', master_log_file='mysql-bin.000001', master_log_pos=1554;
*master_log_file与master_log_pos以在主库查询的数据为准,解释同上
主从数据库分别执行以下代码
start slave;
六、自查是否启动成功
show slave status G;
执行代码如果两个都是Yes,说明成功。