MySQL主从复制部署

MySQL主从复制部署

前言

MySQL 8.0 的主从复制是一种常见的数据库高可用和读写分离方案 在做的时候 排了好长时间 才发现是从库的二级制格式和主的不一样 所有很小的问题 下面这些东西就是我最终的结果 如果有更好的建议 大家可以私信我的

一、准备工作

  1. 两台安装好 MySQL 8.0 的服务器(主库和从库)

    主库:Centos7:192.168.3.151/24

    从库:Ubuntu:192.168.3.141/24

  2. 确保两台服务器网络互通,防火墙开放 MySQL 端口(默认 3306)

  3. 主库和从库的 MySQL 版本保持一致

二、主库(Master)配置

  1. 修改配置文件

    编辑 MySQL 配置文件(通常是 /etc/my.cnf/etc/mysql/my.cnf):

    bash 复制代码
    [mysqld]
    port = 3306
    basedir = /usr/local/mysql
    datadir = /usr/local/mysql/data
    log-error = /usr/local/mysql/data/error.log
    pid-file = /usr/local/mysql/data/mysql.pid
    socket = /tmp/mysql.sock
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    default-storage-engine=InnoDB
    default-authentication-plugin=mysql_native_password
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    
    # 主库特有配置
    server-id = 1
    log_bin = /usr/local/mysql/data/mysql-bin
    binlog_format = row #PS!!!(从库的格式要和主库一模一样)
    expire_logs_days = 7
    max_binlog_size = 100M
    
    #server-id = 1:主库唯一标识(正确,从库需设置不同值)
    #log_bin = /usr/local/mysql/data/mysql-bin:启用二进制日志(主从复制必需)
    #binlog_format = row:使用行格式(MySQL 8.0 推荐)
    #expire_logs_days = 7:自动清理 7 天前的 binlog(避免磁盘占满)
    #max_binlog_size = 100M:单个 binlog 文件最大 100M(合理设置)
  • 重启主库 MySQL 服务

    bash 复制代码
    systemctl restart mysqld
  • 创建用于复制的用户

    登录主库 MySQL:

    sql 复制代码
    mysql -u root -p

  • 创建用户并授权:

    sql 复制代码
    CREATE USER 'aa'@'%' IDENTIFIED WITH mysql_native_password BY '123'; --测试环境密码'123'
    GRANT  ON *.* TO 'repl_user'@'从库IP地址';
    FLUSH PRIVILEGES;
  • 查看主库状态

    sql 复制代码
    SHOW MASTER STATUS;
    
    --记录结果中的 File 和 Position 值,后续配置从库需要用到。
    
    --显示结果如下
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000004 |      156 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.06 sec)

