NỘI DUNG
Trong quá trình vận hành MySQL/MariaDB, đôi khi bạn có thể gặp phải tình huống mất dữ liệu hoặc chỉ còn lại các tệp .frm và .ibd mà không có bản sao lưu đầy đủ của database. Điều này có thể xảy ra do lỗi hệ thống, mất tập tin InnoDB tablespace, hoặc di chuyển dữ liệu không đúng cách.
Vậy làm thế nào để khôi phục lại database từ các tệp này? Bài viết này sẽ hướng dẫn bạn từng bước phục hồi cấu trúc bảng từ tệp .frm, nhập lại dữ liệu từ tệp .ibd, và liên kết tablespace để bảng có thể hoạt động trở lại. Với hướng dẫn chi tiết này, bạn có thể khôi phục dữ liệu một cách an toàn và hiệu quả, ngay cả khi không có bản backup đầy đủ.
1. Giới Thiệu
Trong MySQL/MariaDB, các tệp .frm
và .ibd
đóng vai trò quan trọng trong việc lưu trữ dữ liệu của bảng:
.frm
(Format File):Chứa định nghĩa và cấu trúc của bảng, bao gồm tên cột, kiểu dữ liệu, khóa chính, khóa ngoại và các ràng buộc khác..ibd
(InnoDB Datafile):Chứa dữ liệu thực tế của bảng và các chỉ mục liên quan khi sử dụng InnoDB.
Khi MySQL bị lỗi hoặc mất thông tin schema, bạn có thể cần khôi phục dữ liệu từ các file .frm
và .ibd
bằng các bước dưới đây.

2. Các Bước Phục Hồi
Bước 1: Cài Đặt Công Cụ dbsake
Đây là một công cụ giúp trích xuất schema từ file .frm
mà không cần chạy MySQL.
curl -s http://get.dbsake.net > dbsake
chmod u+x dbsake

Bước 2: Phục Hồi Cấu Trúc Bảng Từ File .frm
Chạy lệnh sau để lấy cấu trúc bảng:
./dbsake frmdump /đường/dẫn/tới/file.frm
Ví dụ thực tế:
./dbsake frmdump /root/recomysql/caisslcom_dbcaissl/wp_options.frm
Đầu ra sẽ chứa lệnhCREATE TABLE
, giúp bạn tái tạo bảng trên database mới:
CREATE TABLE `wp_options` (
`option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`option_name` varchar(191) NOT NULL DEFAULT '',
`option_value` longtext NOT NULL,
`autoload` varchar(20) NOT NULL DEFAULT 'yes',
PRIMARY KEY (`option_id`),
UNIQUE KEY `option_name` (`option_name`),
KEY `autoload` (`autoload`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Tạo database mới:
CREATE DATABASE admin_caisslnew;
CREATE USER 'admin_caisslnew'@'localhost' IDENTIFIED BY 'yourpassword';
GRANT ALL PRIVILEGES ON admin_caisslnew.* TO 'admin_caisslnew'@'localhost';
FLUSH PRIVILEGES;
Nhập schema vào database mới:
for tbl in /root/recomysql/caisslcom_dbcaissl/*.frm; do
./dbsake frmdump "$tbl" | mysql -u admin_caisslnew -p'password' admin_caisslnew
done
Kiểm tra bảng đã được tạo hay chưa:
SHOW TABLES FROM admin_caisslnew;

Bước 3: Khôi Phục Dữ Liệu Từ .ibd
1. Ngắt liên kết tablespace của bảng
ALTER TABLE wp_options DISCARD TABLESPACE;

2. Copy file.ibd
vào thư mục dữ liệu MySQL:
cp /root/recomysql/caisslcom_dbcaissl/wp_options.ibd /var/lib/mysql/admin_caisslnew/wp_options.ibd
chown mysql:mysql /var/lib/mysql/admin_caisslnew/wp_options.ibd
3. Nhập lại tablespace vào MySQL:
ALTER TABLE wp_options IMPORT TABLESPACE;
Bước 4. Kiểm tra dữ liệu
Sau khi hoàn tất, bạn có thể chạy lệnh sau để kiểm tra dữ liệu. Hoặc truy cập vào phpMyAdmin để kiểm tra chi tiết giao diện trực quan.
SELECT * FROM wp_options LIMIT 10;

3. Lưu ý quan trọng
Nếu database cũ sử dụng innodb_file_per_table=OFF, việc khôi phục .ibd sẽ khó khăn hơn.
Nếu gặp lỗi ERROR 1030 (HY000): Got error -1 from storage engine, kiểm tra quyền sở hữu file .ibd.
Sao lưu dữ liệu trước khi thực hiện các thao tác trên.
Bằng cách làm theo hướng dẫn này, bạn có thể khôi phục dữ liệu quan trọng trong trường hợp mất schema MySQL.
Chúc bạn thành công!
- Percona Blog – Recovering Table Structure
- GitHub dbsake
- StackOverflow – Recreate
.frm
File - Gist – InnoDB Recovery