連載第38回
2014年4月13日
MySQLのrootを削除してしまった…。

 前回からのつづき。本来の目的だった「webminでMySQLの管理」はとてもスムーズに行えた気がします。ここまで操作してきたことをターミナル経由で行おうとしたら、コマンドを何度も打ち込んだりして、かなり面倒だったに違いありません。
 ここで一旦、MySQL設定ウィンドウ内の整理をしておこうと思いました。当初から設置されていた「information_schema」「mysql」というデータベースは決して削除してはダメ絶対!ということなのでそのまま放置しておきます(Coda 2からも見えませんし)。逆に、MySQLインストール時に自動作成される「test」というDBはCoda 2から削除しておきました。また「データベースの許可」から「test」と「test_%」を削除。「ユーザーの許可」から「匿名」と「root(ホストはlocalhost、127.0.0.1、vps~の3項目)」のユーザーを削除…したところでハマりました。ぎゃふん。

何も出来無くなった

 以前、ServersMan@VPSレンタル開始時にデフォルトで提供されている「root」を、セキュリティ観点から削除しました。その時と同じノリで、MySQLでも新規ユーザーを設定したことだし、rootは削除しておいた方がいいかな、と思ったのが運の尽き。前回の終わりに「追加・削除はwebminから一手間かけて行うようにします」なんて言っておいて、一手間かけてヘマをしてしまいました。MySQL自体はwebminからアクセス出来るから(Coda 2からもDBに接続できます)、完全にログイン出来無くなったワケではないけれど、しかしユーザーの許可やデータベースの作成などことごとく拒否。つまり、前回作成した新規ユーザーIDに、rootに代わる権限を付与しないまま削除してしまったのですね。これはマズイことになりました。

同じ失敗をしている仲間を探す

 まず最初に考えたのが、MySQLの再インストール。しかし現状でMySQL自体は普通に動いているので、それは最後の手として取っておくことにして、もう少し他の手段を探してみることに。そこで早速「MySQL root 削除してしまった」でググってみると…居た、同じ仲間が。たくさん。

頑張ってみた、が

 サーバのrootではなくて、MySQL用のrootを復活させたい…という想いは同じ。自分でアレコレ考える能力も無いので、とりあえず参考記事にある手順を踏んでみる事にしました。まずは「su -」でrootに昇格してからスタート。

ターミナルからMySQLの操作

# /etc/init.d/mysqld stop
# /usr/bin/mysqld_safe --skip-grant-tables

1行目:MySQL停止。
2行目:権限無視モードでmysql起動。これを使うと、認証ナシでログイン出来るんですね。ほー。

 ここで、現在のターミナルウィンドウはそのままにして、新たにCoda 2から「新規ターミナルタブを開き」ログインして「su -」で昇格。mysqlに仮rootでログインします。

かりそめのrootでMySQLにログイン

# /etc/init.d/mysqld stop
# /usr/bin/mysqld_safe --skip-grant-tables

 プロンプトが「mysql」に変わり、MySQLに接続出来たことが分かります。rootを削除してしまった後、それまでデータベースにあった「mysql」と、提供されていた「wordpress」 の2つのDBも消えてしまいました。が、参考記事では「mysql」に接続する、とあるので、とりあえず打ち込んでみます。大丈夫なのか。

mysqlデータベースに移動

use mysql

 なんかテキストが表示されるけど、進みます。改めて「root」ユーザーを作成(インサート)します。

「root」ユーザー作成

 insert into user (user, host, password) values('root', 'localhost', PASSWORD('pass'));

「Query OK, 云々かんぬん」と出たので、次にrootに付与する権限を設定します。長いので途中を略。参考記事を参照してください。

「root」の権限設定その1

update user set
Select_priv='Y',
Insert_priv='Y',
Update_priv='Y',
   略
Trigger_priv='Y',
Create_user_priv='Y'
where User='root';

1つ1つ打ち込むのは面倒なので…

「root」の権限設定その2

update user set Select_priv='Y', Insert_priv='Y', Update_priv='Y', Delete_priv='Y', Create_priv='Y', Drop_priv='Y', Reload_priv='Y', Shutdown_priv='Y', Process_priv='Y', File_priv='Y', Grant_priv='Y', References_priv='Y', Index_priv='Y', Alter_priv='Y', Show_db_priv='Y', Super_priv='Y', Create_tmp_table_priv='Y', Lock_tables_priv='Y', Execute_priv='Y', Repl_slave_priv='Y', Repl_client_priv='Y', Create_view_priv='Y', Show_view_priv='Y', Create_routine_priv='Y', Alter_routine_priv='Y', Create_user_priv='Y', Event_priv = 'Y', Trigger_priv = 'Y' where User = 'root';

