AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 11806
Accepted
Buttle Butkus
Buttle Butkus
Asked: 2012-01-28 04:50:19 +0800 CST2012-01-28 04:50:19 +0800 CST 2012-01-28 04:50:19 +0800 CST

为什么 DROP DATABASE 需要这么长时间?(MySQL)

  • 772

新的 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 mysqldump
  • 5 5 个回答
  • 94751 Views

5 个回答

  • Voted
  1. Best Answer
    Stefan Magnuson
    2013-03-27T21:32:50+08:002013-03-27T21:32:50+08:00

    与其杀死进程,不如在 MySQL 中执行它会更安全:

    $ mysqladmin processlist -u root -p
    Enter password: 
    +-----+------+-----------+-------------------+---------+------+-------+------------------+
    | Id  | User | Host      | db                | Command | Time | State | Info             |
    +-----+------+-----------+-------------------+---------+------+-------+------------------+
    | 174 | root | localhost | example           | Sleep   | 297  |       |                  |
    | 407 | root | localhost |                   | Query   | 0    |       | show processlist |
    +-----+------+-----------+-------------------+---------+------+-------+------------------+
    

    id 为 174 的查询是阻止删除“示例”数据库的查询,因此在您杀死任何进程之前,首先让 MySQL 尝试终止查询:

    $ mysqladmin kill 174
    

    再次运行processlist上面的命令以确认它已被杀死。

    如果这不起作用,那么您可能会考虑杀死错误的进程,但在此之前您可能会尝试重新启动 MySQL 服务器。

    您还可以在 MySQL shell 中运行诸如“SHOW FULL PROCESSLIST”和“KILL 174”之类的命令,例如,如果您只安装了 MySQL 客户端。要点是避免在 shell 中使用“kill”来终止进程,除非绝对必要。

    一般来说,您可以使用mysql或mysqladmin。不过,您不需要经常运行这样的命令;一旦您开始定期终止查询,肯定会出现问题,您最好解决该问题(终止查询过程只是治疗症状)。

    • 89
  2. Buttle Butkus
    2012-02-04T02:16:40+08:002012-02-04T02:16:40+08:00

    虽然我认为导入过程已经结束,但它可能仍在运行。

    该DROP DATABASE命令可能在运行之前等待数据库完成导入。

    因此,与其DROP DATABASE花很长时间,不如说它可能只是进口。

    1.)

    如果其他人阅读此内容并尝试取消数据库导入并删除数据库,我建议您首先找到导入的 PID(进程 ID)并从不同的终端运行它:

    $ kill [PID]
    

    ...其中 [PID] 将是进程的实际 PID。

    如果另一个终端仍然连接,您应该会立即看到导入停止。

    2.)

    您也可以SHOW PROCESSLIST在 phpMyAdmin SQL 选项卡中运行。结果表显示正在运行的进程,单击要杀死的行旁边的“x”应该可以解决问题。这与接受的答案或从命令行终止mysql进程具有相同的效果。mysql

    然后运行

    DROP DATABASE `database_name`;
    

    一切都应该是干净的。


    另一个答案表明,杀死 mysql 中的进程比从外部执行要好。我没有测试过这个答案,但这听起来很合理。所以我把它标记为“接受的答案”而不是这个。

    • 11
  3. Mannoj
    2012-07-13T01:04:20+08:002012-07-13T01:04:20+08:00

    我遇到了同样的问题。但这次我检查了显示进程列表;它说检查权限的时间更长。然后我发现 mysqld_safe 以 root 身份运行,而文件夹级别权限仅适用于 mysql 用户。因此我终止了查询,当然它花了很长时间才说它处于终止状态但我等待它做出反应然后它终止查询并将文件夹级别权限更改为 root 也通过将其添加到组和 chmod 到 770。然后我执行相同的删除数据库等等;对于 20GB 数据库,它确实在 2 秒内为我工作。

    • 4
  4. Tim Brigham
    2012-01-28T05:04:34+08:002012-01-28T05:04:34+08:00

    在你删除它之前,尝试截断你的数据库中最大的表。在处理防火墙流量的 MySQL 档案时,我看到了非常相似的行为,这非常有帮助。

    • 3
  5. RolandoMySQLDBA
    2012-02-04T10:51:49+08:002012-02-04T10:51:49+08:00

    首先想到的是状态Checking Permissions...

    当您发出DROP DATABASE mydb;/var/lib/mysql/mydb 中的所有内容时,会检查是否存在操作系统权限以删除每个文件。

    有些人认为减少 mysql 用户的数量可能会有所帮助

    • 3

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve