【MySQL】主从复制[通俗易懂]

【MySQL】主从复制[通俗易懂]纸上得来终觉浅,绝知此事要躬行。 概述 复制是指将主数据库的DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 My

【MySQL】主从复制

纸上得来终觉浅,绝知此事要躬行。

概述

复制是指将主数据库的DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。

MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。

优势

MySQL 复制的优点主要包含以下三个方面:

  • 主库出现问题,可以快速切换到从库提供服务。

  • 可以在从库上执行查询操作,从主库中更新,实现读写分离,降低主库的访问压力。

  • 可以在从库中执行备份,以避免备份期间影响主库的服务。

原理

在详细介绍如何设置复制之前,我们先看看MySQL实际上是如何复制数据的,总的来说,复制分为三个步骤:

  1. 当主库在事务提交时,会把数据变更作为时间 Events 记录在二进制日志文件 Binlog 中。(这些记录被称为二进制日志事件)
  2. 主库推送二进制日志文件 Binlog 中的日志事件到从库的中继日志 Relay Log 。
  3. slave重做中继日志中的事件,将改变反映它自己的数据。

【MySQL】主从复制[通俗易懂]

第一步在主库上记录二进制文件(后续介绍设置)。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按照事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志之后主库会告诉存储引擎提交事务。

第二步,从库将主库的二进制日志复制到其本地的中继日志。首先从库会启动一个工作线程称为I/O线程,该线程跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储线程,这个二进制转储线程会读取主库上二进制日志事件,他不会对事件进行轮询。如果该线程追赶上了主库,他将进入睡眠状态,直到主库发送信号量通知从库有新的事件才会被唤醒,然后线程将接受到的事件记录到中继日志。

第三步,从库中的线程从中继日志中读取事件并在从库执行,从而实现从库数据的更新。

配置

Master配置

  1. 查看MySQL默认配置文件
mysql --help|grep "my.cnf"

代码100分

  1. 选择一个配置文件输入一下配置信息
代码100分# 必须,表示mysql配置文件
[mysqld]

# mysql 服务ID,保证整个集群环境中唯一
server-id=1

# mysql binlog 日志的存储路径和文件名
log-bin=/var/lib/mysql/mysqlbin

# 错误日志,默认已经开启
# log-err

# mysql的安装目录
# basedir

# mysql的临时目录
# tmpdir

# mysql的数据存放目录
# datadir

# 是否只读,1 代表只读, 0 代表读写
read-only=0

# 忽略的数据, 指不需要同步的数据库
binlog-ignore-db=mysql

# 指定同步的数据库
# binlog-do-db=db01
  1. 保存完毕之后,重启服务
service mysql restart
  1. 创建同步数据的账户,并且进行授权操作
代码100分grant replication slave on *.* to "用户名"@"从库服务器地地址" identified by "密码";	

# 例如:grant replication slave on *.* to "root"@"192.168.192.131" identified by "root";	

flush privileges;
  1. 查看log-bin是否已打开
mysql> show variables like "%log_bin%";
+---------------------------------+-------------------------------+
| Variable_name                   | Value                         |
+---------------------------------+-------------------------------+
| log_bin                         | ON                            |
| log_bin_basename                | /var/lib/mysql/mysqlbin       |
| log_bin_index                   | /var/lib/mysql/mysqlbin.index |
| log_bin_trust_function_creators | OFF                           |
| log_bin_use_v1_row_events       | OFF                           |
| sql_log_bin                     | ON                            |
+---------------------------------+-------------------------------+
6 rows in set (0.00 sec)
  1. 查看master状态
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| mysqlbin.000001 |      154 |              | mysql            |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

# File : 从哪个日志文件开始推送日志文件 
# Position : 从哪个位置开始推送日志
# Binlog_Ignore_DB : 指定不需要同步的数据库

Slave配置

  1. 与Master一样查找配置文件,输入以下内容
# mysql服务端ID,唯一
server-id=2

# 指定binlog日志
log-bin=/var/lib/mysql/mysqlbin
  1. 保存完毕之后,重启服务
service mysql restart
  1. 登录数据库,输入一下命令
