MySQL 8 严格来说这个是复制,所以官方的英文文档是Replica,而非Master Slave。 该方法均适用于Linux和Windows的MySQL。
MySQL Setting Up Replicas Digital Ocean - How to Setup Replication
主要以参考Digital Ocean文档为主来修改配置 Linux是查看/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf Windows是查看C:\ProgramData\MySQL\my.ini;
如果有bind-address则要么删除,允许全部ip访问,要么改为进来请求的IP。
bind-address = source_server_ip
其次server-id = 1,而在从节点,是2/3/4/5… (主节点的id数字是最小的)
[mysqld]
server-id = 1
然后需要增加想要同步的数据库名:
例如:
[mysqld]
server-id = 1
binlog_do_db = database_name
然后我们可以重启mysql了。
# Windows使用net stop mysql80和net start mysql80
sudo systemctl restart mysql
这时候通过mysql命令查看:
mysql > SHOW MASTER STATUS;
Output
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 157 | db_name | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
随着mysql重启,mysql-bin.尾数也会增加。
CREATE USER 'replica_user'@'replica_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
这里需要注意,我们默认新增用户其实是用caching_sha2_password的模式连接,这需要SSL。所以我们改为用mysql_native_password的模式。你可以通过以下方式查询到用户连接模式:
select host, user, plugin from mysql.user
然后再
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'replica_server_ip';
FLUSH PRIVILEGES;
当然我们也先从mysqldump备份好SQL, 如果本身服务没在使用,就不用锁数据了。
[mysqld]
server-id = 2
binlog_do_db = database_name
relay-log = /var/log/mysql/mysql-relay-bin.log
# (Windows)relay-log = relay-bin.log [默认保存在C:\ProgramData\MySQL\Data]
配置完以上,即可重启服务。 然后在mysql内填写我们从SHOW MASTER STATUS得到的数值:
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='source_server_ip',
SOURCE_USER='replica_user',
SOURCE_PASSWORD='password',
SOURCE_LOG_FILE='mysql-bin.000001',
SOURCE_LOG_POS=157;
之后,在从节点启用复制
START REPLICA;
SHOW REPLICA STATUS\G;
这时候可以在主节点测试是否成功。插入新数据,再去从节点查看是否有这个数据即可。