MySQL备份与恢复

一、数据备份的重要性

1. 备份的核心作用:灾难恢复

备份不是"多此一举",而是应对突发情况的"救命稻草"。当数据因为各种原因丢失时,备份文件能让你把数据库恢复到之前的状态,避免业务中断。

2. 这些情况会导致数据丢失(一定要警惕)

  • 人为操作错误:误删表、误修改数据、执行了错误的SQL语句(比如不小心删了整个数据库);
  • 程序错误:代码bug导致数据写入异常、系统崩溃;
  • 硬件故障:服务器硬盘损坏、内存故障、电源中断;
  • 灾难与安全问题:火灾、地震等自然灾害,或者黑客攻击、勒索病毒加密数据。

3. 数据丢失的后果有多严重?

  • 电商平台:丢失订单数据,无法核对交易,客户投诉不断;
  • 企业办公:客户资料丢失,业务无法推进;
  • 金融机构:交易记录缺失,可能面临监管处罚和客户索赔。

所以,备份不是"可选操作",而是"必须操作"------哪怕是小公司,也不能忽视。

二、数据库备份类型

MySQL备份主要分两大类:物理备份逻辑备份。简单说,物理备份是"复制数据库的物理文件",逻辑备份是"导出数据库的SQL语句",两者各有适用场景。

2.1 物理备份:直接备份数据库文件

物理备份针对的是MySQL的物理文件(比如数据文件、日志文件),就像"复制电脑里的文件夹"一样,备份和恢复速度都比较快,适合大型数据库。它又分为3种:

2.1.1 冷备份(脱机备份)
  • 通俗理解:先关掉MySQL服务,再复制数据库文件,相当于"关了商店门,再盘点货架上的商品"。
  • 操作工具 :Linux系统的tar命令(打包文件)。
  • 优点:简单粗暴,不用额外工具,备份文件完整,恢复也快;
  • 缺点:必须关闭数据库,会影响业务(比如电商平台不能半夜关服务就不适合);
  • 适用场景:可接受停机维护的系统(比如内部办公系统、小型网站,适合在半夜10点到凌晨5点之间操作)。
2.1.2 热备份(联机备份)
  • 通俗理解:MySQL正常运行、业务正常开展的情况下备份,相当于"商店正常营业,店员悄悄盘点商品"。
  • 操作工具:第三方工具(如Percona XtraBackup、mysqlbackup)。
  • 优点:不影响业务,能实现24小时不间断服务(比如电商、金融平台必备);
  • 缺点:配置复杂,需要额外工具,会消耗服务器资源(比如占用CPU、内存);
  • 适用场景:不能停机的高可用系统(如淘宝、银行APP的数据库)。
2.1.3 温备份
  • 通俗理解:备份时数据库不关闭,但禁止写入数据(只能读),相当于"商店正常开门,顾客能看商品但不能买,店员盘点"。
  • 操作工具 :MySQL自带的mysqldump命令。
  • 优点:不用关服务,对业务影响小(只是短暂不能写入);
  • 缺点:备份期间不能新增/修改数据,适合业务低峰期操作;
  • 适用场景:可容忍短暂"只读"的业务(比如论坛、资讯网站,备份时用户不能发帖但能看内容)。

2.2 逻辑备份:导出SQL语句

逻辑备份不碰物理文件,而是把数据库的表结构、数据转换成SQL语句,备份成.sql文件,就像"把书本内容抄下来,后续可以重新抄回书本"。它主要分3种策略:

2.2.1 完全备份
  • 通俗理解:每次都备份整个数据库的所有表结构和数据,相当于"把整个衣柜的衣服都打包,不管之前有没有备份过"。
  • 操作方式 :用mysqldump导出所有库/表,或用tar打包物理文件;
  • 优点:恢复最简单,直接用备份文件就能还原,不用依赖其他文件;
  • 缺点:备份文件大(重复数据多),占用磁盘空间,备份时间长(比如100G的数据库,备份可能要几小时);
  • 适用场景:数据量小的数据库(比如几G的小型网站),或作为基础备份(后续增量/差异备份都基于它)。
