windows下mysql-8.0.13主从同步配置⽅案(读写分离)
⼀.mysql主从同步原理
1. Slave上⾯的IO线程连接上Master,并请求从指定Binary log⽂件的指定位置(或者从最开始的⽇志)之后的⽇志内容;
2. Master接收到来⾃Slave的IO线程的请求后,通过负责复制的IO线程根据请求信息读取指定⽇志指定位置之后的⽇志信息,返回给
Slave端的IO线程。返回信息中除了⽇志所包含的信息之外,还包括本次返回的信息在Master端Binary log⽂件的名称以及在Binary log 中的位置;
3. Slave的IO线程收到信息后,将接收到的⽇志内容依次写⼊到Slave端的RelayLog⽂件()的最末端,并将读取到
的Master端的bin-log的⽂件名和位置记录到master-info⽂件中,以便在下⼀次读取的时候能够清楚的告诉master“我需要从某个bin-log 的哪个位置开始往后的⽇志内容,请发给我”
4. Slave的SQL线程检测到Relay Log中新增加了内容后,会马上解析该Log⽂件中的内容成为在Master端真实执⾏时候的那些可执⾏的
查询或操作语句,并在⾃⾝执⾏那些查询或操作语句,这样,实际上就是在master端和Slave端执⾏了同样的查询或操作语句,所以两端的数据是完全⼀样的。
binlog输出线程。每当有从库连接到主库的时候,主库都会创建⼀个线程然后发送binlog内容到从库。
对于每⼀个即将发送给从库的sql事件,binlog输出线程会将其锁住。⼀旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。
在从库⾥,当复制开始的时候,从库就会创建两个线程进⾏处理:
从库I/O线程。当START SLAVE语句在从库开始执⾏之后,从库创建⼀个I/O线程,该线程连接到主库并请求主库发送binlog⾥⾯的更新记录到从库上。
从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地⽂件,其中包括relay log⽂件。
从库的SQL线程。从库创建⼀个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执⾏。
可以知道,对于每⼀个主从复制的连接,都有三个线程。拥有多个从库的主库为每⼀个连接到主库的从库创建⼀个binlog输出线程,每⼀个从库都有它⾃⼰的I/O线程和SQL线程。
从库通过创建两个独⽴的线程,使得在进⾏复制时,从库的读和写进⾏了分离。因此,即使负责执⾏的线程运⾏较慢,负责读取更新语句的线程并不会因此变得缓慢。⽐如说,如果从库有⼀段时间没运⾏了,当它在此启动的时候,尽管它的SQL线程执⾏⽐较慢,它的I/O线程可以快速地从主库⾥读取所有的binlog内容。这样⼀来,即使从库在SQL线程执⾏完所有读取到的语句前停⽌运⾏了,I/O线程也⾄少完全读取了所有的内容,并将其安全地备份在从库本地的relay log,随时准备在从库下⼀次启动的时候执⾏语句
⼆.mysql8.0.13主从配置
环境介绍及说明
1、主库所在的操作系统:windows 10 (64位);
主库⽬录:C:\mysql-8.0.13\master\3307
主库的版本:mysql-8.0.13-winx64.zip;
主库的ip地址:127.0.0.1;
主库的端⼝:3307;
2、从库所在的操作系统:windows10 (64位);
从库⽬录:C:\mysql-8.0.13\slave\3308
从库的版本:mysql-8.0.13-winx64.zip;
从库的ip地址:127.0.0.1;
从库的端⼝:3308;
注:主库和从库版本可以⼀致也可以不⼀致,需要说明⼀点,如果两者版本不⼀致,⼀般主库的版本需要⽐从库的版本低,这样就可以避免由于版本问题,有些sql不能执⾏的问题。
数据库配置及注册服务
1、主库(master)的配置(因为在虚拟机上,C盘为例)
将下载的数据库解压到:C:\mysql-8.0.13\master\3307;
在3307⽬录下建⽴my.ini;配置内容如下:
[mysqld]
#主库配置
server-id=1
#开启⼆进制⽇志
log_bin=master-bin
log_bin-index=master-bin.index
# 设置3307端⼝
port=3307
# 设置mysql的安装⽬录
basedir=C:/mysql-8.0.13/master/3307
# 设置mysql数据库的数据的存放⽬
datadir=C:/mysql-8.0.13/master/3307/data
# 允许最⼤连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使⽤的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使⽤的默认存储引擎
default-storage-engine=INNODB
# 默认使⽤“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使⽤的端⼝
port=3307
default-character-set=utf8
管理员⾝份(必须,必须,必须)运⾏cmd,并cd到C:\mysql-8.0.13\master\3307\bin下,输⼊命令:
mysqld --initialize --user=mysql --console(bin⽬录下⽣成data⽂件,系统默认创建数据库,此时还会⽣成⼀个临时的密码!不到密码)
注册服务,输⼊命令:
mysqld --install mysql-master --defaults-file="C:\mysql-8.0.13\master\3307\my.ini"
启动MySQL服务,输⼊命令:(默认是启动的,可以先登陆数据库,如果服务没有启动,再执⾏此命令)
net start mysql-master
登陆mysql,输⼊命令:
mysql -u root -P3307 -p
修改密码,输⼊命令:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
退出mysql,输⼊命令:
exit;
重新登陆OK。恭喜,主库完成
2、从库(slave)的配置(因为在虚拟机上,C盘为例)
将下载的数据库解压到:C:\mysql-8.0.13\slave\3308;
在3308⽬录下建⽴my.ini;配置内容如下:
[mysqld]
#从库配置
server_id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
# 设置3308端⼝
port=3308
# 设置mysql的安装⽬录
basedir=C:/mysql-8.0.13/slave/3308
# 设置mysql数据库的数据的存放⽬录
datadir=C:/mysql-8.0.13/slave/3308/data
# 允许最⼤连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使⽤的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使⽤的默认存储引擎
mysql下载到了c盘default-storage-engine=INNODB
# 默认使⽤“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使⽤的端⼝
port=3308
default-character-set=utf8
管理员⾝份(必须,必须,必须)运⾏cmd,并cd到C:\mysql-8.0.13\slave\3308\bin下,输⼊命令:
mysqld --initialize --user=mysql --console
注册服务,输⼊命令:
mysqld --install mysql-slave3308 --defaults-file="C:\mysql-8.0.13\slave\3308\my.ini"
启动MySQL服务,输⼊命令:(默认是启动的,可以先登陆数据库,如果服务没有启动,再执⾏此命令)
net start mysql-slave3308
登陆mysql,输⼊命令:
mysql -u root -P3308 -p
修改密码,输⼊命令:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
退出mysql,输⼊命令:
exit;
重新登陆OK。恭喜,从库完成
3、主库(master)关联从库(slave)配置
登陆master主库,创建⼀个⽤于让从数据库连接的⽤户,输⼊命令(⾃定义⽤户warm,密码为warm123456)
CREATE USER 'warm'@'%' IDENTIFIED WITH mysql_native_password BY 'warm123456';
给⽤户授权,输⼊命令
GRANT REPLICATION SLAVE ON *.* TO 'warm'@'%';
刷新权限,输⼊命令
flush privileges;
查看master的状态,输⼊命令
show master status;
登陆slave从库,在slave从库节点上设置master主库主节点参数,输⼊命令
CHANGE MASTER TO
MASTER_HOST='172.0.0.1',                                                                                                                                                                                              MASTER_PORT=3307,
MASTER_USER='warm',
MASTER_PASSWORD='warm123456',
MASTER_LOG_FILE='binlog.000012',
MASTER_LOG_POS=631746;
注意,MASTER_LOG_FILE和master状态⾥的File保持⼀致,MASTER_LOG_POS和master状态⾥的Positon保持⼀致
开启主从同步,输⼊命令
start slave;
查看主从同步状态,输⼊命令
show slave status\G;
Slave_IO_Running和Slave_SQL_Running的状态都为YES才表⽰同步成功
若有错误,可在下⽅查看报错信息
根据错误信息,⾃⾏百度!
⾃⾏创建库与表进⾏验证即可。
备注:注意不要往从库中写数据,如果从库写⼊数据,master_log_pos是不会变化的,主库的信息没有发⽣变化,当主库⼜变化和从库⼀样的操作时就有可能会产⽣冲突,因此,只能在主库中写数据,从库只能读数据,当然主库也可以读数据。
在从库中建⽴只读⽤户,避免往从库中写数据。
转载于:my.oschina/warm6Y/blog/3003452

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。