MySQL 無原生 RENAME DATABASE 指令(5.1.7 短暫引入後因風險移除)。直接改檔案目錄名稱僅適用 MyISAM,InnoDB 會導致資料字典不一致而損壞。
| 方案 | 適用引擎 | 風險 | 停機時間 | 推薦度 |
|---|---|---|---|---|
| 1. mysqldump 導出/導入 | 全引擎 | 低 | 長(視資料量) | ⭐⭐⭐⭐⭐ 最通用安全 |
| 2. RENAME TABLE 跨庫移動 | 全引擎 | 低 | 短(元數據操作) | ⭐⭐⭐⭐ 推薦大表 |
| 3. 改引擎為 MyISAM → 改目錄名 → 改回 InnoDB | InnoDB→MyISAM→InnoDB | 中(轉換過程風險) | 中 | ⭐⭐ 不推薦 |
| 4. 直接改資料目錄名稱 | 僅 MyISAM | 高(InnoDB 必壞) | 極短 | ⭐ 僅限純 MyISAM |
# 1. 導出
mysqldump -u root -p --single-transaction --routines --triggers --events src_db > src_db.sql
# 2. 建立新庫
mysql -u root -p -e "CREATE DATABASE trg_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
# 3. 導入
mysql -u root -p trg_db < src_db.sql
# 4. 驗證無誤後刪除舊庫
mysql -u root -p -e "DROP DATABASE src_db;"
-- 1. 建立目標庫
CREATE DATABASE trg_db;
-- 2. 取得所有表名
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'src_db';
-- 3. 逐表重命名(可用腳本批次產生 SQL)
RENAME TABLE src_db.tbl1 TO trg_db.tbl1, src_db.tbl2 TO trg_db.tbl2, ...;
-- 4. 確認無殘留表後刪除舊庫
DROP DATABASE src_db;
#!/bin/bash
mysqlconn="mysql -u root -p'pwd' -h localhost"
olddb="src_db"
newdb="trg_db"
$mysqlconn -e "CREATE DATABASE $newdb"
tables=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$olddb'")
for t in $tables; do
$mysqlconn -e "RENAME TABLE $olddb.$t TO $newdb.$t"
done
# $mysqlconn -e "DROP DATABASE $olddb" # 驗證後再開啟
RENAME TABLE 需要來源表的 ALTER、DROP 權限,目標庫的 CREATE、INSERT 權限。RENAME TABLE 移動,需另行處理(mysqldump --routines --triggers --events)。SET FOREIGN_KEY_CHECKS=0。修改資料庫名稱,**首選 mysqldump 重建**(最安全、支援所有物件);**大表追求極速可用 RENAME TABLE 跨庫移動**(僅移動表,需補充視圖/程式碼物件)。嚴禁直接改目錄名稱操作 InnoDB 資料庫。