mysql のデータをインポートしたら繋がらなくなった時の対応メモ
今回、他のサーバ上のMySQLのデータが大量(2.5GB)にあった事から phpMyAdmin から読み込むのも難しかった事からターミナルから読ませてみる事にした。今回のメモは以下の2つの事を行った時のモノだが、本来は1だけで済ませた方がいい事である。
- ターミナル上からデータをMySQLにインポートする
- 分からなくなった MySQL のユーザーのパスワードを再設定する
1. ターミナル上からデータをMySQLにインポートする
今回、この部分については、あまり問題にならなかったが、一応メモとして残しておく。そもそも、ココをミスった事が後から気がつく事になるのですが...
$ mysql -u root -p < data.sql
こう書く事で、全てをインポートする事になるが、これをすると mysql のユーザー情報まで上書きしてしまうので、サーバ上に設定されていたユーザーや mysql の root のパスワードまで書き変わってしまいます。それでいい場合(バックアップから完全に戻したい!)には、完全に元に戻ったりできるのでいいかもしれません。
$ mysql -u root -p データベース名 < data.sql
しかし、今回は上記のようにして、特定のデータベースの情報のみとするべきでした。
インポートした段階で、すぐに mysql にアクセスできなくなれば、すぐに分かったのですが、my.cnf を書き換えて、mysql を再起動した後にパスワードがバックアップ上のdata.sql内のモノに変わった事から、my.cnf の書き方がダメなの? って事でパスワードが変わってしまった事からアクセスできないという事が気がつかないバカな事をしていました。
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
は、単なるパスワードエラーです。(メモ)
2. 分からなくなった MySQL のユーザーのパスワードを再設定する
1. mysqldを停止します。
# /etc/init.d/mysqld stop
2. 認証なしでMySQLサーバに接続するために、認証をパスさせます。
# /usr/bin/mysqld_safe --skip-grant-tables
※なお、起動中は起動させたコンソールを使うことができないため、別のコンソールを起動させてアクセス下さい。また、Web から phpMyAdmin 等を利用し、IDは root でパスワードが空でアクセス可能です。(キケンなので長くこのままにしないように!)
3. mysqlにパスワードなしでrootユーザでログインさせます。
# mysql -u root
4. mysqlのデータベースを指定します。
mysql> use mysql;
5. ユーザーのパスワードを希望のものに上書きします。
mysql> UPDATE user SET Password = OLD_PASSWORD('パスワード') WHERE Host = 'ホスト名' AND User = 'ユーザー名';
今回利用しているサーバはパスワードが古いタイプに設定されているようなので、OLD_PASSWORD としていますが、運用によっては PASSWORD を利用するところもあるかと思います。
7. mysqldを再起動します。
# /etc/init.d/mysqld restart
8. 新しいパスワードにてログインできることを確認します。
$ mysql -u root -p
これで、なんとか動かなくなってしまった、サイトが無事に動作するようになりました。また、同様な事が起こった時のためにメモで残しておきます。