2.2.2 差异备份
  • 通俗理解:只备份"上次完全备份之后"修改或新增的数据,相当于"上次打包了整个衣柜,这次只打包新增的、或换下来的衣服"。
  • 优点:备份文件比完全备份小,备份速度快;
  • 缺点:恢复时需要先恢复上次的完全备份,再恢复最新的差异备份(两步走);
  • 适用场景:数据量中等的业务(比如10-50G的数据库),不想频繁做完全备份的情况。
2.2.3 增量备份
  • 通俗理解:只备份"上次备份(不管是完全还是增量)之后"修改或新增的数据,相当于"上次打包了新增衣服,这次只打包这期间又新增的衣服"。
  • 优点:备份文件最小,占用空间少,备份速度最快(比如每天增量备份只要几分钟);
  • 缺点:恢复最复杂,需要按顺序恢复"完全备份 + 所有增量备份"(比如完全备份是周一,周二到周五是增量,恢复时要先还原周一的,再依次还原周二到周五的);如果中间某个增量备份文件损坏,后续数据就没法恢复;
  • 适用场景:数据量大、更新频繁的数据库(比如100G以上的电商数据库)。

2.3 备份策略对比表

备份方式 空间占用 恢复速度 恢复复杂度 适用场景
完全备份 高(重复数据多) 快(一步还原) 低(直接用备份文件) 小型数据库、基础备份
差异备份 中(只存上次完全备份后的数据) 中(两步还原:完全+差异) 中(需要两个文件) 中型业务系统
增量备份 低(只存上次备份后的数据) 慢(多步还原:完全+所有增量) 高(依赖完整备份链) 大型高频更新系统

推荐备份策略(新手直接用)

  • 完全备份:每周1次,选业务低峰期(比如周日凌晨2点);
  • 增量备份:每天1次(比如凌晨3点);
  • 额外空间:用NFS(网络文件存储)给MySQL服务器分配专门的备份空间,避免备份文件占满业务磁盘。

三、常见备份方法

3.1 物理冷备:用tar命令打包文件

这是最直接的物理备份方法,适合小型数据库,步骤简单:

  1. 关闭MySQL服务 :确保备份时没有数据写入,命令:

    bash 复制代码
    systemctl stop mysqld  # Linux系统命令,Windows用net stop mysql
  2. 打包数据库文件 :MySQL的数据文件默认存在/usr/local/mysql/data/(Linux),用tar打包压缩:

    bash 复制代码
    tar zcvPf /opt/mysql_all_$(date +%F).tar.gz /usr/local/mysql/data/
    • 解释参数:z(压缩)、c(创建打包文件)、v(显示备份过程)、P(保留文件绝对路径)、f(指定备份文件名);
    • 备份文件名带日期(比如mysql_all_2025-09-16.tar.gz),方便后续区分。
  3. 启动MySQL服务 :备份完成后,重新开启服务:

    bash 复制代码
    systemctl start mysqld
  4. 恢复方式 :如果数据丢失,关闭服务后,解压备份文件覆盖原数据目录即可:

    bash 复制代码
    tar zxvPf /opt/mysql_all_2025-09-16.tar.gz -C /usr/local/mysql/
    • x(解压)、C(指定解压到的目录)。

3.2 专用备份工具:mysqldump或mysqlhotcopy

这两个是MySQL自带的备份工具,主打逻辑备份,新手优先学mysqldump(支持所有存储引擎,比如InnoDB)。

3.2.1 mysqldump(温备份,推荐)
  • 支持备份单个库、多个库、所有库,还能只备份表结构;
  • 备份后生成SQL文件,跨平台通用(比如Windows备份的文件能在Linux上恢复)。
3.2.2 mysqlhotcopy(仅支持特定存储引擎)
  • 只能备份MyISAM和ARCHIVE引擎的表(现在InnoDB是主流引擎,用得少);
  • 备份速度比mysqldump快,但适用范围窄,新手可以暂时不用学。

3.3 二进制日志增量备份

