MySQL 5.1.7 曾引入 RENAME DATABASE,5.1.23 因數據丟失風險緊急移除。生產環境修改庫名需採用變通方案。本文系統對比五種方案原理、優劣、適用場景與風險等級,助您根據業務約束選擇最優路徑。
RENAME DATABASE old_db TO new_db;
# 1. 停止服務 systemctl stop mysqld # 2. 重命名 data 目錄下庫文件夾 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;
SELECT CONCAT('RENAME TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' TO new_db.', TABLE_NAME, ';')
FROM information_schema.TABLES WHERE TABLE_SCHEMA='old_db';
mydumper/myloader 多線程並行導出導入 (10x 加速)。#!/bin/bash
# rename_db.sh old_db new_db
MYSQL="mysql -u root -p'pwd' -h localhost"
OLD=$1; NEW=$2
$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\`;" || { echo "FAIL $T"; exit 1; }
done
$MYSQL -e "DROP DATABASE \`$OLD\`;"
echo "SUCCESS: $OLD -> $NEW"
| 維度 | 方案一 RENAME DB | 方案二 目錄重命名 | 方案三 RENAME TABLE | 方案四 mysqldump | 方案五 Shell 自動化 |
|---|---|---|---|---|---|
| 速度 | 極快 | 極快 | ⚡ 秒級 | 🐢 分~時級 | ⚡ 秒~分級 |
| InnoDB 支援 | ✗ 損壞 | ✗ 不支援 | ✓ 完美 | ✓ 重建 | ✓ 完美 |
| 跨實例 | ✗ | ✗ | ✗ | ✓ 最佳 | ✗ (可擴展) |
| 停機需求 | 無 (但危險) | ✓ 全庫停機 | 極短 MDL 鎖 | 導入期間讀寫分離 | 極短 MDL 鎖 |
| 元數據完整性 | ✗ 丟失 | ✗ 不更新 | ✓ 自動維護 | ✓ 重建 | ✓ 自動維護 |
| 風險等級 | ☠️ 極高 | 🔴 高 | 🟢 低 | 🟡 中 (導入失敗) | 🟢 低 (可控) |
| 推薦場景 | 無 | 純 MyISAM 唯讀 | 同實例重命名首選 | 跨版本/跨雲/結構重組 | 批量運維/自動化流水線 |
mysqldump --no-data --routines --triggers --events old_db 導出定義 → sed 's/old_db/new_db/g' → 導入新庫。SELECT CONCAT('GRANT ', PRIVILEGE_TYPE, ' ON new_db.* TO ', USER, HOST, ';') FROM information_schema.SCHEMA_PRIVILEGES WHERE TABLE_SCHEMA='old_db'; 批量生成 GRANT 語句。SHOW TABLES FROM new_db、抽樣 CHECKSUM TABLE、業務煙霧測試。MySQL 重命名資料庫,**同實例首選方案三 (RENAME TABLE) + 方案五 (自動化腳本)**,秒級完成、零數據拷貝、風險可控;**跨實例/版本/雲遷移首選方案四 (mysqldump/mydumper)**,通用性最強。方案一、二 已進入歷史垃圾箱,嚴禁生產踩坑。建立「備份→預檢→腳本→低峰執行→驗證→切換→觀察→清理」標準化 SOP,讓庫名變更成為常規無感運維動作。