总结主要步骤
1.配置一个提供复制的账号;
创建用户
CREATE USER 'replication'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
FLUSH PRIVILEGES;
2.修改配置 选择模式
主库配置;
windows的得话是my.ini文件
默认这个目录下
C:\ProgramData\MySQL\MySQL Server 8.0
添加如下配置 server-id log_bin 指定一下位置
binlog_format 指定主从复制模式 。当然本文不涉及GTID这样的东西;就是简单的复制.
bind-address = 0.0.0.0
server-id = 1
log_bin = D:/mysqlbin/bin/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 100M
更改完配置是需要重启mysql的;
windows的话是需要
net stop MySQL
net start MySQL
linux 我使用的docker的话
是 docker restart mysql;
3.找一个从库
配置复制源
CHANGE MASTER TO
MASTER_HOST='192.168.56.1', -- 主库的IP地址
MASTER_USER='replication', -- 复制用户
MASTER_PASSWORD='1942951600', -- 复制用户的密码
MASTER_LOG_FILE='mysql-bin.000001', -- 从主库SHOW MASTER STATUS得到的文件名
MASTER_LOG_POS=1808; -- 从主库SHOW MASTER STATUS得到的位置
CHANGE MASTER TO
MASTER_HOST='192.168.56.1', -- 主库的IP地址
MASTER_USER='replication', -- 复制用户
MASTER_PASSWORD='1942951600', -- 复制用户的密码
MASTER_LOG_FILE='mysql-bin.000001', -- 从主库SHOW MASTER STATUS得到的文件名
MASTER_LOG_POS=1808; -- 从主库SHOW MASTER STATUS得到的位置
start slave;
就搞定了;
MASTER_LOG_FILE 这个里面的文件是自己配置里面的文件通过SHOW MASTER STATUS; 来查看位置。
一些检查状态的sql
SHOW MASTER STATUS;
SHOW SLAVE STATUS\G
- dump数据 然后开始测试
遇到的问题
问题1.Slave_SQL_Running
密码策略问题
这个两个数据库密码策略使用不同:一个是密码策略问题。可以通过下面sql语句来查看;
有mysql_native_password 和caching_sha2_password ;我们使用mysql_native_password 这种
修改主库
修改用户的认证插件选项,禁用安全连接要求:
sql
ALTER USER 'replication'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
FLUSH PRIVILEGES;
更改主库认证密码方式
ALTER USER 'replication'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;
### mysql数据库查看权限
use mysql;
select host, user, plugin, authentication_string, password_expired from user;
serve-id不同
这个需要去配置里面修改 server-id = 2 主从的id不能一样。所以后面删除了mysql容器又来了一遍
重新来一遍的步骤
0. 清楚原有数据卷里面的一些数据
- ’停止slave
- 停止mysql容器
- .卸载mysql容器
- 重启mysql容器
- 重新配置主从节点
- 检查配置状态
docker stop
docker rm
> SHOW VARIABLES LIKE 'server_id';
docker run -p 3306:3306 --name mysql --restart=always --privileged=true \
-v /usr/local/mysql/log:/var/log/mysql \
-v /usr/local/mysql/data:/var/lib/mysql \
-v /usr/local/mysql/conf:/etc/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
docker exec -it mysql /bin/bash
mysql -u root -p
SHOW SLAVE STATUS\G
START SLAVE;
STOP SLAVE IO_THREAD;
CHANGE MASTER TO
MASTER_HOST='192.168.1.8', -- 主库的IP地址
MASTER_USER='root', -- 复制用户
MASTER_PASSWORD='1942951600', -- 复制用户的密码
MASTER_LOG_FILE='mysql-bin.000001', -- 从主库SHOW MASTER STATUS得到的文件名
MASTER_LOG_POS=1808; -- 从主库SHOW MASTER STATUS得到的位置
CHANGE MASTER TO
MASTER_HOST='192.168.56.1', -- 主库的IP地址
MASTER_USER='replication', -- 复制用户
MASTER_PASSWORD='1942951600', -- 复制用户的密码
MASTER_LOG_FILE='mysql-bin.000001', -- 从主库SHOW MASTER STATUS得到的文件名
MASTER_LOG_POS=1808; -- 从主库SHOW MASTER STATUS得到的位置
SHOW SLAVE STATUS\G
START SLAVE;
查看中继日志位置;
[mysqld]
server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin
### 其他命令语句
更改配置后重启mysql;
docker restart mysql
查看从库mysql 日志;
tail -n 50 /var/log/mysql/mysqld.log
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.8' IDENTIFIED BY '1942951600';
reset slave;
问题二:
Slave_IO_Running: Connecting
主要我的是从库是docker上面来做的;可能有网段的问题;
排查过程:检查linux服务器是否能ping通我本机。添加bind-address配置。
监听一下
sudo yum install telnet
使用 telnet 测试 MySQL 端口
一旦安装了 telnet 客户端,你可以使用它来测试 MySQL 服务的端口是否开放。
telnet 192.168.1.8 3306
使用这个可以来
在主库 添加 如下代码块 方便虚拟机连接;
安装检测网络工具
yum search ifconfig
yum install net-tools
ifconfig
relay-log = /var/lib/mysql/mysql-relay-bin 我默认的中继日志配置在这个位置;
处理docker的网络问题 修改docker的网段 (应该和这个没关系)
重启docker
修改
/etc/docker/daemon.json,加入一行 “bip”: “192.168.56.1/24”,,然后再次查看 ifconfig,已经变成了 192 网段了
重启 docker 服务
sudo systemctl restart docker
做完处理后在虚拟机的docker里面也可以 通过mysql -u replication -p -h 192.168.56.1
这样的方式来去访问到
后来是改了从库连接主库的ip
以太网适配器 VirtualBox Host-Only Network: 使用的这个ipv4
成功截图
这两个标位yes即可
创建数据库
CREATE DATABASE yan
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
可以使用dump命令来备份mysql数据库。也可以使用数据库工具来完成工具的配置;来导入数据库。然后测试;