备份是数据恢复的核心保障,若事先通过mysqldump或xtrabackup创建了备份,可直接还原数据。
适用于单数据库或全量备份,步骤如下:
backup.sql.gz),先解压再导入:gunzip backup.sql.gz # 解压备份文件
mysql -u root -p 数据库名 < backup.sql # 导入备份
mysql -u root -p 目标数据库名 < backup.sql
mysql -u root -p 数据库名 < backup.sql
适用于InnoDB引擎的高性能备份,步骤如下:
systemctl stop mysqld
rm -rf /var/lib/mysql/* # 清空数据目录(默认路径)
innobackupex解析备份(还原事务日志):innobackupex --defaults-file=/etc/my.cnf --apply-log /path/to/backup
innobackupex --defaults-file=/etc/my.cnf --copy-back /path/to/backup
mysql用户,重启服务:chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
若未备份但开启了Binlog(默认开启,可通过SHOW VARIABLES LIKE 'log_bin';确认),可通过Binlog回放恢复指定时间点或时间段的数据。
mysql -u root -p -e "SHOW BINARY LOGS;"
输出示例:+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| mysql-bin.000001 | 1024 |
| mysql-bin.000002 | 2048 |
+-------------------+-----------+
/var/lib/mysql/):mysql -u root -p -e "SHOW VARIABLES LIKE 'log_bin_basename';"
使用mysqlbinlog工具提取特定时间段的SQL语句(避免全量恢复):
mysqlbinlog --start-datetime="2025-10-20 10:00:00" --stop-datetime="2025-10-20 11:00:00" /var/lib/mysql/mysql-bin.000002 > recovery.sql
--start-datetime:误操作开始时间(如误删时间);--stop-datetime:误操作结束时间(如恢复截止时间)。mysql -u root -p 数据库名 < recovery.sql
recovery.sql,找到误操作语句(如DELETE),将其改为INSERT(需确认原数据值):-- 原误操作(删除)
DELETE FROM users WHERE id = 2;
-- 改为插入(恢复)
INSERT INTO users (id, name, age) VALUES (2, 'Bob', 25);
保存后导入:mysql -u root -p 数据库名 < recovery.sql
若以上方法均无效(如无备份、Binlog未开启),可尝试第三方工具,但成功率取决于数据覆盖情况:
wget https://github.com/twindb/undrop-for-innodb/archive/master.zip
unzip master.zip
cd undrop-for-innodb-master
make
./undrop-for-innodb --innodb_data_file_path=/var/lib/mysql/ibdata1 --socket=/var/lib/mysql/mysql.sock --table=test/test_table
注:工具使用前需停止MySQL服务,避免数据进一步覆盖。read_only=ON),防止新数据覆盖旧数据;/var/lib/mysql/),避免恢复失败导致二次丢失;以上方法覆盖了CentOS系统下MySQL数据丢失的常见场景,优先选择备份恢复或Binlog回放,第三方工具作为最后手段。操作前务必确认步骤,避免误操作加剧数据损失。