深入mysql主从复制延迟问题的详解

面试mysqldba的时候遇到一个题:

描述msyql replication 机制的实现原理,如何在不停掉mysql主库的情况下,恢复数据不一致的slave的数据库节点?

MySQL的复制(replication)是一个异步的复制,从一个MySQL instace(称之为Master)复制到另一个MySQL instance(称之Slave)。实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(Sql进程和IO进程),另外一个进程在Master(IO进程)上。

引用新浪某位大牛的话:mysql复制就是一句话:基于binlog的单线程异步复制过程。
MySQL Replication复制的基本过程如下:
1、Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;


复制代码 代码如下:

mysql> CHANGE MASTER TO
            ->     MASTER_HOST='master_host_name',
            ->     MASTER_USER='replication_user_name',
            ->     MASTER_PASSWORD='replication_password',
            ->     MASTER_LOG_FILE='recorded_log_file_name',
            ->     MASTER_LOG_POS=recorded_log_position;

2、Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;

3、Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;

4、Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行

操作过程:
(1)登陆主服务器,查看主服务器的状态
mysql>show master status;
找到现阶段master的数据偏移量的值。

(2)登陆从服务器,执行同步操作。
mysql>stop slave;
mysql > change master to 直接定位到这个值得位置; 这里也就相当于给slave指明了相应的位置。
mysql > start slave;

(3)从服务器上查看状态
mysql > show slave status

时间: 2013-06-11

利用pt-heartbeat监控MySQL的复制延迟详解

pt-heartbeat 数据库做主从复制时,复制状态.数据延迟是否正常是非常关键的指标,那么如何对其进行监控呢? pt-heartbeat 是 PERCONA 开发的一个工具集中的一个,专门用来监控MySQL和PostgreSQL的复制延迟. 比较成熟,例如Uber等大型公司都在使用. 下面来话不多说,来一起看看详细的介绍: 监控原理 在 master 中建一个 heartbeat 表,其中有一个 时间戳 字段,pt-heartbeat 会周期性的修改时间戳的值. slave 会复制 hear

用HAProxy来检测MySQL复制的延迟的教程

在MySQL世界里,HAProxy 通常来作为软件负载均衡器使用.彼得.博罗什在过去的邮件中解释了如何使用percona xtradb集群(pxc)来对其设置.所以它只发送查询到可应用的节点.同样的方法可用于常规主从设置来读取负载并分散到多个从节点.不过,使用MySQL复制,另一个因素开始发挥作用:复制延迟.在这种情况下,被提及到的 Percona xtraDB 集群以及我们提出只返回"向上"或者"向下"的检查方法行不通.我们将希望依赖其复制延迟来调整内部Hapro

mysql 复制原理与实践应用详解

本文实例讲述了mysql 复制原理与实践应用.分享给大家供大家参考,具体如下: 复制功能是将一个mysql数据库上的数据复到一个或多个mysql从数据库上. 复制的原理:在主服务器上执行的所有DDL和DML语句都会被记录到二进制日志中,这些日志由连接到它的从服务器获取,并复制到从库,并保存为中继日志, 这个过程由一个称为 IO线程 的线程负责,还有一个称为 SQL线程 的则按顺序执行中继日志中的语句. 复制有多种拓扑形式: 1.传统复制,一主多从,一个主服务器多个从服务器. 2.链式复制,一台服

php在linux下检测mysql同步状态的方法

本文实例讲述了php在linux下检测mysql同步状态的方法.分享给大家供大家参考.具体分析如下: 这里通过两个实例来介绍mysql同步状态检测实现方法.代码如下: 复制代码 代码如下: #!/bin/sh     #check MySQL_Slave Status  #crontab time 00:10  MYSQL_USER="root" MYSQL_PWD="123456" MYSQL_SLAVE_LOG="/tmp/check_mysql_sl

用Autoconf检测MySQL软件包的教程

在你的程序(或者工程)中,如果编译阶段需要检测当前环境中是否存在MySQL客户端相关的库文件时,你可以使用Autoconf来帮你完成这个工作,轻盈.优雅.无痛.阅读本文需要了解简单GNU Autoconf使用. 1. 本文的目标 目的:编译时,根据configure参数(如果有--with-mysql),选择性编译对应的MySQL相关的功能. 实现:使用已经写好的m4脚本:ax_lib_mysql.m4 2. 如何利用Autoconf实现 大部分你想到的事情都已经有人做过尝试了.这件事情也不例外

分析MySQL复制以及调优原理和方法

一. 简介 MySQL自带复制方案,带来好处有: 数据备份. 负载均衡. 分布式数据. 概念介绍: 主机(master):被复制的数据库. 从机(slave):复制主机数据的数据库. 复制步骤: (1). master记录更改的明细,存入到二进制日志(binary log). (2). master发送同步消息给slave. (3). slave收到消息后,将master的二进制日志复制到本地的中继日志(relay log). (4). slave重现中继日志中的消息,从而改变数据库的数据. 下

MySQL主从同步延迟的原因及解决办法

由于历史原因,MySQL复制基于逻辑的二进制日志,而非重做日志.多次被问到何时MySQL能支持基于物理的复制,其实这就看MySQL各位大佬的想法.上次和赖老师脑暴,倏地说道:MySQL会不会来个基于Paxos的redo复制? 物理复制的真正好处不在于正确性,因为基于ROW格式的日志复制也已能完全保证复制的正确性.由于物理日志的写入是在事务执行过程中就不断写入,而二进制日志的写入仅仅在事务提交时.因此物理日志的优势如下所示: 复制架构下,大事务日志提交速度快: 复制架构下,主从数据延迟小: 假设执

php检测mysql表是否存在的方法小结

本文实例讲述了php检测mysql表是否存在的方法.分享给大家供大家参考,具体如下: pdo: <?php $dsn = 'mysql:dbname=test;host=127.0.0.1'; $user = 'root'; $password = ''; try { $pdo = new PDO($dsn, $user, $password); } catch (PDOException $e) { die("数据库连接失败".$e->getMessage()); } $

MySQL 复制详解及简单实例

MySQL 复制详解及简单实例 主从复制技术在MySQL中被广泛使用,主要用于同步一台服务器上的数据至多台从服务器,可以用于实现负载均衡,高可用和故障切换,以及提供备份等等.MySQL支持多种不同的复制技术,诸如单向,半同步异步复制等以及不同级别的复制,诸如数据库级别,表级,跨库同步等等.本文简要描述了一个基本的主从复制并给出示例. 1.复制的基本原理(步骤) a.在主库上把数据更改记录的二进制日志(binary log)     b.从库上的I/O线程连接到主库并请求发送其二进制日志文件(主库

mysql 复制表结构和数据实例代码

在mysql数据库开发中,我们有时候需要复制或拷贝一张表结构和数据到例外一张表,这个时候我们可以使用create ... select ... from语句来实现,本文章向大家介绍mysql复制表结构和数据一个简单实例, 比如现在有一张表,我们要将该表复制一份,以备以后使用,那么如何使用mysql语句来实现呢?其实我们可以直接使用create ... select ... from语句来实现,具体实现方法请看下面实例. 我们先来创建一张Topic表,创建Topic表的SQL语句如下: mysql

MySQL 复制表详解及实例代码

MySQL 复制表详解 如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的. 本章节将为大家介绍如何完整的复制MySQL数据表,步骤如下: 使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等. 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构. 如果你想复制表的内容,