Thứ Hai, 19 tháng 8, 2013

Reset root passwd của mysql trên Linux


Giả sử vào một ngày đẹp trời, bạn quên mất root passwd của mysql trên Linux. Bạn sẽ làm gì đây ?

Version mysql mình đang dùng: 5.5.24

Bạn có hai cách để xử lý:
Cách thứ nhất khởi động mysql bằng mysql_safe. 
Cách thứ hai, khởi động mysql bằng mysqld nhưng kèm theo tham số --skip-grant-tables.

Mình sẽ trình bày từng cách một. Với cả hai cách, bạn đều phải tắt mysql service đi:
sudo service mysql stop
hoặc một cách thô bạo hơn, bạn có thể kill mysql service
sudo kill -9 /var/run/mysqld/mysqld.pid


Khi mysql của bạn đang hoạt động, nó sẽ tự động sinh ra một file mysqld.pid chứa pid của mysql process. Bạn có thể tìm thấy pid của mysql trong file này hoặc tìm qua netstat
sudo netstat -apn | grep 3306

Trong cách thứ nhất. Bạn cần chuẩn bị một script file có nội dung như sau:


UPDATE mysql.user SET Password=PASSWORD('abc') WHERE User='root';
FLUSH PRIVILEGES;

Bạn có thể lưu file này với đuôi mở rộng bất kỳ, có thể đặt bất kỳ đâu trong file system. Mình lưu file này dưới tên mysql-init. Sau đó, bạn sẽ dùng mysqld_safe để gọi thực hiện script file này. Mysqld_safe cũng tương tự mysqld. Bản thân mysqld_safe sẽ gọi mysqld để hoàn tất công việc của nó. Điểm khác biệt ở chỗ mysqld_safe có hỗ trợ chạy script file và log error. 
sudo mysql_safe --init-file=<absolute-path-to-script-file>/mysql-init --log-error=<absolute-path-to-log-error-file>/error_mysql_log

Một file error_mysql_log.err sẽ được sinh ra khi bạn chạy câu lệnh trên.

(*) Rất có thể khi bạn thực hiện câu lệnh mysqld_safe, bạn sẽ gặp lỗi  
[ERROR] /usr/sbin/mysqld: File '<absolute-path-to-script-file>/mysql-init' not found (Errcode: 13)

Lỗi này là do mysqld không có quyền đọc mysql-init. Để điều chỉnh, bạn thay đổi trong file cấu hình: /etc/apparmor.d/usr.sbin.mysqld
sudo vi /etc/apparmor.d/usr.sbin.mysqld

Bạn bổ sung thêm dòng này vào file trên:

<absolute-path-to-script-file>/mysql-init r

Sau đó, bạn reload lại apparmor:

sudo /etc/init.d/apparmor reload

Sau khi khởi động mysql service bằng mysql_safe. Bạn thực hiện truy cập vào mysql service với mật khẩu mới cho root account.
mysql -u root -p

Trong cách thứ hai. Bạn có thể thực hiện việc reset nhanh chóng hơn.

Sử dụng tham số --skip-grant-tables để cho phép khởi động mysql service mà không cần qua các bước xác thực khi truy cập.
sudo mysqld --skip-grant-tables

Sau đó bạn truy cập vào mysql service mà không cần password. Password không cần nhập.
mysql -u root -p

Sau khi truy cập thành công, bạn sử dụng các command tương tự trong đoạn script mysql-init trong cách một để reset password của root.

Không có nhận xét nào:

Đăng nhận xét