Mysql 在线新建或重做主从

1. 前言

以前给 Mysql 数据库做主从,都是在主服务器停服的情况下做的。但是最近有一个项目,已经上线几天了,数据库也单服务器跑了几天,才确定要给 Mysql 服务器做一个主从架构,简单的一主一从架构。

项目最好能在不停服的情况下完成 Mysql 主从搭建。后来翻了一些资料,真的找到了可以在线新建或者重做主从的方法。

其实我们以前停服做主从的主要目的是想锁表,是想找到 master_log_file 和 master_log_pos 两个参数。如果有方法在不停服的情况下,能确定这两个参数,那么在线建立主从架构的功能,就可以实现了。

2. 服务器环境以及版本

系统: CentOS7.5
Mysql: 5.6.x
主端: 172.188.26.221
从端: 172.188.26.229

3. 配置准备

注意:主端不停服的前提是,它已经开启了bin-log 日志!!

如果之前在主库没有开启 bin-log 日志,那就没有办法在新新建了,因为配置 bin-log 日志之后,主库一定要重启才能生效。不过,如果现在的情况是重做主库,那就证明之前是做过主从的,只是可能主从失效了需要重做。这种情况,主库也不需要重启,只要重新备份一下数据库,就可以重建从库了。

下面继续说说具体的主从新建过程。

在主库修改配置文件 my.cnf ,添加开启 bin-log 日志,格式用 row,注意 server-id ,它在主端和备端的数值要不一样,一般使用 ip 的最后一段。

server-id=221
log-bin=/data/mysqldata/mysql-bin
binlog-format=ROW

如果之前已经开启了bin-log 功能,就不用修改了。

接着在主库上进行备份用户的授权操作:

mysql>grant replication slave on *.* to 'repel'@'172.188.26.229' identified by 'password';

授权给从库的 ip 地址,备份的用户名是 repel,建议不要使用 'repel'@'%' 这种方式进行授权操作,主要是为了安全问题,限制授权的 ip 白名单。

接下来就是要在主库将需要备份的数据库导出来:

  • 用 mysqldump 的方式,以下是导出整个数据库:
mysqldump -uroot -p  --single-transaction --no-autocommit --master-data=2 -A >test2.sql
  • 用 mysqldump 的方式,如果主端 Mysql 上有不止一个项目的业务库,但是只想导出其中一个业务库,假设叫做 feitian 数据库:

    mysqldump -uroot -p  --single-transaction --no-autocommit --master-data=2  feitian > feitian_dump.sql

这里有一个关键的参数 "--master-data=2", 这个参数能帮助我们实现在线重建主从数据库。

导出数据库之后,将它传到从库的服务器上,怎么传,各人随意了。我使用 scp:

scp  feitian_dump.sql  root@172.188.26.229:/usr/local/src/

接下来就是在从库上做配置了。

从库最好是完全“清白”的状态,或者重新安装。像安装 Mysql、Nginx、php 这些常规操作,最好在平时就写好脚本,准备好安装包、自己常用的配置文件。当要使用的时候,直接跑一下脚本就安装好了。

我习惯使用 ansible playbook 来做这种脚本化的操作。

重装 Mysql 的操作我就不写了,或者我另写一篇文章,将自己的脚本分享出来。

Mysql 重装完成之后,要对数据库做初始化操作,要修改 root 密码,这些都是常规操作。

当一个新的 Mysql 安装好并成功启动之后,就可以配置从库功能了。

修改从库 my.cnf ,由于我只想备份 feitian 业务库,所以只增加了:

server-id=229
replicate_wild_do_table=feitian.%
  • 其实如果进行的是全库备份,那么只要配置 server-id 和主库不一样就可以了,其他的不需要增加。
  • 但是,如果只想备份某些特定的业务库,就需要使用 replicate_wild_do_table 这个参数了。它的作用是告诉从库只需要备份特定的库,如果有多个库,就继续用逗号隔开添加即可。
  • 还有一个功能相反的参数 replicate_wild_ignore_table ,是配置忽略的数据库,即不备份的数据库,这个参数使用起来比较多限制,不熟悉最好不使用。

接下来是导入数据库,在导入数据库前,需要重置一下从库binlog:


mysql -uroot -p   -e 'reset master'
mysql -uroot -p   feitian < feitian_dump.sql

重头戏,下面要配置主从同步了。

在上面提到过,在备份数据库的时候,使用了一个关键的参数 --master-data=2.这个参数为什么关键呢?因为在备份文件中,可以看到我们需要的 master_log_file 和 master_log_pos 两个参数。有了这两个参数,我们就不需要像以往那样停服锁表,来查看了。

具体怎么查找这两个参数?它们大概在文件的前 30 行以内,所以可以用 head 命令找到:


[root@ND-BACKUP mysql]# head -n 30 feitian_dump.sql
-- MySQL dump 10.13  Distrib 5.6.39, for linux-glibc2.12 (x86_64)
--
-- Host: localhost    Database: feitian
-- ------------------------------------------------------
-- Server version   5.6.39-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Position to start replication or point-in-time recovery from
--

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000063', MASTER_LOG_POS=144333309;

--
-- Table structure for table `ft_access`
--

