MySQL复制方法
MySQL的二进制日志,MySQL复制原理,MySQL主从模式搭建,MySQL双主模式搭建,MySQL级联模式搭建,MySQL半同步模式复制
一、二进制日志
1、概念
MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句。二进制日志(binary log)中记录了对MySQL数据库执行更改的所有操作,并且记录了语句发生时间、执行时长、操作数据等其它额外信息,但是它不记录SELECT、SHOW等那些不修改数据的SQL语句。二进制日志(binary log)主要用于数据库恢复和主从复制,以及审计(audit)操作。
2、二进制日志特点
1、记录导致数据改变或潜在导致数据改变的SQL语句
2、记录已提交的日志
3、不依赖于存储引擎类型
4、可通过“重放”日志文件中的事件来生成数据副本
3、二进制日志相关的服务器变量
默认服务器变量配置文件为/etc/my.cnf,可以在此文件中设置相关变量的值
(1)、sql_log_bin=ON|OFF:是否记录二进制日志,默认ON,所以不需要设置,可以在mysql运行的过程中通过修改变量参数来临时关闭记录二进制日志
mysql> set sql_log_bin=off
(2)、log_bin=/PATH/BIN_LOG_FILE:指定文件位置;默认OFF。要想开启服务器的二进制日志功能必须设置此项,有两种设置方式
log_bin
不指定文件的位置,会默认二进制日志默认放在mysql的datadir目录中(不推荐)
log_bin=/data/mysql/logs/log_bin
指定文件的位置,生成的二进制文件就会在/data/mysql/logs/目录中,二进制文件名为log_bin.000001, log_bin.000002以此类推。数据库每次一重启服务,就会生成一个新的二进制文件,编号以此类推
(3)、max_binlog_size=1073741824:单个二进制日志文件的最大体积(单位:字节),到达最大值会自动滚动,默认为1G
(4)、binlog_format=STATEMENT|ROW|MIXED:二进制日志记录的格式,默认STATEMENT。建议设置为ROW,这样删除数据的时候不记录删除语句,而是删除的行每条都记录
4、二进制管理的语句
(1)、查看mariadb自行管理使用中的二进制日志文件列表,及大小,所有二进制日志
SHOW MASTER LOGS 或者 SHOW BINARY LOGS
(2)、查看使用中的二进制日志文件,当前正在使用的二进制日志
SHOW MASTER STATUS
(3)、查看二进制文件中的指定内容
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
示例:SHOW BINLOG EVENTS IN 'mariadb.000002' FROM 6516 LIMIT 2,3
(4)、清除指定二进制日志
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
示例:
PURGE BINARY LOGS TO ‘mariadb-bin.000003’; #不包括该文件
PURGE BINARY LOGS BEFORE '2017-01-23';
PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30';
(5)、删除所有二进制日志,index文件重新记数,慎重操作
RESET MASTER
(6)、切换日志文件:会生成新的二进制文件
FLUSH LOGS;
5、mysqlbinlog命令用法
mysqlbinlog二进制日志的客户端命令工具
mysqlbinlog [OPTIONS] log_file…
--start-position= # 指定开始位置
--stop-position= # 指定结束位置
--start-datetime=
--stop-datetime=
命令用法示例
# mysqlbinlog --start-position=6787 --stop-position=7527 /var/lib/mysql/mariadb-bin.000003 -v
# mysqlbinlog --start-datetime="2018-01-30 20:30:10" --stop-datetime="2018-01-30 20:35:22" mariadb-bin.000003 -vvv
二、MySQL复制原理

