Техніка, що я збираюсь показати вам, вам знадобиться кишки зі сталі.
Дано наступні критерії
- datadir є
/var/lib/mysql
- стіл є
mydb.mytb
- enum стовпчик називається називається
enum_col
- двигун - MyISAM
Ось смерть, що викликає смерть:
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;
В окремому сесії OS / SSH поміняйте файли .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;
Це воно !!!
CAVEAT: Я НЕ МОЖУ ВЗАЙМАТИ КРЕДИТ ЗА ЦЕЙ!
Цей метод виходить з «High Performance MySQL: Оптимізація, резервне копіювання, реплікація, і багато іншого», сторінки 146-148 під підзаголовком прискорюючи ALTER TABLE . Page 147 Абзац 1 говорить:
Методика, яку ми збираємось продемонструвати, є непідтримуваною, недокументованою та може не працювати. Використовуйте його на свій ризик. Радимо спершу створити резервну копію даних!
Спробувати ! (Будь ласка, повідомте нам, як це вийшло)
ОНОВЛЕННЯ 2011-10-05 17:49 EDT
Якщо таблиця MyISAM і у вас є достатньо місця у виробництві та прямому вікні простою, спробуйте:
service mysql restart --skip-networking
В окремому сесії OS / SSH зробіть копію таблиці
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
автоматично визначить наявність нової таблиці, що називається mydb.mytbplay
.
Увімкніть алгоритм роботи зі сталі mydb.mytbplay
Ви перевіряєте цілісність mydb.mytbplay
Якщо ви задоволені
ALTER TABLE mydb.mytb RENAME mydb.mytb_backup;
ALTER TABLE mydb.mytbplay RENAME mydb.mytb;
service mysql restart
Спробувати!