Cách khắc phục lỗi MySQL ERROR 1045: Truy cập bị từ chối đối với người dùng 'root'

trung cấp🗄️ MySQL2026-03-16| Linux (Ubuntu/Debian, CentOS/RHEL), MySQL 5.x, 8.x, MariaDB

Error Message

ERROR 1045 (28000): Access denied for user 'root'@'localhost'
#mysql#root#mật khẩu#truy cập

Gặp phải lỗi ERROR 1045 (28000): Access denied for user 'root'@'localhost' có thể gây khó chịu. Vấn đề phổ biến này thường xuất hiện sau khi khởi động lại máy chủ, cập nhật hoặc thay đổi cấu hình khi bạn cố gắng kết nối với phiên bản MySQL hoặc MariaDB của mình.

Về cơ bản, lỗi này có nghĩa là quá trình xác thực người dùng root của bạn đã thất bại, thường là do mật khẩu không chính xác hoặc quyền truy cập của máy chủ không đúng. Hướng dẫn này cung cấp các bản sửa lỗi tức thì và các bước khắc phục sự cố chi tiết để giúp bạn nhanh chóng lấy lại quyền truy cập vào cơ sở dữ liệu của mình.

TL;DR Khắc phục nhanh: Đặt lại mật khẩu Root

Trong hầu hết các trường hợp, lỗi này bắt nguồn từ mật khẩu không chính xác cho người dùng root. Cách nhanh nhất để giải quyết là đặt lại mật khẩu root. Quá trình này yêu cầu dừng dịch vụ MySQL, khởi động lại dịch vụ ở chế độ đặc biệt để bỏ qua xác thực, cập nhật mật khẩu, sau đó đưa dịch vụ trở lại hoạt động bình thường.

Đối với các hệ thống dựa trên Ubuntu/Debian:

# 1. Dừng dịch vụ MySQL/MariaDB
sudo systemctl stop mysql

# 2. Khởi động MySQL ở chế độ an toàn (bỏ qua bảng cấp quyền)
# Tạo một thư mục tạm thời cho socket MySQL nếu nó không tồn tại hoặc bị từ chối quyền
sudo mkdir -p /var/run/mysqld
sudo chown -R mysql:mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables --skip-networking &

# Chờ vài giây để dịch vụ khởi động
sleep 5

# 3. Kết nối với MySQL với tư cách root mà không cần mật khẩu
mysql -u root

# Trong dấu nhắc MySQL, cập nhật mật khẩu:
# Đối với MySQL 8.x:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewSecurePasswordHere';
FLUSH PRIVILEGES;

# Đối với MySQL 5.7+ hoặc MariaDB (sử dụng authentication_string):
UPDATE mysql.user SET authentication_string=PASSWORD('YourNewSecurePasswordHere') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

# Đối với MySQL cũ hơn (5.6 trở xuống) hoặc các thiết lập MariaDB cụ thể (sử dụng cột Password):
# UPDATE mysql.user SET Password=PASSWORD('YourNewSecurePasswordHere') WHERE User='root' AND Host='localhost';
# FLUSH PRIVILEGES;

# 4. Thoát MySQL và dừng tiến trình chế độ an toàn
exit
sudo pkill mysqld_safe

# 5. Khởi động dịch vụ MySQL bình thường
sudo systemctl start mysql

# 6. Xác minh bản sửa lỗi
mysql -u root -p
# Nhập 'YourNewSecurePasswordHere' khi được nhắc.

Đối với các hệ thống dựa trên CentOS/RHEL:

# 1. Dừng dịch vụ MySQL/MariaDB
sudo systemctl stop mysqld

# 2. Khởi động MySQL ở chế độ an toàn
sudo mkdir -p /var/run/mysqld
sudo chown -R mysql:mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables --skip-networking &

# Chờ vài giây
sleep 5

# 3. Kết nối với MySQL với tư cách root mà không cần mật khẩu
mysql -u root

# Trong dấu nhắc MySQL (tương tự như trên):
# Đối với MySQL 8.x:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewSecurePasswordHere';
FLUSH PRIVILEGES;

# Đối với MySQL 5.7+ hoặc MariaDB (sử dụng authentication_string):
UPDATE mysql.user SET authentication_string=PASSWORD('YourNewSecurePasswordHere') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

# 4. Thoát MySQL và dừng tiến trình chế độ an toàn
exit
sudo pkill mysqld_safe

# 5. Khởi động dịch vụ MySQL bình thường
sudo systemctl start mysqld

# 6. Xác minh bản sửa lỗi
mysql -u root -p
# Nhập 'YourNewSecurePasswordHere' khi được nhắc.

