惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
T
The Exploit Database - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
P
Palo Alto Networks Blog
T
Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Tenable Blog
F
Full Disclosure
TaoSecurity Blog
TaoSecurity Blog
I
InfoQ
AI
AI
云风的 BLOG
云风的 BLOG
K
Kaspersky official blog
Microsoft Azure Blog
Microsoft Azure Blog
S
SegmentFault 最新的问题
Y
Y Combinator Blog
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Privacy International News Feed
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
I
Intezer
L
Lohrmann on Cybersecurity
博客园_首页
量子位
Blog — PlanetScale
Blog — PlanetScale
The Last Watchdog
The Last Watchdog
Cisco Talos Blog
Cisco Talos Blog
博客园 - 叶小钗
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Help Net Security
Help Net Security
Security Archives - TechRepublic
Security Archives - TechRepublic
Apple Machine Learning Research
Apple Machine Learning Research
W
WeLiveSecurity
N
News and Events Feed by Topic
S
Schneier on Security
T
Tor Project blog
MongoDB | Blog
MongoDB | Blog
博客园 - 三生石上(FineUI控件)
V
Visual Studio Blog
T
Threat Research - Cisco Blogs
H
Help Net Security
V
V2EX
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
博客园 - Franky
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler

博客园 - 与f

微软的人机验证 docker运行hermes agent python使用docx库对在word中的表格合并操作 Python 项目创建+依赖管理+版本控制 百度飞桨PaddleOCR-VL识别发票图片输出json格式 大模型微调后导出,部署服务然后后端调用 openclaw的一些聊天配置 docker 部署 openclaw llama.cpp编译 微信小程序显示ai返回的markdown或html C#多端桌面程序(可跨平台) 基于SRS(Simple Realtime Server)+ CDN边缘节点加速3个nginx做文件分发1个nginx做负载均衡 一份基于SRS(Simple Realtime Server)+ CDN边缘节点srs edge加速的万人级直播部署清单 HLS(HTTP Live Streaming)标准的视频及加密和解密播放 HLS(HTTP Live Streaming)标准的视频及加密 使用Dockerfile创建一个hyperf容器做为开发环境 docker的hyperf框架docker-compose一键安装 通过vm虚拟中的docker 环境做开发 ubuntu 安装后ssh 连接到服务器 lvm的概念和操作(linux) PHP Attributes 注解 centos 服务器查找一些字符串 Centos8网络配置小工具 Keepalive实现一个高可用负载均衡场景 Keepalived详解:原理、编译安装与高可用集群配置
主流 MySQL 热备份方案
与f · 2026-01-21 · via 博客园 - 与f

按照备份时数据库的运行状态,可以分为三种:


冷备:停库、停服来备份。即关mysql服务,读写请求均不允许状态

温备:不停库、不停服务备份,会(锁表)阻止用户的写入.

热备:不停库、不停服务备份,也不会(锁表)阻止用户的写入。


注:MyISAM不支持热备,InnoDB都支持。

1.冷备,先停止服务,使用cp 命令把mysql的数据文件,复制到备份目录;恢复是把备份目录的文件cp到mysql的数据目录,再启动mysql服务。

2.温备,

#备份
mysqldump -u [username] -p[password] [database_name] > backup_database_name.sql
mysqldump -u root -p mydatabase > mydatabase_backup.sql

mysqldump -u [username] -p[password] [database_name] [table_name] > backup_table_name.sql
mysqldump -u root -p mydatabase mytable > mytable_backup.sql

#恢复
mysql -u [username] -p[password] [database_name] < backup_database_name.sql
mysql -u root -p mydatabase < mydatabase_backup.sql

mysql -u [username] -p[password] [database_name] < backup_table_name.sql
mysql -u root -p newdatabase < mytable_backup.sql

3.热备

 方案一:Percona XtraBackup(最推荐!生产首选)

开源、免费、专为 InnoDB 设计,真正实现 无锁热备

✔️ 优势:

  • 备份时 不锁表,业务读写照常
  • 支持 全量 + 增量 备份
  • TB 级数据恢复只要几分钟(比 mysqldump 快10倍+)
  • 支持压缩、加密、流式传输

🛠️ 快速上手(CentOS):

#安装

#‌1.确认 Percona 仓库已正确安装
sudo rpm -ivh https://repo.percona.com/yum/percona-release-latest.noarch.rpm

#2.如果你使用的是 CentOS Stream 或类似系统,可能需要启用 Percona 的特定仓库。
sudo percona-release enable-only tools release

#3.然后清理 YUM 缓存并更新
sudo yum clean all
sudo yum makecache

#4.查找可用的 Percona XtraBackup 包‌
yum list available | grep -i xtrabackup

#MySQL 版本命名,例如:
#percona-xtrabackup-24:通常用于 MySQL 5.65.7。
#percona-xtrabackup-80:用于 MySQL 8.0
# 安装(以 MySQL 8.0 为例)
sudo yum install percona-xtrabackup-80   # CentOS
# 或
sudo apt install percona-xtrabackup-80   # Ubuntu

# 创建备份用户(安全起见)
CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'StrongPass123!';
GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';

# 全量热备份(数据库正在跑也没关系!)
xtrabackup --user=bkpuser --password=StrongPass123! \
           --backup --target-dir=/backup/full_$(date +%F)

