Hướng dẫn chuyển storage engine MyISAM sang InnoDB và ngược lại

28-December-2016

Bài viết này sẽ hướng dẫn chuyển storage engine của MySQL từ MyISAM sang InnoDB và ngược lại.

1. Giới thiệu

- MyISAM và InnoDB là các storage engine (cơ chế lưu trữ) của MySQL. Mỗi cơ chế sẽ lưu dữ liệu trên ổ cứng theo mỗi cách khác nhau và có ưu nhược điểm riêng. Một số tính năng của từng loại cơ chế:

a. MyISAM:

+ Chỉ có thể đọc table đồng thời mà không thể ghi đồng thời

+ Tự sữa chữa và phục hồi dữ liệu tốt sau khi hệ thống bị crash.

+ Hỗ trợ tìm kiếm full-text index.

+ Tăng tốc độ ghi nhờ không ghi dữ liệu vào ổ cứng ngay mà ghi vào buffer trên RAM trước, sau một khoảng thời gian mới ghi vào ổ cứng.

+ Hỗ trợ nén dữ liệu giúp tăng tốc độ đọc dữ liệu nhưng dữ liệu sau khi nén không thể cập nhật được.

b. InnoDB:

+ Có khả năng phục hồi, sửa chữa tốt.
+ Là engine phức tạp nhất trong các engine của MySQL.
+ Hỗ trợ MVCC (Multiversion Concurrency Control) do đó table có thể đọc và ghi đồng thời.
+ Sử dụng clustered index do đó hiệu năng tìm kiếm theo primakey rất cao.
+ Lưu dữ liệu trên 1 file (thuật ngữ gọi là tablespace).
+ Hỗ trợ transactions.

2. Cách chuyển MyISAM sang InnoDB và ngược lại

- Sử dụng cú pháp MySQL sau để chuyển từng table MyISAM sang InnoDB: ALTER TABLE table_name ENGINE = MyISAM;
- Sử dụng cú pháp MySQL sau để chuyển từng table InnoDB sang InnoDB: ALTER TABLE table_name ENGINE = InnoDB;
- Hướng dẫn chuyển tất cả table của một database từ MyISAM sang InnoDB:
+ Tạo file script: "vi script"
+ Thêm nội dung sau vào file script

#!/bin/sh
DBNAME="your-database"
DBUSER="your-username"
DBPWD="your-password"for t in $(mysql -u$DBUSER -p$DBPWD --batch --column-names=false-e "show tables" $DBNAME);do
echo "Converting table $t"
mysql -u$DBUSER -p$DBPWD -e "alter table $t engine=InnoDB" $DBNAME;done

Trong đó "your-database" là database cần chuyển, "your-username" là user name của được gán quyền cho database, "your-password" là password của user.

+ Thêm quyền thực thi cho file script: "chmod +x script
+ Chạy file script: ./script

- Khách hàng có thể sử dụng script trên để chuyển InnoDB sang MyISAM với script trên bằng cách sửa dòng "mysql -u$DBUSER -p$DBPWD -e "alter table $t engine=InnoDB" $DBNAME;done" thành "mysql -u$DBUSER -p$DBPWD -e "alter table $t engine=MyISAM" $DBNAME;done"