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;
Mysql 在线新建或重做主从的更多相关文章
- 在线建立或重做mysql主从复制架构方法(传统模式和GTID模式)【转】
mysql主从复制架构,是mysql数据库主要特色之一,绝大多数公司都有用到. 而GTID模式是基于事务的复制模式的意思,发展到现在也是越来越多人用. 以前很多文章,介绍搭建mysql主从复制架构,是 ...
- mysql之使用xtrabackup进行物理备份、恢复、在线克隆从库、在线重做主从
注:图片来自<深入浅出MySQL 数据库开发 优化与管理维护 第2版> 物理备份和恢复 1.冷备份:停掉mysql再备份,一般很少用,因为很多应用不允许长时间停机,停机备份的可以直接CP数 ...
- xtrabackup进行物理备份、恢复、在线克隆从库、在线重做主从
http://www.lai18.com/content/4733997.html 注:图片来自<深入浅出MySQL 数据库开发 优化与管理维护 第2版> 物理备份和恢复 1.冷备份:停掉 ...
- MySQL在线DDL工具 gh-ost
一.简介 gh-ost基于 golang 语言,是 github 开源的一个 DDL 工具,是 GitHub's Online Schema Transmogrifier/Transfigurator ...
- MySQL 在线更改 Schema 工具
MySQL在线更改schema的工具很多,如Percona的pt-online-schema-change. Facebook的 OSC 和 LHM 等,但这些都是基于触发器(Trigger)的,今天 ...
- MySQL在线DDL gh-ost 使用说明
背景: 作为一个DBA,大表的DDL的变更大部分都是使用Percona的pt-online-schema-change,本文说明下另一种工具gh-ost的使用:不依赖于触发器,是因为他是通过模拟从库, ...
- GitHub 开源的 MySQL 在线更改 Schema 工具【转】
本文来自:https://segmentfault.com/a/1190000006158503 原文:gh-ost: GitHub's online schema migration tool fo ...
- MySQL 在线开启&关闭GTID模式
MySQL 在线开启&关闭GTID模式 目录 MySQL 在线开启&关闭GTID模式 基本概述 在线开启GTID 1. 设置GTID校验ENFORCE_GTID_CONSISTENCY ...
- mysql通过mysqldunp命令重做从库详细操作步骤
mysql通过mysqldunp命令重做从库详细操作步骤 背景 生产环境上的主从复制集群,因为一些异常或人为原因,在从库做了一些操作,导致主从同步失败.一般修复起来比较麻烦,通过重做mysql从库的方 ...
随机推荐
- 小白学 Python 爬虫(42):春节去哪里玩(系列终篇)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- NTT - 牛客
链接:https://www.nowcoder.com/acm/contest/133/D来源:牛客网 题目描述 Applese打开了m个QQ群,向群友们发出了组队的邀请.作为网红选手,Applese ...
- dfs序 + 树状数组
You are given a tree, it’s root is p, and the node is numbered from 1 to n. Now define f(i) as the n ...
- 前端之css的基本使用(一),行内、内部、外部样式,语法格式、注释、选择符、属性等
一.行内.内部.外部样式 1.行内样式 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- HBase二次开发之搭建HBase调试环境,如何远程debug HBase源代码
版本 HDP:3.0.1.0 HBase:2.0.0 一.前言 之前的文章也提到过,最近工作中需要对HBase进行二次开发(参照HBase的AES加密方法,为HBase增加SMS4数据加密类型).研究 ...
- 异步查询转同步加redis业务实现的BUG分享
在最近的性能测试中,某一个查询接口指标不通过,开发做了N次优化,最终的优化方案如下:异步查询然后转同步,再加上redis缓存.此为背景. 在测试过程中发现一个BUG:同样的请求在第一次查询结果是OK的 ...
- java"小心机"(1)【资源彩蛋!】
每天进步一点点,距离大腿又近一步! 阅读本文大概需要9分钟 java"小心机"系列文章在此开篇.在这,将会给你带来曾经错过.忽略或感到模糊的知识,也许它很基础,微不足道,但它能修复 ...
- 9、python判断语句与循环语句
前言:本文主要介绍python判断语句与循环语句,包括if语句.while循环.for循环.range函数. 一.if语句 关键字:if.elif.else,写法如下: # if if 条件: # ...
- NOde.js的安装和简介
1.nodejs的安装 1.1 检测nodejs的版本 node -v (version:版本) 1.2 path配置nodejs 的环境变量(当前版本都是自动安装配置环境变量)指令: path 1. ...
- 爬虫之协程,selenium
1.什么是代理?代理和爬虫之间的关联是什么? 2.在requests的get和post方法常用的参数有哪些?分别有什么作用?(四个参数) - url headers parmas/data proxi ...