在上面的输出,可以看到 binlog 是 mysql-bin.000063,position 是 144333309.有了这两个参数,就可以配置从库同步了。

一般在从库 change master to 就可以了。

所以,在从库做以下配置:

# 先重置一下 slave
mysql>reset slave all;

#然后再执行操作
mysql>change master to  master_host='172.188.26.221', master_user='repel', master_password='*****', master_port=3306,master_log_file='mysql-bin.000063',
master_log_pos=144333309;

然后,就可以启动从库复制了:

mysql>start slave;

检查一下从库的状态:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.188.26.221
                  Master_User: repel
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000063
          Read_Master_Log_Pos: 146576160
               Relay_Log_File: nd-feitian-relay-bin.000002
                Relay_Log_Pos: 2243134
        Relay_Master_Log_File: mysql-bin.000063
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

      Replicate_Wild_Do_Table: feitian.%
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 146576160
              Relay_Log_Space: 2243311
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No

        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 221
                  Master_UUID: a986c930-214a-11e8-b69c-00163e0cee42
             Master_Info_File: /usr/local/mysql/mysqldata/master.info
                    SQL_Delay: 0
          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: 86400

                Auto_Position: 0
  • 看到Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes,两个 yes 说明主从同步基本没有问题了。
  • 确认主从是否同步到相同内容,通过:

    • Master_Log_File: mysql-bin.000063 和 Relay_Master_Log_File: mysql-bin.000063 说明主从都已经同步到相同的 binlog 日志了。
  • 如果上面两个参数一样了,还需要比较 Read_Master_Log_Pos 和 Exec_Master_Log_Pos 两个参数。看有没有差异,如果没有差异则说明主从同步的情况比较好。

在主库也可以看看主从同步的状态:

msyql> show processlist;
(0)

相关推荐

  • 基于Docker实现MySQL主从复制

    前言 MySQL的主从复制是实现应用的高性能,高可用的基础.对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同MySQL服务器,可有效减轻数据库压力.当遇到MySQL单点故障中,也能在短 ...

  • MySQL主从配置

    MySQL主从配置 MySQL主从又叫做Replication.AB复制,两台机器做主从配置之后,数据实时同步 主从配置大致步骤 ①主将更改操作记录到binlog里 ②从将主的binlog事件(sql ...

  • mysql5.7搭建主从库

    #MYSQL单节点的mysql远远不能满于生成,以防止生产服务器宕机,磁盘空间溢满等种种原因,需要有一个备用数据库, 这时候主从库是不错的选择,在是数据库集群中也起到了很大的作用 #MySQL 主从复 ...

  • 面试被问MySQL 主从复制,怎么破?

    一.前言 随着应用业务数据不断的增大,应用的响应速度不断下降,在检测过程中我们不难发现大多数的请求都是查询操作. 此时,我们可以将数据库扩展成主从复制模式,将读操作和写操作分离开来,多台数据库分摊请求 ...

  • MySQL在线DDL gh

    背景: 作为一个DBA,大表的DDL的变更大部分都是使用Percona的pt-online-schema-change,本文说明下另一种工具gh-ost的使用:不依赖于触发器,是因为他是通过模拟从库, ...

  • “新潮模式”重构社区营销所有线上品牌都值得在线下社区重做一遍

    踩在移动互联网的尾巴上,我们已经看见了知乎的崛起.小红书的繁荣.短视频直播带货的火爆--最近火起来的是"社区".互联网大佬们磨刀霍霍,都准备大干一场. 盒马试水社区团购:滴滴&qu ...

  • mysql进阶学习二之搭建主从

    前面说了主从复制的原理,现在我们搭建主从结构 1. 提前准备 我准备了两台主机,主节点是远程的centos7,从节点是本机windows 主从复制的原理在上一篇已经说了:主节点中mysql创建一个用户 ...

  • MySQL主从仅同步指定库

    有两种方式 1.在主库上指定主库二进制日志记录的库或忽略的库: vim /etc/my.cnf ... binlog-do-db=xxxx 二进制日志记录的数据库 binlog-ignore-db=x ...

  • “新潮模式”重构社区营销,所有线上品牌都值得在线下社区里重做一遍

    踩在移动互联网的尾巴上,我们已经看见了知乎的崛起.小红书的繁荣.短视频直播带货的火爆--最近火起来的是"社区".互联网大佬们磨刀霍霍,都准备大干一场. 盒马试水社区团购:滴滴&qu ...

  • mysql主从同步方式,附高频面试题合集

    前言2021春季社招正在火热招聘当中,很多人都挂在了技术知识掌握还是不够广,不够深,甚至连一些基础的问题都只能模模糊糊的回答出来.你说,这跳槽不是跳了个寂寞吗?其实,根本原因还是对于自己的技术栈掌握的 ...

  • mysql面试题:如何实现 MySQL 的读写分离?MySQL 主从复制原理是啥?如何解决 MySQL 主从同步的延时问题?

    面试题 你有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题? 考点分析 高并发这个阶段,肯定是需要做读写分离的 ...

  • Linux搭建MySQL主从

    实现目标 搭建两台MySQL服务器(一主一从),一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作. 工作流程概述 主服务器: 开启二进制日志 配置唯一的server-id 获 ...