MySQL8.0主从复制的配置
提前准备好2台服务器安装好MySQL8,保证主从库的网络是通的,新建需要同步的数据库和表,如果是已有的数据库,可以先导出主库的数据然后导入到从库里,保证主从需要同步的数据库一致
一,主服务器配置
1,修改/etc/my.cnf文件在[mysqld]下面配置如下内容,其他可选参数请查阅文档
[mysqld]
# 服务器唯一id,默认为1,值范围为1~2^32−1. ;主数据库和从数据库的server-id不能重复
server-id=1
# [可选] 0(默认)表示读写(主机),1表示只读(从机)
read-only=0
# 待同步的数据库
binlog_do_db=test
# 不同步的数据库日志
binlog_ignore_db=mysql,sys
2,创建一个同步复制用户(非必需,也可以用root用户,但不建议)
mysql -u root -p
CREATE USER 'copyuser'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'copyuser'@'%';
FLUSH PRIVILEGES;
3,查看binlog文件及位置,关注File和Position的信息,后面要用到
show master status;
二,配置从服务器
1,修改/etc/my.cnf文件在[mysqld]下面配置如下内容,其他可选参数请查阅文档
[mysqld]
# 服务器唯一id,默认为1,值范围为1~2^32−1. ;主数据库和从数据库的server-id不能重复
server-id=2
# [可选] 0(默认)表示读写(主机),1表示只读(从机)
read-only=1
# 待同步的数据库
replicate_do_db=test
# 不同步的数据库日志
replicate_ignore_db=mysql,sys
2,实现主从同步,在从库具体配置如下:master_host、master_port、master_user、master_password根据实际情况填写,master_log_file和master_log_pos对应在master服务器查看的结果
mysql -u root -p
stop slave;
change master to master_host='192.168.170.145', master_port=3306 ,master_user='copyuser',master_password='123456',master_log_file='binlog.000004',master_log_pos=1878;
start slave;
3,查看同步结果:Slave_IO_Running/Replica_IO_Running和 Slave_SQL_Running/Replica_SQL_Running 为 Yes,看到Replica has read all relay log; waiting for more updates
show slave status \G;
4,验证是否成功
在主库的表里新增一条数据,查看从库对应的表是否有刚才新增的数据
5,常用命令:
低于8.0.22版本的语法:
change master to master_host='192.168.170.145', master_port=3306 ,master_user='copyuser',master_password='123456',master_log_file='binlog.000004',master_log_pos=1878;
SHOW SLAVE STATUS;
START SLAVE;
STOP SLAVE;
RESTART SLAVE;
自8.0.22版本后的语法:
change replication source to source_host='192.168.170.145',source_port=3306,source_user='copyuser',source_password='123456',source_log_file='binlog.000004',source_log_pos=1878;
SHOW REPLICA STATUS;
START REPLICA;
STOP REPLICA;
RESTART REPLICA;
三,由于从库配置了read only,所以创建一个普通用户,只可以读取数据,避免root用户修改数据导致主从同步失败
CREATE USER 'ipt'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
grant all privileges on test.* to 'ipt'@'%' with grant option;
flush privileges;