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

MySQL 修改數據庫名稱變通方案:RENAME DATABASE 缺失的替代方案

     編輯:MySQL 資料庫相關知識

背景

MySQL 5.1 曾短暫引入 RENAME DATABASE,但 5.1.23 後移除(僅實驗性功能)。生產環境無原生改庫名命令。

變通方案:建新庫 + 批量 RENAME TABLE

步驟 1:創建目標數據庫

CREATE DATABASE db_v2;

步驟 2:生成重命名 SQL

SELECT CONCAT('RENAME TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' TO db_v2.', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'old_db'
INTO OUTFILE '/tmp/rename_to_db_v2.sql';

步驟 3:執行遷移

SOURCE /tmp/rename_to_db_v2.sql;

完整自動化腳本

#!/bin/bash
OLD_DB="old_db"
NEW_DB="new_db"
SQL_FILE="/tmp/rename_${OLD_DB}_to_${NEW_DB}.sql"

# 1. 創建新庫
mysql -e "CREATE DATABASE \`${NEW_DB}\`;"

# 2. 生成 RENAME 語句(過濾視圖)
mysql -N -e "
SELECT CONCAT('RENAME TABLE \`', TABLE_SCHEMA, '\`.\`', TABLE_NAME, '\` TO \`', '${NEW_DB}', '\`.\`', TABLE_NAME, '\`;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '${OLD_DB}' AND TABLE_TYPE = 'BASE TABLE';
" > ${SQL_FILE}

# 3. 執行
mysql < ${SQL_FILE}

# 4. 驗證
mysql -e "SHOW TABLES FROM \`${NEW_DB}\`;"
mysql -e "DROP DATABASE \`${OLD_DB}\`;"  # 確認無誤後執行

關鍵注意事項

項目處理方式
視圖TABLE_TYPE='BASE TABLE' 僅遷移基表,視圖需單獨重建
存儲過程/函數/觸發器屬於庫級對象,**不會**隨表遷移,需導出重建
權限庫級權限需重新授予
外鍵同庫內表關聯自動維護,跨庫外鍵需手動調整
Binlog大量 RENAME 產生大量 Binlog,備庫同步延遲,建議低峰期操作
鎖表RENAME TABLE 獲取元數據鎖,極短暫,無長時間阻塞

替代方案對比

方案優點缺點適用場景
RENAME TABLE 批量原地操作、無數據拷貝、秒級完成需處理視圖/程序/權限同實例改名、表量<500
mysqldump + 導入完整遷移對象、可跨實例耗時長、需雙倍空間、鎖表久跨實例、需清理數據
pt-online-schema-change無鎖遷移不支持改庫名、僅改表結構不適用

MySQL 8.0 新特性

8.0 仍無 RENAME DATABASE,但支持 RENAME TABLE db1.tbl TO db2.tbl 跨庫移動表,本質相同。

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