/etc/init.d/mysqld stop # 或 systemctl stop mysqld
/usr/local/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking &
關鍵參數說明:
--skip-grant-tables:跳過權限驗證,允許無密碼登入。--skip-networking:禁用網路連線,僅允許本地 Unix Socket 連線,提升安全性。&:後台運行。/usr/local/mysql/bin/mysql
# 進入 mysql> 提示符後
UPDATE mysql.user SET Password = PASSWORD('123456') WHERE User = 'root';
FLUSH PRIVILEGES;
MySQL 5.7+ 版本語法不同:
UPDATE mysql.user SET authentication_string = PASSWORD('123456') WHERE User = 'root';
FLUSH PRIVILEGES;
殺掉 mysqld_safe 進程,正常啟動 service mysqld start,即可使用新密碼登入。
執行 mysqld_safe --skip-grant-tables 後,免密登入成功,但修改密碼後正常啟動仍提示 Access denied。
mysqld_safe 預設讀取編譯安裝路徑下的 data 目錄 (如 /usr/local/mysql/data),若實際資料目錄在其他位置 (如 /opt/mysql/data),會啟動一個空的臨時實例,修改的密碼寫入臨時實例的 mysql.user 表,而非生產資料目錄。
mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking &
確保 my.cnf 中 [mysqld] 區段的 datadir 指向正確路徑。
ln -s /opt/mysql/data /usr/local/mysql/data
mysqld_safe --skip-grant-tables --skip-networking --datadir=/opt/mysql/data --basedir=/usr/local/mysql &
DELETE FROM mysql.user WHERE User = ''; FLUSH PRIVILEGES;UPDATE mysql.user SET Host = 'localhost' WHERE User = 'root'; FLUSH PRIVILEGES; (或僅允許特定 IP)。DROP DATABASE test; DELETE FROM mysql.db WHERE Db = 'test' OR Db LIKE 'test\\_%'; FLUSH PRIVILEGES;mysql_secure_installation:自動化完成上述安全加固步驟。