MySQL主从介绍
- MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的
- MySQL主从是基于binlog的,主上须开启binlog才能进行主从。
- 主从过程大致有3个步骤
1)主将更改操作记录到binlog里
2)从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog里中继日志
3)从根据relaylog里面的sql语句按顺序执行 - 主上有一个log dump线程,用来和从的I/O线程传递binlog
- 从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句落地
MySQL主从原理图
MySQL主从配置
主配置(安装完mysql的虚拟机)
-
基础配置
-
# vi /etc/my.cnf
编辑配置文件
log_bin=linux1 -
# /etc/init.d/mysqld restart
-
查看# ll /data/mysql/
-
重启mysqld服务
-
# vim /etc/profile
export PATH=$PATH:/usr/local/mysql/bin (文件末尾加入) -
# source /etc/profile
-
# mysqldump -uroot mysql > /tmp/mysql.sql
备份mysql库(加入环境变量) -
创建一个库保存数据
-
# mysql -uroot kei < /tmp/mysql.sql
将mysql库恢复成新建的库,作为测试数据
数据库配置 -
# mysql -uroot
进入数据库(没有密码) -
> grant replication slave on . to ‘repl’ @192.168.31.133 identified by ‘password’;
创建用作同步数据的用户并赋予权限,IP地址为从节点的地址(replication是MySQL非常出色的一个功能,该功能将一个MySQL实例中的数据复制到另一个MySQL实例中。)
-
> flush tables with read lock;
将表锁住,保持表内数据不变
-
> show master status;
显示主机状态
从配置(安装完mysql的虚拟机)
-
基础配置
-
# vi /etc/my.cnf
编辑配置文件,主从配置文件 sever id 不可以一样。 -
# /etc/init.d/mysqld restart
重启mysqld服务
-
# scp /tmp/mysql.sql root@192.168.31.133:/tmp/
在主上将文件拷贝到从上,并在从上查看文件大小是否一致
-
# mysql -uroot -e “create database kei”
//创建一个和主一样的库
-
# mysql -uroot kei < /tmp/mysql.sql
将文件内容导入库
数据库配置 -
# mysql -uroot
-
mysql> stop slave;
进入数据库(没有密码)(698861为show master status;中的大小) -
> change master to master_host=‘192.168.31.132’,master_user=‘repl’,master_password=‘123456’,master_log_file=‘linux1.000001’,master_log_pos=698861;
-
mysql> start slave;
-
关闭防火墙和selinux
systemctl stop firewalld / setenforce 0 -
mysql> show slave status\G
- > unlock tables;
在主上执行解锁表
检验主从配置是否正常
-
从上操作
-
> show slave status\G;
在从上执行命令,查看(将防火墙关闭)
-
主、从同时操作
-
mysql> use kei;
-
mysql> show tables;
-
mysql> select count(*) from db;
-
主上操作,删除数据
-
mysql> truncate table db;
-
mysql> select count(*) from db;
-
从上查看数据
-
mysql> select count(*) from db;
也可drop table尝试看看
几个配置参数
-
主服务器上
-
从服务器上
测试主从
-
主服务器上
-
# mysql -uroot -p密码
在主上进入数据库 -
> select count(*) from db;
-
> truncate table db;
-
从服务器上
-
# mysql -uroot kei
在从上进入数据库 -
> select count(*) from db;