こうやって1行で打ち込むのがベターかも。

 カタカタと入力して、えいっ!と最後にリターンを押したら、Syntaxエラーが出てガックリ。どこを間違えたか確認しても分からず、仕方ないので、とりあえず適当な3つの権限を選んで個別にチマチマと1回ずつ再入力。

「root」の権限設定その3

update user set
Select_priv='Y'
where User='root';

update user set
Insert_priv='Y'
where User='root';

update user set
Create_user_priv='Y'
where User='root';

 情報をflushし反映させて、接続を閉じます。

flushする

flush privileges;
exit

 続けて「/usr/bin/mysqld_safe –skip-grant-tables」の走っているプロセスIDを調べ、キルします。そしてMySQLの再起動。

プロセスのキルとMySQL再起動

# ps aux
# kill PID番号
# /etc/init.d/mysqld start

 しかしどこで手順を間違えたのか、webminでチェックしてみるとデータベースもユーザーも未だ復活出来ていませんでした。また上述の作業を繰り返したりして、時折チラっとrootが復活しwebmin上に出現する瞬間があるのですが(付与した権限も上述の3つになっている)、「やったラッキー!」と喜んで設定を上書き保存しようとすると「お前には権限が無い」とエラーが出てしまう。再びガックリ。そのうちターミナルからmysqlに対して何をやってもエラーが出る状態となり、次の手段を考えねばならない状況となりました。
 

Q&Aの自己解決スレッド

 いよいよ追いつめられて来ました。しかしMySQLの再インストールなんて面倒なことはもう金輪際やりたくないので、もう少し粘って解決方法を探し回ってみると、某Q&Aサイトに参考になりそうな書き込み発見。

質問:誤って全てのユーザを削除してしまい、MySQLサーバに接続出来なくなってしまいました。

 質問者はここで自己解決してしまっているのですが、その解決方法が興味深い。つまり要約すると、データベースに関するディレクトリを丸ごと削除して、その該当部分を再インストールしている、ということらしい(昔のMacみたい)。MySQL全体丸ごとを再インストールすることはしなくても良いというのならば、それはとても有り難い。

 まずは確認ということで、以前購入したTransmitでサーバにSFTP接続し、僕のサーバも「var/lib/mysql」にあることを確認。幸い、まだブログは始めてないから各データベースはまっさらの空っぽ。失って悲観に暮れてしまうようなものは一切ありませんし、他に手も無さそうなので、この方法を試してみることにしました。

 一旦、webminからMySQLのサービスを停止し、もう一度ターミナルで「var/lib」まで移動してから削除。続けて「mysql_install_db」でデータベース設定関連を再インストールしました。作業は成功した様子。

MySQLデータベース関連再インストール

# rm -rf mysql*
# mysql_install_db
外部サイト参考記事
Homebrewでインストールしたmysqlのmysql_install_dbが失敗する @blog = Blog.new(author: “nyangry”)

初期状態になった

 webminにログインして、停止状態のMySQLを再起動させると、まず最初回のログインウィンドウが出てきました。当初、そのログイン項目には前回設定した新規ユーザー名が表示されていたので、クリーンインストールしたと思ったが記録が残っているのか?と思い、そのパスワードを打ち込んで保存ボタンを押したのだけれど拒否。「?」と思い、次にServersMan@VPSから提供されていたログイン名とパスワードを入れてみたけど拒否…。さらに次はログイン名にrootを入れて、あれこれ思い付くパスワードを入れてみたけどやはり拒否。
 ここまで来たのに門前払いなの〜とグッタリしてきた時に、何となくログイン名はrootのまま、パスワードには何も入力せずに空のままで保存ボタンを押したら、やっとログイン出来ました…分かるか!

 なにはともあれ、無事ログインも出来、そこにはrootちゃんも戻ってきていました(擬人化)。そして再び前回の行程を辿ることになるのですが、こういう時の為にこの引っ越しメモたちをチマチマと記録していてホントに良かった!まさか昨日のメモ(&ブログには掲載しなかった大量の画面キャプチャ)が翌日に役立つとは!つづく。

…半日を無駄にしました。