一、基本原理
从服务器会从主服务器读取binlog来进行数据同步
从机有两个关键线程I/O thread和SQL thread
I/O thread读取主机binlog到从机relaylog中继日志
SQL thread执行从机relaylog中继日志进行数据同步
二、创建mysql实例
可用docker实现参考:
版本: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,如果有且匹配则不写日志,不匹配则写日志