类别 #1:所有数据都是 MyISAM

类别 #1:所有数据都是 MyISAM

我在廉价的虚拟机上运行非常复杂的 php 脚本,每周大约有 50 万次页面浏览量,所以有点问题。我每天重启 mysql 两次。这不会有问题,但是当重启 mysql 时

/etc/init.d/mysql restart

它重新启动,然后它有时Table './forum/phpbb_posts' is marked as crashed and last (automatic?) repair failed

该表与该硬脚本无关,但是它的 250 000(1.8 GB)表似乎崩溃了。修复该表大约需要 14 分钟。

有没有更安全的方法来停止 mysql?我知道我应该备份,我也这样做了,但每天只备份一次,而且数据还在增长(这些天增长得不快)

目前运行于 Debian GNU/Linux 6.0

答案1

503 网站停止活动(.htaccess 维护模式)并启动顶部监控mysqld cpu使用情况

mysqladmin -p 刷新表

观察 mysql 活动(可能需要几分钟,取决于你的安装)以及它何时逐渐减少

mysqladmin -p 刷新表

确保然后

mysqladmin -p 关机

此序列确保您的网站停止创建更多的数据库请求,告诉 mysql 将内存中的数据和事务日志文件刷新到数据库表,然后启动适当的数据库守护进程关闭。

答案2

关闭 mysqld 可能是一项耗时的任务。最大的担忧之一是所有数据是否正确刷新以及所有表是否关闭。

有两种方法可以确保数据正确关闭。它分为两个基本类别:

类别 #1:所有数据都是 MyISAM

如果所有数据都是 MyISAM,则应确保 InnoDB 已完全禁用

[mysqld]
skip-innodb

在启动时使用此选项可绕过通常在启动时执行的崩溃恢复周期的任何 InnoDB 协议。结合这一点,MyISAM 数据永远不会被缓存。只有索引页存储在 MyISAM 密钥缓存中(大小由 key_buffer_size 决定)。因此,您可以快速启动和快速关闭。

类别 #2:所有或大部分数据是 InnoDB

如果大部分或所有数据都是 InnoDB,则必须注意为 innodb_buffer_pool_size 配置的空间量。innodb_buffer_pool_size 越大,清除脏页所需的时间就越长。

边注:执行 InnoDB 表的 mysqldump 将自动触发刷新属于被转储表的缓冲池中任何残留的脏页。

无论您是 mysqldump 所有 InnoDB 表还是只是关闭 mysql,都只有一种方法可以加速刷新脏页的过程。

您必须设置默认值为 innodb_max_dirty_pages_pct。默认情况下,MySQL 5.0/5.1 的默认值为 90。对于 MySQL 5.5,默认值为 75。令人惊讶的是,只需将 innodb_max_dirty_pages_pct 设置为 0。这将使缓冲池中的脏页数量保持在最低限度。这可能会略微增加磁盘 I/O,但仍在可容忍的水平内。

你必须做两件事:

请将其放置在/etc/my.cnf 中

[mysqld]
innodb_max_dirty_pages_pct=0

其次,您不必重新启动mysql。只需以root用户身份执行此操作:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

服务器负载可能会略微飙升并保持这种状态,直到缓冲池中的脏页少于 1%。

试一试 !!!

更新时间 2013-03-04 21:31 EST

你还应该先运行这个 MySQL 命令

SET GLOBAL innodb_fast_shutdown = 0;

这将导致 InnoDB 事务日志 (ib_logfile0、ib_logfile1) 中的所有内容被完全刷新,然后

service mysql stop

答案3

打破停止和启动的常规怎么样?也许重新启动没有给数据库足够的时间在启动之前进入静止状态?

IE

/etc/init.d/mysql stop;
sync;
sleep 30;
/etc/init.d/mysql start

相关内容