mysqlのテーブル破損

Cronからmysqlに関するエラーメールが届いた
mysqldump: Got error: 145: Table ‘./nucleus/nucleus_plugin_counter’ is marked as crashed and should be repaired when using LOCK TABLES
更新が止まってる状態の「あにょのブログ」のカウンターのところにもエラーメッセージが・・・
mySQL error with query SELECT * FROM nucleus_plugin_counter ORDER BY count_time DESC LIMIT 1: Table ‘./nucleus/nucleus_plugin_counter’ is marked as crashed and should be repaired
どうやらカウンターのデータベースが壊れたようだ
■ データベースのエラーを確認

[root@server1 ~]# mysql -u root -pパスワード
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 45165
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
■ 問題のデータベースに接続
mysql> use nucleus;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
■ エラーチェック
mysql> check table nucleus_plugin_counter;
+--------------------------------+-------+----------+----------------------------------------------------------+
| Table                          | Op    | Msg_type | Msg_text                                                 |
+--------------------------------+-------+----------+----------------------------------------------------------+
| nucleus.nucleus_plugin_counter | check | warning  | Table is marked as crashed                               |
| nucleus.nucleus_plugin_counter | check | warning  | 2 clients are using or haven't closed the table properly |
| nucleus.nucleus_plugin_counter | check | error    | Found 13708 keys of 13709                                |
| nucleus.nucleus_plugin_counter | check | error    | Corrupt                                                  |
+--------------------------------+-------+----------+----------------------------------------------------------+
4 rows in set (0.01 sec)
■ 壊れているテーブルを修復
mysql> repair table nucleus_plugin_counter;
+--------------------------------+--------+----------+--------------------------------------------+
| Table                          | Op     | Msg_type | Msg_text                                   |
+--------------------------------+--------+----------+--------------------------------------------+
| nucleus.nucleus_plugin_counter | repair | warning  | Number of rows changed from 13709 to 13707 |
| nucleus.nucleus_plugin_counter | repair | status   | OK                                         |
+--------------------------------+--------+----------+--------------------------------------------+
2 rows in set (0.12 sec)
■ 修復できたか確認
mysql> check table nucleus_plugin_counter;
+--------------------------------+-------+----------+----------+
| Table                          | Op    | Msg_type | Msg_text |
+--------------------------------+-------+----------+----------+
| nucleus.nucleus_plugin_counter | check | status   | OK       |
+--------------------------------+-------+----------+----------+
1 row in set (0.01 sec)
mysql>exit

問題なく修復できたようだ。
ブログのカウンター表示も元に戻った。

mysqldumpの警告メッセージ

Cronからmysqldumpの警告メッセージのメールがが届いた。
Cron /root/mysqldump.sh ; /root/backup.sh
— Warning: Skipping the data of table mysql.event. Specify the –events option explicitly.
実際やってみると確かに警告が出た。

[root@server1 ~]# /root/mysqldump.sh
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.

現在のmysqlのバージョンを調べる

[root@server1 ~]#  yum info mysql
Loaded plugins: fastestmirror, priorities, refresh-packagekit, security
Loading mirror speeds from cached hostfile
epel/metalink                                                                | 3.2 kB     00:00
* base: mirror.fairway.ne.jp
* centosplus: ftp.tsukuba.wide.ad.jp
* epel: ftp.iij.ad.jp
* extras: mirror.fairway.ne.jp
* updates: mirrors.neusoft.edu.cn
base                                                                         | 3.7 kB     00:00
centosplus                                                                   | 3.5 kB     00:00
epel                                                                         | 3.9 kB     00:00
epel/primary_db                                                              | 5.0 MB     00:00
extras                                                                       | 3.5 kB     00:00
updates                                                                      | 3.5 kB     00:00
90 packages excluded due to repository priority protections
Installed Packages
Name        : mysql
Arch        : x86_64
Version     : 5.1.69
Release     : 1.el6_4
Size        : 2.4 M
Repo        : installed
From repo   : updates
Summary     : MySQL client programs and shared libraries
URL         : http://www.mysql.com
License     : GPLv2 with exceptions
Description : MySQL is a multi-user, multi-threaded SQL database server. MySQL is a
: client/server implementation consisting of a server daemon (mysqld)
: and many different client programs and libraries. The base package
: contains the standard MySQL client programs and generic MySQL files.

