六十、MySQL主从介绍、准备工作、配置主、配置从、测试主从同步
一、MySQL主从介绍
MySQL主从官方叫法是Replication、有的人叫AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的。
MySQL主从是基于binlog的,主上须开启binlog才能进行主从。
主从过程大致有3个步骤
1)主将更改操作记录到binlog里
2)从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog里
3)从根据relaylog里面的sql语句按顺序执行
主上有一个log dump线程,专门用来生成binlog的,和从的I/O线程传递binlog;
从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句执行一遍。
MySQL主从原理图:
解析:
Master:主
Slave:从
当主有写入操作(write)时,就会有log dump thread线程和从上的I/O thread线程进行交互通信,主写操作都会记录到Binary log里去,从把binlog信息读到slave上,然后生成了Relay log(中继日志),然后SQL thread线程把Relay log里的SQL语句做一个执行,做出相应的更改,最终达到两边数据一致。
应用场景:
1)数据备份
2)数据备份+web服务器在从上读数据,但是不能在从上写。
二、准备工作
1.安装mysql
wget下载mysql
解压,解压完的目录移动放到/usr/local/mysql下(这一步一定要检查这个目录事前是否存在,如果存在,就把这个目录先改名字或者把目录下的内容删除),最终目录里的内容是mysql解压的包的内容。
然后进入这个目录初始化。
2.修改/etc/my.cnf
定义datadir和socket
[root@MRX mysql]# cp support-files/mysql.server /etc/init.d/mysqld 拷贝启动脚本
然后编辑它,定义Basedir和datadir。
3.修改完配置文件后,启动或者重启mysqld服务
最终两台机器的mysql都要启动起来。
三、配置主
安装mysql
修改/etc/my.cnf
在mysqld里的socket下增加两行:
server-id=130 主机的IP尾数
log_bin=aminglinux1 bin_log的前缀
修改完配置文件后,启动或者重启mysqld服务
# /etc/init.d/mysqld restart
# pwd
/data/mysql
# ls -lt
总用量 110748
-rw-rw---- 1 mysql mysql 50331648 5月 16 20:59 ib_logfile0
-rw-rw---- 1 mysql mysql 12582912 5月 16 20:59 ibdata1
-rw-rw---- 1 mysql mysql 119466 5月 16 20:59 MRX.err
-rw-rw---- 1 mysql mysql 5 5月 16 20:59 MRX.pid
-rw-rw---- 1 mysql mysql 21 5月 16 20:59 aminglinux1.index 这个文件是一定要有的,索引。
-rw-rw---- 1 mysql mysql 120 5月 16 20:59 aminglinux1.000001 第1个二进制文件
drwx------ 2 mysql mysql 324 5月 15 22:55 zrlog
drwx------ 2 mysql mysql 4096 5月 8 23:33 mysql2
drwx------ 2 mysql mysql 20 5月 8 22:38 db1
-rw-rw---- 1 mysql mysql 56 4月 19 21:32 auto.cnf
drwx------ 2 mysql mysql 4096 4月 19 21:22 mysql
drwx------ 2 mysql mysql 4096 4月 19 21:22 performance_schema
-rw-rw---- 1 mysql mysql 50331648 4月 19 21:22 ib_logfile1
drwx------ 2 mysql mysql 6 4月 19 21:22 test
这种以aminglinux1开头的bin_log文件是实现主从的根本,没有它们,主从就没法完成。
把mysql库备份并恢复成aming库,作为测试数据
# pwd
/data/mysql
# mysqldump -uroot -p12345 mysql > /tmp/mysql.sql 备份这个目录
# mysql -uroot -p12345 -e “create database aming”
# mysql -uroot -p12345 aming < /tmp/mysql.sql 恢复这个库
创建用作同步数据的用户
# mysql -uroot -p12345
grant replication slave on *.* to 'repl'@'192.168.93.129' identified by '123456';
flush tables with read lock; 把这个表锁上,目的是为了不让他继续写。
show master status;
这里记住File的名字aminglinux1.000001和Position为664307。
退出mysql。
除了mysql以为其他的全都可以同步,因为mysql里存的是用户和密码。
先备份了mysql2和zrlog。
四、配置从
安装mysql
查看my.cnf,配置server-id=129,要求和主不一样,不用配置log_bin,因为只有主才需要二进制日志文件,所以增加server-id就可以了。
修改完配置文件后,重启mysqld服务
# scp 192.168.93.130:/tmp/*.sql /tmp/
scp命令:用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。
把主上aming库同步到从上(如果主和从的数据不一致,后期会很麻烦)
[root@CLAY ~]# alias mysql=/usr/local/mysql/bin/mysql
# mysql -uroot
可以先创建aming库,然后把主上的/tmp/mysql.sql拷贝到从上,然后导入aming库
mysql> create database user;
Query OK, 1 row affected (0.04 sec)
mysql> create database zrlog;
Query OK, 1 row affected (0.01 sec)
mysql> create database mysql2;
Query OK, 1 row affected (0.00 sec)
然后恢复这些库的数据:
[root@CLAY ~]# mysql -uroot mysql2 < /tmp/mysql2.sql
[root@CLAY ~]# mysql -uroot zrlog < /tmp/zrlog.sql
[root@CLAY ~]# mysql -uroot user < /tmp/user.sql
mysql> stop slave;
change master to master_host='192.168.93.130', master_user='repl', master_password='123456', master_log_file='aminglinux1.000001', master_log_pos=664307; 这一步很关键
change master to master_host='192.168.93.130',master_port=3306(默认端口,可省略不写),master_user='repl'(用户), master_password='123456'( 从的密码), master_log_file='aminglinux1.000001'(日志文件), master_log_pos=664307(Position);
这个log_file和log_pos就是在主上mysql> show master status;出来的,pos这里的数字不用加单引号。
mysql> start slave;
从上执行mysql -uroot
mysql> show slave status\G 判定主从是否配置成功,看下面的这两行是否是两个yes。
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:
还要到主上执行mysql> unlock tables; 恢复“写”操作。
到此主从就搭建完了。
/etc/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 -p12345
mysql> use aming; //切换到aming库
select count(*) from db; //看一下db表有几行数据,这里是1行
truncate table db; 清空这个表
到从上 mysql -uroot
use aming;
select count(*) from db;
主上继续drop table db; 删除这个库,主上操作。
从上查看db表
有的人,遇到主从不能正常同步,提示uuid相同的错误。这是因为克隆机器导致。
https://www.2cto.com/database/201412/364479.html