MySQL rootユーザーのパスワード変更

rootユーザーのパスワードを度忘れ

方法1: mycnfにskip-grant-tablesを追加→パスワード変更
方法2: mysqld_safe –skip-grant-tables→パスワード変更
でパスワードを変更可能。

mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

 

方法1- my.cnfの書き換え

設定ファイルをバックアップし、[mysqld]セクション内に
skip-grant-tables を追加すると、パスワードなしでログインできる。

# my.cnfを探す
sudo find / -name '*my.cnf*' | sort
find: ‘/proc/867/task/867/net’: 無効な引数です
find: ‘/proc/867/net’: 無効な引数です
find: ‘/run/user/1000/gvfs’: 許可がありません
/etc/alternatives/my.cnf
/etc/mysql/my.cnf
/etc/mysql/my.cnf.bak
/etc/mysql/my.cnf.fallback
/etc/mysql/my.cnf.migrated
/var/lib/dpkg/alternatives/my.cnf

# シンボリックリンク先を辿る
ls -l /etc/mysql/my.cnf
lrwxrwxrwx 1 root root 24 10月 24 01:15 /etc/mysql/my.cnf -> /etc/alternatives/my.cnf
ls -l /etc/alternatives/my.cnf
lrwxrwxrwx 1 root root 26 10月 24 01:15 /etc/alternatives/my.cnf -> /etc/mysql/my.cnf.migrated
ls -l /etc/mysql/my.cnf.migrated
-rw-r--r-- 1 root root 4251 10月 24 01:15 /etc/mysql/my.cnf.migrated

# シンボリック先のファイル実体をコピー
cp -L /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
ls -l /etc/mysql/my.cnf.bak
-rw-r--r-- 1 root root 4251 12月  9 13:21 /etc/mysql/my.cnf.bak
diff /etc/mysql/my.cnf /etc/mysql/my.cnf.bak

# my.cnfに skip-grant-tables を追加
vim /etc/mysql/my.cnf
# [mysqld]セクション内に skip-grant-tables を追加

# 追加できてるか確認-1
diff /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
45d44
< skip-grant-tables

# 追加できてるか確認-2
cat /etc/mysql/my.cnf | grep '\[mysqld\]' -A 1
[mysqld]
skip-grant-tables

 

方法1- MySQLを再起動し、パスワード変更

# mysqlを再起動
sudo /etc/init.d/mysql restart
[ ok ] Restarting mysql (via systemctl): mysql.service.

# パスワードなしでログイン
mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

# パスワード変更
MariaDB [(none)]> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

MariaDB [mysql]> UPDATE mysql.user SET Password=PASSWORD('お好みのパスワード') WHERE User='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [mysql]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

MariaDB [mysql]> exit;
Bye

 

方法1- my.cnfの戻し

sudo vim /etc/mysql/my.cnf
# skip-grant-tables の行を削除

# 消えてるか確認-1
diff /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
# 差分なし

# 消えてるか確認-2
cat /etc/mysql/my.cnf | grep '\[mysqld\]' -A 1
[mysqld]
#

 

方法1- 変更後のパスワードでログイン

mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> Bye

 

方法2- mysqld_safe –skip-grant-tables

多分、こっちを使う人が多いと思う。
オプションに感謝し、MySQLを再起動し、パスワード変更する。

# MySQLを停止
sudo /etc/init.d/mysql stop

# mysqld_safeの確認
which mysqld_safe
/usr/bin/mysqld_safe

# MySQLを起動
# 操作不能になるので、バックグラウンドで起動
sudo mysqld_safe --skip-grant-tables &
[1] 28920

# パスワードを変更
mysql -u root
USE mysql;
UPDATE mysql.user SET Password=PASSWORD('<お好きなパス>') WHERE User='root'; # MySQL5.6以前
UPDATE mysql.user SET authentication_string=PASSWORD('<お好きなパス>') WHERE User='root'; # MySQL5.7以降
FLUSH PRIVILEGES;
exit;

# mysqld_safe のプロセスを探して、killしていく
ps auxf | grep mysql | grep -v grep
root     28920  0.0  0.1  53716  3832 pts/0    S    17:05   0:00
    \_ sudo mysqld_safe --skip-grant-tables
root     28922  0.0  0.0   4504  1872 pts/0    S    17:05   0:00
        |   \_ /bin/sh /usr/bin/mysqld_safe --skip-grant-tables
mysql    29294  0.0  9.7 1152316 199132 pts/0  Sl   17:05   0:00
            |       \_ /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-grant-tables --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=

sudo kill -9 28920 28922 29294

# MySQLを起動
sudo /etc/init.d/mysql start

 

ハマりポイント

`mysqld.sock`がない
なければ、作ってからmysqld_safeする。

mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

sudo mkdir -p /var/run/mysqld
sudo chown mysql:mysql  /var/run/mysqld/
cd /var/run/mysqld/
sudo touch mysqld.sock
sudo chown mysql:mysql mysqld.sock
sudo chmod 777 mysqld.sock
sudo mysqld_safe --skip-grant-tables &

cf. MySQL 5.7でrootユーザのパスワードを再設定
https://qiita.com/is0me/items/91a0af0342c307b94a16
cf. Mysqlのrootユーザのpasswordを初期化(変更)する
https://qiita.com/is0me/items/91a0af0342c307b94a16

コメント

タイトルとURLをコピーしました