MySQLのテーブルが壊れた

エラー: データベースに接続できません

WordPressのトップにたった一行でかでかと表示されてた。ブレーカーが落ちたせいだな。

WordPress側から復元とかできる仕組みがあるらしいけど、うまく動かなかった。エラーメッセージ的にMySQLの方の問題だろうと思って、コマンドラインで試してみるとデータベースには普通に繋がる。とりあえず片っぱしからアクセスしてみると、

mysql> select * from wp_options;
ERROR 145 (HY000): Table './wordpress/wp_options' is marked as crashed and should be repaired

初めて見たエラーだけどググったら速攻で出てきたので何とかなりそう。それにしてもエラーメッセージがおかしい。「テーブルを読み取れません」とまで分からなくても「データベースに問題があります」程度にしてくれないと原因究明し辛い。

mysql> check table wp_options;
+----------------------+-------+----------+-----------------------------------------------------------------------------------------+
| Table                | Op    | Msg_type | Msg_text                                                                                |
+----------------------+-------+----------+-----------------------------------------------------------------------------------------+
| wordpress.wp_options | check | error    | Table upgrade required. Please do "REPAIR TABLE `wp_options`" or dump/reload to fix it! |
+----------------------+-------+----------+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> repair table wp_options;
+----------------------+--------+----------+------------------------------------------------------+
| Table                | Op     | Msg_type | Msg_text                                             |
+----------------------+--------+----------+------------------------------------------------------+
| wordpress.wp_options | repair | info     | Wrong bytesec:  58- 34- 34 at 296176; Skipped        |
| wordpress.wp_options | repair | info     | Found block that points outside data file at 7572    |
| wordpress.wp_options | repair | info     | Found block with too small length at 194732; Skipped |
| wordpress.wp_options | repair | info     | Found block that points outside data file at 194744  |
| wordpress.wp_options | repair | info     | Found block that points outside data file at 204696  |
| wordpress.wp_options | repair | info     | Found block that points outside data file at 207436  |
| wordpress.wp_options | repair | info     | Found block that points outside data file at 207532  |
| wordpress.wp_options | repair | info     | Found block that points outside data file at 217276  |
| wordpress.wp_options | repair | info     | Key 1 - Found wrong stored record at 244464          |
| wordpress.wp_options | repair | info     | Found block that points outside data file at 246936  |
| wordpress.wp_options | repair | info     | Found block that points outside data file at 297132  |
| wordpress.wp_options | repair | warning  | Number of rows changed from 161 to 150               |
| wordpress.wp_options | repair | status   | OK                                                   |
+----------------------+--------+----------+------------------------------------------------------+
13 rows in set (0.48 sec)

なんとかなった。

簡単なWordPress高速化

ググればいくらでも出てきたので敢えて俺が書く必要もあるまいて。自分用健忘録。

WordPress を高速化する5つの方法

MySQLのキャッシュ有効化。

$ sudoedit /etc/mysql/my.cnf
# in section [mysqld]
> query_cache_size=24M
$ sudo rc-config restart mysql

PHP拡張APC(中間コードキャッシュ)。

$ sudo emerge pecl-apc
$ sudo rc-config reload apache2

終わり。うっわ簡単。これだけでおよそ描画開始までの遅延が半分にw

ブログソフト

ブログソフトWordPressを採用。重くてリッチなMySQL+PHP。

余計な時間を割きたくなかったので最もポピュラーな部類から選ぼうと思って、これとMovable Typeの二者択一。取り敢えず両方動かしてみようと思ったらMovable TypeがDL出来なかったのであっさりWordPressに決定。うちの鯖が王道LAMP構成なので動作に問題はない。

サイトの”インストール”に従ってそのまま問題なく設定、動かしてみると案外使い勝手が良い。ただやっぱり動作は重い。適当にググったらWP Super Cacheとか言う奴の説明があったからそのままreadmeに従ってインストール。面倒だったがこれで速く、なったのか分からない。

次に必須要件のコードハイライト、ググったら『ソースコードをハイライトしてくれるWordPressのプラグイン』って記事発見。コードハイライトプラグインの比較があるので参考にして、そこと同様にSyntaxHighlighter Evolvedに落ち着いた。C++,C#,bash辺りが対応してたらよろしい。それに割かし見た目も良いしコピーできて便利だ。

因みにGoogle ~ってのはGoogle codeにホスティングされてるsyntaxhighlighterを使ってるってだけっぽい。確かに名前がややこしいな。

最後にサンプル。n番目の素数を求める(prime(0)=2)。ちゃんと<iostream>とか出てるねw

#include <iostream>

typedef unsigned long long type;

int main()
{
	type n, p;
	std::cin >> n;

	if(!n--)
		p = 2;
	else
		for(type i = 3; ; i += 2)
		{
			for(type j = 3; j * j <= i; j += 2)
				if(i % j == 0)
					goto noprime;
			if(!n--)
			{
				p = i;
				break;
			}
			noprime:;
		}

	std::cout << p << std::endl;

	return 0;
}