web-dev-qa-db-ja.com

mysql(d)を停止するより安全な方法はありますか?

安価な仮想マシンで非常にハードなphpスクリプトを実行しています。これは、週に約50万ペー​​ジビューがあるため、少し問題があります。 mysqlを1日2回再起動します。それは問題ではありませんが、mysqlを再起動するとき

_/etc/init.d/mysql restart
_

再起動してから時々Table './forum/phpbb_posts' is marked as crashed and last (automatic?) repair failedと表示されます

このテーブルはそのハードスクリプトとは何の関係もありませんが、クラッシュしているように見える250 000(1.8ギガ)のテーブルです。修理には約14分かかります。

Mysqlを停止するためのより安全な方法はありますか?私はバックアップを行う必要があることを知っています、そして私はそうします、しかし1日1回だけであり、データはまだ増え続けています(最近は速くはありません)

現在DebianGNU/Linux6.0で実行されています

4
genesis

503 Webサイトでアクティビティを停止し(.htaccessメンテナンスモード)、開始しますtop mysqldcpuの使用状況を監視します

mysqladmin -p flush-tables

mysqlアクティビティ(インストールによっては数分かかる場合があります)と、それが徐々に減少する時期を監視します

mysqladmin -p flush-tables

念のために

mysqladmin -p shutdown

このシーケンスにより、Webサイトはデータベース要求の作成を停止し、メモリ内のデータとトランザクションログファイルをデータベーステーブルにフラッシュするようにmysqlに指示し、適切なデータベースデーモンのシャットダウンを開始します。

2
Fiasco Labs

Mysqldのシャットダウンは時間のかかる作業になる可能性があります。最大の懸念の1つは、すべてのデータが適切にフラッシュされ、すべてのテーブルが閉じられることです。

データを適切に閉じるには、2つの方法があります。これは、2つの基本的なカテゴリに分類されます。

カテゴリ#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を実行すると、ダンプされているテーブルに属するバッファープール内の残りのダーティページのフラッシュが自動的にトリガーされます。

すべてのInnoDBテーブルをmysqldumpする場合でも、mysqlをシャットダウンする場合でも、ダーティページをフラッシュするプロセスを早めるのは1つだけです。

innodb_max_dirty_pages_pct を設定する必要があります。デフォルトでは、MySQL 5.0 /5.1の場合は90です。 MySQL 5.5の場合、デフォルトは75です。驚くべきことに、innodb_max_dirty_pages_pctを0に設定するだけです。これにより、バッファプール内のダーティページの数が最小限に抑えられます。これにより、ディスクI/Oがわずかに増加する可能性がありますが、それでも許容レベル内です。

あなたは2つのことをしなければなりません:

/etc/my.cnfに配置してください

[mysqld]
innodb_max_dirty_pages_pct=0

次に、mysqlを再起動する必要はありません。これをrootユーザーとして実行するだけです。

SET GLOBAL innodb_max_dirty_pages_pct = 0;

サーバーの負荷が少し急上昇し、バッファプールがダーティページの1%未満になるまでその状態が続く場合があります。

試してみる !!!

更新2013-03-0421:31 EST

このMySQLコマンドも最初に実行する必要があります

SET GLOBAL innodb_fast_shutdown = 0;

これにより、InnoDBトランザクションログ(ib_logfile0、ib_logfile1)のすべてが完全にフラッシュされ、その後に

service mysql stop
4
RolandoMySQLDBA

ストップアンドスタート連隊を解散するのはどうですか?たぶん、再起動は、データベースが開始を開始する前に静止停止に到達するのに十分な時間をデータベースに与えていませんか?

つまり.

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