Quan trọng: Thay thế YourNewSecurePasswordHere bằng một mật khẩu mạnh, duy nhất. Hãy đặt mật khẩu dài ít nhất 12-16 ký tự, kết hợp chữ hoa, chữ thường, số và ký hiệu để đạt bảo mật tối đa.

Nguyên nhân gốc rễ chi tiết

Khi máy chủ MySQL gặp lỗi ERROR 1045 (28000): Access denied for user 'root'@'localhost', nó đang từ chối rõ ràng một nỗ lực kết nối. Điều này thường xảy ra vì thông tin xác thực do máy khách của bạn cung cấp (như tên người dùng, mật khẩu và máy chủ kết nối) không khớp với bất kỳ mục nào trong bảng cấp quyền của MySQL cho phép truy cập.

Các lý do phổ biến bao gồm:

  • Mật khẩu không chính xác: Đây là nguyên nhân thường xuyên nhất. Thông thường, bạn có thể chỉ đơn giản là cung cấp mật khẩu sai cho người dùng root. Điều này có thể do lỗi đánh máy, quên mật khẩu đã thay đổi gần đây hoặc nếu cập nhật mật khẩu không được phản ánh chính xác trong chuỗi kết nối của ứng dụng của bạn.
  • Người dùng không được cấu hình cho máy chủ: Các tài khoản người dùng của MySQL được xác định bởi cả tên người dùng VÀ máy chủ. root@localhost là một người dùng khác biệt so với root@192.168.1.100 hoặc root@% (bất kỳ máy chủ nào). Nếu bạn đang cố gắng kết nối từ một máy từ xa, nhưng người dùng root chỉ được định nghĩa cho localhost, bạn sẽ gặp lỗi này.
  • Bảng cấp quyền bị hỏng: Mặc dù ít phổ biến hơn, đây vẫn là một khả năng. Bảng mysql.user hoặc các bảng cấp quyền liên quan khác có thể bị hỏng hoặc thậm chí thiếu mục nhập root quan trọng.

Các phương pháp khắc phục

Mặc dù đặt lại mật khẩu là cách khắc phục phổ biến nhất, nhưng các tình huống khác cũng có thể dẫn đến lỗi này. Hãy cùng khám phá các giải pháp mạnh mẽ hơn cho những tình huống đó.

1. Đặt lại mật khẩu Root (Chi tiết)

Đây là cách khắc phục chính, được trình bày chi tiết với giải thích từng bước.

Bước 1: Dừng dịch vụ MySQL/MariaDB

Đảm bảo dịch vụ cơ sở dữ liệu được dừng sạch sẽ.

# Đối với các hệ thống dựa trên systemd (Ubuntu, Debian, CentOS 7+, RHEL 7+)
sudo systemctl stop mysql   # hoặc mariadb, mysqld

# Đối với các hệ thống cũ hơn (SysVinit)
sudo service mysql stop    # hoặc mariadb, mysqld

Bước 2: Khởi động MySQL ở chế độ an toàn (Bỏ qua xác thực)

Để có quyền truy cập, bạn cần khởi động MySQL với --skip-grant-tables. Chế độ đặc biệt này cho phép bạn kết nối với tư cách root mà không cần mật khẩu. Chúng tôi cũng thêm --skip-networking như một biện pháp bảo mật quan trọng, ngăn chặn bất kỳ kết nối bên ngoài nào trong khi cơ sở dữ liệu đang ở trạng thái dễ bị tấn công này.

# Đảm bảo /var/run/mysqld tồn tại với các quyền chính xác
sudo mkdir -p /var/run/mysqld
sudo chown -R mysql:mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables --skip-networking &

# Chờ vài giây để dịch vụ khởi tạo
sleep 5

Bước 3: Kết nối với MySQL với tư cách Root và cập nhật mật khẩu

Kết nối mà không cần mật khẩu và thực thi lệnh ALTER USER hoặc UPDATE thích hợp.

mysql -u root

Trong dấu nhắc MySQL:

Đối với MySQL 8.0+:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewSecurePassword!';
FLUSH PRIVILEGES;

Đối với MySQL 5.7+ và MariaDB (sử dụng authentication_string):

UPDATE mysql.user SET authentication_string=PASSWORD('YourNewSecurePassword!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

Đối với các phiên bản MySQL cũ hơn (5.6 trở xuống) hoặc các thiết lập MariaDB cụ thể (sử dụng cột Password):

UPDATE mysql.user SET Password=PASSWORD('YourNewSecurePassword!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

Hãy nhớ thay thế YourNewSecurePassword! bằng một mật khẩu mạnh, duy nhất. Sau khi thực hiện lệnh, gõ exit để thoát khỏi dấu nhắc MySQL.

Bước 4: Dừng tiến trình MySQL ở chế độ an toàn

Chấm dứt tiến trình mysqld_safe không an toàn.

sudo pkill mysqld_safe
# Nếu cần, tìm PID: ps aux | grep mysql | grep 'skip-grant-tables' | awk '{print $2}' | xargs sudo kill

Bước 5: Khởi động dịch vụ MySQL bình thường

sudo systemctl start mysql   # hoặc mariadb, mysqld

2. Giải quyết các vấn đề truy cập cụ thể của máy chủ

Nếu bạn đang kết nối từ một máy từ xa và người dùng root chỉ được định nghĩa cho localhost, bạn sẽ nhận được lỗi truy cập bị từ chối. Các tài khoản người dùng MySQL được liên kết với cả tên người dùng và máy chủ.

Nếu bạn cần cho phép người dùng root truy cập từ bất kỳ máy chủ nào (ít an toàn hơn và nên được sử dụng hết sức thận trọng trong môi trường sản xuất) hoặc từ một địa chỉ IP cụ thể, hãy làm theo các bước sau:

Đầu tiên, đảm bảo bạn có thể kết nối với tư cách root@localhost (sử dụng đặt lại mật khẩu nếu cần). Sau đó, trong máy khách MySQL:

Cho phép root từ bất kỳ máy chủ nào (%) (MySQL 8.x):

ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY 'YourSuperStrongPassword!'; -- Tùy chọn: thay đổi plugin để tương thích
CREATE USER 'root'@'%' IDENTIFIED BY 'YourSuperStrongPassword!';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Cho phép root từ bất kỳ máy chủ nào (%) (MySQL 5.x / MariaDB):

UPDATE mysql.user SET Host='%' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
-- Nếu cần đặt lại mật khẩu sau khi thay đổi máy chủ:
-- UPDATE mysql.user SET authentication_string=PASSWORD('YourSuperStrongPassword!') WHERE User='root' AND Host='%' ;
-- FLUSH PRIVILEGES;

Thực hành tốt nhất: Tạo người dùng chuyên dụng, có ít đặc quyền hơn cho truy cập từ xa và các ứng dụng cụ thể thay vì sử dụng root từ xa.

CREATE USER 'your_admin'@'your_remote_ip' IDENTIFIED BY 'StrongPassword!';
GRANT ALL PRIVILEGES ON *.* TO 'your_admin'@'your_remote_ip' WITH GRANT OPTION;
FLUSH PRIVILEGES;

3. Xác minh bảng cấp quyền hoặc người dùng Root bị thiếu

Trong những trường hợp hiếm hoi, bảng mysql.user có thể bị hỏng hoặc mục nhập người dùng root có thể bị thiếu. Kết nối ở chế độ an toàn (mysql -u root) và sau đó:

USE mysql;
SELECT user, host, authentication_string, plugin FROM user WHERE user='root';

Nếu người dùng root bị thiếu hoặc đầu ra cho thấy sự hỏng hóc, cần điều tra thêm về cài đặt MySQL của bạn. Tránh sử dụng mysql_install_db hoặc khởi tạo lại thư mục dữ liệu mà không có bản sao lưu đầy đủ, vì điều này có thể dẫn đến mất dữ liệu.

Các bước xác minh

Sau khi bạn đã áp dụng bản sửa lỗi, điều cần thiết là phải xác nhận rằng bạn có thể kết nối thành công. Dưới đây là cách xác minh:

  • Thử kết nối từ máy chủ:
mysql -u root -p
# Nhập mật khẩu mới của bạn.

Nếu thành công, bạn sẽ thấy dấu nhắc MySQL (mysql>).

  • Thử kết nối từ máy khách từ xa (nếu có thể):
mysql -h your_mysql_server_ip -u root -p
# Nhập mật khẩu mới của bạn.

  • Chạy một truy vấn đơn giản: Sau khi kết nối, hãy chạy một truy vấn cơ bản để xác nhận mọi thứ đang hoạt động:
SHOW DATABASES;

Điều này xác nhận cả việc truy cập thành công và chức năng cơ sở dữ liệu cơ bản. Nếu bạn thấy các cơ sở dữ liệu của mình được liệt kê, bạn đã giải quyết thành công sự cố!

Đọc thêm

Để hiểu sâu hơn về quản lý người dùng và bảo mật MySQL, hãy tham khảo tài liệu chính thức:

Related Error Notes