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时区相关问题

前言&#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 multi主从复制_mysqld_multi方式配置Mysql数据库主从复制

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

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;它一般适用于建立数据…

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

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

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

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

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

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

java的反射机制是什么_JAVA反射机制

一、什么是反射机制 简单的来说&#xff0c;反射机制指的是程序在运行时能够获取自身的信息。在java中&#xff0c;只要给定类的名字&#xff0c;那么就可以通过反射机制来获得类的所有信息。二、哪里用到反射机制 有些时候&#xff0c;我们用过一些知识&#xf…

java unsafe park_Java魔法类——Unsafe应用解析

前言Unsafe是位于sun.misc包下的一个类&#xff0c;主要提供一些用于执行低级别、不安全操作的方法&#xff0c;如直接访问系统内存资源、自主管理内存资源等&#xff0c;这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java…

计算机视觉基础(12)——图像恢复

前言 我们将学习图像恢复相关知识。主要有图像恢复的定义、评价标准和实现图像恢复的方法。图像恢复任务包括图像去噪、去模糊、图像超分辨率、图像修复等&#xff1b;评价标准有峰值信噪比和结构相似性&#xff1b;图像超分辨的方法有传统方法和基于深度学习的方法&#xff1a…

百度编辑器图片上传 java_百度编辑器粘贴图片自动上传到服务器(Java版)

ChromeIE默认支持粘贴剪切板中的图片&#xff0c;但是我要发布的文章存在word里面&#xff0c;图片多达数十张&#xff0c;我总不能一张一张复制吧&#xff1f;Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能。但是无法处理多张图片。而且转换成BASE64后是作为内容…

matlab解方java_Java:调用window的matlab遇到的问题和解决方案

描述容易报错的问题和可能原因1.java.lang.NullPointerException解决途径&#xff1a;window和linux的文件路径不同&#xff0c;window分隔符是\\&#xff0c;linux是/2.Exception in thread “main” java.lang.ExceptionInInitializerError解决途径&#xff1a;matlab生成的j…

java中的输入语句判断正负_在java中使用方法调用统计数组中正数的个数,将判断数据的正负功能定义成方法...

满意答案donglin820推荐于 2018.04.21public class TestDemo {static int count 0;// 统计整数的个数public static void main(String[] args) {int[] number new int[10];// 动态生成一个整数数组(长度为10)Scanner s new Scanner(System.in);for (int i 0; i < 10; i)…

java二级考试有草稿纸吗_“大型考试”为什么需要回收草稿纸?学生:这么多年也没整明白!...

在大家的求学生涯中&#xff0c;肯定不难发现这个事情&#xff0c;那就是学生考完试不能带走草稿纸&#xff0c;尤其是高考、中考这种全国统一大型考试&#xff0c;英语四六级等等&#xff0c;而一些初中高中、大学院校内部期末考试也是这样。学校和考场提供统一草稿纸目的是非…

expressjs如何做mysql注入_Node.js+Express+Mysql 实现增删改查

这次选用nodejsexpressmysql 使用http作为客户端&#xff0c;express框架搭建服务端&#xff0c;从而实现数据的增删改查。这篇文章可以算作上篇文章的升级篇&#xff0c;加入了和数据库的交互。安装node 直接去官网下载选择下载即可https://nodejs.org/en/download/current/cn…

docker pxc mysql_docker安装pxc集群的详细教程

前言现在mysql自建集群方案有多种&#xff0c;keepalived、MHA、PXC、MYSQL主备等&#xff0c;但是目前根据自身情况和条件&#xff0c;选择使用pxc的放来进行搭建&#xff0c;最大的好处就是&#xff0c;多主多备&#xff0c;即主从一体&#xff0c;没有同步延时问题&#xff…

php微信开源框架,SOPHP免费微信开源框架 php版 v4.5

SOPHP是一款稳定开源的微信公众平台开发系统,也是基于weiphp开发的第一款商业系统。依托自身强大的钩子功能&#xff0c;她可以帮助大家快速开发出自己想要的微信功能插件&#xff0c;运营近两年来我们收获了上千用户与良好的口碑。作为一个开源产品&#xff0c;希望大家都能参…

java系统管理员停用,为什么犯错让我成为一个更好的系统管理员

诀窍就是同一个错误不要犯两次。到目前为止&#xff0c;我已做了十多年 Fedora 贡献者。 Fedora 有一个由开发者和用户组成的大型社区&#xff0c;其中每一个人&#xff0c;不管是极富洞察力的用户还是出色的程序员&#xff0c;都有一些独有的技能。我喜欢这样的社区&#xff0…

php ajax json 实例,php+ajax+json 详解及实例代码

phpajaxjson 实例代码html页面&#xff1a;$(function(){$("#send").click(function(){var cont $("input").serialize();$.ajax({url:ab.php,type:post,dataType:json,data:cont,success:function(data){var str data.username data.age data.job;$(&…