mysql数据库主从复制(mysql-replication)_mysqlreplication-程序员宅基地

技术标签: 运维  linux  服务器  mysql  数据库  

mysql数据库主从复制:mysql-replication

一、理论知识

1.Replication

主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。

2.mysql主从复制的优点
  • 横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可以在一个或多个从设备上进行。该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。读拓展性和负载均衡。
  • 数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。主库的写入数据会持续地在冗余的从库节点上被执行保留,减少数据丢失的风险。
  • 分析 - 可以在主服务器上创建实时数据,而信息分析可以在从服务器上进行,而不会影响主服务器的性能。
  • 备份 - 可以使用从服务器数据进行备份,减轻主服务器的压力。
  • 高可用性保障 - 当主库发生故障时,可以快速的切到其某一个从库,并将该从库提升为主库,因为数据都一样,所以不会影响系统的运行
3.Replication的原理

在这里插入图片描述
Binlog
从比较宽泛的角度来探讨复制的原理,MySQL的Server之间通过二进制日志来实现实时数据变化的传输复制,这里的二进制日志是属于MySQL服务器的日志,记录了所有对MySQL所做的更改。这种复制模式也可以根据具体数据的特性分为三种:

  • Statement:基于语句格式
    Statement模式下,复制过程中向获取数据的从库发送的就是在主库上执行的SQL原句,主库会将执行的SQL原有发送到从库中。
  • Row:基于行格式
    Row模式下,主库会将每次DML操作引发的数据具体行变化记录在Binlog中并复制到从库上,从库根据行的变更记录来对应地修改数据,但DDL类型的操作依然是以Statement的格式记录。
  • Mixed:基于混合语句和行格式
    MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。
    最早的实现是基于语句格式,在3.23版本被引入MySQL,从最初起就是MySQL Server层的能力,这一点与具体使用的存储引擎没有关联;在5.1版本后开始支持基于行格式的复制;在5.1.8版本后开始支持混合格式的复制。

这三种模式各有优劣,相对来说,基于Row的行格式被应用的更广泛,虽然这种模式下对资源的开销会偏大,但数据变化的准确性以及可靠性是要强于Statement格式的,同时这种模式下的Binlog提供了完整的数据变更信息,可以使其应用不被局限在MySQL集群系统内,可以被例如Binlogserver,DTS数据传输等服务应用,提供灵活的跨系统数据传输能力, 目前互联网业务的在线MySQL集群全部都是基于Row行格式的Binlog。

二、配置主从复制(以mysql5.7版本为例)(模拟无数据)

1.准备环境

准备两台服务器(一主一从)

防火墙和selinux均关闭(方法见下)

[root@master ~]# systemctl stop firewalld --now && setenforce 0
[root@slave ~]# systemctl stop firewalld --now && setenforce 0

设置主机名解析(方法如下)

[root@master ~]# vim /etc/hosts   插入下列信息,两台服务器ip和主机名
10.12.155.10   master
10.12.155.11   slave
[root@slave ~]# vim /etc/hosts   插入下列信息,两台服务器ip和主机名
10.12.155.10   master
10.12.155.11   slave
2.清理环境
#清理数据库
[root@master ~]# yum -y erase `rpm -qa | egrep "mysql|mariadb"`
[root@master ~]# rm -rf /etc/my* && rm -rf /var/lib/mysql && rm -rf /usr/bin/mysql
#检查清理效果
[[ ! -f /etc/my.cnf ]] && [[ ! -d /var/lib/mysql ]] && [[ ! -f /usr/bin/mysql ]] && echo "环境已经清理完成" || echo "环境未清理"
3、安装mysql

推荐使用yum安装,yum安装方法见教程:如何yum安装mysql

安装完成后重启,获取初始密码

[root@master ~]# cat /var/log/mysqld.log | grep  password | awk -F':' '{print $4}'
# 此条命令会获取一个12位的字符串初始密码

修改密码

[root@master ~]# mysqladmin -uroot -p'初始密码' password '新密码'
4、配置主服务器(master)

开启biinlog二进制日志

