Mysql主从配置
1.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主从原理图
3.MySQL主从配置
- 主配置(安装完mysql的虚拟机)
基础配置`
# vi /etc/my.cnf
编辑配置文件
log_bin=linux1,删除log_bin前的注释
# /etc/init.d/mysqld restart
# ll /data/mysql/ //查看此文件
重启mysqld服务
#/etc/init.d/mysqld restart
# vim /etc/profile
export PATH=$PATH:/usr/local/mysql/bin
# source /etc/profile
# mysqldump -uroot -p mysql > /tmp/mysql.sql
备份mysql库(加入环境变量)
# mysql -uroot -e "create database kei"
创建一个库保存数据
# mysql -uroot kei < /tmp/mysql.sql
将mysql库恢复成新建的库,作为测试数据
数据库配置
# mysql -uroot
进入数据库
>grant replication slave on *.* to 'repl' @192.168.37.13 identified by '123456';
创建用作同步数据的用户并赋予权限,IP地址为从节点的地址(replication是MySQL非常出色的一个功能,该功能将一个MySQL实例中的数据复制到另一个MySQL实例中。
>flush tables with read lock;
将表锁住,保持表内数据不变
show master status;
显示主机状态
刚开始做显示上图000001,下图为报错重做后增到000008
//后面从配置时使用红框中的代码
- 从配置(安装完mysql的虚拟机)
基础配置
# vi /etc/my.cnf
编辑配置文件
# /etc/init.d/mysqld restart
重启mysqld服务
# scp /tmp/mysql.sql root@192.168.243.130:/tmp/
在主上将文件拷贝到从上,并在从上查看文件大小是否一致
# mysql -uroot -e "create database kei"
//创建一个和主一样的库
# mysql -uroot kei < /tmp/mysql.sql
将文件内容导入库
数据库配置
# mysql -uroot
mysql> stop slave;
进入数据库(没有密码)(698861为show master status;中的大小)
mysql> change master to master_host='192.168.37.12',master_user='repl',master_password='123456',master_log_file='linux1.000001',master_log_pos=698861;
mysql> start slave;
关闭防火墙和selinux
mysql> show slave status\G
mysql> unlock tables;
再主上执行解锁表
4.检验主从配置是否正常
从上操作
mysql> 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尝试看看
5.几个配置参数
-
主服务器上
-
从服务器上
6.测试主从
- 主服务器上
# mysql -uroot -p密码
在主上进入数据库
> select count(*) from db;
> truncate table db;
- 从服务器上
# mysql -uroot kei
在从上进入数据库
> select count(*) from db;