萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 修改資料庫名稱的安全方案總結

核心難點

MySQL 無原生 RENAME DATABASE 指令(5.1.7 短暫引入後因風險移除)。直接改檔案目錄名稱僅適用 MyISAM,InnoDB 會導致資料字典不一致而損壞。

方案對比表

方案適用引擎風險停機時間推薦度
1. mysqldump 導出/導入全引擎低長(視資料量)⭐⭐⭐⭐⭐ 最通用安全
2. RENAME TABLE 跨庫移動全引擎低短(元數據操作)⭐⭐⭐⭐ 推薦大表
3. 改引擎為 MyISAM → 改目錄名 → 改回 InnoDBInnoDB→MyISAM→InnoDB中(轉換過程風險)中⭐⭐ 不推薦
4. 直接改資料目錄名稱僅 MyISAM高(InnoDB 必壞)極短⭐ 僅限純 MyISAM

推薦方案 1:mysqldump 重建(最通用)

# 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;"

推薦方案 2:RENAME TABLE 跨庫移動(極速、適合大表)

-- 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;

Shell 自動化腳本片段

#!/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 資料庫。

copyright © 萬盛學電腦網 all rights reserved