重命名MySQL数据库

Dhi*_*pan 106 mysql database linux rename

我创建了一个名为的数据库hrms.现在我需要将数据库名称更改为sunhrm.但是,它在MySQL工作台中被禁用.我可以在Linux服务器上执行此操作吗?

jan*_*jan 68

如果您需要从命令行执行此操作,只需复制,修改和粘贴此代码段:

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\`;"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这只处理表.视图和存储过程必须单独完成. (17认同)
  • 更容易使用此脚本的版本:https://gist.github.com/tadas-s/5411299 (6认同)

New*_*ria 59

我认为你不能做到这一点.我认为您需要转储该数据库,创建新命名的数据库,然后导入转储.

如果这是一个实时系统,你需要把它取下来.如果不能,则需要将此数据库的复制设置为新数据库.

如果你想看到执行此命令的命令,@ hajan有详细信息.

  • 是否有意义?为什么MySQL开发者省略了这么重要的选择? (10认同)

小智 33

可以通过mysqldump命令复制数据库而不将dump存储到文件中:

  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"


jet*_*ole 32

您可以完全按照以前的数据库创建新数据库,然后在完成后删除旧数据库.使用mysqldump工具创建数据库的.sql备份,mysqldump orig_db > orig_db.sql或者如果需要使用用户名和密码,则运行mysqldump -u root -p orig_db > orig_db.sql.orig_db是您要"重命名"的数据库的名称,root将是您登录的用户,而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

希望这有所帮助,这是一种可靠的方法来实现它,而不使用一些会破坏您的数据并产生不一致的临时方法.

  • 只需创建数据库并将结果从一个直接传递给另一个:`mysqldump -u root -p old_db | mysql -u root -p new_db`. (2认同)

Cri*_*rta 21

在创建新模式"other_db"之后,您可以通过RENAME语句为"current_db"中的每个表执行此操作

RENAME TABLE current_db.tbl_name TO other_db.tbl_name
Run Code Online (Sandbox Code Playgroud)

重命名表语法

  • 嗨mikeslattery,我的声明是一个RENAME TABLE而不是RENAME DATABASE或SCHEMA (13认同)
  • "这个声明是在MySQL 5.1.7中添加的,但发现它很危险,并在MySQL 5.1.23中删除了"http://dev.mysql.com/doc/refman/5.1/en/rename-database.html (5认同)

Sat*_*h D 11

那么有两种方法:

方法1:一种众所周知的重命名数据库模式的方法是使用Mysqldump转储模式并在另一个模式中恢复,然后删除旧模式(如果需要).

Shell

 mysqldump emp > emp.out
 mysql -e "CREATE DATABASE employees;"
 mysql employees < emp.out 
 mysql -e "DROP DATABASE emp;"
Run Code Online (Sandbox Code Playgroud)

尽管上述方法容易,但是耗费时间和空间.如果架构超过100GB怎么办?有些方法可以将上述命令组合在一起以节省空间,但不会节省时间.

为了解决这种情况,还有另一种重命名模式的快速方法,但是,在执行此操作时必须小心.

方法2:MySQL具有非常好的功能,可以重命名甚至适用于不同模式的表.此重命名操作是原子操作,在重命名时,没有其他人可以访问该表.这需要很短的时间才能完成,因为更改表的名称或其架构只是元数据更改.这是重命名的程序方法:

  1. 使用所需名称创建新数据库模式.
  2. 使用MySQL的"RENAME TABLE"命令将表从旧模式重命名为新模式.
  3. 删除旧的数据库架构.

如果views, triggers, functions, stored procedures模式中存在,那么也需要重新创建.如果表上存在触发器,MySQL的"RENAME TABLE"将失败.为了解决这个问题,我们可以做以下事情:

1) Dump the triggers, events and stored routines in a separate file.使用-E,-R标志(除了转储触发器的-t -d)到mysqldump命令完成.一旦触发器被转储,我们将需要从模式中删除它们,以使RENAME TABLE命令起作用.

  $ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out
Run Code Online (Sandbox Code Playgroud)

2)生成仅"BASE"表的列表.可以使用information_schema.TABLES表上的查询找到它们.

 mysql> select TABLE_NAME from information_schema.tables where 
    table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';
Run Code Online (Sandbox Code Playgroud)

3)将视图转储到out文件中.可以使用相同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
Run Code Online (Sandbox Code Playgroud)

4)删除old_schema中当前表的触发器.

mysql> DROP TRIGGER <trigger_name>;
...
Run Code Online (Sandbox Code Playgroud)

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

使用上述方法的复杂性:我们可能需要更新GRANTSfor用户,使其与正确的schema_name匹配.这些可以固定用一个简单的UPDATEmysql.columns_priv,mysql.procs_priv,mysql.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>
Run Code Online (Sandbox Code Playgroud)

为了演示此脚本的使用,使用了示例模式"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               |
+--------------------+
Run Code Online (Sandbox Code Playgroud)

正如您在上面的输出中所看到的,数据库模式"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
Run Code Online (Sandbox Code Playgroud)