Tôi đã thử nhiều bước để khắc phục vấn đề này. Có rất nhiều nguồn cho các giải pháp khả thi cho vấn đề này rất khó để lọc ra ý nghĩa từ những điều vô nghĩa. Cuối cùng tôi đã tìm thấy một giải pháp tốt ở đây :
Bước 1: Xác định phiên bản cơ sở dữ liệu
$ mysql --version
Bạn sẽ thấy một số kết quả như thế này với MySQL:
$ mysql Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using EditLine wrapper
Hoặc xuất ra như thế này cho MariaDB:
mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1
Lưu ý cơ sở dữ liệu nào và phiên bản nào bạn đang chạy, vì bạn sẽ sử dụng chúng sau này. Tiếp theo, bạn cần dừng cơ sở dữ liệu để bạn có thể truy cập thủ công.
Bước 2: Dừng máy chủ cơ sở dữ liệu
Để thay đổi mật khẩu root, bạn phải tắt máy chủ cơ sở dữ liệu trước.
Bạn có thể làm điều đó cho MySQL với:
$ sudo systemctl stop mysql
Và cho MariaDB với:
$ sudo systemctl stop mariadb
Bước 3: Khởi động lại máy chủ cơ sở dữ liệu mà không cần kiểm tra quyền
Nếu bạn chạy MySQL và MariaDB mà không tải thông tin về đặc quyền người dùng, nó sẽ cho phép bạn truy cập dòng lệnh cơ sở dữ liệu với quyền root mà không cần cung cấp mật khẩu. Điều này sẽ cho phép bạn có được quyền truy cập vào cơ sở dữ liệu mà không cần biết nó.
Để làm điều này, bạn cần ngăn cơ sở dữ liệu tải các bảng cấp, nơi lưu trữ thông tin đặc quyền người dùng. Vì đây là một chút rủi ro bảo mật, bạn cũng nên bỏ qua kết nối mạng để ngăn các khách hàng khác kết nối.
Bắt đầu cơ sở dữ liệu mà không tải các bảng cấp hoặc cho phép kết nối mạng:
$ sudo mysqld_safe --skip-grant-tables --skip-networking &
Dấu và ở cuối lệnh này sẽ làm cho quá trình này chạy trong nền để bạn có thể tiếp tục sử dụng thiết bị đầu cuối của mình.
Bây giờ bạn có thể kết nối với cơ sở dữ liệu với tư cách là người dùng root, không nên yêu cầu mật khẩu.
$ mysql -u root
Thay vào đó, bạn sẽ thấy ngay một dấu nhắc cơ sở dữ liệu thay thế.
Lời nhắc của MySQL
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Nhắc MariaDB
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
Bây giờ bạn có quyền truy cập root, bạn có thể thay đổi mật khẩu root.
Bước 4: Thay đổi mật khẩu root
mysql> FLUSH PRIVILEGES;
Bây giờ chúng ta thực sự có thể thay đổi mật khẩu root.
Đối với MySQL 5.7.6 trở lên cũng như MariaDB 10.1.20 trở lên , hãy sử dụng lệnh sau:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
Đối với MySQL 5.7.5 trở lên cũng như MariaDB 10.1.20 trở lên , hãy sử dụng:
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
Hãy chắc chắn để thay thế new_password
bằng mật khẩu mới của bạn lựa chọn.
Lưu ý: Nếu ALTER USER
lệnh không hoạt động, nó thường biểu thị một vấn đề lớn hơn. Tuy nhiên, UPDATE ... SET
thay vào đó , bạn có thể thử đặt lại mật khẩu gốc.
[QUAN TRỌNG] Đây là dòng cụ thể khắc phục sự cố cụ thể của tôi:
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';
Hãy nhớ tải lại các bảng cấp sau này.
Trong cả hai trường hợp, bạn sẽ thấy xác nhận rằng lệnh đã được thực hiện thành công.
Query OK, 0 rows affected (0.00 sec)
Mật khẩu đã được thay đổi, vì vậy bây giờ bạn có thể dừng phiên bản thủ công của máy chủ cơ sở dữ liệu và khởi động lại như trước đây.
Bước 5: Khởi động lại máy chủ cơ sở dữ liệu thông thường
Hướng dẫn đi vào một số bước tiếp theo để khởi động lại cơ sở dữ liệu, nhưng phần duy nhất tôi sử dụng là:
Đối với MySQL, sử dụng:
$ sudo systemctl bắt đầu mysql
Đối với MariaDB, sử dụng:
$ sudo systemctl start mariadb
Bây giờ bạn có thể xác nhận rằng mật khẩu mới đã được áp dụng chính xác bằng cách chạy:
$ mysql -u root -p
Lệnh bây giờ sẽ nhắc cho mật khẩu mới được gán. Nhập nó và bạn sẽ có quyền truy cập vào dấu nhắc cơ sở dữ liệu như mong đợi.
Phần kết luận
Bây giờ bạn có quyền truy cập quản trị vào máy chủ MySQL hoặc MariaDB được khôi phục. Đảm bảo mật khẩu root mới bạn chọn là mạnh mẽ và an toàn và giữ nó ở nơi an toàn.