Sửa lỗi MySQL ERROR 1820: Tình trạng bị khóa do 'Phải đặt lại mật khẩu'

beginner🗄️ MySQL2026-04-01| MySQL 5.7, MySQL 8.0+, Ubuntu, CentOS, Debian, Windows, macOS

Error Message

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
#mysql#quan-tri-co-so-du-lieu#loi-sql#bao-mat#devops

Tại sao MySQL chặn các truy vấn của bạn

Bạn vừa hoàn tất cài đặt MySQL 8.0 hoặc có thể đã đặt lại thông tin đăng nhập root theo cách thủ công. Mọi thứ có vẻ ổn cho đến khi bạn đăng nhập bằng mật khẩu tạm thời rắc rối đó. Bạn thử chạy lệnh SHOW DATABASES; đơn giản, nhưng máy chủ trả về một thông báo gây khó chịu:

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

MySQL kích hoạt lệnh khóa này vì nó đánh dấu mật khẩu ban đầu hoặc mật khẩu vừa đặt lại là "hết hạn" để đảm bảo bảo mật. Hãy coi đó là một bước kiểm tra an toàn bắt buộc. Cho đến khi bạn thiết lập mật khẩu vĩnh viễn, máy chủ sẽ ở chế độ sandbox bị hạn chế, ngăn chặn hầu hết các tác vụ quản trị.

Quá trình gỡ lỗi

Máy chủ thực chất đang chờ đợi một lệnh cụ thể để chứng minh tài khoản được an toàn. Trên các bản phân phối Linux như Ubuntu hoặc CentOS, bạn có thể đã lấy mật khẩu ban đầu từ log lỗi bằng lệnh sau:

sudo grep 'temporary password' /var/log/mysqld.log

Chuỗi tạm thời đó chỉ dành cho một lần đăng nhập duy nhất. Về mặt nội bộ, MySQL kiểm tra cột password_expired trong bảng hệ thống mysql.user. Nếu giá trị đó là 'Y', bạn sẽ bị kẹt trong shell hạn chế này cho đến khi cập nhật thông tin đăng nhập.

Giải pháp

Việc khắc phục lỗi này mất chưa đầy một phút. Bạn cần cho MySQL biết chính xác mật khẩu mới và vĩnh viễn của mình sẽ là gì.

Bước 1: Chạy lệnh ALTER USER

Khi đang ở trong MySQL shell, hãy thực thi câu lệnh sau. Hãy nhớ thay thế 'YourNewStrongPassword123!' bằng một chuỗi bảo mật mà bạn chọn.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword123!';

Cú pháp này hoạt động trên tất cả các phiên bản hiện đại, bao gồm MySQL 5.7 và 8.0. Sau khi thực thi, cờ "expired" sẽ được xóa ngay lập tức.

Bước 2: Xử lý lỗi chính sách mật khẩu

Đôi khi, mật khẩu bạn chọn không đủ mạnh so với plugin bảo mật mặc định của MySQL. Bạn có thể thấy thông báo này thay thế:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

Theo mặc định, MySQL 8.0 yêu cầu ít nhất 8 ký tự, bao gồm một chữ hoa, một chữ thường, một chữ số và một ký tự đặc biệt. Nếu bạn cần một chuỗi hợp lệ nhanh chóng, hãy thử Trình tạo mật khẩu trên ToolCraft. Nó tạo ra các mật khẩu có độ hỗn loạn cao (high-entropy) để vượt qua các bước kiểm tra này mọi lúc.

Đang làm việc trên môi trường phát triển cục bộ? Bạn có thể tạm thời hạ thấp mức độ nghiêm ngặt nếu muốn sử dụng mật khẩu đơn giản hơn:

-- Dành cho MySQL 8.x
SET GLOBAL validate_password.policy=LOW;
-- Dành cho MySQL 5.7
SET GLOBAL validate_password_policy=LOW;

Bước 3: Hoàn tất và xác minh

Mặc dù ALTER USER thường áp dụng các thay đổi ngay lập tức, nhưng việc làm mới các bảng phân quyền nội bộ cũng không thừa. Hãy chạy lệnh này để chắc chắn:

FLUSH PRIVILEGES;

Bây giờ, hãy kiểm tra quyền truy cập của bạn. Thử chạy lại lệnh SHOW DATABASES;. Nếu danh sách các schema hệ thống xuất hiện, bạn đã mở khóa tài khoản thành công. Thoát khỏi shell và đăng nhập lại bằng mật khẩu mới để xác nhận thay đổi đã được lưu vĩnh viễn.

Bài học cho lần sau

  • Chế độ Sandbox: Khi mật khẩu hết hạn, MySQL sẽ chuyển sang trạng thái hạn chế, chỉ chấp nhận các lệnh quản lý tài khoản.
  • Thông tin đăng nhập tạm thời: Không bao giờ sử dụng mật khẩu tạm thời cho các script production. Chúng chỉ được thiết kế để thiết lập một lần duy nhất.
  • Mẹo tự động hóa: Nếu bạn sử dụng Ansible hoặc Docker để triển khai cơ sở dữ liệu, hãy bao gồm bước ALTER USER trong các script khởi tạo (bootstrap) để ngăn chặn quy trình tự động hóa bị treo do lỗi này.

Related Error Notes