제가 보여 드리려는 다음과 같은 기술은 강철 용기가 필요할 것입니다.
다음 기준을 감안할 때
- datadir은
/var/lib/mysql
- 테이블은
mydb.mytb
- 라는 열거 열이
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;
그게 다야!
주의 사항 : 나는 이것에 대한 신용을 취할 수 없습니다!
이 기술은 "고성능 MySQL : 최적화, 백업, 복제 등", 146-148 페이지의 하위 제목 Speeding Up ALTER 표 아래에 있습니다. 단락 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
시도 해봐!