• Linux环境MySQL数据库主从复制保姆级教程


    1、环境准备

    本文主要是针对MySQL数据库做个主从复制测试,环境是Linux(在阿里云领取的免费服务器,可以试用一个月),MySQL数据库的版本我这里是5.7.40

    主库IP:120.26.60.94

    从库IP:120.27.241.69

    1.1、安装MySQL

    我这里安装的版本是5.7.40

    首先进入opt目录,执行下面命令进行下载:

    wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
    
    • 1

    然后执行下面命令进行安装:

    rpm -ivh mysql57-community-release-el7-9.noarch.rpm
    
    • 1

    执行完成后会在/etc/yum.repos.d/目录下生成两个repo文件mysql-community.repo mysql-community-source.repo

    必须进入到 /etc/yum.repos.d/目录后再执行安装

    cd /etc/yum.repos.d/
    yum install mysql-server --nogpgcheck      //nogpgcheck表示不校验key
    
    • 1
    • 2

    下面就表示安装成功了

    在这里插入图片描述

    运行下面命令进行启动:

    systemctl start mysqld
    
    • 1

    设置开机自动启动:

    systemctl enable mysqld
    
    • 1

    其他命令:

    # 关闭开机启动
    systemctl stop mysqld
    # 关闭MySQL
    systemctl stop mysqld
    # 重启MySQL
    systemctl restart mysqld
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行下面命令查看MySQL运行状态:

    systemctl status mysqld
    
    • 1

    如下:

    在这里插入图片描述

    1.2、设置root登录密码

    那么如何设置root账户的登录密码呢?可按照下面步骤修改root账户密码:

    1、进入MySQL数据配置文件进行修改

    vi /etc/my.cnf
    
    • 1

    再按字母【i】进入编辑模式,然后将下面这一行拷贝进去,放到最后一行,含义是免密码登录

    skip-grant-tables
    
    • 1

    然后按【Esc】后再输入【:wq】,表示保存并退出

    然后重启:

    systemctl restart mysqld.service
    
    • 1

    2、直接免密登录

    mysql -uroot -p
    
    • 1

    此时提示要你输入密码,什么都不用输入,直接回车就可以进入数据库了

    3、设置密码

    你可以使用以下命令来重置root账户的密码:(我这里设置的是AaBa123456,设置最好不要设置的太简单)

    5.7以上版本运行:
    update user set password= password("123456")where user='root';
    
    5.7以下版本运行:
    update user set authentication_string= password("123456")where user='root';
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4、删除免密设置

    按照刚才的步骤,进入【my.cnf】文件中,将【skip-grant-tables】代码删除,并保存退出,再重启MySQL服务器即可,这样以后就可以使用123456这个密码进行登录了

    2、主库配置

    下面所有配置都是在主库中进行的

    2.1、修改my.cnf

    执行下面命令:

    vi /etc/my.cnf
    
    • 1

    然后按字母【i】进入编辑模式,将下面内容拷贝进去即可:(拷贝到【mysqld】节点下面)

    [mysqld]
    #开启log-bin二进制日志
    log-bin=mysql-bin
    
    #配置唯一的服务器ID,一般使用IP最后一位
    server-id=94
    
    #添加,允许从服务器更新二进制日志
    log-slave-updates=true
    
    #需要同步的数据库,如果有多个,复制多份指定数据库名即可
    binlog_do_db=testdb
    #不需要同步的数据库,如果有多个,复制多份指定数据库名即可
    binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    binlog-ignore-db=sys
    
    #下面不是必须配置
    #主要是为了使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性
    innodb_flush_log_at_trx_commit = 1
    #使binlog在每1次binlog写入后与硬盘同步
    sync_binlog = 1
    #只保留7天的二进制日志,以防磁盘被日志占满
    expire-logs-days=7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

    然后按【Esc】后,再按【:wq】进行保存并退出操作

    2.2、重启数据库

    修改完配置文件后需要重启数据库,并查看配置是否生效,执行下面命令进行重启:

    systemctl restart mysqld.service
    
    • 1

    然后在输入下面命令查看MySQL重启后的运行状态:

    systemctl status mysqld
    
    • 1

    在这里插入图片描述

    OK,到此主库设置完毕

    2.3、检验设置是否成功

    先使用下面命令登录数据库:

    mysql -uroot -p123456
    
    • 1

    登录成功后输入下面命令检查:

    show variables like 'server_id';
    
    • 1

    在这里插入图片描述

    再输入命令:

    show variables like 'log_bin';
    
    • 1

    在这里插入图片描述

    再输入命令:

    #skip_networking默认是OFF关闭状态,启用后,主从服务器将无法相互通信,所以这里必须是OFFer
    show variables like '%skip_networking%';
    
    • 1
    • 2

    在这里插入图片描述

    OK,全部检查完毕,确实设置成功了

    2.4、建立主从复制的账号

    同样先登录MySQL之后,执行下面命令:

    GRANT REPLICATION SLAVE ON *.* to 'slavetest'@'%' identified by 'root@123456';
    
    • 1

    注意:

    上面SQL的作用是创建一个用户【slavetest】密码为【root@123456】并且给【slavetest】用户授予REPLICATION SLAVE权限,常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制,如下:

    在这里插入图片描述

    然后执行下面命令:

    #查看master的状态
    show master status\G
    
    • 1
    • 2

    在这里插入图片描述

    就不用再执行其他命令了

    上面结果中的File和Position的值需要记录一下,待会要用到

    主库的配置就搞完了,都已经做好准备了,下面我们开始搞从库

    3、从库配置

    先在从库上执行下面语句检查下刚刚建立的账号是否可以连接

    #IP是主库IP
    mysql -uslavetest -p'root@123456' -h120.26.60.94
    
    • 1
    • 2

    在这里插入图片描述

    确定可以连接

    3.1、配置my.cnf

    执行下面命令编辑my.cnf

    vi /etc/my.cnf
    
    • 1

    然后在【mysqld】节点下面新增下面内容:

    #配置唯一的服务器ID,一般使用IP最后一位
    server-id=69
    
    • 1
    • 2

    如下:

    在这里插入图片描述

    然后重启数据库,并查看刚配置的是否生效:

    systemctl restart mysqld
    mysql -uroot -p123456
    show variables like 'server_id';
    show variables like 'log_bin';
    
    • 1
    • 2
    • 3
    • 4

    如果报错:

    在这里插入图片描述

    那就执行:

    ALTER USER USER() IDENTIFIED BY 'Admin2023!';
    
    • 1

    就可以了执行了:

    在这里插入图片描述

    在这里插入图片描述

    3.2、配置复制参数

    配置同步,注意 MASTER_LOG_FILE 和 MASTER_LOG_POS 的值要与Master的一致,登录MySQL后运行下面语句:

    CHANGE MASTER TO MASTER_HOST='120.26.60.94',MASTER_USER='slavetest',MASTER_PASSWORD='root@123456',MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=434;
    
    • 1

    下面是主库的参数:

    在这里插入图片描述

    在这里插入图片描述

    如果执行失败,就执行:reset slave;

    我这里执行成功了,就可以直接执行下面语句了:

    start slave;
    
    • 1

    在这里插入图片描述

    3.3、查看从库状态

    执行下面命令查看从库状态:

    show slave status\G
    
    • 1

    在这里插入图片描述

    参数介绍:

    # 负责与主机的io通信
    Slave_IO_Running: Yes
    
    # 负责自己的slave mysql进程
    Slave_SQL_Running: Yes
    
    • 1
    • 2
    • 3
    • 4
    • 5

    若出错,则清理掉之前的配置,执行以下命令:

    mysql> stop slave;
    mysql> reset slave all;
    
    • 1
    • 2

    4、测试

    在我本地用Navicat工具连接主库和从库:

    在这里插入图片描述

    目前两个库都是一样的库,我现在在主库上面新建一个【testdb】数据库,然后从库直接刷新,就可以看到这个数据库了,同样的,你在主库上新建什么表,添加什么数据,刷新从库后,会发现,数据都在了,说明测试成功了,现在主从复制功能就实现了:
    在这里插入图片描述

    5、注意事项

    如果你设置都已经设置好了,确保没有问题了,但是本机windows就是无法远程连接Linux中的MySQL服务器的话,那就需要检查下:

    1. 接口是否放行
    2. 防火墙是否关闭

    一般情况下,需要检查下Linux服务器的防火墙是否关闭,然后检查端口是否放行(不放行的话其他服务器上连接不成功的)

    5.1、接口放行

    我这里是阿里云的服务器,所以登录到阿里云的控制台中,如下这样配置:

    在这里插入图片描述

    5.2、防火墙关闭

    防火墙相关命令:

    • 远程访问linux时,需要关闭防火墙,否则访问linux上的tomcat,mysql等服务可能会失败;
    • 查看防火墙状态: systemctl status firewalld.service(绿的running表示防火墙开启)
    • 执行关闭命令(立即关闭 - 立即生效): systemctl stop firewalld.service
    • 再次执行查看防火墙命令:systemctl status firewalld.service
    • 执行开机禁用防火墙自启命令(永久关闭 - 重启生效): systemctl disable firewalld.service
    • 开启防火墙:systemctl start firewalld.service

    5.3、Slave_IO_Running: No

    一般出现这样的问题有以下几种情况,逐一检查下即可:

    • 网络不通
    • my.cnf 配置有问题
    • 密码、file 文件名、pos 偏移量不对
    • 防火墙没有关闭

    6、总结

    1. 本文梳理出了在Linux环境中如何做主从复制,希望对大家有帮助

    如果本文对你有帮助的话,记得点赞+关注哦

  • 相关阅读:
    【QT学习】扫描二维码获取登录验证码(完整源码)
    C++&qt Day10
    JMSA(Jacobian Saliency Map Attack)算法源码解析
    鸿蒙API9手机号验证
    AXI三种接口及DMA DDR XDMA介绍(应用于vivado中的ip调用)
    小程序 用户反馈 与 客服对话 使用说明
    orbslam2实验记录-----稠密建图
    Java版企业工程项目管理系统源码+java版本+项目模块功能清单+spring cloud +spring boot
    如何从缓存一致性协议MESI来理解内存屏障
    Oracle/PLSQL: Sin Function
  • 原文地址:https://blog.csdn.net/wujiangbo520/article/details/128150824