MySQL - 数据误删恢复

90 阅读2分钟

希望你永远用不到

写在前面

首先,在手写SQL删除和修改数据时记得做备份以防万一,另外,大多数情况下一定要记得带where条件

在配置MySQL时一定要在配置文件中启动binlog日志,这个点也重要

[mysqld]

log-bin                                   =     mysql-bin # 启用二进制日志记录
binlog_format                             =     mixed # [mixed | row | statement] 二进制日志记录格式

恢复过程演示

mysql> select count(id) from ws_chat_msg;
+-----------+
| count(id) |
+-----------+
|       160 |
+-----------+
1 row in set (0.01 sec)

# 可以看到我们表内当前是有数据的

mysql> delete from ws_chat_msg;
Query OK, 160 rows affected (0.01 sec)

mysql> select count(id) from ws_chat_msg;
+-----------+
| count(id) |
+-----------+
|         0 |
+-----------+
1 row in set (0.00 sec)
# 此时因为错误的执行了一条没有带wheredelete语句导致数据被全删掉了

mysql> show master status;
+------------------+-----------+--------------+------------------+-------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000006 | 183197009 |              |                  |                   |
+------------------+-----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
# 恢复数据前先要找到当前的日志文件,从上面的结果可以看到当前的日志文件名是mysql-bin.000006

[root@localhost ~] mysqlbinlog --no-defaults --stop-datetime="2023-07-13 17:59:00" [mysqldatadir]/mysql-bin.000006 > sqldump.sql

# mysqldatadir如果不知道路径可以在/etc/my.cnf文件里找到

# 运行过程需要一点时间,耐心等级结果即可

上面的恢复命令中我为了不影响生产库的继续运行把数据导入到了一个SQL文件中,然后把数据导入另外一个新的库中再去恢复数据,当然你也可以在当前的数据库恢复数据,但我非常不建议你这么做,因为恢复过程中新产生的数据也会被回滚

  • 在当前库进行恢复
[root@localhost ~] mysqlbinlog --no-defaults --stop-datetime="2023-07-13 17:15:00" [mysqldatadir]/mysql-bin.000006 | mysql -f -D [数据库名称]
  • 在新库中进行恢复(推荐)
mysql> CREATE DATABASE dbname
    ->     CHARACTER SET utf8mb4
    ->     COLLATE utf8mb4_general_ci;
# 在mysql里新建一个库

[root@localhost ~] mysql -D dbname < ./sqldump.sql