不能删除information_schema和mysql库,仅可安全删除test等明确标注的示例库(如sakila、world),需先核查进程、禁用自动重建逻辑、逐个DROP并刷新权限,再清理匿名用户及加固认证。

删掉 mysql、test、information_schema 这几个库?别乱动
不能全删。information_schema 是 MySQL 系统视图库,强制删除会导致服务启动失败或查询报错;mysql 库存用户权限、插件、时区等关键元数据,删了就登不进去;只有 test 和类似 example、employees 这类明确标为“示例”的库才该清。
确认哪些库是默认带的示例库
不同发行版和安装方式带的不一样:MySQL 官方二进制包默认只带 test(空库);Percona Server 可能多一个 percona_schema;MariaDB 有时带 mysqltest;Docker 镜像如果基于 mysql:8.0,默认只有 test,但某些第三方镜像会预装 sakila 或 world。
- 先连上去执行
SHOW DATABASES;,人工核对名字,别依赖文档 - 用
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME REGEXP '^(test|example|sakila|world|employees)$';快速筛选 - 注意大小写:Linux 下库名区分大小写,
Test和test是两个库
安全删除示例库的正确姿势
直接 DROP DATABASE 不够——得先关掉可能的自动重建逻辑,再删,否则下次重启或运行初始化脚本又冒出来。
- 检查是否启用了
mysql_install_db或mysqld --initialize后的自动填充逻辑(常见于容器启动脚本),删前注释掉相关行 - 确认没人在用:
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE DB IN ('test', 'sakila'); - 执行删除:
DROP DATABASE test;、DROP DATABASE sakila;(逐个来,别写成DROP DATABASE test, sakila;,语法不支持) - 删完立刻执行
FLUSH PRIVILEGES;,避免缓存残留
删完还要防反弹:关闭匿名用户 + 禁用本地 socket 登录(常见后门入口)
很多人删了库就以为完事了,其实攻击者常靠默认账号进来建新库。重点不是“删”,是“不让别人再建”。
- 删掉匿名用户:
DELETE FROM mysql.user WHERE User = '';,然后FLUSH PRIVILEGES; - 禁用
root@localhost的 socket 认证(如果不用本地运维):UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE User = 'root' AND Host = 'localhost';,再设强密码 - 检查
skip-grant-tables是否被误开启(配置文件里搜这串),开着等于裸奔 - MySQL 8.0+ 默认启用
caching_sha2_password插件,别为了兼容老客户端把它全切回mysql_native_password,只改必要账号
真正麻烦的是权限模型嵌套和初始化脚本残留——哪怕库删干净了,一个 CREATE DATABASE IF NOT EXISTS test; 被塞在某个监控脚本里,过两天就复活。得去翻自动化部署链路里的所有 SQL 片段和容器 entrypoint。










