首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 修改資料庫名稱的 5 種方法與風險評估

     編輯:MySQL 資料庫相關知識

⚠️ 核心警示

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 自動化版

方法 2:直接改目錄(僅 MyISAM)

systemctl stop mysqld
mv /var/lib/mysql/old_db /var/lib/mysql/new_db
systemctl start mysqld

InnoDB 絕對不可用此法(表空間 ID、共享表空間、Redo Log 綁定舊路徑)。

方法 3:RENAME TABLE 逐表遷移

CREATE DATABASE `new_db`;
RENAME TABLE `old_db`.`table1` TO `new_db`.`table1`,
             `old_db`.`table2` TO `new_db`.`table2`;
-- 確認無誤後
DROP DATABASE `old_db`;

優點:不拷貝資料,僅修改元數據,秒級完成。缺點:表多時手工繁瑣;有外鍵/觸發器/視圖/存儲過程需額外處理。

方法 4:mysqldump 導出導入(推薦通用)

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

方法 5:Shell 腳本自動化 RENAME TABLE

#!/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 VIEW
  • 存儲過程/函數/觸發器/事件:mysqldump --routines --triggers --events --no-data
  • 權限:SHOW GRANTS FOR 'user'@'host' → 新庫重新授權

結語

修改資料庫名稱本質是「遷移」。mysqldump 導出導入最通用安全,RENAME TABLE 最快但需同引擎/版本且無外鍵。無論何種方式,備份優先、驗證校驗、維護窗口操作是鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved