代码之家  ›  专栏  ›  技术社区  ›  Community wiki

如何重命名MySQL数据库(更改架构名称)?

  •  1136
  • Community wiki  · 技术社区  · 2 年前

    如何快速重命名MySQL数据库(更改其模式名称)?

    通常我只是转储一个数据库,然后用新名称重新导入它。对于非常大的数据库来说,这不是一个选项。显然地 RENAME {DATABASE | SCHEMA} db_name TO new_db_name; does bad things, exists only in a handful of versions, and is a bad idea overall

    这需要与 InnoDB ,与 MyISAM

    46 回复  |  直到 2 年前
        1
  •  6
  •   New Alexandria    5 年前

    对于 InnoDB ,以下操作似乎有效:创建新的空数据库,然后依次将每个表重命名为新数据库:

    RENAME TABLE old_db.table TO new_db.table;
    

    之后,您需要调整权限。

    对于shell中的脚本编写,可以使用以下任一选项:

    mysql -u username -ppassword old_db -sNe 'show tables' | while read table; \ 
        do mysql -u username -ppassword -sNe "rename table old_db.$table to new_db.$table"; done
    

    for table in `mysql -u root -ppassword -s -N -e "use old_db;show tables from old_db;"`; do mysql -u root -ppassword -s -N -e "use old_db;rename table old_db.$table to new_db.$table;"; done;
    

    注意事项:

    • 选项之间没有空格 -p 和密码。如果您的数据库没有密码,请删除 -u username -ppassword 部分
    • 若某个表有触发器,则不能使用上述方法将其移动到另一个数据库(将导致 Trigger in wrong schema 错误)。如果是这种情况,请使用传统方法克隆数据库,然后删除旧数据库:

      mysqldump old_db | mysql new_db

    • 如果您有存储过程,则可以在以后复制它们:

      mysqldump -R old_db | mysql new_db

        2
  •  4
  •   coffeefiend    10 年前

    使用以下几个简单的命令:

    mysqldump -u username -p -v olddatabase > olddbdump.sql
    mysqladmin -u username -p create newdatabase
    mysql -u username -p newdatabase < olddbdump.sql
    

    或者按照@Pablo Marin Garcia的建议,使用以下方法来减少I/O:

    mysqladmin -u username -p create newdatabase
    mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase
    
        3
  •  4
  •   Samra    8 年前

    我认为这个解决方案更简单,是一些开发人员提出的。phpMyAdmin对此有一个操作。

    从phpMyAdmin中,选择要选择的数据库。在选项卡中有一个名为“操作”的选项卡,请转到重命名部分。仅此而已。

    正如许多人建议的那样,它使用新名称创建一个新数据库,将旧数据库的所有表转储到新数据库中,然后删除旧数据库。

    Enter image description here

        4
  •  3
  •   Milosz    13 年前

    可以使用SQL生成SQL脚本,将源数据库中的每个表传输到目标数据库。

    必须先创建目标数据库,然后才能运行从命令生成的脚本。

    你可以使用这两个脚本中的任何一个(我最初建议使用前者,有人“改进”了我的答案 GROUP_CONCAT 。你选吧,但我更喜欢原版):

    SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')
    FROM information_schema.TABLES 
    WHERE table_schema='$1';
    

    SELECT GROUP_CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name SEPARATOR '; ')
    FROM information_schema.TABLES 
    WHERE table_schema='$1';
    

    (1美元和2美元分别是来源和目标)

    这将生成一个SQL命令,然后您必须运行该命令。

    请注意 组_目录 具有默认长度限制,对于具有大量表的数据库,可能会超过该长度限制。你可以通过跑步来改变这个限制 SET SESSION group_concat_max_len = 100000000; (或其他一些大数字)。

    推荐文章