# “准备”备份(应用 redo log,让数据一致)
xtrabackup --prepare --target-dir=/backup/full_2026-01-21

# 恢复?只需 copy-back(先停 MySQL)
systemctl stop mysqld
xtrabackup --copy-back --target-dir=/backup/full_2026-01-21
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld

💡 增量备份也超简单:基于上次全量或增量目录再备份,省空间又快!

注意:如果mysql版本低于8.0.21,不支持上面的BACKUP_ADMIN权限,需要手动授予备份所需的其他权限。通常:

  • 需要手动授予备份所需的其他权限。通常,备份用户需要以下权限:
    • SELECT:用于读取数据。
    • RELOAD:用于执行 FLUSH TABLES WITH READ LOCK
    • PROCESS:用于执行 SHOW PROCESSLIST
    • REPLICATION CLIENT:用于执行 SHOW MASTER STATUS 和 SHOW SLAVE STATUS
    • LOCK TABLES:用于执行 FLUSH TABLES WITH READ LOCK
    • CREATEINSERTDROPUPDATE:用于在 mysql 数据库中创建和操作 backup_process 表(如果需要)。
    • SUPER:用于控制复制线程(在某些场景下)。
  • 授予这些权限的示例语句:
    GRANT SELECT, RELOAD, PROCESS, REPLICATION CLIENT, LOCK TABLES ON *.* TO 'bkpuser'@'localhost';
    -- 如果需要操作 mysql.backup_process 表
    GRANT CREATE, INSERT, DROP, UPDATE ON mysql.backup_process TO 'bkpuser'@'localhost';
    -- 如果需要创建表空间或进行表级恢复
    GRANT CREATE TABLESPACE ON *.* TO 'bkpuser'@'localhost';
    FLUSH PRIVILEGES;

✅ 方案二:主从复制(Master-Slave)—— 把从库当热备节点

本质:从库 = 实时热备份 + 可读扩展

✔️ 优势:

  • 从库数据几乎实时同步(秒级延迟)
  • 备份直接在 从库 上做,零影响主库性能
  • 主库挂了?秒切从库,服务不中断!

🛠️ 配置关键步骤:

1. 修改 my.cnf(Linux 路径通常为 /etc/my.cnf

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
# 推荐开启 GTID(更健壮,自动处理位置)
gtid_mode = ON
enforce_gtid_consistency = ON

# 可选:只同步特定库(安全)
# binlog-do-db = myapp

2. 重启 MySQL

sudo systemctl restart mysqld

3. 创建复制专用账号(关键!不能用 root)

-- 创建用户(注意:MySQL 8 默认认证插件是 caching_sha2_password)
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'StrongReplPass123!';

-- 授权复制权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%';

-- 刷新权限
FLUSH PRIVILEGES;

💡 为什么不用 root?

  • 安全:最小权限原则
  • 稳定:避免因 root 密码变更导致复制中断

🔧 获取主库当前 binlog 位置(两种方式)

方式 A:使用 Position 模式(传统,兼容老版本)

-- 锁表(短暂只读,几秒)
FLUSH TABLES WITH READ LOCK;

-- 查看位置
SHOW MASTER STATUS;

输出示例:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     154  |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

记下 File = mysql-bin.000003Position = 154

⚠️ 别忘了解锁!

方式 B:使用 GTID 模式(推荐!自动定位,不怕断电)

  • 不需要手动记 position!
  • 只要主从都开了 gtid_mode=ON,从库会自动找最新 GTID

要判断 MySQL 使用的是 ‌Position 模式‌ 还是 ‌GTID 模式‌ 进行主从复制

SHOW VARIABLES LIKE 'gtid_mode';

从库配置(Slave)

1. 修改 my.cnf

[mysqld]
server-id = 2          # 必须唯一!不能和主库一样
relay-log = mysql-relay-bin
read_only = ON         # 防止误写(应用用户仍可写,除非 SUPER 权限)
gtid_mode = ON
enforce_gtid_consistency = ON

2. 重启 MySQL

sudo systemctl restart mysqld

3. 配置主从关系

如果用 Position 模式

CHANGE MASTER TO
  MASTER_HOST='192.168.1.10',
  MASTER_USER='repl',
  MASTER_PASSWORD='StrongReplPass123!',
  MASTER_LOG_FILE='mysql-bin.000003',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;  -- 连不上时每10秒重试

如果用 GTID 模式(更简单!):

CHANGE MASTER TO
  MASTER_HOST='192.168.1.10',
  MASTER_USER='repl',
  MASTER_PASSWORD='StrongReplPass123!',
  MASTER_AUTO_POSITION=1;   -- 关键!自动用 GTID 同步

4. 启动复制

5. 检查状态

✅ 成功标志

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • Seconds_Behind_Master: 0(或很小)

❌ 常见失败原因

  • 网络不通(防火墙没开 3306)
  • 复制账号密码错
  • server-id 重复
  • 主库没开 binlog

 总结两点:

  1. 主库要不要建账号? → 必须建! 且只给 REPLICATION SLAVE 权限
  2. 从库复制位置怎么来? →
    • Position 模式:SHOW MASTER STATUS 手动记录
    • GTID 模式:自动同步,无需记位置(强烈推荐!)