可以在大型数据库上使用mysqldump导致我的长查询挂起吗?

时间:2012-03-14 17:48:33

标签: mysql mysqldump

我有一个大型数据库(大约50GB)。它是在我无法控制的服务器上,但我知道他们每晚都在使用mysqldump进行备份。

我的查询需要几个小时才能完成。我把它设置为运行,但它实际上从未完成。

我注意到在备份时间之后,所有表都有一个锁定请求(SHOW OPEN TABLES WHERE in_use> 0;列出所有表格)。

我查询中的表的in_use = 2,所有其他表的in_use = 1。

那么......这里发生了什么? a)我的查询正常运行,阻止转储发生。我应该等一下? b)转储导致服务器挂起(可能缺少内存/磁盘空间?) c)其他什么?

编辑:使用MyISAM表

有一个服务器管理员不是很称职,但如果我问他具体的事情,他会做。我该怎么让他检查?

编辑:添加查询

SELECT citing.article_id as citing, citing.year, r.id_when_cited, cited_issue.country
FROM isi_lac_authored_articles as citing # 1M records
        JOIN isi_citation_references r ON (citing.article_id = r.article_id) # 400M records
        JOIN isi_articles cited ON (cited.id_when_cited = r.id_when_cited) # 25M records
        JOIN isi_issues cited_issue ON (cited.issue_id = cited_issue.issue_id) # 1M records

这就是EXPLAIN所说的:

+----+-------------+-------------+------+--------------------------------------------------------------------------+---------------------------------------+---------+-------------------------------+---------+-------------+
| id | select_type | table       | type | possible_keys                                                            | key                                   | key_len | ref                           | rows    | Extra       |
+----+-------------+-------------+------+--------------------------------------------------------------------------+---------------------------------------+---------+-------------------------------+---------+-------------+
|  1 | SIMPLE      | cited_issue | ALL  | NULL                                                                     | NULL                                  | NULL    | NULL                          | 1156856 |             |
|  1 | SIMPLE      | cited       | ref  | isi_articles_id_when_cited,isi_articles_issue_id                         | isi_articles_issue_id                 | 49      | func                          |      19 | Using where |
|  1 | SIMPLE      | r           | ref  | isi_citation_references_article_id,isi_citation_references_id_when_cited | isi_citation_references_id_when_cited | 17      | mimir_dev.cited.id_when_cited |       4 | Using where |
|  1 | SIMPLE      | citing      | ref  | isi_lac_authored_articles_article_id                                     | isi_lac_authored_articles_article_id  | 16      | mimir_dev.r.article_id        |       1 |             |
+----+-------------+-------------+------+--------------------------------------------------------------------------+---------------------------------------+---------+-------------------------------+---------+-------------+

我实际上不明白为什么需要查看isi_issues表中的所有记录。不应该只是在issue_id上​​的isi_articles(引用)匹配吗?这两个字段都已编入索引。

2 个答案:

答案 0 :(得分:2)

对于该大小的MySQL数据库,您可能需要考虑设置到从属节点的复制,然后在从属服务器上执行夜间数据库备份。

答案 1 :(得分:1)

是的 - mysqldump的一些选项会在备份进行时锁定所有MyISAM表,因此备份是一个时间点的一致“快照”。

InnoDB支持交易,这使得这不必要。它通常也比MyISAM快。你应该使用它。 :)