重命名MySQL数据库[复制](Rename MySQL database [duplicate])

2019-06-27 13:43发布

这个问题已经在这里有一个答案:

  • 如何快速重命名一个MySQL数据库(其他城市架构名称)? 47个回答

我创建了一个数据库的名称, hrms 。 现在,我需要改变数据库名称sunhrm 。 但是,它在MySQL的工作台被禁用。 我能做到这一点的Linux服务器本身?

Answer 1:

我不认为你可以做到这一点。 我想你会需要转储数据库,创建新命名的一个,然后导入转储。

如果这是一个活的系统,你需要把它记下来。 如果不能,那么你将需要设置复制从这个数据库到新的。

如果你想看到的命令要做到这一点, @jan有细节 。



Answer 2:

如果你需要做的命令行,只复制,改编并粘贴此片段:

mysql -e "CREATE DATABASE \`new_database\`;"
for table in `mysql -B -N -e "SHOW TABLES;" old_database`
do 
  mysql -e "RENAME TABLE \`old_database\`.\`$table\` to \`new_database\`.\`$table\`"
done
mysql -e "DROP DATABASE \`old_database\`;"


Answer 3:

这是可能通过的mysqldump命令不保存到转储文件复制数据库:

  1. mysql -u root -p -e "create database my_new_database"
  2. mysqldump -u root -p original_database | mysql -u root -p my_new_database
  3. mysql -u root -p -e "drop database original_database"


Answer 4:

您可以准确地创建一个新的数据库与以前的数据库中存在,然后删除旧的数据库时,即可大功告成。 使用mysqldump工具通过创建数据库的备份名为.sql mysqldump orig_db > orig_db.sql或者如果你需要使用用户名和密码,然后运行mysqldump -u root -p orig_db > orig_db.sql 。 orig_db是要“重命名”,根本是你登录的用户和orig_db.sql将创建包含备份文件的数据库的名称。 现在,创建要用于数据库名称的新的空数据库。 例如, mysql -u root -p -e "create database new_db" 。 一旦这样做了,然后运行mysql -u root -p new_db < orig_db.sql 。 new_db现在存在的orig_db完美复制。 然后,您可以删除原始数据库,因为你现在拥有它与你想要的数据库名称新的数据库现有的。

没有所有的上述解释的周期短,见效快的步骤是:

  1. mysqldump -u root -p original_database > original_database.sql
  2. mysql -u root -p -e "create database my_new_database"
  3. mysql -u root -p my_new_database < original_database.sql
  4. mysql -u root -p -e drop database originl_database

希望这可以帮助,这是一个可靠的手段来完成它,而不使用将破坏你的数据,并创建不一致一些特别方法。



Answer 5:

您可以通过RENAME语句每个表做你的“current_db”创建新的模式后,“other_db”

RENAME TABLE current_db.tbl_name TO other_db.tbl_name

源重命名表语法



Answer 6:

那么有2种方法:

方法1:用于重命名数据库模式的公知的方法是通过使用mysqldump倾倒的模式和在另一个模式恢复,然后丢弃旧模式(如果需要)。

Shell

 mysqldump emp > emp.out
 mysql -e "CREATE DATABASE employees;"
 mysql employees < emp.out 
 mysql -e "DROP DATABASE emp;"

虽然上述方法是容易的,它是时间和空间的消耗。 如果该模式是超过100GB的? 有一些方法,你可以管上面的命令一起,以节省空间,但它不会节省时间。

为了纠正这种情况下,还有另外一个重命名模式快速的方法,但有些必须小心,在做的考虑。

方法2:MySQL有重命名,即使在不同的模式工作表一个非常好的功能。 此重命名操作是原子和而其更名没有其他人可以访问表。 这需要很短的时间,因为更改表的名称以完成或它的模式只是一个元数据的变化。 这是在做重命名程序的方法:

  1. 创建所需的名称新的数据库架构。
  2. 重命名旧模式中的表到新的架构,使用MySQL的“重命名表”命令。
  3. 删除旧的数据库架构。

如果有views, triggers, functions, stored procedures中的模式,这些将需要重新过。 如果有触发存在于表MySQL的“重命名表”失败。 为了解决这个问题,我们可以做以下的事情:

1) Dump the triggers, events and stored routines in a separate file. 此完成使用-E,-R标志(除了-t -d其中转储触发器)到mysqldump命令。 一旦触发转储,我们需要从架构删除它们,准备重新命名TABLE命令工作。

  $ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out

