PHP无删除恢复功能,数据删除后只能通过备份还原;需先验证备份存在性、完整性及时间点,再按需整库还原或提取单表/单行INSERT语句回插,还原前须停写入并加锁。
PHP 本身不提供“删除后恢复”功能,DELETE 执行后数据就从数据库中移除了;恢复唯一可行路径是依赖**备份文件还原**——但必须确认你有可用的、时间点合适的备份。
别急着还原,先验证备份是否真实存在、未损坏、覆盖了误删前的时间点:
ls -lh /backup/mysql/ 查看备份目录下是否有近期的 .sql 或 .xz 文件(如 mydb_20250520.sql.xz)xz -t 检查压缩包完整性:xz -t /backup/mysql/mydb_20250520.sql.xz
zcat /backup/mysql/mydb_20250520.sql.xz | head -n 50 | grep -A5 "INSERT INTO \`users\`"
mysqldump 按库导出,但误删的是单张表某几行,还原整库会覆盖其他新数据 —— 此时需从备份中提取对应 INSERT 语句手动回插还原过程中任何新写入都会导致数据混乱。PHP 应用层必须暂停,不能只靠“关掉网站”,要切断真实数据流:
$dbname = 'm
yapp'; 改成 $dbname = 'myapp_OFFLINE';),让所有请求报错退出mysql -e "FLUSH TABLES WITH READ LOCK;" 防止后台任务偷偷写入--single-transaction(InnoDB)或 --lock-all-tables(MyISAM),避免中途被改大多数误删只是 DELETE FROM users WHERE id = 123; 这类操作,没必要还原整个库。直接从备份里捞数据更安全:
zcat /backup/mysql/mydb_20250520.sql.xz | sed -n '/^INSERT INTO `users`/,/^INSERT/p' > users_inserts.sql
awk 或 grep 筛选特定 ID:grep "VALUES (123," users_inserts.sql
mysqldump --skip-insert-values 格式,需补全字段名再执行;否则直接 mysql myapp
utf8mb4 而当前库是 utf8,导入会报错 Incorrect string value,需先 ALTER DATABASE myapp CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
备份不是“做过就完事”的动作。没定期校验、没模拟过还原流程的备份,和没备份一样。尤其 PHP 项目常混用 PDO 直连 + ORM + 缓存,删库命令可能藏在某个 foreach 循环里,而备份窗口又卡在凌晨三点——这些细节比语法更重要。