Home

まとめったーとかの開発ブログ

MySQLのテーブルをcheck、repairコマンドで修復する

先日から一部ページで閲覧不可の障害が発生していたので修復を行いました。

下記例外メッセージが問題のページにアクセスすると表示される。

SQLSTATE[HY000]: General error: 145 Table ‘table_name’ is marked as crashed and should be repaired

checkコマンドでテーブルのエラーを確認。

mysql> check table table_name;
+------------+-------+----------+---------------------------------------------------------------------+
| Table      | Op    | Msg_type | Msg_text                                                            |
+------------+-------+----------+---------------------------------------------------------------------+
| table_name | check | warning  | Table is marked as crashed                                          |
| table_name | check | warning  | 123 clients are using or haven't closed the table properly          |
| table_name | check | warning  | Found 51444 deleted space in delete link chain. Should be 51160     |
| table_name | check | error    | Found more than the expected 1132 deleted rows in delete link chain |
| table_name | check | error    | record delete-link-chain corrupted                                  |
| table_name | check | error    | Corrupt                                                             |
+------------+-------+----------+---------------------------------------------------------------------+
6 rows in set (0.79 sec)

repairコマンドでテーブルを修復。

mysql> repair table table_name ;
+------------+--------+----------+------------------------------------------+
| Table      | Op     | Msg_type | Msg_text                                 |
+------------+--------+----------+------------------------------------------+
| table_name | repair | warning  | Number of rows changed from 2219 to 1313 |
| table_name | repair | status   | OK                                       |
+------------+--------+----------+------------------------------------------+
2 rows in set (0.18 sec)

repairしたあとはもう一度checkコマンドでエラーがでていないか確認。

mysql> check table table_name;
+----------------------------------+-------+----------+----------+
| Table                            | Op    | Msg_type | Msg_text |
+----------------------------------+-------+----------+----------+
| table_name                       | check | status   | OK       |
+----------------------------------+-------+----------+----------+
1 row in set (0.00 sec)

通常の運用であればmysqlのテーブルが壊れる可能性は低いですが、まれにテーブル更新中にmysqldプロセスが停止してしまうと起こってしまう事象との事。repairコマンドはmyisamに対してしか使用することは出来ないので注意。

  • コメント (Close): 0
  • トラックバック (Close): 0

サイトデータ、データベースのバックアップ方法

サーバー内データをtarコマンドで1ファイルにまとめる

# tar cvfz 20130817.www.tar.gz www/

SQLベースのバックアップ

# mysqldump -u root -x -p --all-databases > 20130817.dump.sql

個別にデータベースをバックアップ(一括バックアップで失敗する場合等)

# mysqldump -u root db_name -p > 20130817.db_name.sql

全てのデータベースのバックアップを復元

# mysql -u root -p < 20130817.dump.sql
  • コメント (Close): 0
  • トラックバック (Close): 0

ツイッターidを指定すると発生する「Sorry, that page does not exist」について

  • 2013-08-13 (火)
  • PHP

twitterのプロフィール情報を取得する場合、今まではスクリーン名が変更されることを考慮してapiのパラメータにユーザidを指定していましたが、一部twitterユーザに限り「Sorry, that page does not exist」を返す事象が発生しました。

1
2
3
4
5
6
7
<?php
				$params = array('include_entities' => 'true'
				                , 'user_id' => $target);
				$url = 'https://api.twitter.com/1.1/users/show.json';
				$user = $this->_oAuth->OAuthRequest($url, 'GET', $params);
				var_dump($user);
				?>

string(68) “{“errors”:[{"message":"Sorry, that page does not exist","code":34}]}”

ユーザidの代わりにスクリーン名を指定すると正常に動作することから暫定的な対応としてユーザidでプロフィール情報の取得に失敗した場合はスクリーン名を指定しapiを実行する事にしました。

1
2
3
4
5
6
7
<?php
				$params = array('include_entities' => 'true'
				                , 'screen_name' => $target);
				$url = 'https://api.twitter.com/1.1/users/show.json';
				$user = $this->_oAuth->OAuthRequest($url, 'GET', $params);
				var_dump($user);
				?>