增量备份的核心依赖MySQL的"二进制日志"(binlog),这个日志会记录所有修改数据的SQL语句(比如插入、修改、删除),相当于数据库的"操作日记"。

关键前提:开启二进制日志
  1. 编辑MySQL配置文件(Linux:/etc/my.cnf,Windows:my.ini):

    ini 复制代码
    [mysqld]
    log-bin=mysql-bin  # 开启二进制日志,日志文件名为mysql-bin.000001、mysql-bin.000002...
    binlog_format = MIXED  # 日志格式(推荐混合模式)
    server-id = 1  # 数据库服务器ID(主从复制时必填,单服务器可加可不加)
  2. 重启MySQL服务,让配置生效:

    bash 复制代码
    systemctl restart mysqld
  3. 验证是否开启成功:登录MySQL,执行命令:

    sql 复制代码
    SHOW VARIABLES LIKE 'log_bin';
    • 如果结果中ValueON,说明开启成功。
二进制日志的3种格式(新手记MIXED就行)
格式 通俗理解 优点 缺点
STATEMENT(基于SQL语句) 记录执行的SQL语句(比如"删除id=1的数据") 日志文件小,备份快 高并发时可能数据不一致(比如函数执行结果不同)
ROW(基于行) 记录数据行的变化(比如"把id=1的名字从A改成B") 数据一致性高,恢复准确 日志文件大(全表更新时日志会暴涨)
MIXED(混合模式) 普通SQL用STATEMENT,函数/复杂操作用ROW 兼顾速度和准确性 无明显缺点,推荐使用

3.4 第三方工具:专业热备份方案

如果需要热备份(不影响业务),可以用第三方工具,新手推荐Percona XtraBackup(免费开源):

  • 支持InnoDB引擎,备份时不锁表、不影响业务;
  • 能实现完全备份和增量备份,恢复速度快;
  • 适合中大型数据库(比如50G以上)。

四、MySQL完全备份

完全备份是所有备份策略的基础,不管后续做差异还是增量备份,都要先做一次完全备份。

4.1 核心特点

  • 备份内容:整个数据库的表结构、数据、文件结构;
  • 备份结果:保存备份完成时刻的数据库状态;
  • 核心作用:是差异备份、增量备份的"基础包",恢复时必须先还原完全备份。

4.2 优缺点分析

优点 缺点
恢复简单:直接用备份文件还原,不用依赖其他文件 空间占用大:重复数据多,比如10G数据库,每次备份都占10G
数据完整:备份文件包含所有数据,无依赖 备份时间长:数据量大时,备份可能要几小时
操作简单:不用复杂配置,新手也能搞定 恢复时间长:大文件解压、导入耗时久

五、数据库完全备份分类

完全备份主要分两种:物理冷备(tar打包)和mysqldump备份(SQL文件),下面详细说操作步骤。

5.1 物理冷备份与恢复(适合小型数据库)

备份步骤(Linux系统)
  1. 登录服务器,切换到root用户(避免权限不足);

  2. 关闭MySQL服务:

    bash 复制代码
    systemctl stop mysqld
  3. 查看数据目录路径(确认文件位置):

    bash 复制代码
    ls /usr/local/mysql/data/  # 正常会看到数据库名对应的文件夹
  4. 打包备份数据目录:

    bash 复制代码
    tar zcvPf /opt/mysql_all_$(date +%F).tar.gz /usr/local/mysql/data/
    • 备份文件存在/opt/目录下,文件名带日期(比如mysql_all_2025-09-16.tar.gz);
  5. 启动MySQL服务:

    bash 复制代码
    systemctl start mysqld
  6. 验证备份:查看/opt/目录下是否有备份文件,命令:

    bash 复制代码
    ls /opt/ | grep mysql_all_
