`mysqlcheck`可以帮助我解决数据库问题而不会损坏我的数据库吗?

时间:2015-07-02 15:41:34

标签: mysql database

背景

我有一个Drupal站点,其中包含一个使用phpmyadmin管理的数据库。该数据库的大小超过1500个表。我在速度方面存在很大问题,并且正在寻找一个好的解决方案。该数据库的使用寿命为2.5-3岁,从未得到维护(据我所知)。

研究

我一直在努力寻找加快速度的方法,一切都让我回到了数据库的纯粹大小。我遇到了命令

OPTIMIZE TABLE
tbl_name [, tbl_name] ...

女巫很快就会把我引向更强大的

mysqlcheck -o <db_schema_name>

我没有使用此命令的测试区域,因为我们只有一个数据库。我知道运行此命令将花费很长时间在我的数据库上,因为数据库的庞大规模可能需要数天。

推理

我想使用它的原因是因为似乎MySQL每天都会关闭或崩溃。在phpmyadmin上我看到了这个

phpmyadmin sql time up

自从我1个月前开始工作以来,它只用了9个小时就没有关掉它。它似乎永远不会超过15小时。

状态变量

这是将值显示为警报的状态变量列表,我希望使用mysqlcheck修复其中一些。

alert values

结论

我想知道在数据库上运行mysqlcheck是否会导致任何问题或损坏我的数据库中的任何数据。了解这样的操作需要花多少时间也是很方便的。

1 个答案:

答案 0 :(得分:4)

答案的第一部分是好消息...... mysqlcheck -o不会比在每张桌子上运行OPTIMIZE TABLE更有可能损害您的数据库,因为&#39;这就是它所做的一切。它是一个方便的工具,它登录到服务器,获取表的列表,并通过它们进行迭代,向服务器发送一个{1}}查询时间,直到它完成。

现在,有些坏消息。如果您的表空间中存在潜在的损坏,OPTIMIZE TABLE可能会遇到它,因此您应该确定您已准备好应对这种可能性,包括备份和恢复计划。这种可能性相当遥远,但 是一种可能的结果。

更糟糕的消息:几乎肯定是在错误的树上咆哮。

在具有大量流量的同一台计算机上运行Apache和MySQL - 或者流量变化很大 - 是针对最佳做法的,并且是一个问题的处方,因为这两种服务都会在负载下增加内存消耗,如果是数据库是网站数据的后备存储,然后两个服务同时增加负载。

请参阅我对InnoDB Crash Post Mortem on Database Administrators Stack ExchangeWhy is Apache Running Wild and Killing MySQL on Server Fault的回答,全面了解这个相当常见的问题,其中MySQL是受害者,比什么都重要。

请注意,您是否使用InnoDB并不重要。 MySQL错误日志中的数据库恢复条目会有所不同,但死亡赠品是这样的:在没有任何可疑之前,MySQL错误日志说:

OPTIMIZE TABLE

那个之后的消息经常被误解为MySQL&#34;崩溃,&#34;但那不是发生了什么......它被杀了。 MySQL可能会拒绝重启,直到Apache平静或重新启动,或服务器重新启动。同样,从错误日志中,您可能会或可能不会另外看到类似的内容:

mysqld_safe Number of processes running now: 0

检查InnoDB: Initializing buffer pool, size = 4.0G InnoDB: mmap(4395630592 bytes) failed; errno 12 InnoDB: Completed initialization of buffer pool InnoDB: Fatal error: cannot allocate memory for the buffer pool [ERROR] Aborting [Note] /usr/libexec/mysqld: Shutdown complete mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended /var/log/syslog(取决于您运行的发行版)会向您显示真正的问题。

/var/log/messages

...或者消息......应该以类似的方式显示许多条目:

$ sudo egrep 'kernel|oom' /var/log/syslog

Apache让内存处于饥饿状态,系统面临整体不稳定的风险,所以&#34;某些东西&#34;被牺牲了。那&#34;东西&#34;可能是MySQL服务器守护程序kernel: pcscd invoked oom-killer: gfp_mask=0xd0, order=0, oomkilladj=0

mysqld

MySQL通常会尝试自行重启,而且据你所知,偶尔也会发生这种情况......但除非Apache的内存需求快速下降,否则不允许MySQL提出足够的请求来自系统的记忆,并将放弃。

优化表格有其有效的应用程序......但是,在这种情况下,如果我已正确识别您的问题,它将与重新安排下沉船 Titanic上的躺椅非常相似。它可以为您节省一些磁盘空间,但在运行时也会花费一些备用磁盘空间,因为一些存储引擎会创建一个全新的表副本,然后重命名副本并删除旧表。无论如何,它不太可能对内存消耗产生任何有意义的影响。