news 2026/7/20 16:59:38

MySQL 8.0.35 主从复制搭建笔记(传统位置点主从复制)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 8.0.35 主从复制搭建笔记(传统位置点主从复制)

基于二进制包最小化安装,传统位置点主从复制

  • 主库:192.168.195.141
  • 从库:192.168.195.142

1. 环境信息

项目主库 (Master)从库 (Slave)
IP192.168.195.141192.168.195.142
OSKylin Linux Advanced Server V10 (Halberd)Kylin Linux Advanced Server V10 (Halberd)
MySQL版本8.0.35(二进制包,glibc2.17)8.0.35(二进制包,glibc2.17)
server-id12
角色MasterSlave

2. 安装 MySQL(两台均执行)

2.1 创建用户与组

groupaddmysqluseradd-gmysql mysql

验证:

idmysql# 用户id=1003(mysql) 组id=1000(mysql) 组=1000(mysql)

2.2 解压二进制包

cd/usr/local/wgethttps://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.35-linux-glibc2.17-x86_64.tar.xztarxvf mysql-8.0.35-linux-glibc2.17-x86_64.tar.xzln-smysql-8.0.35-linux-glibc2.17-x86_64 mysql

验证:

ls-la/usr/local/mysql# lrwxrwxrwx 1 root root 35 7月 19 17:32 /usr/local/mysql -> mysql-8.0.35-linux-glibc2.17-x86_64/usr/local/mysql/bin/mysql--version# /usr/local/mysql/bin/mysql Ver 8.0.35 for Linux on x86_64 (MySQL Community Server - GPL)

3. 编辑配置文件

3.1 主库 /etc/my.cnf(141)

[client] socket = /data/mysql/3306/data/mysql.sock [mysqld] basedir = /usr/local/mysql datadir = /data/mysql/3306/data user = mysql port = 3306 socket = /data/mysql/3306/data/mysql.sock log_error = /data/mysql/3306/data/mysqld.err log_timestamps = system log-bin = mysql-bin server-id = 1

参数解释:

  • log-bin = mysql-bin:开启 binlog(二进制日志),主库必须开启,用于记录所有更改数据的操作,从库通过读取主库的 binlog 来同步数据。
  • server-id = 1:服务器唯一标识,主从环境中每个实例必须不同。修改 server-id 无需重启实例。

3.2 从库 /etc/my.cnf(142)

[client] socket = /data/mysql/3306/data/mysql.sock [mysqld] basedir = /usr/local/mysql datadir = /data/mysql/3306/data user = mysql port = 3306 socket = /data/mysql/3306/data/mysql.sock log_error = /data/mysql/3306/data/mysqld.err log_timestamps = system server-id = 2

与主库的区别:

  • server-id = 2:从库的 server-id 必须与主库不同。
  • 从库不需要配置log-bin。MySQL 8.0 中 binlog 默认是开启的,如果要关闭需设置skip_log_bindisable_log_bin。当前从库未显式设置log-bin,MySQL 8.0 会默认开启。

4. 创建数据目录(两台均执行)

mkdir-p/data/mysql/3306/datachownmysql.mysql /data/mysql/3306/data/

5. 初始化实例(两台均执行)

/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf--initialize

如果没有错误输出,就意味着实例初始化成功。错误日志输出:

2026-07-19T17:33:01.671748+08:00 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: th-VSde4e?i5

6. 配置 systemd 服务(两台均执行)

6.1 创建 /etc/systemd/system/mysqld.service

[Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql Type=forking PIDFile=/data/mysql/3306/data/mysqld.pid TimeoutSec=0 ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --pid-file=/data/mysql/3306/data/mysqld.pid --daemonize $MYSQLD_OPTS EnvironmentFile=-/etc/sysconfig/mysql LimitNOFILE = 65535 Restart=on-failure RestartPreventExitStatus=1 PrivateTmp=false

6.2 创建 /etc/sysconfig/mysql

MYSQLD_OPTS=

7. 启动实例(两台均执行)

systemctl daemon-reload systemctl start mysqld systemctlenablemysqld

验证:

systemctl status mysqld# Active: active (running)systemctl is-enabled mysqld# enabled

8. 修改 root 密码(两台均执行)

# 获取临时密码greppassword /data/mysql/3306/data/mysqld.err# 2026-07-19T17:33:01.671748+08:00 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: th-VSde4e?i5# 登录并修改密码/usr/local/mysql/bin/mysql-uroot-S/data/mysql/3306/data/mysql.sock-p
alteruseruser()identifiedby'Root@123456';

9. 搭建主从复制

9.1 主库创建复制用户

-- 在主库(141)执行CREATEUSER'repl'@'%'IDENTIFIEDBY'123456';GRANTREPLICATIONSLAVEON*.*TO'repl'@'%';

说明:复制用户用于从库连接主库拉取 binlog。密码使用123456,与课程文档一致。

从库上进行登录测试:

# 在从库(142)执行mysql-h192.168.195.141-urepl-p123456

9.2 备份主库

以 mysqldump 为例:

# 在主库(141)执行mysqldump-S/data/mysql/3306/data/mysql.sock --single-transaction-uroot-p--master-data=2-E-R--triggers-A>/tmp/full_backup.sql

参数解释:

  • --single-transaction:InnoDB 一致性快照备份,不锁表。
  • --master-data=2:备份文件中写入 CHANGE MASTER TO 语句(注释形式),记录备份时的 binlog 位置点。值为2表示注释掉,值为1表示不注释。
  • -E:导出事件。
  • -R:导出存储过程和函数。
  • --triggers:导出触发器。
  • -A:导出所有数据库。

备份集通过 scp 远程拷贝到从库上:

scp/tmp/full_backup.sql root@192.168.195.142:/home/

9.3 基于主库的备份恢复从库

# 在从库(142)执行mysql-S/data/mysql/3306/data/mysql.sock-uroot-p</home/full_backup.sql

9.4 获取位置点信息

# 在从库(142)执行grep-m1"CHANGE MASTER TO"/home/full_backup.sql# -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=1789;

命令行中的-m 1是只输出第一个匹配项。

9.5 建立主从复制

-- 在从库(142)执行CHANGE MASTERTOMASTER_HOST='192.168.195.141',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=1789,GET_MASTER_PUBLIC_KEY=1;

参数解释:

  • MASTER_HOST:主库的主机信息。
  • MASTER_PORT:主库端口,不指定则默认为 3306。
  • MASTER_USER:复制用户。
  • MASTER_PASSWORD:复制用户的密码。
  • MASTER_LOG_FILE:从库 IO 线程启动时,从主库的哪个 binlog 文件开始读取。
  • MASTER_LOG_POS:从主库 binlog 的哪个位置点开始读取。
  • GET_MASTER_PUBLIC_KEY = 1:MySQL 8.0 默认使用 caching_sha2_password 认证插件,非 SSL 连接时需获取主库公钥完成认证。使用 mysql_native_password 认证插件的不需要设置。

9.6 开启主从复制

-- 在从库(142)执行startslave;showslavestatus\G

验证输出:

Slave_IO_State: Waiting for source to send event Master_Host: 192.168.195.141 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 1789 Relay_Log_File: MYSQL142-relay-bin.000002 Relay_Log_Pos: 326 Relay_Master_Log_File: mysql-bin.000002 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: 1789 Relay_Log_Space: 539 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Seconds_Behind_Master: 0 Last_IO_Error: Last_SQL_Error: Master_Server_Id: 1 Master_UUID: d5728692-8354-11f1-8acf-000c29048d1f 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 Auto_Position: 0 Get_master_public_key: 1

重点关注:Slave_IO_RunningSlave_SQL_Running,两个均为 “Yes” 代表主从复制搭建成功。


10. 验证主从复制

10.1 主库 show processlist

-- 在主库(141)执行showprocesslist;
+----+-----------------+---------------------+------+-------------+--------+--------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+---------------------+------+-------------+--------+--------------------------------------------------+------------------+ | 5 | event_scheduler | localhost | NULL | Daemon | 408 | Waiting on empty queue | NULL | | 20 | repl | 192.168.195.142:45256 | NULL | Binlog Dump | 23 | Source has sent all binlog to replica; waiting for more updates | NULL | | 21 | root | localhost | NULL | Query | 0 | init | show processlist | +----+-----------------+---------------------+------+-------------+--------+--------------------------------------------------+------------------+

Id 为 20 的连接对应的即是Binlog Dump 线程

10.2 从库 show processlist

-- 在从库(142)执行showprocesslist;
+----+-------------+-----------------+------+---------+--------+--------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------------+------+---------+--------+--------------------------------------------------+------------------+ | 5 | event_scheduler | localhost | NULL | Daemon | 410 | Waiting on empty queue | NULL | | 13 | system user | connecting host | NULL | Connect | 30 | Waiting for source to send event | NULL | | 14 | system user | | NULL | Query | 30 | Replica has read all relay log; waiting for more updates | NULL | | 15 | system user | | NULL | Connect | 30 | Waiting for an event from Coordinator | NULL | | 16 | system user | | NULL | Connect | 30 | Waiting for an event from Coordinator | NULL | | 17 | system user | | NULL | Connect | 30 | Waiting for an event from Coordinator | NULL | | 18 | system user | | NULL | Connect | 30 | Waiting for an event from Coordinator | NULL | | 20 | root | localhost | NULL | Query | 0 | init | show processlist | +----+-------------+-----------------+------+---------+--------+--------------------------------------------------+------------------+
  • 13IO 线程(Waiting for source to send event)
  • 14协调线程(Replica has read all relay log; waiting for more updates)
  • 15-18SQL 工作线程(Waiting for an event from Coordinator)

10.3 数据同步测试

主库写入测试数据:

-- 在主库(141)执行CREATEDATABASEtest_rep;USEtest_rep;CREATETABLEt1(idINTPRIMARYKEY,nameVARCHAR(20));INSERTINTOt1VALUES(1,'master_data');SELECT*FROMt1;-- +----+-------------+-- | id | name |-- +----+-------------+-- | 1 | master_data |-- +----+-------------+

从库查询验证:

-- 在从库(142)执行SELECT*FROMtest_rep.t1;-- +----+-------------+-- | id | name |-- +----+-------------+-- | 1 | master_data |-- +----+-------------+

数据一致,主从复制工作正常。


11. 查看复制用户密码

-- 在从库(142)执行select*frommysql.slave_master_info\G
*************************** 1. row *************************** Number_of_lines: 33 Master_log_name: mysql-bin.000002 Master_log_pos: 1789 Host: 192.168.195.141 User_name: repl User_password: 123456 Port: 3306 Connect_retry: 60 Enabled_ssl: 0 Ssl_verify_server_cert: 0 Heartbeat: 30 Retry_count: 86400 Enabled_auto_position: 0 Get_public_key: 1 Master_compression_algorithm: uncompressed Master_zstd_compression_level: 3 Source_connection_auto_failover: 0 Gtid_only: 0

12. 查看从库重放信息

-- 在从库(142)执行select*frommysql.slave_relay_log_info\G
*************************** 1. row *************************** Number_of_lines: 14 Relay_log_name: ./MYSQL142-relay-bin.000002 Relay_log_pos: 1051 Master_log_name: mysql-bin.000002 Master_log_pos: 2514 Sql_delay: 0 Number_of_workers: 4 Id: 1 Assign_gtids_to_anonymous_transactions_type: OFF Assign_gtids_to_anonymous_transactions_value:

13. 连接信息

# 主库(141)/usr/local/mysql/bin/mysql-uroot-S/data/mysql/3306/data/mysql.sock -p'Root@123456'# 从库(142)/usr/local/mysql/bin/mysql-uroot-S/data/mysql/3306/data/mysql.sock -p'Root@123456'

14. 复制原理

复制的流程

  1. 从库开启主从复制(start slave),会创建一个IO thread来连接主库。
  2. 主库接受到连接请求后,会创建一个Binlog Dump thread来响应它。这个线程会读取 binlog 里面的二进制日志事件,发送给 Slave IO thread。Slave IO thread 接收到事件后,会将其写入到本地的Relay log中。
  3. 从库的SQL thread会读取 Relay log 中的二进制日志事件,然后重放。

复制的作用

  1. 横向扩展读能力:在从服务器可以执行查询工作,降低主服务器压力(主库写,从库读,降压)——读写分离。
  2. 很多关键的日常操作可放到从库进行,如备份、数据分析等。
  3. 数据灾备:在从服务器进行备份,避免备份期间影响主服务器服务——容灾。
  4. 有丰富的生态圈。
  5. 当主服务器出现问题时,可以切换到从服务器——提高可用性。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/20 16:55:54

继电器工作原理与驱动电路设计实战指南

1. 继电器基础认知与核心价值第一次拆解老式机械继电器时&#xff0c;那个"咔嗒"的吸合声让我记忆犹新。这种用微小电流控制大功率电路的电磁开关&#xff0c;至今仍是工业控制领域的"老将"。继电器本质上是通过电磁铁原理实现的电路隔离控制器——当线圈通…

作者头像 李华
网站建设 2026/7/20 16:54:09

【Linux 系统】进程终止、退出状态与进程等待

父进程创建子进程以后&#xff0c;不只是让子进程完成任务就结束了。父进程还需要知道&#xff1a;子进程是正常完成&#xff0c;还是被信号终止&#xff1b;如果正常结束&#xff0c;结果是否成功&#xff1b;最后还要把内核保留的子进程终止信息回收掉。 这一过程连接了进程终…

作者头像 李华
网站建设 2026/7/20 16:53:57

Drain3训练vs推理模式:构建生产级日志模板匹配系统

Drain3训练vs推理模式&#xff1a;构建生产级日志模板匹配系统 【免费下载链接】Drain3 A robust streaming log template miner based on the Drain algorithm 项目地址: https://gitcode.com/gh_mirrors/dr/Drain3 Drain3是一款基于Drain算法的强大流式日志模板挖掘工…

作者头像 李华
网站建设 2026/7/20 16:52:34

Social-Auto-Upload:跨平台Cookie持久化架构与异步验证机制设计

Social-Auto-Upload&#xff1a;跨平台Cookie持久化架构与异步验证机制设计 【免费下载链接】social-auto-upload 自动化上传视频到社交媒体&#xff1a;抖音、小红书、视频号、tiktok、youtube、bilibili 项目地址: https://gitcode.com/GitHub_Trending/so/social-auto-upl…

作者头像 李华
网站建设 2026/7/20 16:50:08

重温 vLLM 中的 PagedAttention

vLLM introduced PagedAttention, which borrows the paging abstraction that operating systems use for RAM and applies it to the GPU’s KV cache. During LLM inference, the KV cache – the stored key and value tensors for all previous tokens – is the dominant…

作者头像 李华
网站建设 2026/7/20 16:47:51

SpringBoot实战技能进阶:从核心原理到面试高频考点深度解析

这次我们来看一个 Java 后端开发者绕不开的核心话题&#xff1a;SpringBoot 的实战能力与面试准备。标题里提到的“练到这个程度”&#xff0c;指的并不是死记硬背八股文&#xff0c;而是构建一套能应对真实面试场景、覆盖高频考点、并能体现工程化思维的 SpringBoot 实战技能栈…

作者头像 李华