[root@master ~]# mkdir  /data
[root@master ~]# chown  -R  mysql.mysql  /data
[root@master ~]# vim /etc/my.cnf   #插入下列两行信息,serverID必须具有唯一性,binlog日志存放路径必须存在且授权
server-id=1
bin-log=/data/mysql-bin
[root@master ~]# systemctl restart mysqld   #这里注意改完配置文件后必须要重启服务,保证修改的配置生效

创建授权用户

[root@master ~]# myslq -uroot -p'密码'
mysql> grant replication slave on *.* to 'repl'@'10.12.155.11' identified by '账号密码'
#这里是在mysql数据库创建一个新用户并给它授予主从复制的从库权限,注意这是mysql5.7版本的操作方法,如果是mysql8.0版本,则需要先创建用户,然后授权,分两步。

查看主库信息

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)
#此条命令可以查看主库的主从复制相关信息,主要是用来获取File、Position这两条信息,后面配从库会用到。
5、配置从服务器(slave)

设置server-id

[root@slave ~]# vim /etc/my.cnf
server-id=2    #server-id必须唯一
[root@slave ~]# systemctl restart mysqld  #重启服务使修改配置生效

从服务器配置连接主服务器信息

[root@slave ~]# myslq -uroot -p'密码'
mysql> ? change master to   #此条命令可以查看配置列表模板,辅助配置
mysql> change master to
 -> MASTER_HOST='master',         #主库的ip,这里做了主机名解析,所以填主机名
  ->MASTER_USER='repl',     #主库授权的账户名称
  ->MASTER_PASSWORD='password',    #主库授权的账户密码
 -> MASTER_PORT=3306,       #主库的mysql服务的端口
  ->MASTER_LOG_FILE='mysql-bin.000001',    #主库二进制日志名称
  ->MASTER_LOG_POS=154,         #主从关系开始的二进制日志位置点信息
  ->MASTER_CONNECT_RETRY=10;     #主从关系连接的尝试最长时间

启动从服务器的复制线程

mysql> start slave:

查询是否成功建立主从关系

mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_State: Reconnecting after a failed master event read
                Master_Host: master
                Master_User: repl
                Master_Port: 3306
              Connect_Retry: 10
            Master_Log_File: mysql-bin.000001
        Read_Master_Log_Pos: 415
             Relay_Log_File: localhost-relay-bin.000002
              Relay_Log_Pos: 581
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 

#12、13条信息(Slave_IO_Running、Slave_SQL_Running)这两处显示两个yes,则说明主从复制建立成功,也可以在主库写入数据,在从库进行查询,如果能查到主库写入的信息,则也能说明主从关系建立成功。

在从站上暂停复制

您可以使用和stop slave和start slave语句停止并启动从站上的复制 。
要停止从主服务器处理二进制日志,请使用:

mysql> stop slave;   //暂停
mysql> start slave;  //启动
mysql> reset slave:  //重新设置

三、主数据库有数据情况下如何配置

主数据库有数据的情况下,使用myqldump工具将主服务器中现有数据导出,使用scp命令复制到每个从服务器

3.1配置主服务器
  • 开启binlog二进制日志
 [root@master ~]# vim  etc/my.cnf
 server-id=1     
 bin-log=/data/mysql-bin
  • 创建日志目录并授权
 [root@master /]# mkdir data
 [root@master /]# chown mysql.mysql /data
  • 重启服务
 [root@master /]# systemctl restart mysqld
  • 创建复制数据的用户并授权
[root@master ~]# myslq -uroot -p'密码'
mysql> grant replication slave on *.* to 'repl'@'10.12.155.11' identified by '账号密码'
  • 主数据库有数据的情况下,使用myqldump工具将主服务器中现有数据导出,使用scp命令复制到每个从服务器
[root@master ~]# mysqldump  -u'用户名' -p'密码' --all-databases >all.sql

[root@master ~]# scp all.sql  slave:/root/
3.2配置从服务器
  • 添加server-id
 [root@slave ~]# vim  etc/my.cnf
 server-id=2     
  • 重启服务
 [root@slave /]# systemctl restart mysqld
  • 导入主服务器数据库数据
 [root@slave /]# mysql  -uroot -p'密码'  <all.sql
 或者
 [root@slave /]# myslq -uroot -p'密码'
 mysql>source /all.sql
  • 查看主服务器binlog日志名称和位置信息
