mysqlクラッシュリカバリ
###
### クラッシュした場合の対応方法
###
自分が今までメインで使ってきたDBはMySQLでした。mariadbも検証はしてましたが、当時はまだmysqlの方が…って感じでしたね。7系OSからはmariadbが採用されたりとかなり発展してますね。さすがmysql開発者と言いますか、当たり前なのかもしれませんが。
ともあれmysqlを扱ってた経験上、DBのクラッシュは冷や汗ものだったことと、その際に残したメモをUPしておきます。大体クラッシュした時点で応急的な対応で復旧は出来ませんでした。あとクラッシュする原因としては過負荷が多いとも思うので、事前にレプリで分散するとか、最初のサーバ設計できっちり想定していることが重要だと思います。
ただ、コストの兼ね合いもあるし、そう理想通り上手く事が進まないのも難しい現実かな。
# 参考:http://www.orsx.net/blog/archives/4099
# まずは下記をmy.cnfに追記してみる。
# モードはいくつかあるが、「3」は強制リカバリモード。
innodb_force_recovery=3
# これでダメなら下記。MySQLを停止する
service mysqld stop
# データベースを格納しているディレクトリを移動(バックアップ)する
# 場所が不明な場合は設定ファイル内の”datadir”を参照する
# 元のibdataの容量が大きいとディスクFullになるから、その場合は削除してから再作成
mv /var/lib/mysql /var/lib/mysql_bkup
# 再度データベースを格納するディレクトリを作成する
mkdir /var/lib/mysql
# 所有者をmysqlユーザとする
chown mysql:mysql /var/lib/mysql
# 強制リカバリーモードの設定を解除する
vi /etc/my.cnf
# mysqlを立ち上げると初期化し新たにDBの作成を開始する。
# この時、ibdataファイルなども全て新規で作られる為、
# innodbファイル系の容量が大きいとそれなりに時間がかかる。
# CPUの性能によって変わる。serviceコマンドでの起動も
# タイムアウトすることがあるが、logを見ると動いているケースがあるので注意
service mysqld start
# mysql5.6からはSQLモードも変わるので下記も修正
# 自分が使ったwingのリポジトリは5.5からのアップグレードを想定している為、
# 通常のインストールではこの設定ファイルは作成されない
# SQLモードをコメントアウト
# 参考:http://www.seeds-std.co.jp/seedsblog/1035.html
# 参考:http://d.hatena.ne.jp/oranie/20130402/1364906656
# conf編集
vi /usr/my.cnf
# コメントアウト
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 設定の適用
service mysqld restart
# mysqlのユーザー・PASS再設定
# user、host、passの確認
select user,host,password from mysql.user;
# 必要に応じてPASSを設定
set password for root@localhost=password('hogehoge');
set password for root@127.0.0.1=password('hogehoge');
set password for ユーザー名@'ホスト名'=password('hogehoge');
# 接続ユーザー作成
grant all privileges on *.* to root@"192.168.0.0" identified by 'hogehoge' with grant option;
GRANT REPLICATION SLAVE ON *.* TO 'repli'@'%' IDENTIFIED BY '9ma9ma';
# キャッシュ削除
FLUSH PRIVILEGES;
# ホスト名の変更
update mysql.user set host="旧ホスト" where host="新ホスト";
# mysqlから出る
\q
###
### システムファイル破損
###
# 参考:http://m97087yh.seesaa.net/article/304120319.html
# まず、テーブルを消す!
# 場合によっては、他のDBが破損している場合があるので、
# その場合は「/var/lib/mysql/対象DBのディレクトリ」ごと削除。
use mysql;
DROP TABLE IF EXISTS `innodb_index_stats`;
DROP TABLE IF EXISTS `innodb_table_stats`;
DROP TABLE IF EXISTS `slave_master_info`;
DROP TABLE IF EXISTS `slave_relay_log_info`;
DROP TABLE IF EXISTS `slave_worker_info`;
# でも、.ibdは残っているのでこれも消す!
rm -rf /var/lib/mysql/mysql/innodb_index_stats.ibd
rm -rf /var/lib/mysql/mysql/innodb_table_stats.ibd
rm -rf /var/lib/mysql/mysql/slave_master_info.ibd
rm -rf /var/lib/mysql/mysql/slave_relay_log_info.ibd
rm -rf /var/lib/mysql/mysql/slave_worker_info.ibd
# mysql_system_tablesから再作成!!
use mysql;
source /usr/share/mysql/mysql_system_tables.sql;