Ubuntu系统下MySQL数据恢复的常用方法
备份是数据恢复的基础,若事先通过mysqldump或物理备份创建了备份,可直接还原数据。
/home/user/backup.sql或/var/lib/mysql_backup/目录);sudo systemctl stop mysql;mysql -u root -p 数据库名 < /path/to/backup.sql;/var/lib/mysql_backup/中的.ibd、.frm文件),先备份当前数据目录:sudo cp -R /var/lib/mysql /var/lib/mysql_old,再删除旧目录并复制备份文件:sudo rm -rf /var/lib/mysql/*、sudo cp -R /var/lib/mysql_backup/* /var/lib/mysql/,最后修改权限:sudo chown -R mysql:mysql /var/lib/mysql;sudo systemctl start mysql;mysql -u root -p -e "USE 数据库名; SHOW TABLES;"。若开启了Binlog(默认开启),可通过解析日志提取误操作前的数据,实现精准恢复。
log_bin参数开启(执行SHOW VARIABLES LIKE 'log_bin';,返回ON则表示开启)。SHOW BINARY LOGS;(记录了所有数据修改操作的日志文件);mysqlbinlog --start-datetime="2025-XX-XX HH:MM:SS" --stop-datetime="2025-XX-XX HH:MM:SS" /var/lib/mysql/mysql-bin.0000XX > recovery.sql(替换为实际时间范围和Binlog文件名);recovery.sql,将DELETE语句改为INSERT(或删除误操作语句),例如将### DELETE FROM 表名 WHERE id=1改为INSERT INTO 表名 VALUES (1, '数据');;mysql -u root -p 数据库名 < recovery.sql;InnoDB引擎的事务日志(redo log)可恢复未提交或已提交但未刷盘的 transaction,适用于近期误操作。
sudo systemctl stop mysql;innobackupex工具(需安装Percona XtraBackup)准备恢复:innobackupex --apply-log /path/to/backup(解析事务日志);innobackupex --copy-back /path/to/backup --datadir=/var/lib/mysql;sudo chown -R mysql:mysql /var/lib/mysql;sudo systemctl start mysql;若未备份且Binlog未开启,可尝试第三方工具扫描数据库文件碎片恢复数据(成功率取决于数据覆盖情况)。
/var/lib/mysql/中的数据文件;若数据未丢失但表无法访问(如.frm文件损坏),可使用mysqlcheck工具修复。
mysql -u root -p -e "CHECK TABLE 数据库名.表名;"(返回Error表示损坏);mysqlcheck --all-databases --auto-repair -u root -p(修复所有数据库的损坏表);mysql -u root -p -e "USE 数据库名; SHOW TABLES;"。mysqldump备份(mysqldump -u root -p 数据库名 > /path/to/backup_$(date +%F).sql),并将备份文件存储到异地;/etc/mysql/mysql.conf.d/mysqld.cnf,添加log_bin = mysql-bin,重启MySQL服务;