最新版はmysql5.6系だが、CentOS6.4はmysql5.1系がデフォルトとなっている。最新版のmysql5.6をインストールするのは次回に持ち越しということで、とりあえず、今回は警告が出ないようにするだけにする。警告は、events optionをきちんと指定しなさいとの警告なので、mysqldump.shを書きなおすことにした。

[root@server1 ~]# vi mysqldump.sh
#! /bin/sh
mysqldump mysql -uroot -pパスワード --default-character-set=binary > /backup/mysqldump.sql
mysqldump fc -uroot -pパスワード --default-character-set=binary > /backup/fcdump.sql
mysqldump nucleus -uroot -pパスワード --default-character-set=binary > /backup/nucleusdump.sql
mysqldump taka -uroot -pパスワード --default-character-set=binary > /backup/takadump.sql
mysqldump centos -uroot -pパスワード --default-character-set=binary > /backup/centosdump.sql
を下のように --events のオプションを追加
#! /bin/sh
mysqldump --events -uroot mysql -pパスワード --default-character-set=binary > /backup/mysqldump.sql
mysqldump --events -uroot fc -uroot -pパスワード --default-character-set=binary > /backup/fcdump.sql
mysqldump --events -uroot nucleus -uroot -pパスワード --default-character-set=binary > /backup/nucleusdump.sql
mysqldump --events -uroot taka -uroot -pパスワード --default-character-set=binary > /backup/takadump.sql
mysqldump --events -uroot centos -uroot -pパスワード --default-character-set=binary > /backup/centosdump.sql

警告メッセージは出なくなった。

[root@server1 ~]# /root/backup.sh
[root@server1 ~]#

カーネルのバージョンも2.6.32-358.2.1.el6.centos.plus.x86_64から2.6.32-358.6.1.el6.centos.plus.x86_64に上がってた。カーネルは再起動しないと反映されないので再起動することに・・・ところがなかなか起動しないので焦った!!電源入れ直しで起動出来たが、いつものことながらカーネルのバージョンアップ→再起動はちゃんと起動してくれるか不安になる。

[root@server1 ~]# uname --kernel-release
2.6.32-358.6.1.el6.centos.plus.x86_64

データベースサーバ(MySQL)

MySQL は高速性と堅牢性を追及したマルチユーザ・マルチスレッドのSQLデータベースで、 世界で最も人気のあるフリーのリレーショナルデータベースサーバ。 Movable TypeとかNucleus等を利用する場合は各種データをMySQLデータベースに保存するようになっているので、ここではMySQLを使ったデータベースサーバを構築する。
■MySQLインストール

mysql-serverをインストール
[root@server1 ~]# yum -y install mysql-server

■MySQL設定
MySQLサーバーの文字コードとMySQLクライアントの文字コードをUTF-8にする

[root@server1 ~]# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default-character-set = utf8   ← 追加
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
最終行に追加
[mysql]
default-character-set = utf8

■MySQL起動

MySQLの起動
[root@server1 ~]# /etc/init.d/mysqld start
MySQL データベースを初期化中:  Installing MySQL system tables...
OK
Filling help tables...
OK
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h server1.yokensaka.com password 'new-password'
Alternatively you can run:
/usr/bin/mysql_secure_installation
which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.
See the manual for more instructions.
You can start the MySQL daemon with:
cd /usr ; /usr/bin/mysqld_safe &
You can test the MySQL daemon with mysql-test-run.pl
cd /usr/mysql-test ; perl mysql-test-run.pl
Please report any problems with the /usr/bin/mysqlbug script!
[  OK  ]
mysqld を起動中:                                           [  OK  ]

■MySQL自動起動設定

MySQLの自動起動設定
[root@server1 ~]# chkconfig mysqld on
MySQLの自動起動設定確認
[root@server1 ~]# chkconfig --list mysqld
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off
           ランレベル2~5がオンの状態であることを確認

■rootユーザへのパスワード設定
MySQLのrootユーザにはデフォルトではパスワードが設定されていないため、安全のためにパスワードを設定。