恢复步骤(数据丢失后)
  1. 关闭MySQL服务:

    bash 复制代码
    systemctl stop mysqld
  2. 备份当前数据目录(防止误操作覆盖,可选但推荐):

    bash 复制代码
    mv /usr/local/mysql/data/ /opt/data_bak/
  3. 解压备份文件到原数据目录:

    bash 复制代码
    tar zxvPf /opt/mysql_all_2025-09-16.tar.gz -C /usr/local/mysql/
    • 注意:-C后面的路径是/usr/local/mysql/,不是/usr/local/mysql/data/(因为备份时包含了data目录);
  4. 授权数据目录(避免MySQL权限不足):

    bash 复制代码
    chown -R mysql:mysql /usr/local/mysql/data/
  5. 启动MySQL服务:

    bash 复制代码
    systemctl start mysqld
  6. 验证恢复:登录MySQL,查看数据库是否存在:

    sql 复制代码
    SHOW DATABASES;  # 能看到备份时的数据库,说明恢复成功

5.2 mysqldump备份与恢复(温备份,推荐新手)

mysqldump是MySQL自带的工具,不用额外安装,支持备份单个库、多个库、所有库,还能只备份表结构,非常灵活。

核心语法
bash 复制代码
mysqldump -u 用户名 -p[密码] [参数] 库名/表名 > 备份文件路径.sql
  • 注意:-p和密码之间可以不加空格(比如-p123456),也可以加空格后手动输入密码(更安全);
  • 备份文件后缀用.sql,方便识别。
常见备份场景(实战案例)
场景1:备份单个数据库(含所有表)

比如备份名为szsxjd的数据库:

bash 复制代码
mysqldump -u root -p --databases szsxjd > /opt/szsxjd_2025-09-16.sql
  • 参数--databases:表示备份整个数据库(包含创建数据库的SQL语句);
  • 执行后会提示输入密码,输入正确后开始备份;
  • 备份文件:/opt/szsxjd_2025-09-16.sql
场景2:备份多个数据库

比如同时备份mysql(系统库)和szsxjd(业务库):

bash 复制代码
mysqldump -u root -p --databases mysql szsxjd > /opt/mysql_szsxjd_2025-09-16.sql
场景3:备份数据库中的部分表

比如备份szsxjd库中的info1info2表:

bash 复制代码
mysqldump -u root -p szsxjd info1 info2 > /opt/szsxjd_info1_info2.sql
  • 注意:这里没加--databases,备份文件中没有"创建数据库"的语句,恢复时要先手动创建数据库。
场景4:只备份表结构(不备份数据)

比如备份szsxjd库中info1表的结构(用于搭建测试环境):

bash 复制代码
mysqldump -u root -p -d szsxjd info1 > /opt/szsxjd_info1_struct.sql
  • 参数-d:仅备份表结构,不包含数据。
场景5:备份所有数据库(整个MySQL服务器)
bash 复制代码
mysqldump -u root -p --all-databases > /opt/mysql_all_2025-09-16.sql
  • 适合备份小型服务器(数据库数量少)。
查看备份文件(验证是否备份成功)

备份后的SQL文件是文本格式,可以用命令查看内容(过滤注释和空行,更清晰):

bash 复制代码
grep -v "^--" /opt/szsxjd_info1_info2.sql | grep -v "^/" | grep -v "^$"
  • 能看到CREATE TABLE(表结构)和INSERT INTO(数据)语句,说明备份成功。
mysqldump恢复步骤

恢复的核心是"把SQL文件中的语句重新执行一遍",有两种方法,新手推荐第一种。

方法1:用mysql命令恢复(命令行执行)
情况1:备份时加了--databases(含创建数据库语句)

比如恢复szsxjd库:

  1. 直接执行以下命令(不用手动创建数据库):

    bash 复制代码
    mysql -u root -p < /opt/szsxjd_2025-09-16.sql
  2. 输入密码后,等待执行完成;

  3. 验证:登录MySQL,查看数据库和表:

    sql 复制代码
    SHOW DATABASES;  # 有szsxjd库
    USE szsxjd;
    SHOW TABLES;     # 有备份的表
    SELECT * FROM info1;  # 能看到数据,恢复成功
情况2:备份时没加--databases(不含创建数据库语句)

