I Tìm Hiểu
Khi đối mặt với sự cố hoặc hỏng hóc trong cơ sở dữ liệu MySQL sử dụng InnoDB, tùy chọn innodb_force_recovery cung cấp một công cụ quan trọng để phục hồi dữ liệu. Đây là một tùy chọn cấu hình mạnh mẽ cho phép bạn chỉ định các mức độ khôi phục khác nhau, giúp xử lý các lỗi hỏng hóc và khôi phục hoạt động của cơ sở dữ liệu.Các giá trị của innodb_force_recovery có thể được sử dụng để bỏ qua lỗi cụ thể, ngăn chặn các thao tác nền, và điều chỉnh cách xử lý các giao dịch và log redo. Tuy nhiên, việc sử dụng tùy chọn này cần được thực hiện với sự cẩn trọng, vì nó có thể ảnh hưởng đến tính toàn vẹn của dữ liệu.
Trước khi áp dụng các chế độ phục hồi, hãy đảm bảo sao lưu dữ liệu và hiểu rõ các tác động tiềm ẩn của từng giá trị.
II Cách Thực Hiện
Bước 1: Chạy MySQL ở chế độ chỉ đọc (read-only)
- Chỉnh sửa cấu hình MySQL:
- Mở file cấu hình MySQL /etc/my.cnf bằng một trình soạn thảo văn bản, ví dụ:
Bash:nano /etc/my.cnf
- Thêm dòng sau vào phần [mysqld]:
Bash:innodb_force_recovery = 1
- Bạn có thể thử các mức độ khác nhau từ 1 đến 6 nếu mức 1 không đủ. Mức độ tăng dần từ 1 đến 6 có thể giúp khôi phục các tình huống nghiêm trọng hơn, nhưng cũng có thể gây mất mát dữ liệu.
- Mở file cấu hình MySQL /etc/my.cnf bằng một trình soạn thảo văn bản, ví dụ:
( bỏ qua các lỗi ) – Khi server đang hoạt động và có xuất hiện lỗi page . Thì innodb_force_recovery với value = 1 sẽ cố gắng thực hiện truy vấn câu lệnh SELECT * FROM tbl_name bỏ qua các lỗi của index record và page. Điều này giúp ích cho việc dump table.
2. (SRV_FORCE_NO_BACKGROUND)
Ngăn chặn các luồng chính đang vận hành . Nếu có lỗi xảy ra khi tiến trình lọc đang hoạt động. Giá trị recovery này sẽ ngăn chặn lại.
3 (SRV_FORCE_NO_TRX_UNDO)
Không chạy transaction rollbacks sau khi recovery.
Rollbacks là thao tác khôi phục cơ sở dữ liệu về một trạng thái cũ. Các thao tác rollback có tầm quan trọng đối với tính toàn vẹn dữ liệu của cơ sở dữ liệu.
4 (SRV_FORCE_NO_IBUF_MERGE)
Hoạt động ngăn chặn việc insert buffer merge. Nếu có lỗi xảy ra thì sẽ không thực hiện, không thống kê tính toán các table.
5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
Bỏ qua undo logs khi đang bắt đầu start database, InnoDB xử lý ngay khi chưa hoàn thành transactions as committed.
Transaction (giao dịch) là một nhóm, có thứ tự, các hoạt động thao tác trên cơ sở dữ liệu, nhưng được xem như một đơn vị thao tác duy nhất. Khi một transaction bao gồm nhiều lệnh cập nhật, nó đảm bảo tất cả các cập nhật đều được thực hiện thành công, hoặc trong trường hợp một lệnh gặp sự cố toàn bộ transaction bị hủy bỏ. Khi đó dữ liệu trở về trạng thái như trước khi xảy ra transaction. Nói cách khác transaction ngăn chặn tình huống dữ liệu được cập nhật nửa chừng, trong đó một phần được cập nhật còn một phần bị bỏ qua.
6 (SRV_FORCE_NO_LOG_REDO)
Không thực hiện log roll-forward trong kết nối với việc recovery Roll forwardlà khôi phục tất cả giao dịch đã hoàn thành khi hệ thống xảy ra sự cố.
Lưu ý:
Khi chọn giá trị cho innodb_force_recovery, bạn cần cân nhắc các lưu ý sau:- Ảnh hưởng đến tính toàn vẹn dữ liệu: Một số chế độ có thể gây mất dữ liệu hoặc làm giảm tính toàn vẹn của cơ sở dữ liệu. Ví dụ, SRV_FORCE_NO_TRX_UNDO sẽ bỏ qua các giao dịch chưa hoàn thành, có thể dẫn đến trạng thái dữ liệu không nhất quán.
- Sao lưu dữ liệu: Trước khi thay đổi bất kỳ cấu hình nào liên quan đến phục hồi, hãy sao lưu toàn bộ dữ liệu nếu có thể. Điều này giúp bảo vệ dữ liệu của bạn khỏi mất mát trong quá trình phục hồi.
- Giai đoạn phục hồi: Sử dụng innodb_force_recovery chủ yếu trong giai đoạn phục hồi khẩn cấp. Sau khi phục hồi thành công, bạn nên khôi phục hệ thống về trạng thái bình thường (tức là tắt tùy chọn innodb_force_recovery và khởi động lại MySQL).
- Khả năng thực hiện thao tác: Một số chế độ chỉ hữu ích trong các tình huống cụ thể. Ví dụ, SRV_FORCE_IGNORE_CORRUPT có thể giúp xuất bảng dữ liệu khi gặp lỗi hỏng hóc, nhưng có thể không phù hợp nếu bạn cần một trạng thái cơ sở dữ liệu hoàn chỉnh và nhất quán.
- Kiểm tra kỹ lưỡng: Sau khi sử dụng innodb_force_recovery, hãy kiểm tra cơ sở dữ liệu để đảm bảo rằng dữ liệu đã được phục hồi đúng cách và không có lỗi tiềm ẩn.
- Tư vấn từ chuyên gia: Nếu bạn không chắc chắn về cách sử dụng các chế độ này hoặc tình huống phục hồi của bạn phức tạp, hãy cân nhắc tham khảo ý kiến của các chuyên gia cơ sở dữ liệu.
Bước 2: Sao lưu toàn bộ cơ sở dữ liệu
- Sao lưu cơ sở dữ liệu bằng mysqldump:
- Sử dụng lệnh sau để sao lưu tất cả cơ sở dữ liệu:
Bash:mysqldump -u root -p --all-databases > /root/alldb.sql
- Nếu lệnh trên gặp lỗi, bạn có thể sử dụng các tùy chọn bổ sung để khắc phục lỗi:
Bash:mysqldump -u root -p --complete-insert --routines --triggers --single-transaction --all-databases > /root/alldb.sql
- Sử dụng lệnh sau để sao lưu tất cả cơ sở dữ liệu:
- Sao lưu từng cơ sở dữ liệu riêng biệt (nếu cần):
- Chạy lệnh sau để sao lưu từng cơ sở dữ liệu:
Bash:mysql -N -e 'show databases' | while read dbname; do mysqldump --complete-insert --routines --triggers --single-transaction "$dbname" > /root/backup_db_full/"$dbname".sql; done
- Chạy lệnh sau để sao lưu từng cơ sở dữ liệu:
Bước 3: Sao lưu thư mục dữ liệu MySQL
- Sao lưu thư mục dữ liệu:
- Sao lưu thư mục dữ liệu MySQL để đảm bảo an toàn:
Bash:sudo cp -r /var/lib/mysql /var/lib/mysql.bk
- Sao lưu thư mục dữ liệu MySQL để đảm bảo an toàn:
Bước 4: Đổi tên các tệp InnoDB
- Đổi tên các tệp dữ liệu và log của InnoDB:
- Di chuyển đến thư mục dữ liệu của MySQL:
Bash:cd /var/lib/mysql
- Đổi tên các tệp ibdata1, ib_logfile0, và ib_logfile1:
Bash:mv ibdata1 ibdata1.bak mv ib_logfile0 ib_logfile0.bak mv ib_logfile1 ib_logfile1.bak
- Di chuyển đến thư mục dữ liệu của MySQL:
Bước 5: Khôi phục cấu hình và khởi động lại MySQL
- Chỉnh sửa lại cấu hình MySQL:
- Mở lại file cấu hình /etc/my.cnf và loại bỏ hoặc bình luận dòng innodb_force_recovery mà bạn đã thêm vào trước đó.
- Khởi động lại MySQL:
- Khởi động lại MySQL để áp dụng các thay đổi:
Bash:systemctl restart mysql
- Khởi động lại MySQL để áp dụng các thay đổi:
Bước 6: Kiểm tra và sửa lỗi các bảng InnoDB
- Đổi tên các tệp .ibd:
- Đổi tên các tệp .ibd để MySQL có thể tái tạo lại chúng:
Bash:cd /var/lib/mysql/ find . -type f -name "*.ibd" -exec mv {} {}.bak \;
- Đổi tên các tệp .ibd để MySQL có thể tái tạo lại chúng:
Bước 7: Nhập lại dữ liệu từ sao lưu
- Nhập lại dữ liệu:
- Nhập dữ liệu từ tệp sao lưu vào cơ sở dữ liệu MySQL:
Bash:mysql -u root -p < /root/alldb.sql
- Nhập dữ liệu từ tệp sao lưu vào cơ sở dữ liệu MySQL:
III Tóm Tắt
- Sao lưu và khôi phục cơ sở dữ liệu là những tác vụ quan trọng. Trước khi thực hiện bất kỳ thay đổi nào, hãy chắc chắn rằng bạn đã sao lưu đầy đủ.
- Kiểm tra các tệp sao lưu sau khi khôi phục để đảm bảo rằng dữ liệu được phục hồi đúng cách.
- Thực hiện các bước trên trong môi trường thử nghiệm trước khi áp dụng vào hệ thống sản xuất để tránh mất mát dữ liệu không mong muốn.
Sửa lần cuối: