•MySQL主从又叫作Replication、AB复制。简单讲就是A和B两台机器作主从后,在A上写数据,另一台B也会跟着写数据,二者数据实时同步的mysql
• MySQL主从是基于binlog的,主上须开启binlog才能进行主从。linux
• 主从过程大体有3个步骤web
1)主将更改操做记录到binlog里sql
2)从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog里数据库
3)从根据relaylog里面的sql语句按顺序执行vim
• 主上有一个log dump线程,用来和从的I/O线程传递binlog服务器
• 从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另一个SQL线程用来把relaylog里面的sql语句落地ide
其中binlog 二进制日志测试
relaylog 中继日志spa
MySQL主从原理图以下:
MySQL主从配置使用场景
1)将从用于作数据备份
2)从不只用于数据备份,并且还用于web客户端读取从上的数据,减轻主读的压力
准备两台机器,每台机器都要搭建好并启动MySQL服务 ,下面咱们来将IP为136机器作成主库、130的机器作成从库,当前136机器mysql服务已经搭建好,下面咱们来将130的mysql服务搭建起来
一、安装mysql
1)下载
下载MySQL5.6 64位MySQL二进制免编译包
# wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
2 )解压
# tar xzvf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
3)移动目录
将解压后的文件包移动到目录/usr/local/下并改名为mysql
# mv mysql-5.6.36-linux-glibc2.5-x86_64 /usr/local/mysql
4)建立使用MySQL的系统用户及数据存储目录
# useradd mysql
# mkdir /data/
5)初始化
# cd /usr/local/mysql
# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
当出现两个OK则说明初始化OK
6)修改配置文件
# vim /etc/my.cnf
修改这个文件中以下位置
7)拷贝并编辑启动脚本
# cp support-files/mysql.server /etc/init.d/mysqld
# vim /etc/init.d/mysqld
# chkconfig mysqld on //配置mysqld开机启动
将启动脚本修改下面位置以下图
8)启动mysqld
# /etc/init.d/mysqld start //启动mysqld
# ps aux |grep mysqld //查看mysqld是否成功启动
将前面的准备工做作好以后,咱们再来配置主库
一、修改配置文件
# vim /etc/my.cnf
在配置文件中增长如下内容
server-id=136 //后面的id号能够随便定义
log_bin=lijie1 //这里定义的是binlog的前缀,这个前缀名能够随便定义
二、重启mysql服务
# /etc/init.d/mysqld restart //重启mysqld
# ls -lt /data/mysql/ //配置完重启后能够看到这个目录下多了两个文件
上图中的lijie1.000001是第一个二进制日志文件,后面还会生成不少个
lijie1.index是必需有的索引文件
没有这些文件主从就没有办法完成
三、准备测试用的数据
咱们须要将以前的库备份并恢复成lijie库,做为测试数据
# mysqldump -uroot -p112233 zrlog > /tmp/zrlog.sql //备份库
# mysql -uroot -p112233 -e "create database lijie" //建立测试库
# mysql -uroot -p112233 lijie < /tmp/zrlog.sql //恢复数据到测试库
四、建立用做同步数据的用户
# mysql -uroot -p112233
> grant replication slave on *.* to 'repl'@192.168.31.149 identified by '112233'; //建立数据库用户repl并将其绑定到固定从机192.168.31.149上,且只授予其同步数据的权限
五、锁表
锁表的目的是将表固定在当前状态,不能再写入数据,后面咱们还要将备份的数据同步到从机上,以保证主从数据的一致性
> flush tables with read lock;
六、查看主库状态
> show master status;
一、编辑配置文件
# vim /etc/my.cnf
在这个配置文件中加入server-id,要求和主不同,在这里咱们不须要添加log_bin日志的值了,只有主上才须要二进制日志文件
二、重启mysql服务
# /etc/init.d/mysqld restart //重启mysqld
# ls -lt /data/mysql/ //配置完重启后能够看到这个目录下没有什么变化
三、同步主上的数据文件到本机
# scp 192.168.31.157:/tmp/*.sql /tmp
四、建立库
因为咱们尚未将mysql的路径加入到PATH中,所以咱们能够先作一个alias
# alias 'mysql=/usr/local/mysql/bin/mysql'
# alias 'mysqldump=/usr/local/mysql/bin/mysqldump'
# mysql -uroot -p123123
> create database lijie;
> create database zrlog;
五、恢复数据
# mysqldump -uroot -p123123 lijie < /tmp/lijie.sql
# mysqldump -uroot -p123123 zrlog < /tmp/zrlog.sql
六、实现主从
# mysql -uroot -p123123
> stop slave;
> change master to master_host='192.168.31.157', master_user='repl', master_password='123123', master_log_file='lijie1.000001',master_log_pos=10555;
上面命令中包含的主库信息有:IP 登陆主数据库的用户名、密码、日志文件名,日志路径,咱们还能够在命令中加入端口信息,默认3306端口能够不用写
> start slave;
七、判断主从是否配置成功
从上执行
• mysql -uroot
• show slave stauts\G
看是否有
• Slave_IO_Running: Yes
• Slave_SQL_Running: Yes
还需关注
• Seconds_Behind_Master: 0 //为主从延迟的时间
• Last_IO_Errno: 0
• Last_IO_Error:
• Last_SQL_Errno: 0
• Last_SQL_Error:
咱们使用下面这个命令来查看
# show slave status\G //若是出现下图中两个YES则表示主从配置成功
若是show slave status中Slave_IO_Running=connecting则须要查查有没有iptables规则,或者是否开启了selinux ,还要保证用户名密码是对的
八、取消锁定
主从配置好后,还要到主上去取消对表写入的锁定
> unlock tables;
一、几个配置参数
下面的参数是在mysql配置文件my.cnf中去定义的,能够在主上配置,也能够在从上配置
若是是在主服务器上,
• binlog-do-db= //指定须要同步的库,若是有多个库,须要用英文逗号分割
• binlog-ignore-db= //忽略指定库
• 从服务器上
• replicate_do_db=
• replicate_ignore_db=
• replicate_do_table=
• replicate_ignore_table=
• replicate_wild_do_table= //如aming.%, 支持通配符%,建议从服务器上不使用上面四行配置,仅使用后面这两行配置
• replicate_wild_ignore_table=
二、测试同步
主上
• mysql -uroot aming
• select count(*) from db;
• truncate table db;
到从上
• mysql -uroot aming
• select count(*) from db;
主上继续drop table db;
从上查看db表
1)首先咱们分别在主从上查看下lijie.user表的行数
主 > use lijie; 从 > use lijie;
> select count(*) user; > select count(*) user;
能够看到两边的结果是一致的
2)咱们在主上清空表lijie.user
> truncate table user; //清空表user的数据
> select * from user; // 查询表中内容,能够看到表是空的
再到从上查询表user中的数据,也为空
3)咱们在主上删除表lijie.user
> drop table user;
若是在上述操做中咱们不当心在从上作了删除等操做使主从的数据不一致时,咱们能够尝试重启slave来恢复,若是仍是不行的话,就须要从新作主从了,若是此刻主从数据修改成一致后,能够直接从change master这一步开始走。