比如恢复szsxjd库中的info1info2表:

  1. 先登录MySQL,手动创建数据库(如果已删除):

    sql 复制代码
    CREATE DATABASE IF NOT EXISTS szsxjd;
    exit;  # 退出MySQL
  2. 执行恢复命令(指定数据库):

    bash 复制代码
    mysql -u root -p szsxjd < /opt/szsxjd_info1_info2.sql
  3. 验证:登录MySQL查看表和数据即可。

方法2:用source命令恢复(MySQL内部执行)
  1. 登录MySQL:

    bash 复制代码
    mysql -u root -p
  2. 执行source命令,指定备份文件路径:

    sql 复制代码
    source /opt/szsxjd_2025-09-16.sql;
  3. 等待执行完成,验证数据即可;

  • 优点:执行过程中会显示进度(比如"Query OK, 1 row affected"),方便排查问题。
关键注意事项
  • 恢复前一定要备份当前数据:比如先执行mysqldump -u root -p szsxjd > /opt/szsxjd_bak.sql,避免恢复错误覆盖现有数据;
  • 恢复时确保目标数据库不存在,或数据已备份:如果数据库已存在,恢复会覆盖原有表(不会删除未备份的表);
  • 执行大文件恢复时,不要中断命令:比如10G的SQL文件,恢复可能要几小时,中断后需要重新执行。

六、实战案例

下面用一个完整的例子,带你体验"环境准备→完全备份→增量备份→恢复"的全流程,跟着做就能上手。

6.1 环境准备(先搭建测试环境)

  1. 登录MySQL,创建测试数据库和表:

    sql 复制代码
    -- 创建数据库szsxjd
    CREATE DATABASE szsxjd;
    -- 使用该数据库
    USE szsxjd;
    -- 创建表info1
    CREATE TABLE IF NOT EXISTS info1 (
      id INT(4) NOT NULL AUTO_INCREMENT,  -- 自增ID
      name VARCHAR(10) NOT NULL,         -- 姓名
      age CHAR(10) NOT NULL,             -- 年龄
      hobby VARCHAR(50),                 -- 爱好
      PRIMARY KEY (id)                   -- 主键ID
    );
    -- 插入测试数据
    INSERT INTO info1 VALUES(1,'user1',20,'running');
    INSERT INTO info1 VALUES(2,'user2',30,'singing');
    -- 再创建一个表info2
    CREATE TABLE info2 (id INT, name CHAR(10), age INT, sex CHAR(4));
    INSERT INTO info2 VALUES(1,'user',11,'男');
    INSERT INTO info2 VALUES(2,'user',11,'女');
  2. 验证环境:

    sql 复制代码
    SELECT * FROM info1;
    SELECT * FROM info2;
    • 能看到插入的数据,说明环境搭建成功。

6.2 完全备份与恢复

6.2.1 物理冷备恢复(实战)
  1. 关闭MySQL服务:

    bash 复制代码
    systemctl stop mysqld
  2. 打包备份数据目录:

    bash 复制代码
    tar zcvPf /opt/mysql_all_2025-09-16.tar.gz /usr/local/mysql/data/
  3. 模拟数据丢失:删除数据目录(危险操作,仅测试用):

    bash 复制代码
    mv /usr/local/mysql/data/ /opt/data_old/
  4. 恢复备份:

    bash 复制代码
    tar zxvPf /opt/mysql_all_2025-09-16.tar.gz -C /usr/local/mysql/
  5. 授权并启动服务:

    bash 复制代码
    chown -R mysql:mysql /usr/local/mysql/data/
    systemctl start mysqld
  6. 验证恢复:登录MySQL,查看szsxjd库的表和数据,确认和之前一致。

6.2.2 mysqldump备份与恢复(温备份实战)
  1. 备份szsxjd库(含所有表):

    bash 复制代码
    mysqldump -u root -p --databases szsxjd > /opt/szsxjd_2025-09-16.sql
  2. 模拟数据丢失:删除szsxjd库:

    sql 复制代码
    DROP DATABASE szsxjd;
  3. 恢复备份:

    bash 复制代码
    mysql -u root -p < /opt/szsxjd_2025-09-16.sql
  4. 验证恢复:登录MySQL,查看szsxjd库是否存在,表和数据是否完整。

