MySQL 無原生 RENAME DATABASE 命令(5.1.7 短暫引入 5.1.23 移除,因可能導致資料遺失)。所有「改名」實質是建新庫 → 遷移物件 → 刪舊庫。操作前必須完整備份。
| 方法 | 適用場景 | 速度 | 風險 | 備註 |
|---|---|---|---|---|
| 1. RENAME DATABASE | 禁用 | — | 極高(資料遺失) | 官方已移除 |
| 2. 直接改資料目錄名 | 全表 MyISAM、可停機 | 極快 | 中(InnoDB 不支援) | 需停止 MySQL |
| 3. RENAME TABLE 逐表遷移 | 表數較少、可停機寫入 | 快 | 低 | 需逐表執行 |
| 4. mysqldump 導出導入 | 通用、跨版本/引擎、大表 | 慢 | 低 | 最標準、最安全 |
| 5. Shell 腳本批量 RENAME TABLE | 表多、自動化 | 快 | 低 | 方法 3 自動化版 |
systemctl stop mysqld mv /var/lib/mysql/old_db /var/lib/mysql/new_db systemctl start mysqld
InnoDB 絕對不可用此法(表空間 ID、共享表空間、Redo Log 綁定舊路徑)。
CREATE DATABASE `new_db`;
RENAME TABLE `old_db`.`table1` TO `new_db`.`table1`,
`old_db`.`table2` TO `new_db`.`table2`;
-- 確認無誤後
DROP DATABASE `old_db`;
優點:不拷貝資料,僅修改元數據,秒級完成。缺點:表多時手工繁瑣;有外鍵/觸發器/視圖/存儲過程需額外處理。
# 1. 導出(含結構、資料、觸發器、事件、常式) mysqldump -u root -p --routines --triggers --events --single-transaction --master-data=2 old_db > old_db.sql # 2. 建新庫 mysql -u root -p -e "CREATE DATABASE new_db DEFAULT CHARSET utf8mb4;" # 3. 導入 mysql -u root -p new_db < old_db.sql # 4. 驗證無誤後刪舊庫 mysql -u root -p -e "DROP DATABASE old_db;"
#!/bin/bash
# rename_db.sh old_db new_db
set -euo pipefail
OLD=$1; NEW=$2
MYSQL="mysql -u root -p'pass' -h localhost"
$MYSQL -e "CREATE DATABASE \`$NEW\`;"
TABLES=$($MYSQL -N -e "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='$OLD'")
for T in $TABLES; do
$MYSQL -e "RENAME TABLE \`$OLD\`.\`$T\` TO \`$NEW\`.\`$T\`;"
done
# $MYSQL -e "DROP DATABASE \`$OLD\`;" # 驗證後取消註釋
執行:bash rename_db.sh old_db new_db
SHOW FULL TABLES WHERE Table_type='VIEW' → CREATE OR REPLACE VIEWmysqldump --routines --triggers --events --no-dataSHOW GRANTS FOR 'user'@'host' → 新庫重新授權修改資料庫名稱本質是「遷移」。mysqldump 導出導入最通用安全,RENAME TABLE 最快但需同引擎/版本且無外鍵。無論何種方式,備份優先、驗證校驗、維護窗口操作是鐵律。