[root@master ~]# myslq -uroot -p'密码'
mysql> show master status\G
*************************** 1. row ***************************
            File: mysql-bin.000001
        Position: 154
    Binlog_Do_DB: 
Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)
#此条命令可以查看主库的主从复制相关信息,主要是用来获取File、Position这两条信息,后面配从库会用到。
  • 配置从服务器连接主服务器相关信息
[root@slave ~]# myslq -uroot -p'密码'
mysql> ? change master to   #此条命令可以查看配置列表模板,辅助配置
mysql> change master to
 -> MASTER_HOST='master',         #主库的ip,这里做了主机名解析,所以填主机名
  ->MASTER_USER='repl',     #主库授权的账户名称
  ->MASTER_PASSWORD='password',    #主库授权的账户密码
 -> MASTER_PORT=3306,       #主库的mysql服务的端口
  ->MASTER_LOG_FILE='mysql-bin.000001',    #主库二进制日志名称
  ->MASTER_LOG_POS=154,         #主从关系开始的二进制日志位置点信息
  ->MASTER_CONNECT_RETRY=10;     #主从关系连接的尝试最长时间
  • 启动从服务器复制线程
[root@slave ~]# myslq -uroot -p'密码'
mysql> start slave;
  • 查询配置结果
[root@slave ~]# myslq -uroot -p'密码'
mysql> show slave status\G
  *************************** 1. row ***************************
               Slave_IO_State: Reconnecting after a failed master event read
                  Master_Host: master
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 415
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 581
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 

#12、13条信息(Slave_IO_Running、Slave_SQL_Running)这两处显示两个yes,则说明主从复制建立成功,也可以在主库写入数据,在从库进行查询,如果能查到主库写入的信息,则也能说明主从关系建立成功。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_57328245/article/details/135160741

智能推荐

适合入门的8个趣味机器学习项目-程序员宅基地

文章浏览阅读86次。首发地址:https://yq.aliyun.com/articles/221708谈到机器学习,相信很多除学者都是通过斯坦福大学吴恩达老师的公开课《Machine Learning》开始具体的接触机器学习这个领域,但是学完之后又不知道自己的掌握情况,缺少一些实际的项目操作。对于机器学习的相关竞赛挑战,有些项目的门槛有些高,参加后难以具体的实现,因此造..._scrath五子棋下载

oracle 12c avg,Oracle 12c新特性系列专题-安徽Oracle授权认证中心-程序员宅基地

文章浏览阅读83次。原标题:Oracle 12c新特性系列专题-安徽Oracle授权认证中心 随着Oracle database 12c的普及,数据库管理员 (DBA) 的角色也随之发生了转变。 Oracle 12c数据库对 DBA 而言是下一代数据管理。它让 DBA 可以摆脱单调的日常管理任务,能够专注于如何从数据中获取更多价值。未来我们会推出基于Oracle12c的技术文章,帮助DBA尽快掌握新一代数据库的新特性..._ilm add policy row store compress advanced row after

第七周项目三(负数把正数赶出队列)-程序员宅基地

文章浏览阅读150次。问题及代码:*Copyright(c)2016,烟台大学计算机与控制工程学院 *All right reserved. *文件名称:负数把正数赶出队列.cpp *作者:张冰 *完成日期;2016年10月09日 *版本号;v1.0 * *问题描述: 设从键盘输入一整数序列a1,a2,…an,试编程实现: 当ai>0时,ai进队,当ai<0时,将队首元素出队,当ai

Linux命名空间学习教程(二) IPC-程序员宅基地

文章浏览阅读150次。本文讲的是Linux命名空间学习教程(二) IPC,【编者的话】Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。而 LXC所实现的隔离性主要是来自内核的命名空间, 其中pid、net、ipc、mnt、uts 等命名空间将容器的进程、网络、消息、文件系统和hostname 隔离开。本文是Li..._主机的 ipc 命名空间

adb强制安装apk_adb绕过安装程序强制安装app-程序员宅基地

