mysql 复制方式_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复制原理

b32a823f7dd480316771da8858d50c28.png

主节点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

2、登录mysql数据库,创建同步账号

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY '123456';3、查看二进制日志的位置节点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=200

2、配置同步属性

mysql>CHANGE MASTER TO

MASTER_HOST='192.168.1.200',

MASTER_USER='repluser',

MASTER_PASSWORD='123456',

MASTER_PORT=3306,

MASTER_LOG_FILE='mysql.000001',

MASTER_LOG_POS=402;3、打开同步进程

mysql>START SLAVE4、查看同步状态

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

2、登录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=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >/tmp/backup.sql4、将备份的数据库拷贝到B主机上# scp /tmp/backup.sql 192.168.1.200:/tmp

从节点B配置:

1、编辑mysql的配置文件/etc/my.cnf

[mysqld]

#配置server_id,要求主从必须不一样,可以采用ip地址的尾号形式

server_id=200

2、启动B主机的数据库

# systemctl start mariadb3、导入已备份的数据库

# mysql< /tmp/backup.sql4、查看备份到的位置less /tmp/backup.sql

。。。。省略。。。。

CHANGE MASTER TO MASTER_LOG_FILE='mysql.000003', MASTER_LOG_POS=245;

。。。。省略。。。。5、配置同步属性

mysql>CHANGE MASTER TO

MASTER_HOST='192.168.1.200',

MASTER_USER='repluser',

MASTER_PASSWORD='123456',

MASTER_PORT=3306,

MASTER_LOG_FILE='mysql.000003',

MASTER_LOG_POS=245;6、打开同步进程

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=100# 配置自增ID的起始点,和增长幅度

auto_increment_offset=1auto_increment_increment=2

2、登录mysql数据库,创建同步账号

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY '123456';3、查看数据库当前二进制位置,给B使用的

mysql>SHOW MASTER STATUS;+--------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+--------------+----------+--------------+------------------+

|mysql.000001| 407 | | |

+--------------+----------+--------------+------------------+

4、配置同步属性

注意:此处的日志位置是B通过SHOW MASTER STATUS查看到的日志位置

mysql>CHANGE MASTER TO

MASTER_HOST='192.168.1.200',

MASTER_USER='repluser',

MASTER_PASSWORD='123456',

MASTER_PORT=3306,

MASTER_LOG_FILE='mysql.000001',

MASTER_LOG_POS=407;5、打开同步进程

mysql> START SLAVE

另一主节点B配置:

1、编辑mysql的配置文件/etc/my.cnf

[mysqld]

#打开2进制日志选项

log_bin

#配置server_id,要求主从必须不一样,可以采用ip地址的尾号形式

server_id=200# 配置自增ID的起始点,和增长幅度

auto_increment_offset=2auto_increment_increment=2

2、登录mysql数据库,创建同步账号

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY '123456';3、查看数据库当前二进制位置,给A使用的

mysql>SHOW MASTER STATUS;+--------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+--------------+----------+--------------+------------------+

| mysql.000001 | 407 | | |

+--------------+----------+--------------+------------------+

4、配置同步属性

注意:此处的日志位置是A通过SHOW MASTER STATUS查看到的日志位置

mysql>CHANGE MASTER TO

MASTER_HOST='192.168.1.100',

MASTER_USER='repluser',

MASTER_PASSWORD='123456',

MASTER_PORT=3306,

MASTER_LOG_FILE='mysql.000001',

MASTER_LOG_POS=407;5、打开同步进程

mysql> START SLAVE

5、级联复制方法

级联复制是将主库的数据同步到级联库,然后级联库把自己的数据同步到从库上,这样可以减少主库的压力

a3dec6d59915ff7e52782e57d206c6c9.png

主库配置:

1、修改主库配置文件

# vim/etc/my.cnf

server-id=100log-bin2、创建复制的用户

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY '123456';3、将主库的数据进行全备份

# mysqldump-A --single-transaction --master-data=1 -F > /data/all.sql4、把备份数据拷贝到从库

#scp /data/all.sql 192.168.1.200:/data

级联库配置:

1、修改配置文件

# vim/etc/my.cnfserver-id=200

log-bin

# 将中继日志同步到二进制日志中↓

log_slave_updates

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='123456',MASTER_PORT=3306,

MASTER_LOG_FILE='***', MASTER_LOG_POS=***;3、导入数据库

mysql> source /date/all.sql4、刷新权限

mysql>FLUSH PRIVELEGES;5、开启同步

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配置:

1、修改配置文件

# vim/etc/my.cnf

server-id=201

2、修改级联库的全备份文件,在文件的首页

把 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='123456',MASTER_PORT=3306,

MASTER_LOG_FILE='***', MASTER_LOG_POS=***;3、导入数据库

mysql> source /date/all.sql4、刷新权限

mysql>FLUSH PRIVELEGES;5、开启同步

mysql> start slave;

从库2配置与从库1类似

6、半同步复制

