六十、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主从原理图:

六十、MySQL主从介绍、准备工作、配置主、配置从、测试主从同步_准备工作 _02

解析:

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