Kỹ thuật follolwing tôi sắp chỉ ra cho bạn sẽ yêu cầu sự can đảm của thép.
Đưa ra các tiêu chí sau
- datadir là
/var/lib/mysql
- cái bàn là
mydb.mytb
- cột enum được gọi là
enum_col
- động cơ là MyISAM
Đây là một vết nứt chết người:
CREATE TABLE mydb.mybt LIKE mydb.mytb;
ALTER TABLE mydb.mybt MODIFY enum_col ENUM('First value','Second value');
SET wait_timeout=86400; SET interactive_timeout=86400;
FLUSH TABLES WITH READ LOCK;
Trong Phiên OS / SSH riêng, trao đổi các tệp .frm
$ mv /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/myxx.frm
$ mv /var/lib/mysql/mydb/mybt.frm /var/lib/mysql/mydb/mytb.frm
$ mv /var/lib/mysql/mydb/myxx.frm /var/lib/mysql/mydb/mybt.frm
UNLOCK TABLES;
DROP TABLE mydb.mybt;
Đó là nó !!!
CAVEAT: TÔI KHÔNG THỂ KIẾM TIỀN TÍN DỤNG NÀY!
Kỹ thuật này xuất phát từ "MySQL hiệu suất cao: Tối ưu hóa, sao lưu, sao chép và hơn thế nữa", các trang 146-148 trong mục Subinging Speeding Up ALTER TABLE . Trang 1 Đoạn 1 nói:
Kỹ thuật chúng tôi sắp trình diễn là không được hỗ trợ, không có giấy tờ và có thể không hoạt động. Sử dụng nó có nguy cơ. Chúng tôi khuyên bạn sao lưu dữ liệu trước!
Hãy thử một lần ! (Xin vui lòng cho chúng tôi biết làm thế nào nó bật ra)
CẬP NHẬT 2011-10-05 17:49 EDT
Nếu bảng là MyISAM và bạn có đủ không gian trong sản xuất và cửa sổ thời gian chết thẳng, hãy thử điều này:
service mysql restart --skip-networking
Trong Phiên OS / SSH riêng, tạo một bản sao của bảng
cp /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/mytbplay.frm
cp /var/lib/mysql/mydb/mytb.MYD /var/lib/mysql/mydb/mytbplay.MYD
cp /var/lib/mysql/mydb/mytb.MYI /var/lib/mysql/mydb/mytbplay.MYI
INFORMATION_SCHEMA.TABLES
sẽ tự động phát hiện sự hiện diện của bảng mới được gọi mydb.mytbplay
.
Thực hiện thuật toán ruột thép trên mydb.mytbplay
Bạn kiểm tra tính toàn vẹn của mydb.mytbplay
Nếu bạn hài lòng
ALTER TABLE mydb.mytb RENAME mydb.mytb_backup;
ALTER TABLE mydb.mytbplay RENAME mydb.mytb;
service mysql restart
Hãy thử một lần!