默认情况下,MySQL的复制功能是异步的,异步复制可以提供最佳的性能,主库把binlog日志发送给从库即结束,并不验证从库是否接收完毕。这意味着当主库或从库发生故障时,有可能从库没有接收到主库发送过来的binlog日志,这就会造成主库和从库的数据不一致,甚至在恢复时造成数据的丢失。

在开启了半同步复制机制后,主库只有当有任意一台从库已经接收到主库的数据后,告诉主库。主库收到从库同步成功的信息后,才继续后面的操作。

主库配置:

主数据库A(192.168.1.100),从数据库B(192.168.1.201),从数据库B(192.168.1.202)

1、修改配置文件# vim /etc/my.cnf

[mysqld]

server-id=100

log-bin

2、创建同步用户账户mysql>grant replication slave on *.* to repluser@'192.168.1.%' identified by '123456';

3、主库全备份,并将备份数据传送给从库# mysqldump -A --single-transaction --master-data=1 -F > /data/all.sql

# scp /data/all.sql 192.168.1.201:/tmp

4、主库安装半同步模块,并开启该功能

mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

mysql>set global rpl_semi_sync_master_enabled=on;

可以放到服务器启动参数里

# vim /etc/my.cnfrpl_semi_sync_master_enabled=1

5、半同步状态查询参考命令

mysql>SHOW GLOBAL VARIABLES LIKE '%semi%';

mysql>SHOW GLOBAL STATUS LIKE '%semi%';

从库B配置:

1、修改配置文件

# vim/etc/my.cnf

[mysqld]

server-id=201

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='123456',MASTER_PORT=3306,

MASTER_LOG_FILE='***', MASTER_LOG_POS=***;3、导入数据库

mysql> source /date/all.sql4、刷新权限

mysql>FLUSH PRIVELEGES;5、从库安装半同步模块(与主库模块不同,注意)

mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

mysql>SET GLOBAL rpl_semi_sync_slave_enabled=1;

可以放到服务器启动参数里

# vim/etc/my.cnf

rpl_semi_sync_slave_enabled=1

6、开启主从同步

mysql>start slave;

从库C配置类似

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 主键唯一,MySQL。关键表中的主键。唯一ID还是多个唯一键?

Primary key in relational tables. Composite primary key or unique primary key in those pure relational tables?Which design would you recommend to use in MySQL for high performance? See diagramTechnical advantages and disadvantages!Thanks everyone!解决方案…

mysql以user1登录_在mysql中创建用户后不能本地登录的解决方法

在安装完成MySQL后&#xff0c;我们通常添加拥有相应权限的普通用户用来访问数据库。在使用用户本地登录数据库的时候&#xff0c;经常会出现怎么登录也无法登录的情况,但是从其他的mysql客户端却可以登录。[rootmysql01 ~]# mysql -userver -p123456ERROR 1045 (28000): Acces…

mysql内部时区_一文解决MySQL时区相关问题

前言&#xff1a;在使用MySQL的过程中&#xff0c;你可能会遇到时区相关问题&#xff0c;比如说时间显示错误、时区不是东八区、程序取得的时间和数据库存储的时间不一致等等问题。其实&#xff0c;这些问题都与数据库时区设置有关&#xff0c;本篇文章将从数据库参数入手&…

制作 mysql的rpm文件_自制mysql.rpm安装包

RPM安装比源码更快更方便&#xff0c;更利于统一版本&#xff0c;省去了繁琐的编译过程&#xff0c;下面以制作mysql的rpm安装包为例。编译环境1、 安装rpm-build&#xff1b;检查是否配置rpm环境1 # sudo yum list | greprpm2 This system is not registered with RHN.3 RHN s…

mysql远程授权格式_MySQL远程访问授权

开启 MySQL 的远程登陆帐号有两大步&#xff1a;1、确定服务器上的防火墙没有阻止 3306 端口。MySQL 默认的端口是 3306 &#xff0c;需要确定防火墙没有阻止 3306 端口&#xff0c;否则远程是无法通过 3306 端口连接到 MySQL 的。如果您在安装 MySQL 时指定了其他端口&#xf…

mysql multi主从复制_mysqld_multi方式配置Mysql数据库主从复制

mysqld_multi设计用于管理在同一台机器上运行的多个mysqld进程&#xff0c;这些进程使用不同的socket文件并监听在不同的端口上。mysqld_multi可以批量启动、关闭、或者报告这些mysqld进程的状态。在这里我们通过这种方式来在同一个机器上启动多个数据库实例&#xff0c;并配置…

mysql 日志节点恢复_基于binlog二进制日志的MySQL恢复笔记

基于binlog二进制日志的MySQL恢复笔记刚好复习到这里&#xff0c;顺手做个小实验&#xff0c;记录下。总的操作流程&#xff1a;step0、关掉数据库的对外访问【防止用户操作继续写入这个库】step1、mysqlbinlog 导出相关时间段数据库的二进制日志step2、编辑today.sql找到误操作…

mysql中if在oracle怎么用_mysql和oracle的mybatis操作

