重命名MySQL数据库

时间:2012-08-30 04:41:22

标签: mysql database linux rename

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

12 个答案:

答案 0 :(得分:69)

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

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\`;"

答案 1 :(得分:59)

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

如果这是一个实时系统,您需要将其删除。如果不能,则需要将此数据库的复制设置为新数据库。

如果您想查看执行此操作的命令,@jan has the details

答案 2 :(得分: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"

答案 3 :(得分:32)

您可以完全按照以前的数据库创建新数据库,然后在完成后删除旧数据库。使用mysqldump工具通过mysqldump orig_db > orig_db.sql创建数据库的.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
  5. 希望这会有所帮助,这是一种可靠的方法来实现它,而不使用一些会破坏您的数据并产生不一致的特殊方法。

答案 4 :(得分:21)

创建新架构“other_db”后,您可以通过RENAME语句为“current_db”中的每个表执行此操作

RENAME TABLE current_db.tbl_name TO other_db.tbl_name

来源Rename Table Syntax

答案 5 :(得分:11)

有两种方法:

方法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将表从旧架构重命名为新架构 “RENAME TABLE”命令。
  3. 删除旧数据库架构。
  4. 如果架构中有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
    

    2)生成仅“BASE”表的列表。这些可以使用a找到     查询information_schema.TABLES表。

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

    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
    

    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,使其与正确的schema_name匹配。这些可以通过UPDATEmysql.columns_privmysql.procs_priv,mysql.db表格上的简单mysql.tables_priv更新,old_schema name更新为new_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
    

答案 6 :(得分:4)

总之没有。通常认为重命名数据库太危险了。 MySQL有一点这个功能,但它被删除了。您最好使用工作台将架构和数据导出到SQL,然后在运行/导入之前更改CREATE DATABASE名称。

答案 7 :(得分:3)

对于不耐烦的mysql用户(比如我),解决方案是:

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

答案 8 :(得分:2)

我使用以下方法重命名数据库

  1. 使用mysqldump或任何数据库工具备份文件,例如heidiSQL,mysql管理员等

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

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

  4. 恢复已编辑的SQL文件

答案 9 :(得分:2)

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

  1. 关闭MySQL服务器
  2. 转到mysql data目录并重命名数据库目录(注意:非字母字符需要以特殊方式编码)
  3. 重启服务器
  4. 根据需要调整权限(授予对新数据库名称的访问权限)
  5. 您可以在一个命令中编写所有脚本,以便停机时间只需一两秒。

答案 10 :(得分:0)

首先备份名为HRMS的旧数据库并编辑脚本文件,并将HRMS替换为SUNHRM。完成此步骤后,将数据库文件导入mysql

答案 11 :(得分:0)

重命名数据库或获取数据库映像的另一种方法是使用数据库选项卡中的“反向工程”选项。它将为数据库创建一个ERR图。在那里重命名架构。

之后转到文件菜单并转到导出并转发工程师数据库。

然后您可以导入数据库。