在 MySQL 中跳過授權表

Mehvish Ashiq 2024年2月15日
  1. MySQL 系統資料庫中的授權表
  2. MySQL 中的 --skip-grant-tables 選項
在 MySQL 中跳過授權表

今天,我們將學習 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

  1. 我們不小心鎖定了 root 使用者。
  2. 我們忘記了 root 密碼。
  3. 我們失去了 root 使用者的所有許可權。

讓我們開始瞭解上述每種情況的解決方案。

root 使用者被鎖定時使用 --skip-grant-tables

  • 使用 Windows 管理工具停止 services.msc 中的 MySQL 服務。它可以在 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools 或通過 Windows 搜尋欄訪問。

    mysql 跳過授權表 - 停止 mysql 伺服器

  • 通過新增以下行來更新名為 my.ini 的配置檔案中 [mysqld] 下的 SERVER SECTION
    skip-grant-tables
    

    mysql 跳過授權表 - 更新 mysql ini 檔案

    如果你在預設位置安裝了 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-tablesskip-networking)。
作者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook