• 一、MySQL主从复制原理

  随机站点访问量的鞥集啊,单台的MySQL服务器压力也不断地增加,此时需要对MySQL进行优化,如果在MySQL优化无明显改善时期,可以使用高可用、主从复制、读写分离、分库分表等方式进行进一步的优化。

  MySQL主从复制的目的是为了实现数据库冗余备份,将master数据库数据定时同步至slave库中,一旦master数据库宕机,可以将web应用数据库配置快速地切换到slave数据库,确保web应用的 可用性,MySQL主从复制架构图如下:

  MySQL主从复制至少需要2台数据库服务器,其中1台为master,一台为slave库,MySQL主从数据同步是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,bin-log日志用于记录在master库中所执行的增、删、改的SQL语句,整个过程需要开启3个线程,分别是master开启I/O线程,slave开启I/O线程和SQL线程,具体主从同步原理如下:

(1)slave上执行slave start,开启主从复制开关,产生I/O线程和SQL 线程。slave I/O线程会通过在master创建的授权用户连接上至master,并请求master从指定的文件和位置之后发送bin-log日志内容;

(2)master接受到来自slave I/O线程的请求后,首先进行验证,验证通过后,master I/O线程会根据slave I/O线程请求读取指定bin-log日志文件的指定position点之后的bin-log内容,然后返回给slave的I/O线程;

(3)返回的信息当中除了bin-log日志内容以外,还有master最新的bin-log文件名以及在bin-log中的下一个指定更新的position点;

(4)slave I/O线程接到信息后,将收到的日志内容依次添加到slave端的中继日志(relay-log)文件的最末端(MySQL-relay-bin.xxxxx),并将读取到的master端的bin-log的文件名和position点记录到master.info文件当中,以便下一次读取的时候能够告诉master从相应的bin-log文件名和最后一个position点开始发起请求;

(5)slave SQL线程检测到relay-log中内容有更新,会立刻解析relay-log日志中的内容,将解析后的SQL语句在slave中执行,执行成功后slave库和master库数据保持一致。

  • 二、主从复制实战

1、环境说明

HOST OS MySQL version Port Path Master/Slave
192.168.56.11 Centos 7.4

MySQL 5.6.35

3306 /usr/local/mysql/data/ Master
192.168.56.12 Centos 7.4 MySQL 5.6.35 3306 /usr/local/mysql/data Slave

2、配置Master和Slave的my.cnf

[root@master ~]# vim /etc/my.cnf
log-bin=/usr/local/mysql/data/mysql-bin  #开启Master的bin-log日志记录功能
server-id=1  #配置Master的server-id,必须和slave不一样
[root@slave ~]# vim /etc/my.cnf
server-id=2  #配置Slave的server-id

3、在Master上创建主从复制的用户rep并授权

[root@master ~]# mysql -uroot -p123456

mysql> grant replication slave on *.* to rep@'192.168.56.%' identified by '';  #创建主从复制授权用户
Query OK, rows affected (0.03 sec) mysql> flush privileges;  #刷新权限
Query OK, rows affected (0.04 sec) mysql> select user,host from mysql.user;  #查看创建的rep用户
+-----------+--------------+
| user | host |
+-----------+--------------+
| root | % |
| wordpress | % |
| root | 127.0.0.1 |
| rep | 192.168..% |
| root | localhost |
+-----------+--------------+
rows in set (0.03 sec) mysql> show grants for rep@'192.168.56.%';
+---------------------------------------------------------------------------------------------------------------------------+
| Grants for rep@192.168..% |
+---------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.56.%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
+---------------------------------------------------------------------------------------------------------------------------+
row in set (0.00 sec)

4、在Master上对数据库进行全备

mysql> flush table with read lock;  #给主库加上读锁(备份结束前,该会话不能关闭,否则binlog的文件名或位置点会有变化
Query OK, rows affected (0.02 sec) mysql> show master status;  #查看主库的binlog日志名称和POS值
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin. | | | | |
+------------------+----------+--------------+------------------+-------------------+
row in set (0.00 sec)

********新开一个xshell窗口进行备份**********
[root@master ~]# mkdir /server/backup -p  #创建数据库备份目录
[root@master ~]# mysqldump -uroot -p123456 -A -B --events |gzip > /server/backup/rep_bak_$(date +%F).sql.gz  #全备Master的库
[root@master ~]# ls -lrt /server/backup/
total
-rw-r--r-- root root Jul : rep_bak_2018--.sql.gz
[root@master ~]# scp /server/backup/rep_bak_2018--.sql.gz root@192.168.56.12:/tools/  #将备份拷贝到Slave上
rep_bak_2018--.sql.gz % 317KB .9MB/s : *********拷贝完成后,进行解锁**********
mysql> unlock tables;

5、在Slave上恢复Master上的数据

[root@slave ~]# gzip -d /tools/rep_bak_2018--.sql.gz
[root@slave ~]# mysql -uroot -p123456 < /tools/rep_bak_2018--.sql

6、在Slave上配置master.info

[root@slave ~]# mysql -uroot -p

mysql> stop slave;
Query OK, rows affected (0.02 sec) mysql> change master to master_host='192.168.56.11',master_user='rep',master_password='', master_log_file='mysql-bin.000005' ,master_log_pos=;
Query OK, rows affected, warnings (0.10 sec)

7、在Slave上启动主从复制

mysql> start slave;  #开启主从复制
Query OK, rows affected (0.02 sec) mysql> show slave status\G  #查看slave上的IO和SQL线程是否运行
*************************** . row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.56.11
Master_User: rep
Master_Port:
Connect_Retry:
Master_Log_File: mysql-bin.
Read_Master_Log_Pos:
Relay_Log_File: slave-relay-bin.
Relay_Log_Pos:
Relay_Master_Log_File: mysql-bin.
Slave_IO_Running: Yes  #表示Slave上的IO线程是否运行
Slave_SQL_Running: Yes  #表示Slave上的SQL线程是否运行

Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:
Last_Error:
Skip_Counter:
Exec_Master_Log_Pos:
Relay_Log_Space:
Until_Condition: None
Until_Log_File:
Until_Log_Pos:
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:   #表示落后master的秒数,0表示不落后,正常
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno:
Last_IO_Error:
Last_SQL_Errno:
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id:
Master_UUID: 885e2479-89f6-11e8-a128-000c29ce31fd
Master_Info_File: /usr/local/mysql-5.6./data/master.info
SQL_Delay:
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count:
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position:
row in set (0.00 sec) [root@slave ~]# ll /usr/local/mysql/data/slave-relay-bin.*  #查看从上的relay-log是否生成
-rw-rw---- mysql mysql Jul : /usr/local/mysql/data/slave-relay-bin.
-rw-rw---- mysql mysql Jul : /usr/local/mysql/data/slave-relay-bin.
-rw-rw---- mysql mysql Jul : /usr/local/mysql/data/slave-relay-bin.index

8、测试在Master上的操作是否能同步到Slave上

mysql> create database repppp;  #在主上创建数据库repppp
Query OK, row affected (0.02 sec) mysql> show databases;  #在从上查看是否存在repppp数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| repppp |
| test |
| wordpress |
+--------------------+
rows in set (0.00 sec)

9、总结

(1)异步方式同步
(2) 逻辑同步模式(binlog 有三种模式: SQL、混合、 rowlevel),默认是通过 SQL 语句执行
(3)主库通过记录 binlog 实现对从库的同步
(4)主库 1 个线程(IO 线程),从库 2 个线程(IO 和 SQL)来完成
(5)从库的关键文件: master.info、 relay-log、 relay-info
(6)如果从库还想级联从库,需打开 log-bin 和 log-slave-updates 参数

10、生产场景快速配置 MySQL 主从复制的方案

(1)安装好要配置从库的数据库,配置好 log-bin 和 server-id 参数。
(2)无需配置主库的 my.cnf 文件,主库的 log-bin 和 server-id 参数默认就是配置好的。
(3)登陆主库增加用于从库连接的帐户,并授 replication slave 的权限。
(4)半夜使用 mysqldump 带--master-data=1 参数全备主库,并在从库进行恢复。
(5)在从库执行 change master to 语句,无需 binlog 文件及对应位置点。
(6)在从库开启同步开关 start slave。
(7)从库 show slave status\G,检查同步状态,并在主库进行更新测试。 tips:
(1)主从库服务器的配置差距不要太大。
(2)撰写方案文档和实施步骤。如可能需要停机维护,需要事先申请停机维护时间

 11、遇到的问题

(1)当在执行start slave这条命令时,系统提示 ERROR 1200 (HY000): The server is not configured as slave; fix in config file or with CHANGE MASTER TO, 执行show slave status;又提示Empty set (0.00 sec)

原因:slave已经默认开启,要先关闭再开启,执行stop slave;   再执行change master to master_host='192.168.56.11',master_user='rep',master_password='123456', master_log_file='mysql-bin.000005' ,master_log_pos=120;

(2)出现错误提示  :Slave_IO_Running:NO ,mysql的error日志中信息: Slave I/O: error connecting to master 'replication@172.16.0.100:3306' - retry-time: 60  retries: 86400, Error_code: 1045

解决方法
1.在主mysql中创建slave远程连接访问时候的登录密码一定要设置对。

2.停止slave上的mysqld服务,从服务器上删除掉所有的二进制日志文件,包括一个数据目录下的master.info文件和hostname-relay-bin开头的文件,然后启动slave上的mysqld服务。

