Goal
* mySQLの再インストールせずにrootパスワードをリセットする
Preparation
* mysqld稼動サーバのroot権限を持っていることが前提
##
## 実行環境情報
##
$> uname -a
Linux *** 2.6.32-358.14.1.el6.x86_64 #1 SMP Tue Jul 16 23:51:20 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
$> cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m
$> which mysqld
/usr/local/mysql/bin/mysqld
$> whoami
root
## Check Shell
$> set | grep -i version
BASH_VERSION='4.1.2(1)-release'
## mysqld version
mysql> select version();
+-----------+
| VERSION() |
+-----------+
| 5.6.10 |
+-----------+
Manual
Milestone
* 起動しているmysqlを一旦ストップしてskip-grant-tablesオプション付きで再起動する
** これによって、パスワード認証スキップでログイン可能状態にする
* mysqlのrootユーザでログインする
* mysqlデータベースuserテーブルのレコードをupdateしてパスワードを変更する
* mysqlの起動モードを元に戻して起動し直す
Stop mysqld
## Stop
/etc/init.d/mysqld stop
# Or : HOSTNAME=`hostname`; kill `cat /usr/local/mysql/data/${HOSTNAME}.pid`
# ps -ef | grep mysqld : --pid-fileでpidファイル確認できる
Start mysqld with option(skip-grant-tables)
##
## skip-grant-tablesオプションを指定してmysqldサーバを起動することで、
## mysqlログイン時のHost/Userチェックを無視させることができる
## /etc/my.cnfの[mysqld]ブロックにオプションを追加して通常起動させる方法が確実
##
grep 'skip-grant-tables' /etc/my.cnf
# option追加を確認
## Start
/etc/init.d/mysqld start
ps -ef | grep mysqld
# 起動確認
Password Reset with nopass login
## From any machine
mysql -uroot
# これでログインできるようになるはず
mysql> use mysql
mysql> select Host, User, Password from user;
# user一覧
# mysqlはHost+Userの組み合わせチェックなので、rootユーザでも接続元クライアントによってアカウントが分かれている
mysql> update user set Password=Password('new_password') where Host='localhost' and User='root';
# 接続元としたいHost+Userでレコードを指定してパスワードを更新
# この場合、接続元としたいサーバとmysqlデーモンが稼動したいサーバが同じなので、Host='localhost'としている
mysql> flush privileges;
# 反映させる
mysql> exit;
Restore and Restart mysqld
##
## skip-grant-tablesオプションを解除して、mysqldを再起動させて
## nopassログイン可能状態を元に戻す
##
## /etc/my.cnfからskip-grant-tablesを削除
grep 'skip-grant-tables' /etc/my.cnf
# option削除を確認
/etc/init.d/mysqld stop
/etc/init.d/mysqld start
##
## 正しいパスワードでのログインを確認
## From any machine
mysql -uroot
# ログインできないことを確認
mysql -uroot -p
# new_password入力でログイン可能なことを確認