Mật khẩu người dùng trong MySQL được lưu trữ trong bảng user, việc đặt lại mật khẩu thực chất là thay đổi giá trị của bản ghi trong bảng này. Để thay đổi mật khẩu trong trường hợp quên mật khẩu, ý tưởng là bỏ qua xác thực của MySQL và truy cập vào hệ thống, sau đó cập nhật giá trị mật khẩu bản ghi bằng lệnh SQL.
Trong MySQL 5, người ta có thể khởi động dịch vụ MySQL với tùy chọn --skip-grant-tables, tùy chọn này sẽ yêu cầu dịch vụ bỏ qua việc tải các bảng cấp quyền khi khởi động, do đó người dùng root có thể đăng nhập bằng mật khẩu trống.
mysqld –skip-grant-tables
Sau khi đăng nhập, có thể chạy lệnh SQL bên dưới để thay đổi mật khẩu
UPDATE user SET authentication_string='' WHERE user='root';
Thao tác này sẽ đặt mật khẩu thành trống.
Tuy nhiên, có vẻ như --skip-grant-tables không thể hoạt động bình thường nếu không có một số điều chỉnh trong MySQL 8. Vậy chúng ta có thể làm gì? Có hai tùy chọn khả thi.
- Tạo một file init và chạy dịch vụ MySQL với tùy chọn --init-file. Trong file init, đặt lệnh SQL để cập nhật giá trị mật khẩu.
- Tìm hiểu sâu về cách sử dụng --skip-grant-tables trong MySQL 8.
Hãy xem các tùy chọn này hoạt động như thế nào.
Tùy chọn 1: Tùy chọn --init-file
Tùy chọn này sẽ chỉ định một file chứa lệnh SQL sẽ được thực thi trước khi dịch vụ khởi động. Do đó, chúng ta chỉ cần đặt lệnh cập nhật mật khẩu vào file này và khởi động dịch vụ MySQL với tùy chọn này. Mật khẩu sẽ được đặt lại/cập nhật.
Bước 1: Dừng dịch vụ MySQL
net stop mysql
Bước 2: Tạo một file txt và đặt lệnh bên dưới vào
ALTER USER 'root'@'localhost' IDENTIFIED BY '';
Bước 3: Khởi động dịch vụ trên dòng lệnh và với tùy chọn --init-file
mysqld --init-file=/some/path/to/cmd.txt --console
Vậy là xong. Lưu ý: vui lòng chạy lệnh với tư cách người dùng có đặc quyền khi bạn gặp lỗi từ chối quyền. Nếu bạn thấy các lỗi như:
2018-12-25T02:51:23.739089Z 0 [System] [MY-010116] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe (mysqld 8.0.13) starting as process 1912
2018-12-25T02:51:23.759426Z 1 [ERROR] [MY-011011] [Server] Failed to find valid data directory.
2018-12-25T02:51:23.761196Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2018-12-25T02:51:23.762550Z 0 [ERROR] [MY-010119] [Server] Aborting
2018-12-25T02:51:23.766230Z 0 [System] [MY-010910] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe: Shutdown complete (mysqld 8.0.13) MySQL Community Server - GPL.
Vui lòng chạy lệnh bên dưới để khởi tạo thư mục dữ liệu
mysqld --initialize --console
Tùy chọn 2: Sử dụng tùy chọn --skip-grant-tables
Ngược lại với MySQL 5, một số tùy chọn khác cần được thêm vào trong MySQL 8.
mysqld --console --skip-grant-tables --shared-memory
Sau khi khởi động dịch vụ, đăng nhập bằng mật khẩu trống
mysql -u root
Sau đó thực thi lệnh SQL để cập nhật mật khẩu
UPDATE mysql.user SET authentication_string='' WHERE user='root' and host='localhost';
Thông thường, tùy chọn 1 được khuyến nghị. Và hy vọng những điều này sẽ giúp ích.
2019-02-07T08:33:35.790267Z 0 [System] [MY-010116] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe (mysqld 8.0.14) starting as process 9932
2019-02-07T08:33:35.793300Z 0 [Warning] [MY-010091] [Server] Can't create test file C:\Program Files\MySQL\MySQL Server 8.0\data\DESKTOP-7CTR7J5.lower-test
2019-02-07T08:33:35.793361Z 0 [Warning] [MY-010091] [Server] Can't create test file C:\Program Files\MySQL\MySQL Server 8.0\data\DESKTOP-7CTR7J5.lower-test
2019-02-07T08:33:35.793534Z 0 [ERROR] [MY-013276] [Server] Failed to set datadir to 'C:\Program Files\MySQL\MySQL Server 8.0\data\' (OS errno: 2 - No such file or directory)
2019-02-07T08:33:35.807438Z 0 [ERROR] [MY-010119] [Server] Aborting
2019-02-07T08:33:35.807626Z 0 [System] [MY-010910] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe: Shutdown complete (mysqld 8.0.14) MySQL Community Server - GPL.
Hi! Thanks for the guide. I am getting this error tho. Grateful for your help.