MySQL 原生不支援 RENAME DATABASE(早期版本有過但因風險移除)。本文對比 MyISAM 直接改目錄法與 InnoDB 跨庫遷移表法,給出生產環境可執行的標準化操作步驟。
前提:所有表均為 MyISAM,無外鍵、觸發器、存儲過程依賴
# 1. 停止服務
systemctl stop mysqld
# 2. 重命名數據目錄
mv /var/lib/mysql/old_db /var/lib/mysql/new_db
# 3. 啟動服務
systemctl start mysqld
# 4. 驗證
mysql -e "SHOW DATABASES LIKE 'new_db'; USE new_db; SHOW TABLES;"
⚠️ 風險:InnoDB 表無法此法操作(共享表空間 ibdata1 存儲元數據),強行改名會導致表孤兒化。
核心命令:RENAME TABLE old_db.tbl TO new_db.tbl;
# 1. 創建目標庫
CREATE DATABASE new_db CHARACTER SET utf8mb4;
# 2. 刪除源庫表上的觸發器(避免遷移失敗)
-- 查詢觸發器
SELECT TRIGGER_NAME FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA='old_db';
-- 逐個刪除
DROP TRIGGER old_db.trigger_name;
# 3. 批量遷移表(可用腳本生成)
RENAME TABLE old_db.t1 TO new_db.t1, old_db.t2 TO new_db.t2, ...;
# 4. 重建觸發器/存儲過程/視圖
-- 從備份或 SHOW CREATE TRIGGER 還原
# 5. 驗證數據完整性
CHECKSUM TABLE new_db.t1; -- 對比新舊庫 checksum
# 6. 切換應用配置並觀察
# 7. 確認無誤後刪除舊庫
DROP DATABASE old_db;
#!/bin/bash
OLD_DB=old_db
NEW_DB=new_db
mysql -N -e "SELECT CONCAT('RENAME TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' TO ', '$NEW_DB', '.', TABLE_NAME, ';')
FROM information_schema.TABLES WHERE TABLE_SCHEMA='$OLD_DB';" | mysql
| 維度 | MyISAM 改目錄 | InnoDB 遷移表 |
|---|---|---|
| 停機時間 | 極短(僅重啟) | 取決於表數量/觸發器 |
| 風險等級 | 低(純文件操作) | 中(需處理觸發器/權限) |
| 適用版本 | 所有版本 | 5.0+(支援跨庫 RENAME) |
| 外鍵影響 | 無 | 需先刪外鍵再遷移再建 |