1.Oracle、MySQL插入时返回下一个主键的操作Xml代码 Oracle&#xff1a;SELECT SEQ_ROLE.NEXTVAL AS ID FROM DUALinsert into ROLE(ID, NAME, CREATE, MODIFY) values (#{id}, #{name}, sysdate, sysdate)注意&#xff1a;这边的keyProperty"id"中"id"指的…

mysql数据库的三级模式_2016年计算机三级MySQL数据库试题

2016年计算机三级MySQL数据库试题一、选择题1.E-R图提供了表示信息世界中实体、属性和________的方法。A.数据B.联系C.表D.模式2.数据库系统的核心是________。A.数据模型B.数据库管理系统C.数据库D.数据库管理员3.E-R图是数据库设计的工具之一&#xff0c;它一般适用于建立数据…

python对角线图_python对角线图_python – 在Seaborn Jointplot上绘制对角线(相等的线)...

错误是一个有用的暗示&#xff1a;JointPlot是子图的集合,你必须找到特定的斧头来绘制.修改Seaborn示例&#xff1a;import numpy as npimport pandas as pdimport seaborn as snsfrom matplotlib.pyplot import showsns.set(style"white")# Generate a random corre…

python编程求极限_Sympy笔记一

from IPython.display import displayfrom sympy import *前置知识理解这份笔记的内容需&#xff0c;读者需要具备基础的python知识并且对函数&#xff0c;微积分和矩阵有一定的基础。辅助函数由于后面的笔记中&#xff0c; 我们会大量将一个Sympy object和应用某个函数之后&am…

python语言逆序符号_python的逆序

下面的代码片段可以帮助您完成最后一个任务。如果在字符串的开始或结尾之外的其他地方发现了特殊字符&#xff0c;则对于子集的恢复没有特殊处理。在# Special chars which should be ignored for revertingSPECIALCHARS [ , ., ,]def reverse( string_ ):# Find occurence of…

wpf mysql存储过程_MySQL存储过程的创建及调用

# SQL语句&#xff1a;先编译后执行存储过程(Stored Procedure)&#xff1a;一组可编程的函数&#xff0c;是为了完成特定功能的SQL语句集&#xff0c;经编译创建并保存在数据库中&#xff0c;用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。优点(为什么要用存储过…

mysql没加引号导致全表扫描_mysql隐蔽的索引规则导致数据全表扫描

索引是为了加速数据的检索&#xff0c;但是不合理的表结构或适应不当则会起到反作用。我们在项目中就遇到过类似的问题&#xff0c;两个十万级别的数据表&#xff0c;在做连接查询的时候&#xff0c;查询时间达到了7000多秒还没有查出结果。首先说明&#xff0c;关联的字段都已…

python123测验7程序题答案_Python语言程序设计 Python123 测验7: 文件和数据格式化(编程题)...

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循CC 4.0 by-sa版权协议&#xff0c;转载请附上原文出处链接和本声明。本文链接&#xff1a;https://blog.csdn.net/weixin_42067082/article/details/97661863文本的平均列数描述&#xff1a;打印输出附件文件的平均列数…

mysql 多个密码登录_mysql 多实例登录密码测试

最近在做mysql 多实例的时候&#xff0c;采用不同的方式登录mysql数据库&#xff0c;发现mysql -uroot -p -h 127.0.0.1 -P3308 &#xff0c;登录时居然不要密码就可以登录&#xff0c;吓得我一身汗&#xff0c;经过检查终于找到原因记录下来&#xff0c;给小白们参考。[rootmy…

设置MySQL排序方式_设置MySQL设置字符集和排序方式

1. 编辑/etc/my.cnf文件, 在"[client]"下添加"default-character-setutf8"2. 编辑/etc/my.cnf文件, 在"[mysqld]"下添加"default-character-setutf8"3. 重新启动mysql服务# sudo /etc/init.d/mysqld restart* 查看系统字符集和排序方式…

redhat5.4 安装mysql_Linux redhat 5.4上安装MYDNS

Linux redhat 5.4上安装MYDNS一、1&#xff0c;MYDNS 的简介&#xff1a;MyDNS是一个UNIX平台下的免费DNS服务器端软件。它被设计成直接从数据库中读取DNS记录软件&#xff0c;并且修改记录后也可时时生效。在MyDNS上&#xff0c;你可随心所欲地增加你自己的次级域名的同时建站…

mysql 5.7 flashback_Flashback for MySQL 5.7

实现原理flashback的概念最早出现于Oracle数据库&#xff0c;用于快速恢复用户的误操作。flashback for MySQL用于恢复由DML语句引起的误操作&#xff0c;目前不支持DDL语句。例如下面的语句&#xff1a;DELETE FROM XXX;UPDATE XXX SET YYYZZZ;若没有flashback功能&#xff0c…

给mysql数据库设计编码_MYSQL数据库编码原理

很多站长可能与织梦CMS小编一样&#xff0c;觉得MYSQL数据库即熟悉又神秘。熟悉是因为我们每天都会用到MYSQL进行安装织梦程序&#xff0c;陌生是因为mysql经常与linux联系&#xff0c;是基于linux系统的下的应用&#xff0c;而我们平常使用的都是windows主机系统。织梦CMS就基…