2)生成唯一的“基地”表的列表。 这些可以用在INFORMATION_SCHEMA.TABLES表的查询中找到。

 mysql> select TABLE_NAME from information_schema.tables where 
    table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';

3)转储在出的文件的视图。 视图可以使用同一INFORMATION_SCHEMA.TABLES表的查询中找到。

mysql> select TABLE_NAME from information_schema.tables where 
   table_schema='<old_schema_name>' and TABLE_TYPE='VIEW';
 $ mysqldump <database> <view1> <view2> … > views.out

4)落上在old_schema当前表中的触发器。

mysql> DROP TRIGGER <trigger_name>;
...

5)还原上述转储文件一旦在步骤#2中找到的所有的“基础”表重命名。

mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name;
...
$ mysql <new_schema> < views.out
$ mysql <new_schema> < stored_routines_triggers_events.out

复杂与上面的方法:我们可能需要更新的GRANTS等用户,他们匹配正确的模式名。 这些可以固定一个简单的UPDATEmysql.columns_privmysql.procs_privmysql.tables_priv ,mysql.db表更新old_schema namenew_schema ,并呼吁“同花顺特权;”。 虽然“ method 2 “似乎比“稍微复杂一点method 1 ”,这是完全脚本化。 一个简单的bash脚本开展以正确的顺序上面的步骤,可以帮助您节省空间和时间,而下一次重命名数据库模式。

该Percona的远程DBA团队已经写了一个名为“rename_db”的剧本,在以下方式运行:

[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>

为了说明如何使用该脚本的,使用的样本模式“EMP”,而创建的测试触发器,存储在该模式例程。 将尝试重命名使用脚本,这需要几秒钟才能完成,而不是费时转储数据库架构/还原方法。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp                |
| mysql              |
| performance_schema |
| test               |
+--------------------+


[root@dba ~]# time /tmp/rename_db localhost emp emp_test
create database emp_test DEFAULT CHARACTER SET latin1
drop trigger salary_trigger
rename table emp.__emp_new to emp_test.__emp_new
rename table emp._emp_new to emp_test._emp_new
rename table emp.departments to emp_test.departments
rename table emp.dept to emp_test.dept
rename table emp.dept_emp to emp_test.dept_emp
rename table emp.dept_manager to emp_test.dept_manager
rename table emp.emp to emp_test.emp
rename table emp.employees to emp_test.employees
rename table emp.salaries_temp to emp_test.salaries_temp
rename table emp.titles to emp_test.titles
loading views
loading triggers, routines and events
Dropping database emp

real    0m0.643s
user    0m0.053s
sys     0m0.131s



mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp_test           |
| mysql              |
| performance_schema |
| test               |
+--------------------+

正如你可以在上面看到输出的数据库模式“EMP”在不到一秒钟更名为“emp_test”。 最后,这是从该Percona的上面用于“脚本method 2 “。

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi


Answer 7:

总之没有。 人们普遍认为是太危险了重命名数据库。 MySQL的有这样的功能了一点,但它已被删除。 你会使用工作台到两个架构和数据导出到SQL然后更改CREATE DATABASE名字里有你运行/导入之前会更好。



Answer 8:

对于心急MySQL用户(比如我),解决的办法是:

/etc/init.d/mysql stop
mv /var/lib/mysql/old_database /var/lib/mysql/new_database 
/etc/init.d/mysql start


Answer 9:

我用下面的方法来重命名数据库

  1. 使用mysqldump或任何数据库工具如heidiSQL,MySQL管理等采取文件的备份

  2. 在一些文本编辑器打开备份(如backupfile.sql)文件。

  3. 搜索和替换数据库名和保存文件。

  4. 恢复编辑SQL文件



Answer 10:

如果您的数据库中只包含MyISAM表(如果有InnoDB表使用此方法):

  1. 关闭MySQL服务器
  2. 去了MySQL data目录中并重新命名数据库目录(注:非字母字符需要以特殊的方式进行编码)
  3. 重新启动服务器
  4. 如果需要的话(访问权限授予新的数据库名)调整权限

你可以编写脚本这一切在一个命令,使停机时间只是一两秒钟。



Answer 11:

首先备份旧的数据库名为HRMS和编辑替换词HRMS到SUNHRM脚本文件。 此步骤后导入数据库文件到MySQL



Answer 12:

重命名数据库的数据库或采取像另一种方式是在数据库选项卡中使用反向工程选项。 这将创建一个数据库的ERR图。 重命名模式存在。

之后转到文件菜单,然后转到出口和正向工程数据库。

然后,你可以导入数据库。



文章来源: Rename MySQL database [duplicate]