MySQL 無原生 RENAME DATABASE (5.1.7 短暫存在後移除,有資料遺失風險)。提供 5 種替代方案,按停機容忍度、資料量、權限選擇。
RENAME DATABASE old_db TO new_db; -- 5.1.7~5.1.23 短暫存在,官方文件明確警告可能丟失資料
systemctl stop mysqldmv /var/lib/mysql/old_db /var/lib/mysql/new_dbsystemctl start mysqld限制:InnoDB 共用表空間 (ibdata1) 存放資料字典,**不適用**;僅限 innodb_file_per_table=ON 且全 MyISAM/獨立表空間 InnoDB。
CREATE DATABASE new_db;
RENAME TABLE old_db.tbl1 TO new_db.tbl1,
old_db.tbl2 TO new_db.tbl2,
...;
DROP DATABASE old_db;
優點:原子操作、無鎖表 (元數據鎖極短)、InnoDB/MyISAM 通用。
自動化:
SELECT CONCAT('RENAME TABLE ', GROUP_CONCAT(CONCAT('old_db.', TABLE_NAME, ' TO new_db.', TABLE_NAME)), ';')
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'old_db'
INTO @sql;
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
# 1. 導出 (加 --single-transaction 熱備份 InnoDB)
mysqldump -u root -p --single-transaction --routines --triggers --events old_db > old_db.sql
# 2. 建新庫
mysql -u root -p -e "CREATE DATABASE new_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 3. 導入
mysql -u root -p new_db < old_db.sql
# 4. 驗證無誤後刪舊庫
mysql -u root -p -e "DROP DATABASE old_db;"
#!/bin/bash
mysqlconn="mysql -u root -p'pwd' -h localhost"
olddb="old_db"
newdb="new_db"
$mysqlconn -e "CREATE DATABASE IF NOT EXISTS \`$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\`;"
| 方法 | 停機 | 引擎支援 | 速度 | 風險 | 適用場景 |
|---|---|---|---|---|---|
| 改資料夾 | 是 | MyISAM/獨立表空間 | 極快 | InnoDB 共用表空間失效 | 純 MyISAM、可停機維護窗口 |
| RENAME TABLE | 否 (極短鎖) | 全引擎 | 快 | 極低 | 線上業務、標準首選 |
| mysqldump | 需一致性鎖/單事務 | 全引擎 | 慢 (大表) | 中 (導入失敗殘留) | 跨版本/跨機器/需壓縮備份 |
| Shell 腳本 | 否 | 全引擎 | 快 | 低 | 批量自動化、CI/CD 整合 |
SHOW GRANTS FOR 'user'@'host'; 重新授權