MySQL 5.1 曾短暫引入 RENAME DATABASE,但在 5.1.23 即因數據丟失風險移除。生產環境需改名時,標準做法是 「建新庫 → 批量 RENAME TABLE 跨庫移表 → 校驗 → 刪舊庫」,全程在線、無需導出導入、秒級完成。
mysql> CREATE DATABASE db_v2;
mysql> SELECT CONCAT('RENAME TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' TO db_v2.', TABLE_NAME, ';')
-> INTO OUTFILE '/tmp/rename_to_db_v2.sql'
-> FROM INFORMATION_SCHEMA.TABLES
-> WHERE TABLE_SCHEMA = 'sbtest'; -- 替換為源庫名
生成文件示例:
RENAME TABLE sbtest.t1 TO db_v2.t1;
RENAME TABLE sbtest.t2 TO db_v2.t2;
...
mysql> SOURCE /tmp/rename_to_db_v2.sql;
原理:RENAME TABLE 在同一實例內僅修改數據字典元數據,不搬移物理數據文件,故極快且原子性(單表級)。
| 風險點 | 應對 |
|---|---|
| 視圖/存儲過程/觸發器不會被 RENAME TABLE 移動 | 需手動 SHOW CREATE VIEW/PROCEDURE/TRIGGER 重建到新庫 |
| 外鍵約束引用舊庫名 | 5.6+ 支援跨庫外鍵,遷移前暫時 SET FOREIGN_KEY_CHECKS=0,遷移後驗證再開啟 |
| 權限不隨表遷移 | 遷移後對新庫重新 GRANT,或編寫腳本同步 mysql.db/tables_priv |
| 應用連接池緩存舊庫名 | 配置變更後滾動重啟應用,或使用 DNS/Proxy 透明切換 |
-- 1. 表數量一致
SELECT TABLE_SCHEMA, COUNT(*) FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA IN ('sbtest','db_v2') GROUP BY TABLE_SCHEMA;
-- 2. 行數抽樣核對
SELECT TABLE_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='db_v2';
-- 3. 應用端冒煙測試
總結:雖無 RENAME DATABASE,但 RENAME TABLE db1.t TO db2.t 配合 INFORMATION_SCHEMA 批量生成腳本,提供了零停機、零數據拷貝、秒級完成的最佳實踐。