MySQL 5.1 曾短暫支援 RENAME DATABASE,但 5.1.23 因數據丟失風險移除。生產環境修改庫名需採用「建新庫 → 表重命名遷移 → 刪舊庫」模式。本文提供三種成熟方案:SQL 腳本生成法、mysqldump 導出導入法、Shell 自動化腳本法,並對比優劣適用場景。
利用 information_schema.TABLES 生成 RENAME TABLE 批次腳本,在元數據層面移動表,毫秒級完成。
-- 1. 創建新庫
CREATE DATABASE db_v2;
-- 2. 生成重命名腳本 (假設舊庫 sbtest)
SELECT CONCAT('RENAME TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' TO db_v2.', TABLE_NAME, ';')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'sbtest'
INTO OUTFILE '/tmp/rename_to_db_v2.sql';
-- 3. 執行腳本
SOURCE /tmp/rename_to_db_v2.sql;
-- 4. 驗證並刪除舊庫
SHOW TABLES FROM db_v2;
DROP DATABASE sbtest;
優勢:不移動物理數據、極快、支援事務 (InnoDB)、適用 TB 級大庫。
注意:需 FILE 權限寫入腳本文件,或用應用層生成 SQL 陣列執行。
# 1. 導出結構與數據 (單線程) mysqldump -u root -p --single-transaction --routines --triggers --events old_db > old_db.sql # 2. 創建新庫 mysql -u root -p -e "CREATE DATABASE new_db;" # 3. 導入新庫 mysql -u root -p new_db < old_db.sql # 4. 驗證無誤後刪除舊庫 mysql -u root -p -e "DROP DATABASE old_db;"
優勢:邏輯備份可編輯、跨版本相容、支援異構遷移 (MySQL→MariaDB/Percona)。
劣勢:大庫耗時長 (受限單線程)、需雙倍磁盤空間、導入需重建索引。
#!/bin/bash
# 用法: ./rename_db.sh old_db new_db
MYSQL_CONN="mysql -u root -p'password' -h localhost"
OLD_DB=$1
NEW_DB=$2
$MYSQL_CONN -e "CREATE DATABASE \`$NEW_DB\`;"
TABLES=$($MYSQL_CONN -N -e "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA='$OLD_DB'")
for TABLE in $TABLES; do
$MYSQL_CONN -e "RENAME TABLE \`$OLD_DB\`.\`$TABLE\` TO \`$NEW_DB\`.\`$TABLE\`;"
done
$MYSQL_CONN -e "DROP DATABASE \`$OLD_DB\`;"
echo "Database renamed from $OLD_DB to $NEW_DB"
優勢:可集成 Ansible/Jenkins、支援批量重命名、錯誤處理靈活。
注意:執行前務必備份,生產建議加 set -e 遇錯即停。
| 維度 | SQL 腳本法 | mysqldump 法 | Shell 自動化 |
|---|---|---|---|
| 速度 | ⚡ 毫秒級 (元數據操作) | 🐢 分鐘~小時級 (邏輯導入) | ⚡ 秒~分鐘級 (元數據操作) |
| 鎖表影響 | 極短 (MDL 鎖) | 導出需 --single-transaction | 極短 |
| 跨實例 | ✗ | ✓ | ✗ (可改造支援) |
| 適用場景 | 同實例大庫重命名 | 跨實例/版本遷移、結構清理 | 批量自動化運維 |