主从同步后的操作原则:
主数据库一般只负责做增删改操作,极少负责査询.从想据库只负责做査询,不负责增删改操作,此时主数据库中数据的变动会通过某种方式,自动同步到所有的从数据库中,最终保持数据一致
- Master中开启一个线程,把数据变动记录到一个二逬制的日志文件(binary.log中
- Slave中开启一>M0线程专门用于读取Master中二进制日志内容,并且把数据写入自己的回放日志文件(relay.log)中
- Slave中SQL线程去读取回放日志(relay log)的内容,把Master中执行的DML进行回放,完成主从同步
注意:主从同步是有一定延迟的,所以无法保证从数据库中马上能读取到主数据库同步的信息,因此只要业务方法中涉及到写的操作,那么该操作必须在主数据库上执行
实现步骤
准备工作:先让Master和Slave都拥有相同的数据库,并且数据库中的表数据一致
1 在Master的配置文件my.ini中[mysqld]部分做以下配置,开启binary-log
没有my.ini 文件参考 https://www.jb51.net/article/172172.htm
#配置当前服务器的id
server-id=1
#配置二逬制曰志文件名
log-bin=master-bin
#配置记录哪个数据库的曰志,可以多次配置
binlog-do-db=jerry
2 然后重启MySQL服务器后,再次登录逬去看使用SQL命令查看信息,显示以下内容及表示第一步成功
--查看主服务器状态
show master status;
--注意:bin-log的文件名会随着主服务器的重启发送变化
2.在Maste傲据库中新建一个新用户专门用于做主从同步
--可以使用图形化界面来操作
#创建用户slave用于主从同步,并授予jerry数据库操作权限
GRANT ALL ON jerry.* TO 'slave'@'%' IDENTIFIED BY '123';
#授予主从同步权限,该权限是一全局的权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
#刷新权限
FLUSH PRIVILEGES;
3.在Slave的配置文件中 /etc/my.cnf [mysqld]部分做以下配置,然后重启服务器
#配罝从服务器id,必须唯一不能重复
server-id=2
#回放哪个数据库的日志,可以多次配置
replicate-do-db=jerry
linux中重启mysql
service mysqld restart
4.登录从数据库服务器Slave中执行SQL
##从数据库设置主服务器的信息
CHANGE MASTER TO
MASTER_HOST='主数据库ip',
MASTER_PORT=3306,
MASTER_USER='slave',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=810
//最后两项可以在[主数据库]执行以下SQL查看
SHOW MASTER STATUS;
//如果执行以上代码出现一下错误 则需要先 执行 STOP SLAVE 后重试
[Err] 3021 - This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
//执行成功后 开启 主从同步
start SLAVE;
// 查看主从服务器状态 Slave_IO_Running 和 Slave_SQL_Running 都为yes表示成功
show SLAVE STATUS
此时主从服务已经配置完成 验证 在主数据库的表中插入数据,从数据库表中刷新得到数据