在 MySQL 中跳過授權表
    
    Mehvish Ashiq
    2024年2月15日
    
    MySQL
    MySQL Privilege
    
 
今天,我們將學習 MySQL 的跳過授權表、授權表,以及當我們鎖定 root 使用者、忘記其密碼或想要恢復完全許可權時如何在 MySQL 中使用 --skip-grant-tables。
MySQL 系統資料庫中的授權表
MySQL 系統資料庫中的授權表有以下資訊:
- user(全域性許可權、使用者帳戶和其他非特權欄位/列)
- db(資料庫級別的許可權)
- tables_priv(表級別的特權)
- columns_priv(列級別的特權)
- procs_priv(函式和儲存過程的特權)
- proxies_priv(代理使用者的特權)
每個授權表都由範圍和特權列組成。範圍列標識表中每一行的範圍。
許可權列表示錶行授予的許可權或它允許執行的操作型別。
MySQL 中的 --skip-grant-tables 選項
從 MySQL 8.0.3 開始,--skip-grant-tables 啟用了 --skip-networking,它自動不允許遠端連線。例如,當 --skip-grant-tables 處於活動狀態時,有關帳戶管理的 SQL 語句 ALTER USER 將被禁用。
我們可以在以下情況下使用 --skip-grant-tables:
- 我們不小心鎖定了 root使用者。
- 我們忘記了 root密碼。
- 我們失去了 root使用者的所有許可權。
讓我們開始瞭解上述每種情況的解決方案。
當 root 使用者被鎖定時使用 --skip-grant-tables
    
- 
使用 Windows 管理工具停止services.msc中的 MySQL 服務。它可以在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools或通過 Windows 搜尋欄訪問。 
- 
通過新增以下行來更新名為my.ini的配置檔案中[mysqld]下的SERVER SECTION:skip-grant-tables 如果你在預設位置安裝了 MySQL,則 my.ini檔案位於C:\ProgramData\MySQL\MySQL Server 8.0\my.ini。
- 
再次啟動 MySQL 伺服器。這次我們可以不用密碼登入了。
使用 --skip-grant-tables 恢復 MySQL root 使用者的完整許可權
我們可以使用 UPDATE 命令恢復 MySQL root 使用者的完全許可權。
- 
首先,我們需要停止mysqld。
- 
接下來,使用--skip-grant-table選項重新啟動它以禁用root帳戶的登入憑據。
- 
此外,僅使用mysql再次連線到mysqld伺服器。這裡我們不使用-p選項作為密碼,也可能不輸入使用者名稱。
- 
在mysql客戶端中使用以下命令來獲取 MySQL 中root使用者的所有許可權。mysql> UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';我們已經使用 Super_priv = 'Y'設定了超級許可權。
- 
現在,我們必須使用FLUSH命令重新整理許可權,如下所示:mysql> FLUSH PRIVILEGES;請記住,當 --skip-grant-table處於活動狀態時,MySQL 不會在查詢和連線時檢查授權表,這意味著任何人都可以快速遠端登入並運算元據庫。
在 MySQL 中使用 --skip-grant-tables 重置 root 密碼
在這裡,我們可以使用 mysql 客戶端來重置root 密碼,但這是一種不太安全的方法。要繼續使用此方法,請按照以下步驟操作:
- 
停止 MySQL 伺服器並使用--skip-grant-tables重新啟動。為什麼我們要關閉伺服器?因為這是一種不安全的方法,並且通過啟用skip_networking來禁用遠端連線。
- 
使用mysql客戶端重新連線 MySQL 伺服器。此處不需要密碼。
- 
在mysql客戶端中,重新載入授權表以使帳戶管理語句正常工作。mysql> FLUSH PRIVILEGES;
- 
現在,用你想要的密碼更新'root'@'localhost'帳戶的密碼。
- 
更新語句以使用該主機名以不同的主機名部分更改root帳戶的密碼。mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
- 
最後,我們可以使用新密碼以root使用者身份連線到 MySQL 伺服器。像往常一樣關閉伺服器並重新啟動(沒有--skip-grant-tables和skip-networking)。
        Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
    
作者: Mehvish Ashiq
    