MySQLサーバーへrootユーザでログイン
[root@server1 ~]# mysql -u root
[root@server1 higo]# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.52 Source distribution
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
登録済ユーザ及びパスワードの確認
mysql> select user,host,password from mysql.user;
+------+-----------------------+----------+
| user | host                  | password |
+------+-----------------------+----------+
| root | localhost             |          | ← パスワードが設定されていない
| root | server1.yokensaka.com |          | ← パスワードが設定されていない
| root | 127.0.0.1             |          |
|      | localhost             |          |
|      | server1.yokensaka.com |          |
+------+-----------------------+----------+
5 rows in set (0.00 sec)
localhostのrootユーザにパスワードを設定
mysql> set password for root@localhost=password('パスワード');
Query OK, 0 rows affected (0.00 sec)
server1.yokensaka.comのrootユーザにパスワードを設定
mysql> set password for root@server1.yokensaka.com=password('パスワード');
Query OK, 0 rows affected (0.00 sec)
mysql> exit ← いったんログアウト
Bye
rootユーザでパスワードありでMySQLサーバーへログイン
[root@server1 ~]# mysql -u root -pパスワード
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.52 Source distribution
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
登録済ユーザ及びパスワードの確認
mysql> select user,host,password from mysql.user;
+------+-----------------------+-------------------------------------------+
| user | host                  | password                                  |
+------+-----------------------+-------------------------------------------+
| root | localhost             | *4202C8EE0ABB7FD2186E1CB0180B55C5272A8556 | ← パスワードが設定された
| root | server1.yokensaka.com | *4202C8EE0ABB7FD2186E1CB0180B55C5272A8556 | ← パスワードが設定された
| root | 127.0.0.1             |                                           |
|      | localhost             |                                           |
|      | server1.yokensaka.com |                                           |
+------+-----------------------+-------------------------------------------+
5 rows in set (0.00 sec)
mysql> exit ← いったんログアウト
Bye

※ドメインにハイフン(-)が入ってる場合はドメインをシングルクォーテーションで囲む
■匿名ユーザの削除
MySQLには匿名ユーザがデフォルトで登録されており、ユーザ名とパスワードなしでMySQLサーバーへログインできてしまうため、安全のためにこのユーザを削除。

rootユーザでパスワードありでMySQLサーバーへログイン
[root@server1 ~]# mysql -u root -pパスワード
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.1.52 Source distribution
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
登録ユーザの確認
mysql> select user,host from mysql.user;
+------+-----------------------+
| user | host                  |
+------+-----------------------+
| root | 127.0.0.1             |
|      | localhost             |
| root | localhost             |
|      | server1.yokensaka.com |
| root | server1.yokensaka.com |
+------+-----------------------+
5 rows in set (0.00 sec)
匿名ユーザを削除
mysql> delete from mysql.user where user='';
Query OK, 2 rows affected (0.00 sec)
匿名ユーザが削除されてるか確認
mysql> select user,host from mysql.user;
+------+-----------------------+
| user | host                  |
+------+-----------------------+
| root | 127.0.0.1             |
| root | localhost             |
| root | server1.yokensaka.com |
+------+-----------------------+
3 rows in set (0.01 sec)
mysql> exit ← いったんログアウト
Bye
匿名ユーザでMySQLサーバーへログインできないことを確認
[root@server1 ~]# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

■testデータベースの削除
MySQLにはデフォルトでtestという空のデータベースが登録されているが、不要のため、このデータベースを削除。

rootユーザでMySQLサーバーへログイン
[root@server1 ~]# mysql -u root -pパスワード
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.1.52 Source distribution
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
登録データベースを確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)
testデータベースを削除
mysql> drop database test;
Query OK, 0 rows affected (0.00 sec)
testデータベースが削除されてるか確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
2 rows in set (0.00 sec)
mysql> exit ← ログアウト
Bye

■MySQL確認

