Amazon:如何更改 Amazon RDS MySQL 中的数据库名称?

Nap*_*ter 6 mysql linux amazon-ec2 amazon-rds

我想更改Amazon RDS 的数据库实例的MYSQL 数据库名称。

怎么可能呢?

Ahm*_*sna 7

您可以使用以下命令重命名数据库,但请确保先进行备份

CREATE database new_db_name;
RENAME TABLE db_name.table1 TO new_db_name, db_name.table2 TO new_db_name;
DROP database db_name;
Run Code Online (Sandbox Code Playgroud)

参考资料:http : //www.rndblog.com/how-to-rename-a-database-in-mysql/ /sf/ask/853300031/


Rol*_*DBA 6

您可以使用 mysqldump 完成此操作。这里有一个问题:您无法传送数据,因为传送数据可能会产生相关成本

对于此示例,假设您要重命名mydbourdb

STEP 01 : 创建新数据库

mysql> CREATE DATABASE ourdb;
Run Code Online (Sandbox Code Playgroud)

步骤 02:获取没有触发器的模式

mysqldump -hrdshost -uuser -ppassword -d -t -R --skip-triggers mydb > /tmp/schema.sql
Run Code Online (Sandbox Code Playgroud)

STEP 03 : 获取触发器

mysqldump -hrdshost -uuser -ppassword --skip-routines --triggers mydb > /tmp/triggers.sql
Run Code Online (Sandbox Code Playgroud)

步骤 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}
Run Code Online (Sandbox Code Playgroud)

如果没有外键约束

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}
Run Code Online (Sandbox Code Playgroud)

如果没有外键约束,这应该很快。

步骤 05:将文件合并为一个脚本

ETL_SCRIPT=/tmp/ETL.sql
cat /tmp/schema.sql        > ${ETL_SCRIPT}
cat /tmp/DataTransfer.sql >> ${ETL_SCRIPT}
cat /tmp/triggers.sql     >> ${ETL_SCRIPT}
Run Code Online (Sandbox Code Playgroud)

步骤 06:查看脚本

vi -R /tmp/ETL.sql
Run Code Online (Sandbox Code Playgroud)

或者

less /tmp/ETL.sql
Run Code Online (Sandbox Code Playgroud)

步骤 07:运行脚本

mysql -hrdshost -uuser -ppassword -Dourdb < ${ETL_SCRIPT}
Run Code Online (Sandbox Code Playgroud)

STEP 08:确保所有数据都在目标数据库中

你可以这样做

如果没有外键约束,mydb 应该是空的,ourdb 应该有所有的表。

如果有外键约束,确保mydbourdb具有相同数目的表和相同的行数。通过运行确保所有触发器都存在

SELECT COUNT(1) trigger_count,table_schema
FROM information_schema.triggers
GROUP By table_schema;
Run Code Online (Sandbox Code Playgroud)

步骤 09:手动删除旧数据库

mysql> DROP DATABASE mydb;
Run Code Online (Sandbox Code Playgroud)

我没有在脚本中删除数据库,以防万一。:-)

试一试 !!!