Mysql主从复制

Posted 杨灏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql主从复制相关的知识,希望对你有一定的参考价值。

mysql介绍

mysql的主从复制是一个异步的复制过程,数据将从一个MySQL数据库复制到另一个MySQL数据库,在master与slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和I/O线程)在slave端,另一个线程(I/O线程)在master端。

要实现MySQL的主从复制,首先必须打开master端的binlog记录功能,否则就无法实现。因为整个复制过程实际上就是slave从master端获取binlog日志,然后再在slave上以相同顺序执行获取的binlog日志中所记录的各种SQL操作。

要打开MySQL的binlog记录功能,可通过在MySQL的配置文件my.cnf中的mysqld模块增加“log-bin”参数选项来实现,具体信息如下:

[mysqld]

log-bin = /data/3306/mysql-bin

mysql原理详解

1)开启bin-log,并创建主从复制的账号.在slave服务器上执行start slave命令开启主从复制开关,开始进行主从复制。

2)此时,slave服务器的I/O进程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从指定binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容。 

3)master服务器接受到来自slave服务器的I/O线程的请求后,其上负责复制的I/O线程会根据slave服务器的I/O线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给slave端的I/O线程。返回的信息中除了binlog日志内容外,还有在master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定更新位置。 

4)当slave服务器的I/O线程获取到master服务器上I/O线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到slave端自身的relay log(即中继日志)文件(MySQL-relay-bin.xxxxxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下次读取master端新binlog日志时能够告诉master服务器从新binlog日志的指定文件及位置开始请求新的binlog日志内容。

5)slave服务器端的SQL线程会实时检测本地relay log中I/O线程新增加的日志内容,然后及时地把relay log文件中的内容解析成SQL语句,并在自身slave服务器上按解析SQL语句的位置顺序执行应用这些SQL语句,并在relay-log.info中记录当前应用中继日志的文件名及位置点。

mysql原理小结

MySQL主从复制原理总结:

◆主从复制是异步的逻辑的SQL语句级的复制。

◆复制时,主库有一个I/O线程,从库有两个线程,即I/O和SQL线程。

◆实现主从复制的必要条件是主库要开启记录binlog功能。

◆作为复制的所有MySQL节点的server-id都不能相同。

◆binlog文件只记录对数据库有更改的SQL语句(来自主数据库内容的变更),不记录任何查询(select、show)语句。

实验环境的介绍

[root@db02 ~]# cat /etc/redhat-release

CentOS release 6.8 (Final)

[root@db02 ~]# uname -r

2.6.32-642.el6.x86_64

[root@db02 ~]# uname -m

x86_64

开启两台虚拟机

db01  10.0.0.51 172.16.1.51

db02  10.0.0.52 172.16.1.51

多实例配置主从复制

开启mysql多实例,来进行实验

[root@db02 ~]# /data/3306/mysql start

Starting MySQL...

[root@db02 ~]# /data/3307/mysql start

Starting MySQL...

[root@db02 ~]# ss -lntup |grep mysql

tcp    LISTEN     0      128                   :::3306                 :::*      users:(("mysqld",4656,12))

tcp    LISTEN     0      128                   :::3307                 :::*      users:(("mysqld",5404,12))

开启多实例的binlog

参考前面的笔记

mysql> show variables like \'log_bin%\';

+---------------------------------+----------------------------+

| Variable_name                   | Value                      |

+---------------------------------+----------------------------+

| log_bin                         | ON                         |

| log_bin_basename                | /data/3306/mysql-bin       |

| log_bin_index                   | /data/3306/mysql-bin.index |

| log_bin_trust_function_creators | OFF                        |

| log_bin_use_v1_row_events       | OFF                        |

+---------------------------------+----------------------------+

5 rows in set (0.15 sec)

建立账号授权【主库】

[root@db02 scripts]# mysql -S /data/3306/mysql.sock

mysql> grant replication slave on *.* to \'rep\'@\'172.16.1.%\' identified by \'oldboy123\';

Query OK, 0 rows affected (0.45 sec)
 
mysql> flush privileges;

Query OK, 0 rows affected (0.07 sec)

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

4 rows in set (0.16 sec)
 
mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 |      405 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.05 sec)

进行导出数据

[root@db02 ~]# mkdir -p /server/backup

[root@db02 ~]# mysqldump --master-data=2 -S /data/3306/mysql.sock -A -B |gzip >/server/backup/mysql_bak.$(date +%F).sql.gz

把数据库导入从库

[root@db02 ~]# cd /server/backup/

[root@db02 backup]#

[root@db02 backup]# zcat mysql_bak.2017-05-03.sql.gz >mysql_bak.2017-05-03.sql

[root@db02 backup]# ll

total 812

-rw-r--r--. 1 root root 650630 May  3 11:24 mysql_bak.2017-05-03.sql

-rw-r--r--. 1 root root 178491 May  3 11:23 mysql_bak.2017-05-03.sql.gz

[root@db02 backup]# mysql -S /data/3307/mysql.sock <mysql_bak.2017-05-03.sql 

从库连接主库复制参数

mysql> CHANGE MASTER TO  

    -> MASTER_HOST=\'172.16.1.52\',

    -> MASTER_PORT=3306,

    -> MASTER_USER=\'rep\',

    -> MASTER_PASSWORD=\'oldboy123\',

    -> MASTER_LOG_FILE=\'mysql-bin.000001\',

    -> MASTER_LOG_POS=405;

Query OK, 0 rows affected, 2 warnings (0.11 sec)

启动同步开关

mysql> start slave;

Query OK, 0 rows affected (0.01 sec)

检查

[root@db02 backup]# mysql -S /data/3307/mysql.sock -e "show slave status\\G"|egrep -i "Yes|Behind_Master"

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

        Seconds_Behind_Master: 0

主库上创建

[root@db02 backup]# mysql -S /data/3306/mysql.sock

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

4 rows in set (0.02 sec)

mysql> create database yh;

Query OK, 1 row affected (0.06 sec)

从库上查看

[root@db02 ~]# mysql -S /data/3307/mysql.sock

mysql> show databases

    -> ;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| yh                 |

| performance_schema |

| test               |

+--------------------+

5 rows in set (0.03 sec)

 

以上是关于Mysql主从复制的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 主从复制与读写分离(原理深刻,过程详细,值得一看)

MySQL主从复制与读写分离

MySQL主从复制及读写分离实际部署与验证

MySQL主从复制及读写分离实际部署与验证

mysql实现主从复制/主从同步

MySQL主从复制以及读写分离(❤❤❤❤含理论和实验❤❤❤❤大家中秋快乐!㊗)