change master to master_host= "192.168.192.130", master_user="主库用户名", master_password="主库密码", master_log_file="mysqlbin.000001", master_log_pos=413;

指定当前从库对应的主库的IP地址,用户名,密码,从哪个日志文件开始的那个位置开始同步推送日志。

  1. 开启同步操作
start slave;
show slave status;

【MySQL】主从复制[通俗易懂]

  1. 停止同步操作
stop slave;

测试配置同步

  • 在主库中创建数据库,创建表,并插入数据 :
create database db01;

user db01;

create table user(
	id int(11) not null auto_increment,
	name varchar(50) not null,
	sex varchar(1),
	primary key (id)
)engine=innodb default charset=utf8;

insert into user(id,name,sex) values(null,"Tom","1");
insert into user(id,name,sex) values(null,"Trigger","0");
insert into user(id,name,sex) values(null,"Dawn","1");
  • 在从库中查询数据,进行验证 :

在从库中,可以查看到刚才创建的数据库:

【MySQL】主从复制[通俗易懂]

在该数据库中,查询user表中的数据:

【MySQL】主从复制[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7968.html

(0)
上一篇 2023-03-10
下一篇 2023-03-10

相关推荐

  • 达梦数据库间隔分区应用(interval)

    达梦数据库间隔分区应用(interval)在达梦中我们也可以使用间隔分区,需要注意的是达梦中的间隔分区使用有以下限制

    2023-03-24
    117
  • Python字符串拼接函数的用法及示例

    Python字符串拼接函数的用法及示例在程序中,我们有时需要将多个字符串拼接在一起,以形成一个更长的、更具表现力的信息。Python字符串拼接是实现这一功能的重要工具。字符串拼接具有广泛的应用场景,例如数据报告的生成、核心算法的实现、根据用户输入动态生成URL等。在Python中,实现字符串拼接的方法有多种,其中最常用的就是使用“+”运算符实现,其基本语法如下:

    2024-04-04
    18
  • Python String长度函数:计算字符串长度

    Python String长度函数:计算字符串长度在Python中,字符串是一种很常用的数据类型,它是由一系列字符组成的序列。Python给我们提供了一个内置函数len(),用于计算字符串的长度。根据官方文档的介绍:len(s)函数返回对象(字符、字节、列表、字典等)的长度或元素个数。在本文中,我们聚焦在字符串上。

    2024-04-12
    28
  • 函数组合什么时候出道的_接口函数

    函数组合什么时候出道的_接口函数函数组合在函数式编程中被称为组合(composition),我们将了解组合的概念并学习大量的例子。然后创建自己的compose函数。 组合的概念是非常直观的,并不是函数式编程独有的,在我们生活中或者前端开发中处处可见。 比如我们现在流行的 SPA (单页面应用),都会有组件的概…

    2023-03-02
    99
  • mysql 常用语句_数据库常用语句

    mysql 常用语句_数据库常用语句把工作常用的mysql命令整理一下,省的用的时候在到处找 1.常用命令 1.1登录 mysql -u root -p 2.常用语句 2.1 生成随机数 若在 i<=R<=j 范围内生成随机数 FLO...

    2023-04-09
    99
  • mysql查询多个表的多个字段_修改表字段

    mysql查询多个表的多个字段_修改表字段前言:mysql的字段约束是以后必不可免的,下面主要写了四个:主键约束用于唯一且不能为空;非空约束即不能为空可以重复;唯一约束即可以为空但必须唯一;外键约束是让表与表之间有一定的关联;当然如何使用还…

    2023-02-09
    105
  • -B+树索引和HASH索引有哪些不一样【MySQL系列】「建议收藏」

    -B+树索引和HASH索引有哪些不一样【MySQL系列】「建议收藏」我们都理解B+树和Hash索引的区别有助于我们预测索引在不同的存储引擎中是怎么执行查询的。

    2023-05-29
    99
  • centos7下YUM mysql5.7安装与配置

    centos7下YUM mysql5.7安装与配置centos7下YUM mysql5.7安装与配置

    2023-04-01
    122

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注