文章浏览阅读2w次,点赞5次,收藏7次。在设备上强制安装apk。在app已有的情况下使用-r参数在app版本低于现有版本使用-d参数命令adb install -r -d xxx.apk_adb绕过安装程序强制安装app

随便推点

STM32F407 越界问题定位_stm32flash地址越界怎么解决-程序员宅基地

文章浏览阅读290次。如果是越界进入硬件错误中断,MSP 或者 PSP 保存错误地址,跳转前会保存上一次执行的地址,lr 寄存器会保存子函数的地址,所以如果在 HardFault_CallBack 中直接调用 C 语言函数接口会间接修改了 lr,为了解决这个问题,直接绕过 lr 的 C 语言代码,用汇编语言提取 lr 寄存器再决定后面的操作。由于 STM32 加入了 FreeRTOS 操作系统,可能导致无法准确定位,仅供参考(日常编程需要考虑程序的健壮性,特别是对数组的访问,非常容易出现越界的情况)。_stm32flash地址越界怎么解决

利用SQL注入上传木马拿webshell-程序员宅基地

文章浏览阅读1.8k次。学到了一种操作,说实话,我从来没想过还能这样正常情况下,为了管理方便,许多管理员都会开放MySQL数据库的secure_file_priv,这时就可以导入或者导出数据当我如图输入时,就会在D盘创建一个名为123456.php,内容为<?php phpinfo();?>的文件我们可以利用这一点运用到SQL注入中,从拿下数据库到拿下目标的服务器比如我们在使用联合查询注入,正常是这样的语句http://xxx?id=-1 union select 1,'你想知道的字段的内容或查询语句',

Html CSS的三种链接方式_html链接css代码-程序员宅基地

文章浏览阅读2.9w次,点赞12次,收藏63次。感谢原文:https://blog.csdn.net/abc5382334/article/details/24260817感谢原文:https://blog.csdn.net/jiaqingge/article/details/52564348Html CSS的三种链接方式css文本的链接方式有三种:分别是内联定义、链入内部css、和链入外部css1.代码为:<html>..._html链接css代码

玩游戏哪款蓝牙耳机好?2021十大高音质游戏蓝牙耳机排名_适合游戏与运动的高音质蓝牙耳机-程序员宅基地

文章浏览阅读625次。近几年,蓝牙耳机市场发展迅速,越来越多的消费者希望抛弃线缆,更自由地听音乐,对于运动人士来说,蓝牙耳机的便携性显得尤为重要。但目前市面上的大多数蓝牙耳机实际上都是“有线”的,运动过程中产生的听诊器效应会严重影响听歌的感受。而在“真无线”耳机领域,除了苹果的AirPods外,可供选择的产品并不多,而AirPods又不是为运动场景打造的,防水能力非常差。那么对于喜欢运动又想要“自由”的朋友来说,有没有一款产品能够满足他们的需求呢?下面这十款小编专门为大家搜罗的蓝牙耳机或许就能找到适合的!网红击音F1_适合游戏与运动的高音质蓝牙耳机

iOS 17 测试版中 SwiftUI 视图首次显示时状态的改变导致动画“副作用”的解决方法-程序员宅基地

文章浏览阅读1k次,点赞6次,收藏7次。在本篇博文中,我们在 iOS 17 beta 4(SwiftUI 5.0)测试版中发现了 SwiftUI 视图首次显示时状态的改变会导致动画“副作用”的问题,并提出多种解决方案。

Flutter 自定义 轮播图的实现_flutter pageview轮播图 site:csdn.net-程序员宅基地

文章浏览阅读1.9k次。  在 上篇文章–Flutter 实现支持上拉加载和下拉刷新的 ListView 中,我们最终实现的效果是在 listView 上面留下了一段空白,本意是用来加载轮播图的,于是今天就开发了一下,希望能给各位灵感。一 、效果如下说一下大体思路   其实图片展示是用的 PageView ,然后,下面的指示器 是用的 TabPageSelector ,当然整体是用 Stack 包裹起来的。1、..._flutter pageview轮播图 site:csdn.net

推荐文章

热门文章

相关标签