master.info::记录了Mysql主服务器上的日志文件和记录位置、连接的密码。

(3)slave上Slave_SQL_Running: No ,提示某个表定义不正确

解决方法:
清空drop掉master和slave上的已经存在所有表,然后从master库上导入新的数据即可。

MySQL入门篇(四)之MySQL主从复制的更多相关文章

  1. 第二章 MySQL入门篇

    第一章 MySQL入门篇 一.MySql简介 简言: 和SQL Server数据库相同,MySQl也是一个关系型数据库管理系统.由瑞典的MySQL AB公司开发,2008年被SUN公司收购,2009年 ...

  2. 最新MySQL入门篇

    一.SQL简介 ​ SQL:结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系 ...

  3. 【SSRS】入门篇(四) -- 向报表添加数据

    原文:[SSRS]入门篇(四) -- 向报表添加数据 定义好数据集后 [SSRS]入门篇(三) -- 为报表定义数据集 ,就可以开始设计报表了,将要显示在报表的字段.文本框.图像和其他项从工具箱拖放到 ...

  4. FPGA基础入门篇(四) 边沿检测电路

    FPGA基础入门篇(四)--边沿检测电路 一.边沿检测 边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲.这在FPGA电 ...

  5. MySQL入门篇(七)之Xtrabackup备份与恢复

    一.Xtrabackup介绍 MySQL冷备.mysqldump.MySQL热拷贝都无法实现对数据库进行增量备份.在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况 ...

  6. MySQL入门篇(三)之my.cnf配置文件详解【转】

    转自:https://www.cnblogs.com/panwenbin-logs/p/8360703.html #*** client options 相关选项 ***# #以下选项会被MySQL客 ...

  7. Docker入门(四)——MySQL镜像中的数据库可视化

      在详细介绍这篇文章的内容前,需要说明下笔者写这篇文章的意图:笔者在现有的开发中,前后端联调的方式为Docker镜像对接,数据库使用MySQL镜像,开发环境为远程服务器,因此,笔者迫切需要一种能将远 ...

  8. MySQL入门篇(一)之MySQL部署

    MySQL 二进制免编译安装 (1)下载二进制免编译版本mysql 5.6.35 [root@localhost tools]# wget http://mirrors.sohu.com/mysql/ ...

  9. MySQL入门篇(二)之常见命令管理

    一.SQL结构化查询语言 SQL,英文全称Structured Query Language,中文意思是结构化查询语言.它是一种对关系数据库中的数据进行定义和操作的语言方法,是大多数关系数据库管理系统 ...

随机推荐

  1. SOJ 1017 Power of Cryptography 库函数精度

    Background Current work in cryptography involves (among other things) large prime numbers and comput ...

  2. Yii2.0 发送邮件时中文附件乱码的问题

    yii自带的邮件类使用的是MIME 协议,发送附件时用的是MIME 协议的 Content-disposition扩展,用扩展下载中文名称的附件时有时会正常,有时会乱码. 只需找到如下文件 的如下方法 ...

  3. Graph I - Graph

    Graph There are two standard ways to represent a graph G=(V,E)G=(V,E), where VV is a set of vertices ...

  4. 使用Fiddler监控来自手机客户端的请求

    环境配置组成: 1 手机 2 安装Fiddler的PC 设置要点: 1 手机和PC应在同一个局域网内 我的做法是:PC安装WIFI热点,手机连接热点上网 PC的IP是192.168.95.1  手机的 ...

  5. HDU 1711 Number Sequence (KMP简单题)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. 所有流媒体协议,编解码规范和媒体封装格式的datasheet的下载地址

    https://github.com/jiayayao/DataSheet All datasheet about stream protocol, encode-decode spec and me ...

  7. 多线程系列之 Java多线程的个人理解(一)

    前言:多线程常常是程序员面试时会被问到的问题之一,也会被面试官用来衡量应聘者的编程思维和能力的重要参考指标:无论是在工作中还是在应对面试时,多线程都是一个绕不过去的话题.本文重点围绕多线程,借助Jav ...

  8. webpack4.x最详细入门讲解

    前言 本文主要从webpack4.x入手,会对平时常用的Webpack配置一一讲解,各个功能点都有对应的详细例子,所以本文也比较长,但如果你能动手跟着本文中的例子完整写一次,相信你会觉得Webpack ...

  9. Oracle 的PL/SQL语言使用

    --PL/SQL语言(procedure language 过程化语言) --1.声明类型 declare k number; m ; --Character String buffer too sm ...

  10. React Native封装Toast与加载Loading组件

    React Native开发封装Toast与加载Loading组件 在App开发中,我们避免不了使用的两个组件,一个Toast,一个网络加载Loading,在RN开发中,也是一样,React Nati ...