No Data

配置mysql主从同步

原创  作者:斩雪碎光阴  发布于:2023年10月22日  阅读量:236
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
  分类:  标签:

一、基本原理

从服务器会从主服务器读取binlog来进行数据同步

从机有两个关键线程I/O thread和SQL thread

I/O thread读取主机binlog到从机relaylog中继日志

SQL thread执行从机relaylog中继日志进行数据同步


二、创建mysql实例

可用docker实现参考:

https://sgybk.cn/article32

版本:mysql8.1.0


三、主机中增加配置文件my.cnf

路径在/etc/mysql/conf.d/my.cnf

所有配置卸载[mysqld]节点下

[mysqld]

#服务器唯一id,默认值1

server-id=1

#设置日志格式,默认值ROW

binlog_format=STATEMENT

#二进制日志名,默认binlog

#log-bin=binlog

#设置需要复制的数据库,默认复制全部数据库

#binlog-do-db=mytestdb

#设置不需要复制的数据库

#binlog-ignore-db=mysql

#binlog-ignore-db=infomation_schema

其中binlog_format有三个值ROW、STATEMENT、MIXED

binlog_format=STATEMENT:

日志记录的是主机数据库的写命令,性能高,但是now()之类的函数以及获取系统参数的操作会出现主从数据不同步的问题。

binlog_format=ROW(默认):

日志记录的是主机数据库的“写后的数据”,批量操作时性能较差,解决now()或着user()或者@@hostname等操作在主从机器上不一致的问题。

binlog_format=MIXED:

是以上两种level的混合使用,有函数用ROW,没函数用STATEMENT,但是无法识别系统变量


四、主机中创建slave用户

用于从服务器的io线程读取主服务器的binlog日志

--创建slave用户

CREATE USER 'slave'@'%';

其中'%'代表允许所有远程服务器访问主服务器, 'slave'是用户名

--设置密码

ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

其中mysql_native_password是密码校验规则

--授予复制权限

GRANT REPLICATION SLAVE ON *.* TO  'slave'@'%' ;

其中REPLICATION SLAVE代表复制权限,*.*代表所有数据库的所有表

--刷新权限

FLUSH PRIVILEGES;

即使授予的权限生效

刷新权限之后可以在名字叫mysql的数据库中的user表中可以看到slave用户和被开启的远程复制权限Repl_slave_priv


五、在主机中查询master状态

SHOW MASTER STATUS;

返回值中File是binlog日志文件名字

这个名字是由my.cnf中的二进制日志名(默认binlog)加后缀组成的

例如:binlog.000004

返回值Position代表当前日志记录的位置

例如:1043

之后从服务器从主服务器读取binlog文件时就是从这个文件的这个位置开始读取的,之后需要配置到从服务器中


六、从机中增加配置文件my.cnf

路径在/etc/mysql/conf.d文件夹下

所有配置卸载[mysqld]节点下

[mysqld]

#服务器唯一id,每台服务器的id必须不同,如果配置其他从服务器,注意修改id

server-id=2

#中继日志名,默认relay-bin

#relay-log=relay-bin

docker restart后查看当前server_id:

SHOW VARIABLES LIKE 'server_id';


七、在从机上配置主从关系

执行sql语句:

CHANGE MASTER TO MASTER_HOST='192.168.88.128',

MASTER_USER='slave',MASTER_PASSWORD='123456',

MASTER_PORT=3306,

MASTER_LOG_FILE='binlog.000004',MASTER_LOG_POS=1043;

其中MASTER_HOST='192.168.88.128',MASTER_PORT=3306是主机ip和端口号,

MASTER_USER='slave',MASTER_PASSWORD='123456',是主机中slave用户账号密码,

MASTER_LOG_FILE='binlog.000004',MASTER_LOG_POS=1043是主机binlog日志文件名字和代表当前日志记录的位置


八、启动主从同步

启动从机的复制功能,执行SQL:

START SLAVE;

--查看状态

SHOW SLAVE STATUS;

--在命令行中查看状态(不需要分号),加\G是为了让行纵向显示,以防行太长导致换行混乱

SHOW SLAVE STATUS\G

可以从返回值看到从机的两个关键线程I/O thread和SQL thread

Slave_IO_Running和Slave_SQL_Running分别表示I/O thread和SQL thread的状态

当Slave_IO_Running和Slave_SQL_Running不是YES时,可能为no或Connecting(连接中),可在Last_IO_Errno、Last_IO_Error、Last_SQL_Errno、Last_SQL_Error列查看

如果是Connecting可以等一会儿再查状态,可能就连接上了,可以用停止slave命令:

stop slave;

之后再重新启动:

START SLAVE;


九、停止和重置

--在从机上执行。功能说明:停止I/O线程和SQL线程的操作。

stop slave;

--重置从机relaylog中继日志

--在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。

reset slave;

--重置主机binglog日志

--在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。

--用于第一次进行搭建主从库时,进行主库binlog初始化工作;

reset master;


十、binlog-ingore-db和binlog-do-db的优先级问题

1.判断是否有binlog-ingore-db或binlog-do-db,如果没有则写入日志

2.如果有binlog-ingore-db或binlog-do-db,则判断当前是否有数据库,如果没有则不写日志

3.如果当前有数据库,则判断是否有binlog-do-db,如果有且匹配则写日志,不匹配则不写日志

4.如果没有binlog-do-db再判断binlog-ingore-db,如果有且匹配则不写日志,不匹配则写日志

相关文章