新的 CentOS 安装。
我正在运行一个大型数据库(2GB sql 文件)的导入并且遇到了问题。SSH 客户端似乎失去了连接,并且导入似乎冻结了。我使用另一个窗口登录到 mysql 并且导入似乎已死,卡在特定的 3M 行表上。
所以我尝试了
DROP DATABASE huge_db;
15-20分钟后,什么都没有。在另一个窗口中,我做了:
/etc/init.d/mysqld restart
DROP DB 窗口显示消息:SERVER SHUTDOWN。然后我实际上重新启动了物理服务器。
重新登录到 mysql,检查并且数据库仍然存在,运行
DROP DATABASE huge_db;
又一次,我又等了大约 5 分钟。
再次,它是全新安装。这huge_db
是唯一的数据库(系统数据库除外)。我发誓我以前很快就放弃了这么大的 db,但也许我错了。
我已经成功删除了数据库。花了大约30分钟。另请注意,当我认为 mysqldump 导入已死时,我认为我错了。终端连接丢失,但我认为该过程仍在运行。我很可能杀死了导入中间表(3M 行表),并且可能是整个数据库的 3/4。令人误解的是,“top”显示 mysql 只使用了 3% 的内存,而它似乎应该使用更多。
删除数据库最终需要 30 分钟,因此,我可能不必重新启动服务器,并且可能只需等待 DROP 完成,但我不知道 mysql 对获取 DROP 查询有何反应它通过 mysqldump 导入的数据库相同。
尽管如此,问题仍然存在,为什么删除一个 2GB 的数据库需要 30 分钟以上的时间,而它所要做的就是删除所有 db 文件并从 information_schema 中删除对数据库的所有引用?有什么大不了的?
与其杀死进程,不如在 MySQL 中执行它会更安全:
id 为 174 的查询是阻止删除“示例”数据库的查询,因此在您杀死任何进程之前,首先让 MySQL 尝试终止查询:
再次运行
processlist
上面的命令以确认它已被杀死。如果这不起作用,那么您可能会考虑杀死错误的进程,但在此之前您可能会尝试重新启动 MySQL 服务器。
您还可以在 MySQL shell 中运行诸如“SHOW FULL PROCESSLIST”和“KILL 174”之类的命令,例如,如果您只安装了 MySQL 客户端。要点是避免在 shell 中使用“kill”来终止进程,除非绝对必要。
一般来说,您可以使用
mysql
或mysqladmin
。不过,您不需要经常运行这样的命令;一旦您开始定期终止查询,肯定会出现问题,您最好解决该问题(终止查询过程只是治疗症状)。虽然我认为导入过程已经结束,但它可能仍在运行。
该
DROP DATABASE
命令可能在运行之前等待数据库完成导入。因此,与其
DROP DATABASE
花很长时间,不如说它可能只是进口。1.)
如果其他人阅读此内容并尝试取消数据库导入并删除数据库,我建议您首先找到导入的 PID(进程 ID)并从不同的终端运行它:
...其中 [PID] 将是进程的实际 PID。
如果另一个终端仍然连接,您应该会立即看到导入停止。
2.)
您也可以
SHOW PROCESSLIST
在 phpMyAdmin SQL 选项卡中运行。结果表显示正在运行的进程,单击要杀死的行旁边的“x”应该可以解决问题。这与接受的答案或从命令行终止mysql
进程具有相同的效果。mysql
然后运行
一切都应该是干净的。
另一个答案表明,杀死 mysql 中的进程比从外部执行要好。我没有测试过这个答案,但这听起来很合理。所以我把它标记为“接受的答案”而不是这个。
我遇到了同样的问题。但这次我检查了显示进程列表;它说检查权限的时间更长。然后我发现 mysqld_safe 以 root 身份运行,而文件夹级别权限仅适用于 mysql 用户。因此我终止了查询,当然它花了很长时间才说它处于终止状态但我等待它做出反应然后它终止查询并将文件夹级别权限更改为 root 也通过将其添加到组和 chmod 到 770。然后我执行相同的删除数据库等等;对于 20GB 数据库,它确实在 2 秒内为我工作。
在你删除它之前,尝试截断你的数据库中最大的表。在处理防火墙流量的 MySQL 档案时,我看到了非常相似的行为,这非常有帮助。
首先想到的是状态
Checking Permissions...
当您发出
DROP DATABASE mydb;
/var/lib/mysql/mydb 中的所有内容时,会检查是否存在操作系统权限以删除每个文件。有些人认为减少 mysql 用户的数量可能会有所帮助