Mysql 备份与还原
目录
前言
数据备份是非常重要的。程序错误 人为操作错误 运算错误 磁盘故障 灾难 (如火灾、地震)这些好事玩意被你遇上了,其实也没啥事毕竟只要不是故意给人家数据全删了基本也就是离职了。换个地方混日子也行。但是对企业是很大的损失,所以mysql的备份和还原还是重要的。
数据库备份类型
物理备份
冷备份 (脱机备份) :是在关闭数据库的时候进行的(tar)
热备份 (联机备份) :数据库处于运行状态,依赖于数据库的日志文件
逻辑备份
也不会占用额外的磁盘空间 恢复数据,需要按照次序恢复完全备份和增量备份的数据
常见的备份方法
MySQL 备份与恢复实战
环境准备
-- 创建测试数据库CREATE DATABASE szsxjd ;USE szsxjd;-- 创建测试表CREATE TABLE IF NOT EXISTS info1 (id INT ( 4 ) NOT NULL AUTO_INCREMENT,name VARCHAR ( 10 ) NOT NULL ,age CHAR ( 10 ) NOT NULL ,hobby VARCHAR ( 50 ),PRIMARY KEY (id));-- 插入测试数据INSERT INTO info1 VALUES ( 1 , 'user1' , 20 , 'running' );INSERT INTO info1 VALUES ( 2 , 'user2' , 30 , 'singing' );
准备工作目录,在服务器规划统一的备份存储路径,避免权限混乱。
# 创建备份目录
mkdir -p /opt/mysql_backup
# 赋予当前用户或mysql用户权限(根据实际运行用户调整)
chown -R mysql:mysql /opt/mysql_backup
物理冷备份与恢复
备份操作
# 1. 停止 MySQL 服务systemctl stop mysqld# 2. 压 缩备份 数 据 目 录 (注 意 保 留权 限)tar zcvpF /opt/mysql_all_$( date +%F).tar.gz /usr/local/mysql/data/# 3. 移走原数 据 目 录 (防止 恢复 时冲 突 )mv /usr/local/mysql/data/ /opt/data_backup_$( date +%F)
恢复操作
# 1. 解压备份文件到 MySQL 安装目 录tar xzvpF /opt/mysql_all_2025-09-15.tar.gz -C /usr/local/mysql/# 2. 启动 MySQL 服务systemctl start mysqld
mysqldump 逻辑备份与恢复
最常用的逻辑备份工具,支持在线备份(温备份)。
备份命令

恢复命令
# 恢复指定库(需提前创建库,若备份时未带 --databases )mysql -u root -p szsxjd < /opt/szsxjd.sql# 恢复全量(备份时带 --databases 或 --all-databases ,无需指 定 库名)mysql -u root -p < /opt/all_db.sql
-- 登录 MySQL 后执行source / opt / szsxjd . sql ;
演示如下
1.实验表格

2.删除表格模拟数据丢失的环境

3.恢复表格![]()
4.验证结果
增量备份与恢复(Binlog)!重点内容
开启二进制日志功能
编辑配置文件开启二进制日志
vim /etc/my.cnf[mysqld]log-bin=mysql-binbinlog_format = MIXED # 可选,指定二进制日志 (binlog) 的记录格式为 MIXED (混合输入)server-id = 1 # 可加可不加该命令# 二进制日志 (binlog) 有 3 种不同的记录格式 : STATEMENT ( 基于 SQL 语句 ) 、 ROW( 基于行 ) 、 MIXED( 混合模式 ) ,默认格式是 STATEMENT
重启mysql服务使得配置生效,登录 MySQL 输入 SHOW MASTER STATUS;,如果有输出文件名(如 mysql-bin.000001),说明开启成功。

做一次全量备份 (基准点)
mysqldump -u root -p --databases szsxjd > /opt/szsxjd_full.sql
刷新日志,生成新的 Binlog 文件:
mysqladmin -u root -p flush-logs
模拟产生增量数据:
mysql -u root -p -e "USE szsxjd; INSERT INTO info1 VALUES (3, 'user3', 25, 'swimming');"
再次刷新日志 (可选,用于切割日志):
mysqladmin -u root -p flush-logs
查看 Binlog 内容
我们需要找到刚才插入 user3 的位置点。
# 查看 binlog 内容 (路径通常在数据目录 /usr/local/mysql/data 下)
mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000002
关注输出中的信息:
at 302 (起始位置)
end_log_pos 623 (结束位置)
#250915 10:30:00 (时间戳,请根据实际输出调整)

恢复操作演示
场景 A:全量恢复 (重放所有日志)
日志显示事务开始于 pos 302,结束于 pos 464 (Xid = 36)。
mysqlbinlog --no-defaults \ --stop-position=464 \ /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p szsxjd
--stop-position=464 告诉 MySQL 只重放截止到第 464 字节的操作,这正好是插入 user3 并提交的位置
场景 b:基于 Time (时间点) 的恢复
日志中该操作的时间戳为 260804 21:17:18。
mysqlbinlog --no-defaults \ --stop-datetime="2026-08-04 21:17:18" \ /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p szsxjd
场景 c:跳过误操作 (断点恢复)
user3 的操作在 pos 464 结束,下一个操作(Rotate)从 pos 464 开始。
mysqlbinlog --no-defaults \ --start-position=464 \ /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p szsxjd

总结
逻辑备份 (mysqldump) 适合做全库或单表的定期备份,恢复简单。
增量备份 (Binlog) 必须配合全量备份使用,用于恢复全量备份之后产生的数据,可以实现精确到秒级或事务级的恢复。
路径注意:请确保你的 CentOS 虚拟机中 MySQL 的数据目录路径正确(通常为 /usr/local/mysql/data),否则 mysqlbinlog 命令会报错找不到文件。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)