主节点Master:
1、dump 线程:当从节点通过I/O线程连接主节点时,主节点会创建一个dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对bin-log加锁,当读取完成,锁会被释放。
从节点Slave:
1、I/O 线程:当从节点上执行`start slave`命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地中继日志relay-log中。
2、SQL线程:从中继日志中读取日志事件,在本地完成重放
对于每一个主从连接,都需要三个进程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个binary log dump 进程,而每个从节点都有自己的I/O进程,SQL进程。从节点用两个线程将从主库拉取更新和执行分成独立的任务,这样在执行同步数据任务的时候,不会降低读操作的性能。比如,如果从节点没有运行,此时I/O进程可以很快从主节点获取更新,尽管SQL进程还没有执行。如果在SQL进程执行之前从节点服务停止,至少I/O进程已经从主节点拉取到了最新的变更并且保存在本地relay日志中,当服务再次起来之后,就可以完成数据的同步。
三、主从同步方法
1、从0搭建主从模式
适用于项目未开始时,数据库刚刚安装完毕,没有任何数据情况。
假设A服务器(192.168.1.100)为主数据库,B服务器(192.168.1.200)为从数据库
主节点A配置:
1、编辑mysql的配置文件/etc/my.cnf
[mysqld]
# 打开2进制日志选项
log_bin
# 配置server_id,要求主从必须不一样,可以采用ip地址的尾号形式
server_id=100
、登录mysql数据库,创建同步账号
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY ''; 、查看二进制日志的位置节点
mysql > SHOW MASTER STATUS
-> ;
+--------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------+----------+--------------+------------------+
| mysql.000002 | 402 | | |
+--------------+----------+--------------+------------------+
从节点B配置:
1、编辑mysql的配置文件/etc/my.cnf
[mysqld]
# 配置server_id,要求主从必须不一样,可以采用ip地址的尾号形式
server_id= 、配置同步属性
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.1.200',
MASTER_USER='repluser',
MASTER_PASSWORD='',
MASTER_PORT=,
MASTER_LOG_FILE='mysql.000001',
MASTER_LOG_POS=; 、打开同步进程
mysql> START SLAVE 、查看同步状态
mysql> SHOW SLAVE STATUS
2、数据库A上已有数据
此模式更为普遍,通常是原业务中已有单台数据库服务器,业务需要进行主从同步
假设A服务器(192.168.1.100)为主数据库,B服务器(192.168.1.200)为从数据库
主节点A配置:
1、编辑mysql的配置文件/etc/my.cnf
[mysqld]
# 打开2进制日志选项
log_bin
# 配置server_id,要求主从必须不一样,可以采用ip地址的尾号形式
server_id=100
、登录mysql数据库,创建同步账号
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY '123456';
3、通过mysqldump导出数据库
# mysqldump –uroot -A -F -E -R -x --master-data= --flush-privileges --triggers --default-character-set=utf8 --hex-blob >/tmp/backup.sql 4、将备份的数据库拷贝到B主机上
# scp /tmp/backup.sql 192.168.1.200:/tmp
从节点B配置:
1、编辑mysql的配置文件/etc/my.cnf
[mysqld]
#配置server_id,要求主从必须不一样,可以采用ip地址的尾号形式
server_id= 、启动B主机的数据库
# systemctl start mariadb 、导入已备份的数据库
# mysql < /tmp/backup.sql 4、查看备份到的位置
less /tmp/backup.sql
。。。。省略。。。。
CHANGE MASTER TO MASTER_LOG_FILE='mysql.000003', MASTER_LOG_POS=;
。。。。省略。。。。 、配置同步属性
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.1.200',
MASTER_USER='repluser',
MASTER_PASSWORD='',
MASTER_PORT=,
MASTER_LOG_FILE='mysql.000003',
MASTER_LOG_POS=;
、打开同步进程
mysql> START SLAVE
四、双主同步方法
建议从0开始配置
假设A服务器(192.168.1.100)为主数据库,B服务器(192.168.1.200)为第二主数据库
主节点A配置:
1、编辑mysql的配置文件/etc/my.cnf
[mysqld]
#打开2进制日志选项
log_bin
#配置server_id,要求主从必须不一样,可以采用ip地址的尾号形式
server_id=
# 配置自增ID的起始点,和增长幅度
auto_increment_offset=
auto_increment_increment= 、登录mysql数据库,创建同步账号
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY ''; 、查看数据库当前二进制位置,给B使用的
mysql > SHOW MASTER STATUS;
+--------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------+----------+--------------+------------------+
| mysql.000001 | | | |
+--------------+----------+--------------+------------------+ 、配置同步属性
注意:此处的日志位置是B通过SHOW MASTER STATUS查看到的日志位置
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.1.200',
MASTER_USER='repluser',
MASTER_PASSWORD='',
MASTER_PORT=,
MASTER_LOG_FILE='mysql.000001',
MASTER_LOG_POS=;
、打开同步进程
mysql> START SLAVE
另一主节点B配置:
1、编辑mysql的配置文件/etc/my.cnf
[mysqld]
#打开2进制日志选项
log_bin
#配置server_id,要求主从必须不一样,可以采用ip地址的尾号形式
server_id=
# 配置自增ID的起始点,和增长幅度
auto_increment_offset=
auto_increment_increment= 、登录mysql数据库,创建同步账号
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY ''; 、查看数据库当前二进制位置,给A使用的
mysql > SHOW MASTER STATUS;
+--------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------+----------+--------------+------------------+
| mysql.000001 | 407 | | |
+--------------+----------+--------------+------------------+ 、配置同步属性
注意:此处的日志位置是A通过SHOW MASTER STATUS查看到的日志位置
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repluser',
MASTER_PASSWORD='',
MASTER_PORT=,
MASTER_LOG_FILE='mysql.000001',
MASTER_LOG_POS=;
、打开同步进程
mysql> START SLAVE
5、级联复制方法
级联复制是将主库的数据同步到级联库,然后级联库把自己的数据同步到从库上,这样可以减少主库的压力

