場景一:重置root密碼
mysql登錄密碼為password()算法加密,解密成本太高,以下為通用方案;
原理:mysql提供了特殊啟動方式,即跳過權限表驗證,啟動后,登錄不需要提供密碼;
登錄后,即可修改mysql數據庫的user表,重置密碼,然后刷新權限,重啟mysql服務即可;
注意:此時mysql服務將面臨高風險,請在合適時間執行;
#停止正在運行的mysql服務
service mysqld stop
#以--skip-grant-tables選項啟動服務,跳過權限表驗證,有2種方式
方式1:指定運行選項,只在本次啟動生效
./bin/mysqld_safe --skip-grant-tables --user=root & 如果本機沒有mysqld_safe服務,運行mysqld效果相同
方式2:修改配置文件,使用service、systemctl啟動均生效
修改配置文件my.cnf,添加 skip-grant-tables my.cnf可能存在多個,請使用 sudo mysql --help | grep my.cnf 或 mysql --help | grep 'Default options' -A 1 確認加載順序
#root賬號登錄mysql,此時不需要提供密碼 mysql -uroot #切換到mysql數據庫,登錄賬號與權限在此數據庫中 use mysql; #查看mysql版本 select version(); #查看當前賬戶信息,根據mysql版本執行 #5.7+版本密碼為authentication_string(生效),password; #5.7-版本密碼為password #user=用戶名,host=登錄IP,即允許該賬戶登錄的IP地址,每個IP一條user表記錄,%表示任意IP select user,host,authentication_string,password from user where user='root'; #5.7+設置密碼 update user set authentication_string=password('password') where user='root'; --and Host='localhost'; #5.7-設置密碼 update mysql.user set password=password('password') where user='root'; --host='localhost'; #5.7+支持2個密碼字段,直接設置2個,生效為authentication_string update user set authentication_string=password('password'),password=password('password') where user='root' ; --and Host='localhost'; #刷新權限表 flush privileges; #退出mysql連接 quit; #重啟mysql服務 service mysqld restart
場景二:增加賬號與授權
以上--skip-grant-tables模式不驗證權限,同時無法增加賬號授權,所以增加賬號的登錄IP,需要以正常模式啟動登錄
#密碼登錄重啟后的mysql服務 mysql -u root -p #切換mysql數據庫,賬號和權限在此數據庫 use mysql; #增加賬號授權 grant all privileges on *.* to "root"@"ip" identified by "password" with grant option; #刷新權限表 flush privileges; #退出mysql連接 quit; #無需重啟服務
場景三:修改登錄密碼
1> 更新mysql.user表,需要登錄MySQL執行,需要刷新權限列表生
mysql> use mysql; #5.7前后版本密碼字段不一致,且 user 表同時存在2個字段 # mysql5.7之前 mysql> update user set password=password('123456') where user='root' and host='localhost'; # mysql5.7之后 mysql> update user set authentication_string=password('123456') where user='root' and host='localhost'; mysql> flush privileges; #刷新權限列表
2> 用set password命令,需要登錄MySQL執行,自動刷新權限列表
語法:set password for '用戶名'@'域'=password(‘密碼’) mysql> set password for 'root'@'localhost'=password('123456');
3> alter user命令,需要登錄MySQL執行,自動刷新權限列表
語法:ALTER USER '用戶名'@'域' IDENTIFIED BY 'xxxx'; #初始化時root賬號只有localhost mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
4> grant命令,需要登錄MySQL執行,自動刷新權限列表
語法:GRANT 權限列表(逗號分隔) ON 數據庫.數據表 TO '用戶'@'域' IDENTIFIED BY '密碼'; #grant語句自動創建用戶以及設置密碼 #權限支持 create、update、select、lete、drop、execute等,也可以指定 all privileges 授權所有權限 #grant語句最后可以指定 WITH GRANT OPTION 指定用戶可以將權限傳遞授權給其他用戶。 #數據庫與數據表支持 * 指定全部,如 testdb.* 或 *.*,其他情況只能一條授權一個數據表 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.11.31' IDENTIFIED BY 'Mysql.pass.123' WITH GRANT OPTION;
5> mysqladmin,無需登錄MySQL執行,自動刷新權限列表
語法:mysqladmin -u用戶名 -p舊的密碼 password 新密碼 #該方式為明文傳輸密碼,不安全 [root@localhost ~]# mysqladmin -uroot -p123456 password 1234abcd mysqladmin: [Warning] Using a password on the command line interface can be insecure. New password: Confirm new password: Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
審核編輯:黃飛
-
MySQL
+關注
關注
1文章
801瀏覽量
26441 -
root
+關注
關注
1文章
85瀏覽量
21376
原文標題:MySQL忘記root密碼解決方案
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論