实战讲解mysql8主从复制(windows版)
2024-07-01 13:42 阅读(347)

估计大家刷到这篇文章肯定已经知道什么是主从复制了, 就不废话了,直接正题。


操作数据库以及运行数据库语句,目前有2种方式:


一种是使用命令行程序,即cmd

运行 mysql -u root -p, 之后输入密码就可进入到mysql了,就可以运行sql语句以及各种数据库命令。如下图:

但是这种方式不是很方便。


另一种方式是借助可视化工具navicat,如下图:

这个工具可以创建、修改、删除等数据库操作,也可以运行sql语句,非常方便。本文就借助这个工具来演示。


正文开始,我会按步骤来演示,跟着步骤肯定没错。


1. 准备两台电脑,或者在一台电脑上安装个虚拟机也可以。一台是主服务器(master),一台是从服务器(slave)。两台服务器都安装上mysql8数据库,二者没有任何区别。


主服务器安装的数据库叫master, 从服务器上的数据库叫slave。master数据库完成所有更新操作,比如添加、修改、删除, slave数据库负责查询操作。所以两个数据库要想数据保持一致,就需要将master数据库中的所有更改同步到slave数据库,这就是主从复制。(大哭,说好的不讲概念的)


下载地址: https://dev.mysql.com/downloads/windows/installer/8.0.html


2. 两个服务器上同时创建名称为db的数据库,同时创建admin表,如下:

3. 修改master数据库的配置文件my.ini


my.ini一般是在C:\ProgramData\MySQL\MySQL Server 8.0目录下,如果没有 ProgramData,应该是被隐藏了,显示即可。


如果上面这两项都有,那就不用任何修改。log-bin是 binlog日志的文件名,server-id是服务id,在所有的主从数据库上,这个id不能相同。修改之后重启mysql服务。


另外,还有一个参数 binlog-do-db=db,用于配置哪个数据库允许被复制


什么是binlog日志?


这个日志非常重要,将master数据库的任何修改同步到slave数据库就是靠这个日志的。binlog记录了所有增加、修改、删除操作及数据。即使表数据误删除了,或者数据库误删除了,通过binlog都能恢复,实际上就是重新执行一遍binlog中的操作就可以了。




4. 修改slave数据库的配置文件my.ini

找到server-id,将其修改成别的,只要和master数据库的不一样就行。


同时添加replicate-do-db,这个是允许复制的数据库名称。如果没有该项,则默认复制所有数据库。如果要复制多个,需要重复写,比如:


replicate-do-db=db
replicate-do-db=db02 

所有文件配置就ok了。修改之后重启mysql服务。




5. 在master数据库中创建一个账号,用于给slave使用,因为slave需要连接到master,然后下载binlog,那么就必须给它分配一个账号,而且账号权限只能用于同步binlog。


运行如下sql语句:

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';#创建新的账号,账号名称为slave,密码为123456
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%'; #赋予账号slave同步binlog的权限
FLUSH PRIVILEGES;#刷新一下 

第一行语句是用于创建账号,账号名称为slave,密码为123456, 实际上就是在名称为mysql的数据库中的user表中创建一行:

第二行语句是赋予账号slave同步binlog的权限,实际就是将Repl_slave_priv字段改为Y:

6. master数据库中运行show master status  :

File和Position这两个参数值记录一下,后面会用。




7. 给slave 数据库配置连接到master的信息:

stop slave
#master服务器的ip地址
CHANGE MASTER TO master_host ='192.168.1.100',
#第5步中创建的账号
master_user ='slave',
#第5步中创建的密码
master_password ='123456',
#上一步中的File
master_log_file ='ECS-56099351-bin.000002',
#上一步中的Position
master_log_pos = 2840,
get_master_public_key=1;
start slave 

上面的语句最好一步步运行,先运行stop slave,然后是中间的配置语句,最后是start slave,这样可以观察是否都成功。


master_log_file、master_log_pos 是用于说明从哪个binlog文件的哪个位置开始同步。


会存在多个binlog文件的,每次重启mysql服务,或者运行flush logs语句,都会创建一个新的binlog文件。


stop slave、start slave用于停止、启动线程,因为slave 数据库完成复制工作是靠单独的线程来完成的。


需要注意的是get_master_public_key, 这个参数在低版本的mysql上可以没有,但是在mysql8.0上必须有,否则报错。




8. 当运行完start slave后,主从复制就已经开始工作。 可以通过show slave status语句查看是否正常工作:

如果上面两项都是Yes,说明正常工作了,否则就是出错误了。


Slave_IO_Running是 I/O线程,用于从master读取binlog,并存储到relay log中继日志文件中。


Slave_SQL_Running是 SQL线程,用于读取中继日志,在从库重放,就是重新运行一遍。




9.测试


在master中的admin表中添加一行记录:


然后查看slave 数据库中是否有相同的数据。