6.2.3 MySQL完全恢复(补充:免交互备份)

生产环境中,可能需要定时自动备份(不用手动输入密码),可以这样配置:

  1. 创建备份脚本backup.sh

    bash 复制代码
    #!/bin/bash
    # 备份文件名:库名_日期.sql
    BACKUP_FILE="/opt/szsxjd_$(date +%Y%m%d).sql"
    # 执行备份(密码直接写在命令中,注意权限,避免别人看到)
    /usr/local/mysql/bin/mysqldump -u root -p123456 --databases szsxjd > $BACKUP_FILE
    # 刷新二进制日志(为增量备份做准备)
    /usr/local/mysql/bin/mysqladmin -u root -p123456 flush-logs
  2. 给脚本授权:

    bash 复制代码
    chmod +x backup.sh
  3. 定时执行(用crontab):每周六凌晨1点执行:

    bash 复制代码
    crontab -e

    输入以下内容(保存退出):

    复制代码
    0 1 * * 6 /root/backup.sh
    • 解释:0 1 * * 6 表示"每周六凌晨1点0分执行"。

6.3 MySQL增量备份与恢复

增量备份基于完全备份和二进制日志,下面一步步做:

6.3.1 MySQL数据库增量恢复类型
  • 一般恢复:恢复所有二进制日志中的操作(比如恢复到最新状态);
  • 基于位置恢复:跳过错误操作(比如误删数据的SQL语句,找到它的位置,恢复时跳过);
  • 基于时间点恢复:跳过某个时间段的操作(比如某分钟内执行了错误操作,恢复时跳过该时间段)。
6.3.2 MySQL增量备份(步骤)
6.3.2.1 开启二进制日志(已在前面讲过,这里验证)
  1. 确认配置:

    bash 复制代码
    cat /etc/my.cnf | grep -E "log-bin|binlog_format"
    • 能看到log-bin=mysql-binbinlog_format=MIXED,说明配置正确;
  2. 重启MySQL(如果没重启过):

    bash 复制代码
    systemctl restart mysqld
6.3.2.2 进行完全备份(增量备份的基础)

先做一次完全备份(比如备份szsxjd库):

bash 复制代码
mysqldump -u root -p --databases szsxjd > /opt/szsxjd_full_2025-09-16.sql
6.3.2.3 生成新的二进制日志文件(开始增量备份)

刷新二进制日志,生成新的日志文件(后续操作会记录在新文件中):

bash 复制代码
mysqladmin -u root -p flush-logs
  • 执行后,MySQL会生成新的日志文件(比如之前是mysql-bin.000001,现在生成mysql-bin.000002)。
6.3.2.4 插入新数据(模拟业务更新)

登录MySQL,插入新数据(这些操作会记录在mysql-bin.000002中):

sql 复制代码
USE szsxjd;
-- 给info1表插入新数据
INSERT INTO info1 VALUES(3,'user3',25,'swimming');
INSERT INTO info1 VALUES(4,'user4',35,'reading');
-- 创建新数据库和表(模拟新增业务)
CREATE DATABASE yjs0805;
USE yjs0805;
CREATE TABLE test1 (id INT(4), name VARCHAR(4));
INSERT INTO test1 VALUES(1,'one');
INSERT INTO test1 VALUES(2,'two');
6.3.2.5 再次生成新的二进制日志文件

再刷新一次日志,把刚才的增量数据"定格"在mysql-bin.000002中:

bash 复制代码
mysqladmin -u root -p flush-logs
  • 后续操作会记录在mysql-bin.000003中,方便区分增量数据。
6.3.3 MySQL增量恢复(实战)
6.3.3.1 一般恢复(恢复所有增量数据)

