MySQL 官方曾在 5.1.7 引入 RENAME DATABASE,卻在 5.1.23 移除,主因是可能導致資料遺失。本文整理五種實務可行的資料庫重命名方案,分析優缺點與適用場景,助你避開坑點。
| 方法 | 適用場景 | 風險/缺點 | 停機時間 |
|---|---|---|---|
| 1. RENAME DATABASE | **已棄用,勿使用** | 官方移除,可能資料遺失 | - |
| 2. 搬移資料目錄 | 全庫 MyISAM、可停機 | InnoDB 不支援、需停機 | 短 |
| 3. RENAME TABLE 跨庫 | 表數量少、可接受短暫鎖表 | 大量表需逐一敘述、鎖表時間長 | 中 |
| 4. mysqldump 匯出入 | 跨版本/引擎、資料量中等 | 大資料耗時、需雙倍空間 | 長 |
| 5. Shell 腳本批次 RENAME TABLE | 表數量大、自動化部署 | 需 Shell 環境、同方案 3 風險 | 中 |
# 1. 停止服務
systemctl stop mysqld
# 2. 移動資料目錄
mv /var/lib/mysql/old_db /var/lib/mysql/new_db
# 3. 啟動服務
systemctl start mysqld
CREATE DATABASE new_db;
RENAME TABLE old_db.tbl1 TO new_db.tbl1,
old_db.tbl2 TO new_db.tbl2;
-- 重複所有表...
DROP DATABASE old_db;
# 1. 匯出結構與資料
mysqldump -u user -p -h host old_db > old_db.sql
# 2. 建立新庫
mysql -u user -p -h host -e "CREATE DATABASE new_db;"
# 3. 匯入
mysql -u user -p -h host new_db < old_db.sql
# 4. 驗證無誤後刪除舊庫
mysql -u user -p -h host -e "DROP DATABASE old_db;"
#!/bin/bash
mysqlconn="mysql -u user -ppass -h localhost"
olddb="old_db"
newdb="new_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;"
--single-transaction 熱備份,不鎖表。重命名資料庫本質上是「建立新物件、轉移資料、刪除舊物件」,選對工具並做好驗證與備份,才能安心操作。