【史上最细教程】服务器MySQL数据库完成主从复制

文章目录

  • MySQL完成主从复制教程
    • 准备:
    • 原理:
    • 步骤:
  • 推荐文章

MySQL完成主从复制教程

主从复制(也称 AB 复制)就是将一个服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)中。

可以根据配置,指定复制哪个库哪个表数据。

可以想到复制是通过异步的。

准备:

2台版本一致的服务器数据库,一台作为主库、一台作为从库

(我的两个数据库版本:5.7)

一台服务器搭建2个数据库实例教程:http://t.csdnimg.cn/aaErM

原理:

image-20231123112751434

主库一旦变更数据,就会写入二进制日志文件(Binary log),从库IO线程( I/O thread)连接到主库,读取二进制日志文件内容并写入自己的中继日志文件(Realy log),然后从库 SQL thread 定时检查中继日志 (Realy log),发现有更新的内容就自己的库执行一遍。

从服务器都会copy主服务器二进制日志的全部内容到副本,然后从服务器设备负责决定应该执行副本中的哪些语句。

步骤:

  1. 主库配置my.cnf文件指定唯一server-id

    image-20231123132152378

    [mysqld]
    ## 同一局域网内注意要唯一
    server-id=100  
    ## 开启二进制日志功能,可以随便取(关键)
    log-bin=mysql-bin
    ## 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
    binlog-ignore-db=mysql
    ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M
    ## 主从复制的格式(mixed,statement,row,默认格式是statement)
    binlog_format=mixed
    
  2. 从库配置my.cnf文件指定唯一server-id

    image-20231123132213780

    [mysqld]
    ## 设置server_id,注意要唯一
    server-id=102
    ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin=mysql-slave-bin
    ## relay_log配置中继日志
    relay_log=edu-mysql-relay-bin
    ##复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
    binlog-ignore-db=mysql
    ## 如果需要同步函数或者存储过程
    log_bin_trust_function_creators=true
    ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M
    ## 主从复制的格式(mixed,statement,row,默认格式是statement)
    binlog_format=mixed
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
    slave_skip_errors=1062
    
  3. 重启3306、3307服务,使配置生效

    # 查看mysql 3306、3307进程
    root@songdanminserver:[/usr/local/mysql/3306/run]ps -ef | grep mysqld
    root      8568 25795  0 13:40 pts/0    00:00:00 grep --color=auto mysqld
    mysql    30201     1  0 Nov10 ?        00:07:13 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3306/my.cnf --user=mysql
    mysql    30473     1  0 Nov10 ?        00:07:46 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3307/my.cnf --user=mysql
    # 停止3306、3307进程服务
    root@songdanminserver:[/usr/local/mysql/3306/run]kill 30201
    root@songdanminserver:[/usr/local/mysql/3306/run]kill 30473
    # 查看mysql进程
    root@songdanminserver:[/usr/local/mysql/3306/run]ps -ef | grep mysqld
    root      8614 25795  0 13:41 pts/0    00:00:00 grep --color=auto mysqld
    # 查看端口占用情况是否没有3306、3307
    root@songdanminserver:[/usr/local/mysql/3306/run]netstat -ntl
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
    tcp6       0      0 :::111                  :::*                    LISTEN     
    tcp6       0      0 :::8080                 :::*                    LISTEN     
    tcp6       0      0 ::1:25                  :::*                    LISTEN     
    tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN     
    # 重新启动3306、3307
    root@songdanminserver:[/usr/local/mysql/3306]nohup /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3306/my.cnf --user=mysql &
    [1] 9413
    root@songdanminserver:[/usr/local/mysql/3306]nohup: ignoring input and appending output to ‘nohup.out’
    ^C
    root@songdanminserver:[/usr/local/mysql/3307]nohup /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3307/my.cnf --user=mysql &
    [2] 9457
    root@songdanminserver:[/usr/local/mysql/3307]nohup: ignoring input and appending output to ‘nohup.out’
    ^C
    root@songdanminserver:[/usr/local/mysql/3306]# 查看mysql 3306、3307进程
    root@songdanminserver:[/usr/local/mysql/3307]ps -ef | grep mysqld
    mysql     9413 25795  0 13:52 pts/0    00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3306/my.cnf --user=mysql
    mysql     9559 25795  1 13:54 pts/0    00:00:00 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/3307/my.cnf --user=mysql
    root      9608 25795  0 13:54 pts/0    00:00:00 grep --color=auto mysqld
    
  4. 登录主库,授予从库连接主库,并复制主库数据的权限,刷新权限生效

    # 登录主库3306
    root@songdanminserver:[/usr/local/mysql/3306]mysql -uroot -h127.0.0.1 -p -P3306
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 5
    Server version: 5.7.36-log MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.# 授予从库3307的root用户在指定从库ip上从主库复制所有库、所有表数据的权限
    mysql> grant replication slave, replication client on *.* to 'root'@'你的从库服务器ip' identified by '你的从库root用户密码';
    Query OK, 0 rows affected, 1 warning (0.00 sec)# 刷新权限
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)# 查看MySQL现在有哪些用户及对应的IP权限,可以看到你刚授权的从库user,host
    mysql> select user,host from mysql.user;
    +---------------+--------------+
    | user          | host         |
    +---------------+--------------+
    | root          | %            |
    | root          | 121.41.59.91 |
    | mysql.session | localhost    |
    | mysql.sys     | localhost    |
    +---------------+--------------+
    4 rows in set (0.00 sec)# 查看主库3306的binlog文件名和位置
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000003 |      612 |              | mysql            |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
  5. 登录从库,连接主库,指定主库ip、主库为从库连接所创建的用户、密码、从库从主库哪个二进制文件的哪里开始读取数据等

    # 登录从库3307
    root@songdanminserver:[/usr/local/mysql/3306]mysql -uroot -h127.0.0.1 -p -P3307
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3
    Server version: 5.7.36-log MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.# 配置连接主库3306
    # change master to master_host='主库服务器ip', master_user='root(上一步主库授权从库能进行复制的用户)', master_password='123456(上一步主库授权从库能进行复制的密码)', master_port=3306(主库端口), master_log_file='mysql-bin.000002(上一步查看到的主库日志文件名称)',master_log_pos=2079(上一步查看到的主库日志文件位置);
    mysql> change master to master_host='121.41.53.91', master_user='root', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003',master_log_pos=612;
    Query OK, 0 rows affected, 1 warning (0.02 sec)
    
  6. 从库启动主从复制,查看是否连接主库成功

    # 启动从库复制主库
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)# 查看主从复制状态,查看Slave_IO_Running、Slave_SQL_Running 是否为yes
    mysql> show slave status\G;
    *************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 121.41.53.91  # 绑定的主库ipMaster_User: root	# 主库用户Master_Port: 3306	# 主库端口Connect_Retry: 60	Master_Log_File: mysql-bin.000003 # 主库同步日志,从这读取主库数据Read_Master_Log_Pos: 612Relay_Log_File: edu-mysql-relay-bin.000002 # 从库中继日志Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000003Slave_IO_Running: Yes   # 这里是yes 说明复制成功Slave_SQL_Running: Yes	 # 这里是yes 说明复制成功Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 612Relay_Log_Space: 531Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 100Master_UUID: cfb53930-7fa2-11ee-8ea9-00163e2859d2Master_Info_File: /usr/local/mysql/3307/data/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 
    1 row in set (0.00 sec)# 停止从库复制主库
    mysql> stop slave;
    Query OK, 0 rows affected (0.01 sec)
  7. 测试主从复制是否成功,在主库建表,插入数据,查看从库是否也有

    在主库执行操作:

    • 新增库
    • 新增表
    • 新增数据
    • 修改数据
    • 删除数据

    查看从库3307是否发生变化

    # 进入主库3306
    root@songdanminserver:[/usr/local/mysql/3306]mysql -uroot -h127.0.0.1 -p -P3306
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 16
    Server version: 5.7.36-log MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    # 新建数据库 my_test
    mysql> create database my_test;
    Query OK, 1 row affected (0.00 sec)mysql> use my_test;
    Database changed
    mysql> CREATE TABLE test (->   id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,->   name VARCHAR(30) NOT NULL,->   email VARCHAR(50) NOT NULL,->   reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP-> );
    Query OK, 0 rows affected (0.01 sec)
    # 插入初识数据
    mysql> INSERT INTO test (name, email)-> VALUES ('John Doe', 'john@example.com');
    Query OK, 1 row affected (0.00 sec)# 查看从库变化
    

    image-20231123160935413

