DROP TABLE 是最危险的 DDL 操作,应先重命名隔离观察 3–7 天确认无依赖再删除;清空表优先用 TRUNCATE;大表删数据须分批;跨库外键需手动排查。
直接 DROP TABLE 是线上最危险的 DDL 操作之一——它瞬间删掉结构+数据+索引,且无法回滚。一旦有隐藏依赖(比如定时任务里硬编码了表名、某个存储过程没被发现),服务立刻报错 Table 'xxx' doesn't exist。
ALTER TABLE t1 RENAME TO t1_bak_20251229,切断所有直连访问SHOW PROCESSLIST 看是否有残留连接、检查慢日志里是否还出现原表名DROP TABLE t1_bak_20251229
ALTER TABLE t1_bak_20251229 RENAME TO t1
DELETE FROM t1 看似干净,实则埋雷:它逐行删除、写 binlog(主从延迟暴增)、不释放磁盘空间(InnoDB 表空间文件不缩容),且自增 ID 不重置。
TRUNCATE TABLE t1 是原子操作:重建表结构、清空数据、重置自增、释放空间、不记完整 binlog(只记 DDL 日志)TRUNCATE 不能带 WHERE,也不能在事务中回滚(MySQL 中它是隐式提交)DELETE ... WHERE,但务必加索引 + 分批(见下一条)对千万级表执行 DELETE FROM logs WHERE created_at ,可能卡住 20 分钟,期间阻塞所有写入,binlog 堆积,从库延迟飙升到小时级。
DELETE FROM logs WHERE id <= 1000000 AND created_at < '2023-01-01' LIMIT 10000;
SELECT ROW_COUNT(),为 0 则停止;否则休眠 0.1s 再继续(避免打满 IO)DROP DATABASE 是终极删除,没有“回收站”,也没有“确认弹窗”。MySQL 不会管你有没有正在跑的微服务在连这个库。
SELECT * FROM information_schema.PROCESSLIST WHERE DB = 'target_db';,有结果就 kill 掉mysqldump -u root -p --single-transaction target_db > target_db_$(date +%Y%m%d).sql,哪怕只是留个 schema真正容易被忽略的是:外键跨库引用。如果其他库的表通过外键指向你要删的库,DROP DATABASE 会失败,但错误信息只显示 ERROR 1216 (HY000),不提示具体哪张表在依赖——得手动查 information_schema.KEY_COLUMN_USAGE。