rootでMySQLサーバーへログイン
[root@server1 ~]# mysql -u root -pパスワード
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.52 Source distribution
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
takaデータベースへの全てのアクセス権限を持った、新規ユーザtakaを登録
mysql> grant all privileges on taka.* to taka@localhost identified by 'パスワード';
Query OK, 0 rows affected (0.00 sec)
mysql> select user from mysql.user where user='taka'; ← takaユーザ登録確認
+--------+
| user   |
+--------+
| taka   |
+--------+
1 row in set (0.00 sec)
mysql> exit ← ログアウト
Bye
takaユーザでMySQLサーバーへログイン
[root@server1 ~]# mysql -u taka -pパスワード
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.52 Source distribution
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database taka; ← takaデータベース作成
Query OK, 1 row affected (0.00 sec)
mysql> show databases; ← データベース作成確認
+--------------------+
| Database           |
+--------------------+
| information_schema |
| taka               |
+--------------------+
2 rows in set (0.00 sec)
mysql> use taka ← takaデータベースへ接続
Database changed
mysql> create table taka(num int, name varchar(50)); ← takaテーブル作成
Query OK, 0 rows affected (0.01 sec)
mysql> show tables; ← テーブル作成確認
+----------------+
| Tables_in_test |
+----------------+
| taka           |
+----------------+
1 row in set (0.00 sec)
mysql> insert into taka values(1,'データAB'); ← takaテーブルへデータ登録
Query OK, 1 row affected (0.00 sec)
mysql> select * from taka; ← データ登録確認
+------+----------+
| num  | name     |
+------+----------+
|    1 | データAB |
+------+----------+
1 row in set (0.01 sec)
mysql> update taka set name='データAB'; ← takaテーブル内データ更新
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
mysql> select * from taka; ← データ更新確認
+------+----------+
| num  | name     |
+------+----------+
|    1 | データAB |
+------+----------+
1 row in set (0.00 sec)
mysql> delete from taka where num=1; ← takaテーブル内データ削除
Query OK, 1 row affected (0.02 sec)
mysql> select * from taka; ← データ削除確認
Empty set (0.00 sec)
mysql> drop table taka; ← testテーブル削除
Query OK, 0 rows affected (0.00 sec)
mysql> show tables; ← テーブル削除確認
Empty set (0.00 sec)
mysql> drop database taka; ← データベースtaka削除
Query OK, 0 rows affected (0.00 sec)
mysql> show databases; ← データベース削除確認
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
mysql> exit ← ログアウト
Bye
rootでMySQLサーバーへログイン
[root@server1 ~]# mysql -u root -pパスワード
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.52 Source distribution
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
takaユーザから全てのデータベースへのアクセス権限を剥奪
mysql> revoke all privileges on *.* from taka@localhost;
Query OK, 0 rows affected (0.00 sec)
takaユーザ削除
mysql> delete from mysql.user where user='taka' and host='localhost';
Query OK, 1 row affected (0.03 sec)
takaユーザ削除確認
mysql> select user from mysql.user where user='taka';
Empty set (0.00 sec)
mysql> flush privileges; ← takaユーザの削除をMySQLサーバーへ反映
Query OK, 0 rows affected (0.02 sec)
mysql> exit ← ログアウト
Bye

■文字セットの確認
MySQLを使ったブログ等が文字化けしたときは、以下のコマンドでサーバーが持っている文字セットとクライアントが持っている文字セットを確認できる。

[root@server1 ~]# mysql -u root -pパスワード
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.1.52 Source distribution
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | utf8   |
| character_set_server     | utf8   |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

クライアント側の設定が反映される項目
character_set_client
character_set_connection
character_set_results
サーバー側の設定が反映される項目
character_set_database
character_set_server
■Movable Typeの初期設定
Movable Typeのブログデータを保存するデータベースの初期設定を行います。

rootでMySQLサーバーへログイン
[root@server1 ~]# mysql -u root -pパスワード
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.52 Source distribution
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
「mt」というデータベースを作成
mysql> create database mt;
Query OK, 1 row affected (0.01 sec)
管理DBをデフォルト(管理をカレント)
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
「mt」というデータベースにログインするユーザー名とパスワードを設定
mysql> grant usage on mt.* to higo@localhost identified by 'パスワード';
Query OK, 0 rows affected (0.00 sec)
「mt」というデータベースに対してすべての権限を「higo」に許す
mysql> grant all on mt.* to higo@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> exit ← ログアウト
Bye