MySQL 5.1 曾短暫引入 RENAME DATABASE,但 5.1.23 後移除(僅實驗性功能)。生產環境無原生改庫名命令。
CREATE DATABASE db_v2;
SELECT CONCAT('RENAME TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' TO db_v2.', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'old_db'
INTO OUTFILE '/tmp/rename_to_db_v2.sql';
SOURCE /tmp/rename_to_db_v2.sql;
#!/bin/bash
OLD_DB="old_db"
NEW_DB="new_db"
SQL_FILE="/tmp/rename_${OLD_DB}_to_${NEW_DB}.sql"
# 1. 創建新庫
mysql -e "CREATE DATABASE \`${NEW_DB}\`;"
# 2. 生成 RENAME 語句(過濾視圖)
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}' AND TABLE_TYPE = 'BASE TABLE';
" > ${SQL_FILE}
# 3. 執行
mysql < ${SQL_FILE}
# 4. 驗證
mysql -e "SHOW TABLES FROM \`${NEW_DB}\`;"
mysql -e "DROP DATABASE \`${OLD_DB}\`;" # 確認無誤後執行
| 項目 | 處理方式 |
|---|---|
| 視圖 | TABLE_TYPE='BASE TABLE' 僅遷移基表,視圖需單獨重建 |
| 存儲過程/函數/觸發器 | 屬於庫級對象,**不會**隨表遷移,需導出重建 |
| 權限 | 庫級權限需重新授予 |
| 外鍵 | 同庫內表關聯自動維護,跨庫外鍵需手動調整 |
| Binlog | 大量 RENAME 產生大量 Binlog,備庫同步延遲,建議低峰期操作 |
| 鎖表 | RENAME TABLE 獲取元數據鎖,極短暫,無長時間阻塞 |
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| RENAME TABLE 批量 | 原地操作、無數據拷貝、秒級完成 | 需處理視圖/程序/權限 | 同實例改名、表量<500 |
| mysqldump + 導入 | 完整遷移對象、可跨實例 | 耗時長、需雙倍空間、鎖表久 | 跨實例、需清理數據 |
| pt-online-schema-change | 無鎖遷移 | 不支持改庫名、僅改表結構 | 不適用 |
8.0 仍無 RENAME DATABASE,但支持 RENAME TABLE db1.tbl TO db2.tbl 跨庫移動表,本質相同。