注意:如果出现从库复制失败没有效果时候,从库重新绑定主库(执行6)

造成这类问题的原因一般是在主从复制的时候,基于创建表,然后又去删除和操作了数据表或者表。

推荐文章

【史上最细教程】一台服务器上搭建2个MySQL实例

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

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

相关文章

Java飞翔的鸟

创建三个包,存放代码。把图片放进文件中 APP包(运行) GameApp类 package APP; import mian.GameFrame;public class GameApp {public static void main(String[] args) {new GameFrame();} } mian包(主内容) Barri…

python获取json所有节点和子节点

使用python获取json的所有父结点和子节点 并使用父节点加下划线命名子节点 先展示一段json代码 {"level1": {"level2": {"level3": [{"level4": "4value"},{"level4_2": "4_2value"}]},"level2_…

电力行业的智能调度:数字孪生技术

随着科技的发展,数字孪生技术正逐渐渗透到各个行业领域,其中包括电力行业。数字孪生技术为电力行业带来了前所未有的机遇,使得电力系统的运行更加高效、安全和可持续。本文借用山海鲸可视化软件几个电力行业数字孪生案例探讨数字孪生技术在电…

介绍几种Go语言开发的IDE

文章目录 1.前言2.几种ide2.1 Goland2.2 VsCode示例 2.3 LiteIDE2.4 Eclipse插件GoClipse2.5 Atom2.6 Vim2.7 Sublime Text 3.总结写在最后 1.前言 Go语言作为一种新兴的编程语言,近年来受到了越来越多的关注。 它以其简洁、高效和并发性能而闻名,被广…

Jmeter 压测保姆级入门教程

1、Jmeter本地安装 1.1、下载安装 软件下载地址: https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/ 选择一个压缩包下载即可 然后解压缩后进入bin目录直接执行命令jmeter即可启动 1.2 修改语言 默认是英文的,修改中文,点击…

关于解决C# WinForm中Chart控件增删数据时报错的解决方法

1.报错代码 System.InvalidOperationExceptionHResult=0x80131509Message=集合已修改;可能无法执行枚举操作。具体报错表现为,在Application.Run(Form1())中断。 2.解决方法 这个错误通常是由于在枚举集合时对集合进行了修改而引起的。在修改完chart控件中的内容后,可能会…

Linux---常用命令汇总

文章目录 关于目录操作的命令ls/llcdpwdmkdir 关于文件操作的命令touchechocatrmmvcpvim 关于查询操作的命令greppsnetstat 关于目录操作的命令 ls/ll ls : 列出当前目录下的目录和文件(以行的展示形式) ll : 列出当前目录下的目录和文件&…

Django之Cookie与Session,CBV加装饰器

前言 会话跟踪技术 在一个会话的多个请求中共享数据,这就是会话跟踪技术。例如在一个会话中的请求如下:  请求银行主页; 请求登录(请求参数是用户名和密码);请求转账(请求参数与转账相关的数…

Thread类常用成员方法

点击链接返回标题-> Java线程的学习-CSDN博客 目录 前言 有关线程名字的成员方法: String getName() void setName(String name) Thread(String name) 获取线程对象的成员方法: static Thread currentThread() 让线程睡眠的成员方法&#xff1…

时间序列分析算法的概念、模型检验及应用

时间序列分析是一种用于研究随时间变化的数据模式和趋势的统计方法。这类数据通常按照时间顺序排列,例如股票价格、气温、销售额等。时间序列分析的目标是从过去的观测中提取信息,以便预测未来的趋势。 以下是关于时间序列分析的一些重要概念、模型检验…

python 数据类型之集合

常见的数据类型: int,整数类型(整形)bool,布尔类型str,字符串类型list,列表类型tuple,元组类型dict,字典类型,一个容器且元素必须是键值对。set,…

I Doc View在线文档预览系统RCE漏洞(QVD-2023-45061)

0x01 产品简介 iDocView是一个在线文档解析应用,旨在提供便捷的文件查看和编辑服务。 0x02 漏洞概述 漏洞成因 本次漏洞出现在在线文档解析应用中的远程页面缓存功能。具体问题在于该应用未能对用户输入的URL进行充分的安全验证,从而导致存在安全隐患…

前端实现菜单快速检索的功能

前端CSS <style type"text/css">.btn-box {color: #fff;width: auto;border-radius: 25px;min-width: 40px;height: 40px;margin: 9px;line-height: 40px;display: inline-block;position: relative;overflow: hidden;background-image: linear-gradient(315de…

红队攻防实战之内网穿透隐秘隧道搭建

别低头&#xff0c;皇冠会掉&#xff1b;别流泪&#xff0c;贱人会笑。 本文首发于先知社区&#xff0c;原创作者即是本人 0x00 前言 构建内网隐蔽通道&#xff0c;从而突破各种安全策略限制&#xff0c;实现对目标服务器的完美控制。 当我们从外网成功获得攻击点的时候&…

SAP BAPI For LU01/LU04 记账更改

场景&#xff1a;采购收货质检放行的时候&#xff0c;发现存在有些做QA11的时候&#xff0c;进入到TR-ZONE中&#xff0c;没有进入到指定的仓位 解决方案&#xff1a;前端通过LU04进入&#xff0c;可以查看到一些未清的记账更改通知单&#xff0c;点击工具栏上的创建转储单&am…

Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/3)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

新的预测模型的局部评价指标-pAUROCc

新的预测模型的局部评价指标-pAUROCc Background 局部评价主要是用在不平衡数据上&#xff0c;其合理性&#xff1a;1.局部评价比全局评价敏感&#xff0c;更容易区分模型的优劣&#xff1b;2.临床决策曲线&#xff08;DCA&#xff09;可知&#xff0c;模型使用过程中&#x…

什么是JSX

在React组件中&#xff0c;JSX&#xff08;JavaScript XML&#xff09;是一种语法扩展&#xff0c;用于描述组件的结构和外观。JSX允许我们在JavaScript中编写类似HTML的标记语言&#xff0c;以创建React元素。 在React组件中&#xff0c;render方法是用于定义并返回组件的结构…

HarmonyOS开发(六):构建简单页面

1、Column&Row组件 1.1、概述 一个页面由很多组件组成&#xff0c;如果需要把这些组件组织起来布局好&#xff0c;需要借助容器组件来实现。 容器组件是一种特殊的组件&#xff0c;它可以包含其他组件&#xff0c;而且按照一定的规律布局&#xff0c;一个容器组件中可以…

Linux--初识和基本的指令(2)

目录 前言 1. 指令 1.1 cd其它携带指令 1.2 ls其它携带指令 1.3 which指令 1.4 alias指令 1.5 mkdir其他携带指令 1.7 yum -y install 安装指令 1.8 stat指令 1.9解决指令失控状态 1.10 rmdir&&rm指令 1.11 man指令 1.12 cp指令 1.13 mv指令 1.14 nano…