動態生成 ALTER TABLE 陳述式
SELECT GROUP_CONCAT(
CONCAT('ALTER TABLE `', TABLE_NAME, '` ENGINE=ARCHIVE;') SEPARATOR ' '
) AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_database'
AND TABLE_TYPE = 'BASE TABLE'
AND ENGINE <> 'ARCHIVE';
使用方式
- 在 MySQL 客戶端執行上述查詢,複製輸出的
alter_sql 欄位內容。
- 貼上執行,即可批量轉換指定資料庫下所有基礎表引擎。
- 若需轉為 InnoDB,將
ENGINE=ARCHIVE 改為 ENGINE=InnoDB。
注意事項
GROUP_CONCAT 預設長度 1024 字元,表多時可能截斷。執行前設大:
SET SESSION group_concat_max_len = 1000000;
- 轉換過程會鎖表,建議低峰期操作或使用
pt-online-schema-change (Percona Toolkit) 在線轉換。
- ARCHIVE 引擎僅支援插入/選取,不支援索引、更新、刪除、外鍵,確認業務相容後再轉。
- 外鍵約束表轉引擎需先
DROP FOREIGN KEY,轉換後再加回。
進階:存儲過程自動化
DELIMITER //
CREATE PROCEDURE batch_change_engine(IN db_name VARCHAR(64), IN new_engine VARCHAR(20))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE tname VARCHAR(64);
DECLARE cur CURSOR FOR
SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA = db_name AND TABLE_TYPE = 'BASE TABLE' AND ENGINE <> new_engine;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO tname;
IF done THEN LEAVE read_loop; END IF;
SET @sql = CONCAT('ALTER TABLE `', db_name, '`.`', tname, '` ENGINE=', new_engine);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
END//
DELIMITER ;
-- 呼叫
CALL batch_change_engine('your_database', 'InnoDB');