萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 批量修改所有表儲存引擎為 ARCHIVE/InnoDB 的單條 SQL

動態生成 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';

使用方式

  1. 在 MySQL 客戶端執行上述查詢,複製輸出的 alter_sql 欄位內容。
  2. 貼上執行,即可批量轉換指定資料庫下所有基礎表引擎。
  3. 若需轉為 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');
copyright © 萬盛學電腦網 all rights reserved