解決mysql報(bào)錯(cuò)You must reset your password using ALTER USER statement before executing this statement問(wèn)題
mysql報(bào)錯(cuò)You must reset your password using ALTER USER statement before executing this statement
在 linux 中安裝好 MySQL 并完成初始化配置后,使用默認(rèn)生成的 root 用戶密碼登錄 MySQL 時(shí),可能會(huì)出現(xiàn)無(wú)法執(zhí)行任何語(yǔ)句的情況
提示:
「You must reset your password using ALTER USER statement before executing this statement」
這是因?yàn)?MySQL 5.7 版本后,用戶表的密碼字段由 password 改為了 authentication_string,同時(shí)增加了一個(gè) password_expired 字段來(lái)標(biāo)識(shí)密碼是否過(guò)期。
對(duì)于 root 用戶密碼過(guò)期的情況
通過(guò)以下步驟來(lái)修改root用戶的密碼
1. 停止所有的 MySQL 進(jìn)程。使用命令 `service mysql stop` 或 `killall mysql`
2. 使用無(wú)驗(yàn)證模式啟動(dòng) MySQL。執(zhí)行命令 `mysqld_safe --skip-grant-tables`
3. 使用 MySQL 客戶端登錄無(wú)需密碼。此時(shí)可以執(zhí)行任何語(yǔ)句。
4. 檢查用戶表,使用 `select * from mysql.user;`來(lái)查看用戶詳情。
5. 修改 root 用戶的密碼到期標(biāo)識(shí)和密碼。
6. 使用語(yǔ)句:
`update mysql.user set authentication_string=password('yourpassword'), password_expired='N' where user='root';`
執(zhí)行 `flush privileges;`刷新 privileges 表。
查看結(jié)果
select authentication_string,password_expired from user where user='root';
8. 重新使用正常模式啟動(dòng) MySQL 服務(wù)。執(zhí)行 `service mysql start`
9. 使用新設(shè)置的 root 密碼登錄 MySQL 客戶端進(jìn)行操作。
以上步驟可以很方便地解決 MySQL 中 root 密碼過(guò)期無(wú)法登錄的問(wèn)題。
重置密碼后需要更新整個(gè)項(xiàng)目中的連接配置,以確保正常訪問(wèn)數(shù)據(jù)庫(kù)。
也可以調(diào)整my.cnf
#設(shè)置密碼過(guò)期時(shí)間為120天,設(shè)為0表示不過(guò)期 #default_password_lifetime = 120 default_password_lifetime = 0 #修改密碼強(qiáng)度策略,0為低策略 #validate_password_policy=0 #修改密碼長(zhǎng)度 #validate_password_length=5 #跳過(guò)密碼校驗(yàn),無(wú)密碼登錄 #skip-grant-tables
其他報(bào)錯(cuò)處理:
ERROR 1805 (HY000): Column count of mysql.user is wrong. Expected 45, found 46. The table is probably corrupted
這個(gè)錯(cuò)誤表示MySQL的系統(tǒng)權(quán)限表mysql.user結(jié)構(gòu)與MySQL服務(wù)器預(yù)期的不匹配,可能是由于不兼容的升級(jí)或錯(cuò)誤的操作導(dǎo)致該系統(tǒng)表被破壞。
解決方案有以下幾種
1.嘗試用mysqld自帶的修復(fù)模式先修復(fù)表結(jié)構(gòu):
mysqld --defaults-file=/etc/my.cnf --skip-grant-tables --user=mysql --skip-networking --safe-mode &
進(jìn)入安全模式后,執(zhí)行:
mysql> USE mysql; mysql> REPAIR TABLE user;
如果能順利修復(fù),則重啟正常模式的mysqld服務(wù)器并登錄檢查。
2.如果上述修復(fù)沒(méi)有效果
可以嘗試重建mysql.user表:
mysqldump --add-drop-table --no-data mysql user > user.sql
退出,刪除mysql.user表:
DROP TABLE mysql.user;
然后重建:
SOURCE user.sql;
3.如果以上兩種方式仍然無(wú)法修復(fù)
則可以嘗試重新初始化MySQL數(shù)據(jù)目錄:
mysqld --defaults-file=/etc/my.cnf --initialize-insecure
這將移除所有數(shù)據(jù)重新初始化,之后需要重新導(dǎo)入數(shù)據(jù)。
4.最后的緊急情況下可以選擇完全卸載重裝MySQL服務(wù)器。
在修復(fù)過(guò)程中務(wù)必對(duì)現(xiàn)有數(shù)據(jù)做好備份。
修復(fù)表結(jié)構(gòu)本質(zhì)上是對(duì)表重建,如果有數(shù)據(jù)損壞可能導(dǎo)致部分?jǐn)?shù)據(jù)丟失。
如果不行的話,可以考慮用之前的備份重建。
產(chǎn)生這個(gè)錯(cuò)誤一般是由于MySQL版本升級(jí),權(quán)限表結(jié)構(gòu)發(fā)生變化,手動(dòng)操作錯(cuò)誤等導(dǎo)致。
我們需要格外小心謹(jǐn)慎操作系統(tǒng)權(quán)限表。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Windows安裝MySQL8.0時(shí)的報(bào)錯(cuò)匯總及解決方案
- 解決Linux安裝mysql報(bào)錯(cuò):失敗的軟件包是:mysql-community-libs-8.0.37-1.el7.x86_64?GPG
- MySQL報(bào)錯(cuò)ERROR?2002?(HY000):?Canot?connect?to?local?MySQL?server?through?socket
- 解決mysql啟動(dòng)報(bào)錯(cuò):The server quit without updating PID file問(wèn)題
- MySQL 5.6 中TIMESTAMP with implicit DEFAULT value is deprecated錯(cuò)誤
- MySQL [Warning] TIMESTAMP with implicit DEFAULT value is deprecated(報(bào)錯(cuò)信息解決)
相關(guān)文章
微信昵稱(chēng)帶符號(hào)導(dǎo)致插入MySQL數(shù)據(jù)庫(kù)時(shí)出錯(cuò)的解決方案
Mysql的utf8編碼最多3個(gè)字節(jié),而Emoji表情或者某些特殊字符是4個(gè)字節(jié),所以會(huì)導(dǎo)致帶有表情的昵稱(chēng)插入數(shù)據(jù)庫(kù)時(shí)出錯(cuò),下面給大家分享下解決方案,需要的朋友參考下吧2016-12-12MySQL的prepare使用及遇到bug解析過(guò)程
在一次開(kāi)發(fā)中使用 MySQL PREPARE 以后,從 prepare 直接取 name 賦值給 lex->prepared_stmt_name 然后給 EXECUTE 用,發(fā)現(xiàn)有一定概率找不到 prepare stmt 的 name,于是開(kāi)始動(dòng)手調(diào)查問(wèn)題發(fā)生的原因,本文給大家分享mysql prepare使用及問(wèn)題解決,感興趣的朋友一起看看吧2022-05-05詳解MySQL數(shù)據(jù)庫(kù)、表與完整性約束的定義(Create)
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)、表與完整性約束的定義(Create),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-04-04