三、从库(Slave)配置

  • 修改配置文件

    编辑从库 MySQL 配置文件:

    ini 复制代码
    [mysqld]
    # 从库特有配置
    server-id = 2  # 必须与主库不同(建议为2)
    relay_log = /usr/local/mysql/data/mysql-relay-bin  # 启用中继日志
    read_only = 1  # 从库只读(防止手动写入数据冲突)
    log_bin = /usr/local/mysql/data/mysql-bin  # 可选,若从库需作为其他从库的主库则启用
    binlog_format = row  # 与主库保持一致
    expire_logs_days = 7
    max_binlog_size = 100M
  • 重启从库 MySQL 服务

    bash 复制代码
    systemctl restart mysqld
  • 执行以下命令配置主从关系:

    sql 复制代码
    CHANGE MASTER TO
      MASTER_HOST = '192.168.3.151',
      MASTER_USER = 'aa',
      MASTER_PASSWORD = '123,
      MASTER_LOG_FILE = 'mysql-bin.000004', 
      MASTER_LOG_POS =  156;
  • 启动从库复制进程

    sql 复制代码
    START SLAVE;
  • 查看从库状态

    sql 复制代码
    SHOW SLAVE STATUS\G
    SHOW SLAVE STATUS\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for source to send event
                      Master_Host: 192.168.3.151
                      Master_User: aa
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000004
              Read_Master_Log_Pos: 1105
                   Relay_Log_File: ws-virtual-machine-relay-bin.000004
                    Relay_Log_Pos: 608
            Relay_Master_Log_File: mysql-bin.000004
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: 
              Replicate_Ignore_DB: 
               Replicate_Do_Table: 
           Replicate_Ignore_Table: 
          Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 1105
                  Relay_Log_Space: 1845
                  Until_Condition: None
                   Until_Log_File: 
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_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: No
                    Last_IO_Errno: 0
                    Last_IO_Error: 
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 1
                      Master_UUID: a98f6ecb-7133-11f0-a001-000c29eaadbf
                 Master_Info_File: mysql.slave_master_info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind: 
          Last_IO_Error_Timestamp: 
         Last_SQL_Error_Timestamp: 
                   Master_SSL_Crl: 
               Master_SSL_Crlpath: 
               Retrieved_Gtid_Set: 
                Executed_Gtid_Set: 
                    Auto_Position: 0
             Replicate_Rewrite_DB: 
                     Channel_Name: 
               Master_TLS_Version: 
           Master_public_key_path: 
            Get_master_public_key: 0
                Network_Namespace: 
    1 row in set, 1 warning (0.00 sec)
    • 检查以下两个参数是否为 Yes,如果是则表示配置成功:

      Slave_IO_Running: Yes

      Slave_SQL_Running: Yes

    • PS:

      • 配置必须重启生效 :修改 my.cnf 后,务必重启 MySQL 服务,否则 binlog_format 不会更新。
      • 主从格式严格一致ROW 格式是 MySQL 8.0 主从复制的最佳实践,避免混合使用不同格式。
      • 避免从库写数据 :确保从库 read_only = 1(只读模式),防止手动写入导致的数据冲突。

四、验证主从复制

  1. 在主库创建一个测试数据库和表:

    sql 复制代码
    CREATE DATABASE test_repl;
    USE test_repl;
    CREATE TABLE test_table (id INT, name VARCHAR(20));
    INSERT INTO test_table VALUES (1, 'test');
  2. 在从库查看是否同步成功:

    sql 复制代码
    SHOW DATABASES;
    USE test_repl;
    SELECT * FROM test_table;
  • 如果从库中能看到主库创建的数据,则说明主从复制配置成功。

五、常见错误

常见问题排查

  1. Slave_IO_RunningConnecting,可能是:

    • 网络不通
    • 主库防火墙未开放 3306 端口
    • 复制用户密码错误
    • 主库 IP 或端口错误
  2. Slave_SQL_RunningNo,可能是:

    • 主从数据不一致
    • 从库执行中继日志

可以通过查看 MySQL 错误日志(通常在 /var/log/mysql/error.log)获取更详细的错误信息 看不懂发给AI~~~~

总结:

好了 其实写下来 就那点东西 不多不少的 为什么排的时候没看日志呢?哎~~ 所以大家要有看日志的习惯

新的一天 键盘还是那个键盘 困还是困 但各自努力吧 祝各位开心!!

相关推荐
代码改变世界ctw8 分钟前
TrustZone技术详解————这篇是AI写的包括图
linux
Johny_Zhao14 分钟前
SeaTunnel的搭建部署以及测试
linux·网络·网络安全·信息安全·kubernetes·云计算·containerd·devops·seatunnel·系统运维
fenglllle1 小时前
项目中MySQL遇到的索引失效的问题
数据库·mysql
Another Iso1 小时前
Linux之Shell脚本基本语法
linux·运维·服务器
维尔切1 小时前
Linux中systemd与systemctl管理指南
linux·服务器·网络
gnawkhhkwang1 小时前
copy_file_range系统调用及示例
linux
鱼骨不是鱼翅1 小时前
Linux---第二天---基础指令
linux·运维·服务器
Yama1171 小时前
Linux 磁盘管理
linux·运维·服务器
孙克旭_2 小时前
day068-DevOps基本知识与搭建远程仓库
linux·运维·devops
失因2 小时前
Linux systemd 服务管理与 Firewall 防火墙配置
linux·运维·服务器·centos·apache