string(3087) “[{“id_str”:”・・・省略

2013/08/14
原因判明、該当ユーザのツイッターidが変更されていた。twitter側でidを変更する事は仕様上出来ないと思うので、一度twitterアカウントを削除し、スクリーン名は変えずに新しくアカウントを作り直したんではないかと推測。

  • コメント (Close): 0
  • トラックバック (Close): 0

twitterデータの更新処理自動化

定期的にスクリプトを実行し、サイトに掲載されているtwitter情報(スクリーン名、名前、場所、説明、画像url等)が更新されていた場合にはデータベースに格納されたデータと比較し、変更があればアップデートするようにしました。実は公開当初からこの処理は実装しているつもりでしたが先日確認したところ見事にぬけおちていました(ユーザーさんからのお問い合わせで発覚)その他細かな修正を加えています。
※プロフィール編集後から約一週間程でまとめったーのプロフィールは反映されます。

  • コメント (Close): 0
  • トラックバック (Close): 0

cronを使って特定のプロセスを監視する簡単なスクリプトを作ってみました

負荷も大してかかっていないにもかかわらずmysqlが落ちている事が最近ちょくちょくあるのでmysqlプロセスが動いていなかったらメールを投げるスクリプトを組んでcronに設定してみました。

#!/bin/bash
#############################################################################
# CheckProcess.sh
#
# Usage:
#     $ /tmp/CheckProcess.sh <監視プロセス名>
#
#############################################################################
 
EXEC_DATETIME=`date +"%Y/%m/%d %H:%M:%S"`" "
SCRIPT_NAME=$0
ARGS=$*
 
# 初期設定
ADMIN_MAIL="admin@matometter.info"
 
# 処理開始
STATUS_CODE=0
TARGET_PROCESS_CNT=`ps -ef | grep $1 | grep -v grep | grep -v $SCRIPT_NAME | wc -l`
if [ $TARGET_PROCESS_CNT -eq 0 ]; then
    echo "$EXEC_DATETIME: $1が動いていない" | mail -s "STOP PROCESS: $1" $ADMIN_MAIL
    STATUS_CODE=1
fi

こんな感じに使います。

$ ./CheckProcess.sh mysql

mysqlが見つからなければ指定したメールアドレスにメールを投げます。

  • コメント (Close): 0
  • トラックバック (Close): 0

INSERT文を実行すると処理が返ってこない

newsページのツイートだけ更新されなくなっていました。mroonga側に問題があることだけはわかりましたがはっきりとした原因は不明。気持ち悪いです。とりあえずやったことはmysql再起動、mroongaのヴァージョンアップ、挿入に失敗する(insert文を含むsqlを投げると処理がとまる)テーブルをフラッシュ。テーブル再作成。※処理がこけるテーブルのストレージエンジンにはmroongaを使用。再作成にはmysqlcheckコマンド、REPAIR TABLEを使用する方法があるが残念ながらサポートしていなかったので、ALTER TABLEを使用してストレージエンジンをMyISAMに変更後、mroongaに戻しました。上記の事をためしたら取りあえずツイートが登録できるようになった。単純にテーブルが壊れていただけなのだろうか。

最短復旧手順

$ ps aux | grep mysqld_safe
$ sudo kill -HUP <mysqld_safeプロセスid>
$ mysql -u <ユーザ名> -p
mysql> alter table <テーブル名> engine <データベースエンジン>;
Query OK
mysql> quit;
  • コメント (Close): 0
  • トラックバック (Close): 0

mroongaを使用した際に発生する「General error: 1024 tc is null」エラーについて

大量のデータを挿入すると発生するmroongaのバグのようです。再起動すれば直るとの報告もありますがやはり気持ち悪い。仮想メモリを大量に消費している場合は/proc/sys/vm/overcommit_memoryの値を1にすると動作する可能性もあるようですが、自分の環境では駄目でした。そもそもこれだけメモリに余裕があれば大丈夫でしょ?

# free -m
             total       used       free     shared    buffers     cached
Mem:           996        540        455          0         17        264
-/+ buffers/cache:        258        738
Swap:         2047         68       1979

全文検索を諦めて素直にMyISAMにすることも含めて現在検討中です。

  • コメント (Close): 0
  • トラックバック (Close): 0

Home

検索
フィード
メタ情報

Return to page top