主库配置:
、修改主库配置文件
# vim /etc/my.cnf
server-id=
log-bin 、创建复制的用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY ''; 、将主库的数据进行全备份
# mysqldump -A --single-transaction --master-data= -F > /data/all.sql 、把备份数据拷贝到从库
# scp /data/all.sql 192.168.1.200:/data
级联库配置:
、修改配置文件
# vim /etc/my.cnf
server-id=200
log-bin
# 将中继日志同步到二进制日志中↓
log_slave_updates
、修改主库的的全备份文件,在文件的首页
把 CHANGE MASTER TO MASTER_LOG_FILE='***', MASTER_LOG_POS=***;语句修改为如下。注意***的地方数据不变 # vim /data/all.sql
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repluser',
MASTER_PASSWORD='',
MASTER_PORT=3306,
MASTER_LOG_FILE='***', MASTER_LOG_POS=***; 、导入数据库
mysql > source /date/all.sql 、刷新权限
mysql> FLUSH PRIVELEGES; 、开启同步
mysql> start slave; 6、级联库数据进行全备份
mysqldump -A --single-transaction --master-data=1 -F > /data/all.sql 7、级联库数据拷贝到从库1,和从库2
scp /data/all.sql 192.168.1.201:/data
scp /data/all.sql 192.168.1.202:/data
从库1配置:
、修改配置文件
# vim /etc/my.cnf
server-id= 、修改级联库的全备份文件,在文件的首页
把 CHANGE MASTER TO MASTER_LOG_FILE='***', MASTER_LOG_POS=***;语句修改为如下。注意***的地方数据不变 # vim /data/all.sql
CHANGE MASTER TO
MASTER_HOST='192.168.1.200',
MASTER_USER='repluser',
MASTER_PASSWORD='',
MASTER_PORT=3306,
MASTER_LOG_FILE='***', MASTER_LOG_POS=***; 、导入数据库
mysql > source /date/all.sql 、刷新权限
mysql> FLUSH PRIVELEGES; 、开启同步
mysql> start slave;
从库2配置与从库1类似
6、半同步复制
默认情况下,MySQL的复制功能是异步的,异步复制可以提供最佳的性能,主库把binlog日志发送给从库即结束,并不验证从库是否接收完毕。这意味着当主库或从库发生故障时,有可能从库没有接收到主库发送过来的binlog日志,这就会造成主库和从库的数据不一致,甚至在恢复时造成数据的丢失。
在开启了半同步复制机制后,主库只有当有任意一台从库已经接收到主库的数据后,告诉主库。主库收到从库同步成功的信息后,才继续后面的操作。
主库配置:
主数据库A(192.168.1.100),从数据库B(192.168.1.201),从数据库B(192.168.1.202)
、修改配置文件
# vim /etc/my.cnf
[mysqld]
server-id=100
log-bin 、创建同步用户账户
mysql>grant replication slave on *.* to repluser@'192.168.1.%' identified by '123456'; 、主库全备份,并将备份数据传送给从库
# mysqldump -A --single-transaction --master-data=1 -F > /data/all.sql
# scp /data/all.sql 192.168.1.201:/tmp 、主库安装半同步模块,并开启该功能
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql>set global rpl_semi_sync_master_enabled=on;
可以放到服务器启动参数里
# vim /etc/my.cnf
rpl_semi_sync_master_enabled=1
5、半同步状态查询参考命令
mysql>SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql>SHOW GLOBAL STATUS LIKE '%semi%';
从库B配置:
、修改配置文件
# vim /etc/my.cnf
[mysqld]
server-id= 2、修改主库的的全备份文件,在文件的首页
把 CHANGE MASTER TO MASTER_LOG_FILE='***', MASTER_LOG_POS=***;语句修改为如下。注意***的地方数据不变 # vim /data/all.sql
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repluser',
MASTER_PASSWORD='',
MASTER_PORT=3306,
MASTER_LOG_FILE='***', MASTER_LOG_POS=***; 、导入数据库
mysql > source /date/all.sql 、刷新权限
mysql> FLUSH PRIVELEGES; 、从库安装半同步模块(与主库模块不同,注意)
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql>SET GLOBAL rpl_semi_sync_slave_enabled=;
可以放到服务器启动参数里
# vim /etc/my.cnf
rpl_semi_sync_slave_enabled=1 6、开启主从同步
mysql>start slave;
从库C配置类似
MySQL复制方法的更多相关文章
- mysql 数据库复制方法
同一台MySQL服务器上复制数据库的方法 CREATE DATABASE `新库` DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI; mysqld ...
- [MySQL Reference Manual] 18 复制
18 复制 18 复制 18.1 复制配置 18.1.1 基于Binary Log的数据库复制配置 18.1.2 配置基于Binary log的复制 18.1.2.1 设置复制master的配置 18 ...
- MySQL 复制表结构
200 ? "200px" : this.width)!important;} --> 介绍 有时候我们需要原封不动的复制一张表的表结构来生成一张新表,MYSQL提供了两种便 ...
- mysql basic operation,mysql总结
mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...
- mysql表修改
CREATE TABLE tab2 AS (SELECT * FROM tab1)这种做法表的存储引擎也会采用服务器默认的存储引擎而不是源表的存储引擎,此种复制方法把表的内容也一起复制过来了. CRE ...
- 关于mysql主从复制的概述与分类(转)
一.概述: 按照MySQL的同步复制特点,大体上可以分为三种类别: 1.异步复制: 2.半同步复制: 3.完全同步的复制: -------------------------------------- ...
- MySQL Replication 主从复制全方位解决方案
1.1 主从复制基础概念 在了解主从复制之前必须要了解的就是数据库的二进制日志(binlog),主从复制架构大多基于二进制日志进行,二进制日志相关信息参考:http://www.cnblogs.com ...
- mysql 架构篇系列 1 复制原理和复制架构
一. 复制概述 mysql 从3.23版本开始提供复制功能,复制是指将主数据库的ddl和dml操作通过二进制日志传到复制服务器(也叫从服务器)上,然后在从服务器上对这些日志重新执行(也叫重做),从而使 ...
- mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)
一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...
随机推荐
- Python记:通用的序列操作之成员资格(听起来倒是有些抽象的!)
______________________________永远守护这一尘不染的真心! 要检查特定的值是否包含在序列中,可使用运算符in.它检查是否满足指定的条件,并返回相应的值:满足时返回True, ...
- Codeforces 1207C Gas Pipeline (dp)
题目链接:http://codeforces.com/problemset/problem/1207/C 题目大意是给一条道路修管道,相隔一个单位的管道有两个柱子支撑,管道柱子高度可以是1可以是2,道 ...
- web开发中 前端模板->JavaScript->Controller->JavaScript相应 的交互方式
首先画张图了解当下流行的phpweb 数据交互套路: 1,模板与JavaScript的交互 给HTML标签赋予onlick事件,点击后触发js方法,jQuery收集页面信息,分析信息. 2,js与co ...
- 【StarUML】用例图
用例图是在项目初期确认需求的时候,需要明确各个参与者之间的关系以及对应的功能,它可视化地展示了整个系统的功能以及功能之间.功能与参与者之间的关系. 1.元素 1.1 角色(actor) 角色不一定是人 ...
- ASA升级
1.开启TFTP server,并且保证设备和TFTP server可达.2.上传镜像文件到ASA:ciscoasa# copy tftp: disk0: >>>>拷贝镜像到A ...
- [lua]紫猫lua教程-命令宝典-L1-01-01. Lua环境与IDE
网上大把的lua教程 不过紫猫老师的教程向来都是讲的非常仔细 所以最近天气已经36+了 魔兽世界还需要冲飞行声望 懒得写单子根本没有单子,正好认认真真的看下紫猫老师的lua教程 紫猫老师的lua教 ...
- queue的使用-Hdu 1702
ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- 前端一面/面试常考题1-页面布局:假设高度已知,请写出三栏布局,其中左栏、右栏宽度各为300px,中间自适应。
题目:假设高度已知,请写出三栏布局,其中左栏.右栏宽度各为300px,中间自适应. [题外话:日常宣读我的目标===想要成为一名优雅的程序媛] 一.分析 1. 题目真的像我们想得这么简单吗? 其实不然 ...
- 以C语言为例完成简单的网络聊天程序以及关于socket在Linux下系统调用的分析
套接字是网络编程中的一种通信机制,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程. 端 ...
- 源头质量 PageHelper(分页),导出功能
今天星期五,本来想直接关电脑走人的,但想想自己弄出来的,写写留个记忆吧.两个功能 导出 和 Mybatis的插件 PageHelper 分页 一,导出功能代码实现:这里是需要jar包的啊 <!- ...