模拟场景:完全备份后,新增的数据丢失了(比如误删了yjs0805库和info1表的新数据),需要恢复。

  1. 模拟数据丢失:

    sql 复制代码
    DROP DATABASE yjs0805;
    DELETE FROM szsxjd.info1 WHERE id > 2;  -- 删除id=3、4的数据
  2. 先恢复完全备份(回到2025-09-16的状态):

    bash 复制代码
    mysql -u root -p < /opt/szsxjd_full_2025-09-16.sql
  3. 恢复增量数据(二进制日志mysql-bin.000002中的操作):

    bash 复制代码
    mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p
    • 解释:mysqlbinlog是解析二进制日志的工具,--no-defaults避免字符集错误,把解析后的SQL语句通过管道符(|)传给mysql执行;
  4. 验证恢复:

    sql 复制代码
    SELECT * FROM szsxjd.info1;  -- 能看到id=3、4的数据
    SHOW DATABASES;              -- 能看到yjs0805库
    SELECT * FROM yjs0805.test1; -- 能看到test1表的数据
6.3.3.2 基于位置恢复(跳过错误操作)

模拟场景:增量备份中,有一条错误的SQL(比如误删了test1表的数据),需要恢复时跳过这条错误操作。

  1. 先查看二进制日志,找到错误操作的位置:

    bash 复制代码
    mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002 > /opt/binlog.txt
    • 把日志解析成文本文件,方便查看;
  2. 打开文本文件,查找错误操作:

    bash 复制代码
    cat /opt/binlog.txt
    • 假设找到以下内容(示例):

      复制代码
      # at 1417  -- 操作开始位置
      #250916 19:30:04  -- 操作时间
      DELETE FROM yjs0805.test1;  -- 错误操作(误删表数据)
      # at 1712  -- 操作结束位置
  3. 模拟数据丢失:

    sql 复制代码
    DROP DATABASE yjs0805;
    DELETE FROM szsxjd.info1 WHERE id > 2;
  4. 恢复完全备份:

    bash 复制代码
    mysql -u root -p < /opt/szsxjd_full_2025-09-16.sql
  5. 基于位置恢复(跳过错误操作,恢复到1417之前,再从1712之后恢复):

    bash 复制代码
    # 恢复到错误操作之前(at 1417之前)
    mysqlbinlog --no-defaults --stop-position='1417' /opt/mysql-bin.000002 | mysql -u root -p
    # 恢复错误操作之后(at 1712之后)
    mysqlbinlog --no-defaults --start-position='1712' /opt/mysql-bin.000002 | mysql -u root -p
  6. 验证恢复:yjs0805.test1表的数据没有被删除,szsxjd.info1的id=3、4数据正常。

6.3.3.3 基于时间点恢复(跳过错误时间段)

和基于位置恢复类似,只是用"时间"代替"位置"。

  1. 查看二进制日志中的时间点(从binlog.txt中找):

    • 假设错误操作的时间是2025-09-16 19:30:04
  2. 恢复时跳过该时间点:

    bash 复制代码
    # 恢复到错误时间之前
    mysqlbinlog --no-defaults --stop-datetime='2025-09-16 19:30:00' /opt/mysql-bin.000002 | mysql -u root -p
    # 恢复错误时间之后
    mysqlbinlog --no-defaults --start-datetime='2025-09-16 19:30:05' /opt/mysql-bin.000002 | mysql -u root -p
  3. 验证恢复:错误操作被跳过,数据正常。

总结

MySQL备份与恢复的核心逻辑很简单:"备份是基础,日志是补充,恢复是目的"

相关推荐
一过菜只因1 小时前
MySql Jdbc
android·数据库·mysql
思成不止于此2 小时前
MySQL 查询实战(三):排序与综合练习
数据库·笔记·学习·mysql
茅坑的小石头2 小时前
数据库表设计,概念模型、逻辑模型、物理模型的区别,目标、主要内容、所处阶段、面向人群,数据库无关性
数据库
tebukaopu1482 小时前
mysql数据备份还原
数据库·mysql
zyxqyy&∞2 小时前
mysql代码小练-2
数据库·mysql
JIngJaneIL2 小时前
基于Java非遗传承文化管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
+VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue心理健康管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
poemyang3 小时前
像Git一样管理数据:深入解析数据库并发控制MVCC的实现
mysql·事务·mvcc
only-qi4 小时前
Redis如何应对 Redis 大 Key 问题
数据库·redis·缓存