不重啟mysqld更改root密碼
Ever found yourself working on a MySQL server where root’s password is unavailable? It has happened to me a few times, always because the person who set up the DB left the place long ago, and this information was not documented anywhere.
If you have root access to the OS, MySQL lets you restart the server bypassing access checks, using the skip-grant-tables option, which requires a service restart.
However, if you need to regain root access and want to minimize service impact, you can take advantage of the way the server responds to SIGHUP signals and the fact that access credentials are stored on a MyISAM table.
MySQL uses a few tables to store credentials and privileges for users (you can find more about this here), but for this procedure, we only need to work with the mysql.user table.
Specifically, we will work with the columns ‘user’, ‘host’ and ‘password’ from this table.
Here’s an example of how this can look on a server:
mysql> select user,host,password from mysql.user; +-----------+-----------+-------------------------------------------+ | user | host | password | +-----------+-----------+-------------------------------------------+ | root | localhost | *1BD9C328233CF457571A4BB5DB8D32892AB8EDBF | | root | mysql | *1BD9C328233CF457571A4BB5DB8D32892AB8EDBF | | root | 127.0.0.1 | *1BD9C328233CF457571A4BB5DB8D32892AB8EDBF | | root | ::1 | *1BD9C328233CF457571A4BB5DB8D32892AB8EDBF | | | localhost | | | | mysql | | | dba | % | *4FC8D8270BEC4364C78799065996F5306139B412 | | readwrite | localhost | *202273E75BD11D06FBE2F057BFA1B1BB2B26549C | | readonly | localhost | *FC69E042CE30D92E2952335F690CF2345C812E36 | +-----------+-----------+-------------------------------------------+ 9 rows in set (0.00 sec)
To start, we’ll need to make a copy of this table to a database where we can change it. On this example server, this means the ‘test’ schema, as the ‘readwrite’ user has write privileges on it. Even if root’s password was lost, you can typically get a less privileged MySQL account by checking the applications that connects to this database. If for some reason this is not the case, you can achieve the same results by copying this table to another server, and copying it back after the necessary changes have been made.
The following command happen on the datadir:
[root@mysql mysql]# cp mysql/user.* test/; chown mysql.mysql test/user.*
Please don’t overwrite an existing table when doing this! Rename the copied files as needed instead …
Now you should be able to access (and write) to this table:
[root@mysql mysql]# mysql -ureadwrite -p test Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 34 Server version: 5.6.16 MySQL Community Server (GPL) Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select user,host,password from user; +-----------+-----------+-------------------------------------------+ | user | host | password | +-----------+-----------+-------------------------------------------+ | root | localhost | *1BD9C328233CF457571A4BB5DB8D32892AB8EDBF | | root | mysql | *1BD9C328233CF457571A4BB5DB8D32892AB8EDBF | | root | 127.0.0.1 | *1BD9C328233CF457571A4BB5DB8D32892AB8EDBF | | root | ::1 | *1BD9C328233CF457571A4BB5DB8D32892AB8EDBF | | | localhost | | | | mysql | | | dba | % | *4FC8D8270BEC4364C78799065996F5306139B412 | | readonly | % | *FC69E042CE30D92E2952335F690CF2345C812E36 | | readwrite | % | *202273E75BD11D06FBE2F057BFA1B1BB2B26549C | +-----------+-----------+-------------------------------------------+ 9 rows in set (0.00 sec)
By now you’ve probably figured out what I’ll do: update test.user, changing the password column for user ‘root’ and host ‘localhost’ to the result of running the PASSWORD() function with some string of my choice, then copying this table back, and then sending SIGHUP to the server.
A couple of caveats:
- Either make a copy of the original table file, (and?) or write down the original hash for root (the one you will replace)
- Even if nobody on the customer’s current team knows how to get you MySQL’s root password, that does not mean they don’t have some old app someone has forgotten about that uses the root account to connect. If this is the case, access will break for this app. You can follow the same steps outlined here, but instead of permanently changing root’s password, use your regained access to create a new super user account, and then replace root’s hash with the one you saved (and flush privileges!)
For completion, here’s the rest of the process:
mysql> update test.user set password=password('newpass but this is insecure so dont use') where user = 'root' and host = 'localhost'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select user,host,password from test.user where user='root'; +------+-----------+-------------------------------------------+ | user | host | password | +------+-----------+-------------------------------------------+ | root | localhost | *0A131BF1166FB756A61317A40F272D6FFDD281E9 | | root | mysql | *1BD9C328233CF457571A4BB5DB8D32892AB8EDBF | | root | 127.0.0.1 | *1BD9C328233CF457571A4BB5DB8D32892AB8EDBF | | root | ::1 | *1BD9C328233CF457571A4BB5DB8D32892AB8EDBF | +------+-----------+-------------------------------------------+ 4 rows in set (0.00 sec) mysql>
Time to copy the table back and reload the grant tables:
[root@mysql mysql]# 'cp' test/user.MY* mysql/ [root@mysql mysql]# kill -SIGHUP $(pidof mysqld)
And now you should be able to get back in:
[root@mysql mysql]# mysql -p'newpass but this is insecure so dont use' Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 35 Server version: 5.6.16 MySQL Community Server (GPL) Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show grants; +----------------------------------------------------------------------------------------------------------------------------------------+ | Grants for root@localhost | +----------------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*0A131BF1166FB756A61317A40F272D6FFDD281E9' WITH GRANT OPTION | | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION | +----------------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
There you go. We’ve regained root access to MySQL without restarting the service!
I hope you find this useful, and I’ll leave opinions on MySQL’s security as an exercise to the reader …
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22418990/viewspace-1179432/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【VMware vCenter】在不重啟的情況下重置vCenter Server的root密碼。Server密碼
- 如何在Oracle VM下更改root許可權密碼Oracle密碼
- 恆訊科技分析:如何在 Linux VPS上更改ROOT密碼?Linux密碼
- Ubuntu重置root密碼Ubuntu密碼
- MySQL 重置Root密碼MySql密碼
- MySQL 8.0 重置 root 密碼MySql密碼
- ubantu 設定root密碼密碼
- CentOS 7.5 重置 root 密碼CentOS密碼
- 自動劫持root密碼密碼
- 設定 Homestead root 密碼密碼
- 07 . Jenkins忘記root密碼Jenkins密碼
- 修改Mysql root密碼的方法MySql密碼
- mysql 5.7忘記root密碼MySql密碼
- ubuntu16.04 root 初始密碼Ubuntu密碼
- 【轉載】Linux忘記root密碼--進入單使用者模式修改root密碼Linux密碼模式
- 自動輸入密碼使用root許可權開啟shell指令碼密碼指令碼
- MySQL8.0 忘記 root 密碼下如何修改密碼MySql密碼
- Linux忘記root密碼解鎖Linux密碼
- centos7的root密碼重置CentOS密碼
- rocky9如何重置root密碼密碼
- mysql忘了root密碼怎麼辦MySql密碼
- MYSQL5.7 ROOT密碼修改教程MySql密碼
- 破解 RHEL7.3 的 root 密碼密碼
- mysql 8.0.11 以上版本修改root密碼MySql密碼
- MySQL的Root使用者密碼MySql密碼
- 在Linux中,如何重置 mysql root 密碼?LinuxMySql密碼
- Tool-Gitlab-重置root賬戶密碼Gitlab密碼
- Ubuntu 如何重設 MySQL 的 root 密碼UbuntuMySql密碼
- Ubuntu MySQL5.7設定root密碼UbuntuMySql密碼
- mysql5.7重置root密碼MySql密碼
- linux破解root登入密碼,並重置Linux密碼
- centos7 修改root密碼 密碼忘記的情況下CentOS密碼
- win10 mysql8.0.12 忘記root密碼如何重置密碼Win10MySql密碼
- 更改密碼時出現ERROR 1054密碼Error
- win10更改電腦開機密碼 聯想win10如何更改開機密碼Win10密碼
- Kali Linux 2020.1修改root使用者密碼Linux密碼
- Centos8加密GRUB防破解root密碼CentOS加密密碼
- deepin 20 破解root密碼實戰--圖文密碼
- mysql如何修改root使用者的密碼MySql密碼