Mysql

亞馬遜:如何在 Amazon RDS MySQL 中更改數據庫名稱?

  • January 22, 2018

我想更改Amazon RDS 的數據庫實例的MYSQL 數據庫名稱。

怎麼可能?

您可以使用 mysqldump 完成此操作。這裡有一個問題:您不能運送數據,因為運送數據可能會產生成本

對於此範例,假設您要重命名mydbourdb

STEP 01 : 創建新數據庫

mysql> CREATE DATABASE ourdb;

STEP 02 : 獲取沒有觸發器的模式

mysqldump -hrdshost -uuser -ppassword -d -t -R --skip-triggers mydb > /tmp/schema.sql

STEP 03 : 獲取觸發器

mysqldump -hrdshost -uuser -ppassword --skip-routines --triggers mydb > /tmp/triggers.sql

STEP 04 : 生成INSERT ... SELECT跨所有表執行的腳本

如果有外鍵約束

ETL_DATA_SCRIPT=/tmp/DataTransfer.sql
echo -n > ${ETL_DATA_SCRIPT}
echo "SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;" >> ${ETL_DATA_SCRIPT}
echo "SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;" >> ${ETL_DATA_SCRIPT}
echo "SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION;" >> ${ETL_DATA_SCRIPT}
echo "SET NAMES utf8;" >> ${ETL_DATA_SCRIPT}
echo "SET @OLD_TIME_ZONE=@@TIME_ZONE;" >> ${ETL_DATA_SCRIPT}
echo "SET TIME_ZONE='+00:00';" >> ${ETL_DATA_SCRIPT}
echo "SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;" >> ${ETL_DATA_SCRIPT}
echo "SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;" >> ${ETL_DATA_SCRIPT}
echo "SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO';" >> ${ETL_DATA_SCRIPT}
echo "SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0;" >> ${ETL_DATA_SCRIPT}
echo "SET group_concat_max_len = 104857600;" >> ${ETL_DATA_SCRIPT}
SQL="SELECT CONCAT('INSERT INTO ourdb.',table_name,' SELECt * FROM mydb.',table_name,';')"
SQL="${SQL} FROM information_schema.tables WHERE table_schema='mydb'"
mysql -hrdshost -uuser -ppassword -ANe"${SQL}" >> ${ETL_DATA_SCRIPT}

如果沒有外鍵約束

ETL_DATA_SCRIPT=/tmp/DataTransfer.sql
SQL="SELECT CONCAT('ALTER TABLE mydb.',table_name,' RENAME ourdb.',table_name,';')"
SQL="${SQL} FROM information_schema.tables WHERE table_schema='mydb'"
mysql -hrdshost -uuser -ppassword -ANe"${SQL}" > ${ETL_DATA_SCRIPT}

如果沒有外鍵約束,這應該很快。

STEP 05 : 將文件合併成一個腳本

ETL_SCRIPT=/tmp/ETL.sql
cat /tmp/schema.sql        > ${ETL_SCRIPT}
cat /tmp/DataTransfer.sql >> ${ETL_SCRIPT}
cat /tmp/triggers.sql     >> ${ETL_SCRIPT}

STEP 06 : 查看腳本

vi -R /tmp/ETL.sql

要麼

less /tmp/ETL.sql

STEP 07 : 執行腳本

mysql -hrdshost -uuser -ppassword -Dourdb < ${ETL_SCRIPT}

STEP 08 : 確保所有數據都在目標數據庫中

你可以這樣做

如果沒有外鍵約束,mydb 應該是空的,ourdb 應該有所有的表。

如果存在外鍵約束,請確保具有相同數量的表和相同的行數mydbourdb通過執行確保所有觸發器都存在

SELECT COUNT(1) trigger_count,table_schema
FROM information_schema.triggers
GROUP By table_schema;

步驟 09:手動刪除舊數據庫

mysql> DROP DATABASE mydb;

我沒有在腳本中刪除數據庫,以防萬一。:-)

試一試 !!!

引用自:https://dba.stackexchange.com/questions/76091