Как быстро переименовать базу данных MySQL (изменить имя схемы)?

Руководство по MySQL по адресу MySQL покрывает это.

Обычно я просто выгружаю базу данных и повторно импортирую ее с новым именем. Это не вариант для очень больших баз данных. Очевидно RENAME {DATABASE | SCHEMA} db_name TO new_db_name; делает плохие вещи, существует только в нескольких версиях и в целом является плохой идеей.

Это должно работать с InnoDB, который хранит вещи совсем иначе, чем MyISAM.


person Community    schedule 15.09.2008    source источник
comment
Также на serverfault: serverfault.com/questions/ 195221 / как-переименовать-базу-MySQL   -  person Yves Martin    schedule 14.08.2013
comment
Этот оператор RENAME DATABASE Syntax был добавлен в MySQL 5.1.7, но был признан опасным и был удален в MySQL 5.1.23.   -  person zloctb    schedule 10.06.2015
comment
Надеюсь, MySQL реализует новый рабочий RENAME DATABASE оператор, который не несет в себе никаких опасностей, поскольку в настоящее время нет простого способа выполнить эту задачу. Нет очевидной причины, почему это было опасно в документацию, чтобы у них была возможность сделать замену. По крайней мере, люди размещали на своих веб-сайтах ошибки, связанные с запросами функций. Например, bugs.mysql.com/bug.php?id=58593. и bugs.mysql.com/bug.php?id=1698.   -  person Edward    schedule 15.04.2016
comment
ссылки теперь не работают ...   -  person oldboy    schedule 24.04.2018


Ответы (49)


Для InnoDB, похоже, работает следующее: создайте новую пустую базу данных, затем переименуйте каждую таблицу по очереди в новую базу данных:

RENAME TABLE old_db.table TO new_db.table;

После этого вам нужно будет настроить разрешения.

Для написания сценариев в оболочке вы можете использовать одно из следующего:

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

OR

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

person Community    schedule 19.02.2010
comment
Это хороший вариант и подходящий вариант, если ваш db большой, но у вас не так много таблиц (или вы хотите написать сценарий для цикла для всех таблиц). Кроме того, в innodb это всего лишь логическое переименование, а в MyISAM, в зависимости от вашей файловой системы, это будет логическое переименование или реальное копирование данных на диск. - person Pablo Marin-Garcia; 29.09.2010
comment
Я только что проделал это с базой данных InnoDB с более чем 30 таблицами, используя параметр file_per_table, и хотя в некоторых таблицах было более 3 миллионов строк, это было выполнено за ‹1 секунду. Кажется, просто переместить файлы в хранилище, а не делать что-то более сложное ... +2, если возможно :) - person Dave Rix; 25.11.2011
comment
Обратите внимание, что это не работает для просмотров. Вы не можете переименовать представления, чтобы заставить их переходить из одной базы данных в другую. Вместо этого используйте DROP VIEW и CREATE VIEW. Неуклюжий, да. Возможно, вы захотите сделать mysqldump для перемещения представлений, предварительно переместив все таблицы. Также обратите внимание, что SHOW TABLES будет показывать таблицы И представления, так что будьте осторожны. - person tuomassalo; 01.11.2013
comment
Также это не сработает для любых таблиц с триггерами. Вам нужно найти, сбросить и удалить триггеры перед перемещением таблицы, а затем импортировать сброшенные триггеры в целевую базу данных. - person Olfan; 14.01.2015
comment
Здесь нужно о многом знать. Проверьте источник для базы данных переименования phpmyadmin - person Peter V. Mørch; 11.02.2016
comment
Хотя mysqldump не подходит для больших баз данных, он поддерживает триггеры по умолчанию, а также процедуры с параметром -R или --routines (как указано в ответ) и поддержка таблиц (по умолчанию). Хотя, похоже, он не поддерживает взгляды. - person Edward; 15.04.2016
comment
Обновленная (т. Е. Рабочая) ссылка, объясняющая, почему RENAME DATABASE был удален: dev.mysql.com/worklog / task /? id = 4030 - person alexis; 21.05.2016
comment
Спасибо за ваше предложение. Обратите внимание, что вы должны добавить ';' после команды show tables, если вы не хотите, чтобы вам предлагалось ввести точку с запятой. - person Izerlotti; 13.07.2016
comment
Или, если вы установили MySQL Utilities: mysqldbcopy --source=username@localhost:port --destination=username@localhost:port old_db:new_db, а потом удалите old_db. - person bjmi; 30.08.2016
comment
Получите сценарий для переименования с помощью следующего ‹code›, выберите «ПЕРЕИМЕНОВАТЬ ТАБЛИЦУ», concat (TABLE_SCHEMA, '.', TABLE_NAME), concat ('TO ‹newDbName›.', TABLE_NAME) из information_schema.tables WHERE TABLE_SCHEMA = '‹oldDbName ›'Заказ от TABLE_NAME ‹/code› - person ChrisR; 31.08.2016
comment
В phpMyAdmin я использовал Operations / Rename Database. И это было на удивление быстро, почти мгновенно (1-2 секунды), поэтому я предполагаю, что он использует эту RENAME TABLE стратегию. MySQL 5.6. - person Buttle Butkus; 20.03.2017
comment
Не забудьте использовать команду history -cw в консоли после использования этого сценария оболочки, поскольку вы не хотите, чтобы пароль отображался в виде открытого текста в истории консоли. - person Vincent; 07.10.2017
comment
Пожалуйста, кто-нибудь может объяснить, что имеет в виду OP Answerer, когда он говорит, что вам нужно будет настроить разрешения после этого? - person 0xVox; 26.07.2018
comment
@ThomasBrew: это означает, что вам нужно выполнить SQL как use mysql; update db set db='new_db' where db = 'old_db'; flush priviledges; - person dma_k; 14.02.2019
comment
Первый вариант у меня не сработал, бросил Команда не найдена. Второй вариант сработал очень хорошо! - person Lucas Bustamante; 12.07.2019
comment
Работает ли это, если таблица имеет ссылочные ограничения? Я не ожидал. - person dolmen; 05.11.2019
comment
Лично мне нравится делать это таким образом, SELECT concat (переименовать таблицу old_database_name., TABLE_NAME, 'в new_database_name.', TABLE_NAME, ';') FROM information_schema.tables WHERE TABLE_SCHEMA = 'old_database_name'; который создает серию команд, которые я могу выполнить вручную. - person jbrahy; 14.07.2020
comment
Если в имени вашей таблицы используются косые черты ('/') или другие специальные символы, вам нужно будет использовать обратные кавычки вокруг имени таблицы. Чтобы они правильно интерпретировались, напишите команду так 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; - person brunoob; 12.05.2021

Используйте эти несколько простых команд:

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

Или, чтобы уменьшить количество операций ввода-вывода, используйте следующее, предложенное @Pablo Marin-Garcia:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase
person Community    schedule 02.07.2009
comment
Как сказал OP, [t] это не вариант для очень больших баз данных. - person pilcrow; 07.05.2010
comment
Не забудьте УДАЛИТЬ исходную базу данных - person Pavel Radzivilovsky; 11.10.2010
comment
Блестящий ответ! Пара предложений по дальнейшему улучшению, поскольку это, вероятно, гуглится всеми способностями: (1) Переместите фрагмент кода Пабло Марина-Гарсиа наверх, поскольку он кажется лучшим ответом (2) Поместите -p<password> вместо -p везде, чтобы операторы выполнялись без быстрое появление. - person Steve Chambers; 21.04.2014
comment
Используя конвейерную версию, я получаю два запроса Введите пароль: примерно так: Enter password: Enter password: Кажется, требуется один пароль, но не оба. Я упускаю какую-то деталь? - person Ryan; 27.06.2014
comment
Я удивлен, что об этом никто не упомянул, но вам действительно стоит добавить флаг --routines и к командам mysqldump, чтобы гарантировать, что хранимые процедуры копируются. - person Carlos P; 08.10.2014
comment
Я обычно использую графический интерфейс SQLyog. 1) создание новой БД с требуемым именем, а затем использование функции «Копировать на другой хост / БД» для копирования старой базы данных. 2) Экспорт БД как sqldump, а затем импорт с использованием опции «Выполнить SQL-скрипт» в меню «Инструменты». - person ; 03.04.2017
comment
Это решение является предпочтительным, потому что НЕ нужно перебирать все таблицы - ОГРОМНОЕ удобство. И хотя было заявлено, что это не лучший вариант для больших баз данных, никто не описал, что это означает количественно. Я предлагаю сначала попробовать этот способ. Ваша база данных может быть не такой уж большой, как вы думаете. В худшем случае, вероятно, проблема связана с переполнением диска, поэтому вы должны быть готовы с этим справиться. - person Tom Wilson; 20.03.2019
comment
При запуске mysqldump из команды Windows (cmd.exe) вам необходимо запустить его от имени администратора (иначе он скажет, что доступ запрещен). - person Björn; 24.11.2020

Думаю, решение проще и предлагалось некоторыми разработчиками. В phpMyAdmin есть операция для этого.

В phpMyAdmin выберите базу данных, которую хотите выбрать. Во вкладках есть одна под названием «Операции», перейдите в раздел переименования. Это все.

Он действительно, как многие предлагали, создает новую базу данных с новым именем, выгружает все таблицы старой базы данных в новую базу данных и удаляет старую базу данных.

Введите описание изображения здесь

person Community    schedule 15.01.2012
comment
Предполагая, что у вас даже есть php в вашей среде или вы используете phpmyadmin. - person Chris; 28.08.2012
comment
Довольно опасно, даже если у вас есть phpMyAdmin - серверная часть может выйти из строя в середине процесса, оставив два dbs в неизвестном состоянии, или это может занять очень много времени, что приведет к зависанию внешнего интерфейса или тайм-ауту PHP. - person mozboz; 14.09.2012
comment
Это правда @mozboz, но я занимаюсь этим уже 10 лет и никогда не сталкивался с этой проблемой. То же самое, если вы запускаете команду через оболочку и ваш компьютер дает сбой. Есть возможность, но что? 1 к 1 квадриллиону? - person raphie; 22.09.2012
comment
Скрипт через консоль также является интерфейсом, который может зависать с теми же проблемами. - person Greg; 24.09.2012
comment
Тем не менее, консольные операции намного надежнее, чем PhpMyAdmin, особенно когда задействованы большие базы данных, что является случаем OP. Лично я настоятельно рекомендую любой консольный метод, а не PMA, если у вас достаточно большая база данных. Излишне говорить, что для небольших баз данных PMA так же хороша. - person Teodor Sandu; 25.04.2013
comment
Консольные операции также могут быть защищены от зависаний и падений сети с помощью gnu screen для их запуска. - person Danny Staple; 14.08.2013
comment
Относительно этих различных проблем, кажется, есть два очевидных решения. 1 - Всегда сначала тестируйте в своей среде разработки. 2 - Вместо переименования можно скопировать на новое имя. Вы всегда можете вернуться к исходной БД. - person AyexeM; 06.09.2013
comment
@AyexeM Это абсолютно верно, среда или инструмент, который вы используете, всегда требуют создания резервной копии или копирования данных, независимо от процесса, который вы планируете делать. Восстановление данных, в зависимости от количества данных, обычно выполняется быстро. Согласовано. - person raphie; 01.10.2013
comment
Это очень хороший ответ ... особенно когда все, что я делаю, это тестирую некоторые книжные упражнения ... в php и phpmyadmin. Я неправильно назвал свой db ... и создал несколько таблиц ... и теперь все, что мне нужно сделать, это переименовать db ... и вуаля ... работа сделана. - person ihightower; 06.12.2013
comment
phpmyadmin - надежный инструмент. Я надеюсь, что они реализуют эту функциональность как правильную транзакцию ACID, используя ведение журнала и перекатывается при обнаружении ошибок? Хотя я на самом деле этого не проверял. - person Domi; 07.06.2014
comment
Я проделал это со многими базами данных разного размера, используя phpMyAdmin. На сегодняшний день у меня ни разу не было неудач. Предостережение: мы используем только MyISAM, таблицы InnoDB не используются ни в одной из наших систем (хорошо, за небольшими исключениями). - person TheSatinKnight; 28.05.2017
comment
Я получаю уведомление об ошибке в ./libraries/operations.lib.php#361. Неопределенная переменная: sql_query. Обратная трассировка ./db_operations.php#69: PMA_createDbBeforeCopy () - person Paul Chris Jones; 10.03.2019

Вы можете использовать SQL для создания сценария SQL для переноса каждой таблицы из исходной базы данных в целевую базу данных.

Перед запуском сценария, созданного с помощью команды, необходимо создать целевую базу данных.

Вы можете использовать любой из этих двух сценариев (я изначально предложил первый, а кто-то «улучшил» мой ответ, чтобы он использовал GROUP_CONCAT. Выбирайте, но я предпочитаю оригинал):

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

or

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

(1 и 2 доллара - это источник и цель соответственно)

Это сгенерирует команду SQL, которую вам нужно будет затем запустить.

Обратите внимание, что GROUP_CONCAT имеет ограничение длины по умолчанию, которое может быть превышено для баз данных с большим количеством таблиц. Вы можете изменить это ограничение, запустив SET SESSION group_concat_max_len = 100000000; (или другое большое число).

person Community    schedule 26.11.2011
comment
@BlakeFrederick Он не использует ПЕРЕИМЕНОВАНИЕ БАЗЫ ДАННЫХ, в чем проблема? - person tuxayo; 17.08.2016
comment
Работает ли это, если таблица имеет ссылочные ограничения? Я не ожидал. - person dolmen; 05.11.2019

Эмуляция отсутствующей команды RENAME DATABASE в MySQL:

  1. Создать новую базу данных
  2. Создайте запросы на переименование с помощью:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
    
  3. Запустите этот вывод

  4. Удалить старую базу данных

Это было взято из Эмуляция отсутствующей команды RENAME DATABASE в MySQL < / em>.

person Community    schedule 10.08.2012
comment
Идеально! Я тестировал это с таблицами InnoDB и MyISAM. Самое быстрое решение, которое я тестировал (переименование таблицы практически мгновенно, без задержек)! - person Philipp; 09.10.2018
comment
Большой! Только не забудьте потом исправить привилегии. - person Navidot; 30.08.2019
comment
пс. Лучше сделать это перед запуском запросов на переименование, если вы работаете с живой БД. - person Navidot; 30.08.2019
comment
Работает ли это, если таблица имеет ссылочные ограничения? Я не ожидал. - person dolmen; 05.11.2019

Вы можете использовать этот сценарий оболочки:

Ссылка: Как переименовать базу данных MySQL?

#!/bin/bash
set -e # terminate execution on command failure

mysqlconn="mysql -u root -proot"
olddb=$1
newdb=$2
$mysqlconn -e "CREATE DATABASE $newdb"
params=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES \
                           WHERE table_schema='$olddb'")
for name in $params; do
      $mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name";
done;
$mysqlconn -e "DROP DATABASE $olddb"

Работает:

$ sh rename_database.sh oldname newname
person Community    schedule 07.02.2013
comment
Осторожнее с этим. Если вы не входите в систему с учетной записью root, у вас могут быть ограниченные права. Причина сбоя переименования, но отказ от успешного выполнения приводит к удалению базы данных. В остальном хороший сценарий. - person Lex; 07.03.2013
comment
Я добавил set -e в начало скрипта, что приведет к прекращению выполнения в случае сбоя и должно уменьшить эту проблему. - person Mikkel; 09.04.2018

Три варианта:

  1. Создайте новую базу данных, остановите сервер, переместите файлы из одной папки базы данных в другую и перезапустите сервер. Обратите внимание, что это будет работать, только если ВСЕ ваши таблицы являются MyISAM.

  2. Создайте новую базу данных, используйте операторы CREATE TABLE ... LIKE, а затем используйте операторы INSERT ... SELECT * FROM.

  3. Используйте mysqldump и перезагрузите с этим файлом.

person Community    schedule 15.09.2008
comment
+ для справки myisam. Я не мог понять, почему у меня это не сработало. - person Christian Payne; 14.10.2010
comment
В вопросе говорится, что это должно работать для InnoDB, а не MyISAM - person D-Rock; 12.03.2012
comment
@ D-Rock расскажет об этом Google, который приводит сюда людей, основываясь на названии. - person jiggunjer; 04.04.2020

Простой способ

Перейдите в каталог базы данных:

cd /var/lib/mysql/

Выключите MySQL ... Это важно!

/etc/init.d/mysql stop

Хорошо, этот способ не работает для InnoDB или BDB-Databases.

Переименовать базу данных:

mv old-name new-name

... или стол ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Перезапустите MySQL

/etc/init.d/mysql start

Выполнено...

Хорошо, этот способ не работает с базами данных InnoDB или BDB. В этом случае вам необходимо сбросить базу данных и повторно импортировать ее.

person Community    schedule 15.09.2008
comment
Переименование папок ломает игрушки. - person ViniciusPires; 25.07.2013
comment
@Rahly, даже если установлен один файл для каждой таблицы, это все еще опасно, таблицы, созданные до того, как был установлен один файл для каждой таблицы, будут в беде, если вы не знаете точно, что база данных создается после того, как этот флаг был установлен. - person Qian Chen; 05.06.2015
comment
В целом, тем не менее, большинство людей будут иметь свои системы так или иначе, люди не собираются случайным образом выбирать, иметь или не иметь одну таблицу для каждого файла. Кроме того, даже в вашем сценарии, если бы таблицы были созданы до флага, они изначально не существовали бы как отдельные файлы, поэтому перемещение не сработает и все равно безопасно, никакой опасности. Помните, что база данных НЕ запускается, когда происходит перемещение. - person Rahly; 10.06.2015
comment
Эквивалент для mysql, установленного с Homebrew в OS X: launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist cd /usr/local/var/mysql mv old-name new-name launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist - person coberlin; 19.08.2015
comment
Будьте осторожны, переименовывая имена папок, они могут содержать скрытые файлы, относящиеся к старой папке. - person MGE; 26.06.2021

Я только недавно наткнулся на очень хороший способ сделать это, работает с MyISAM и InnoDB и работает очень быстро:

RENAME TABLE old_db.table TO new_db.table;

Я не помню, где я это читал, но заслуга принадлежит кому-то другому, а не мне.

person Community    schedule 07.05.2010
comment
@ArkadijKuzhel так не думаю. Я думаю, вы говорите о ПЕРЕИМЕНОВАНИИ БАЗЫ ДАННЫХ. - person Rob Grant; 15.09.2015
comment
Это действительно помогло, я создал новую пустую базу данных, а затем использовал код, все таблицы были импортированы с желаемыми именами. - person JulyOrdinary; 12.05.2016
comment
Это страдает той же проблемой, что и принятый ответ - RENAME DATABASE был признан опасным и был удален в MySQL 5.1.23 - из dev.mysql.com/doc/refman/5.1/en/rename-database.html - person Blake Frederick; 09.08.2016

Простейший надежный способ полного переименования (включая удаление старой базы данных в конце, чтобы переименовать, а не скопировать):

mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname

Шаги:

  1. Скопируйте строки в Блокнот.
  2. Замените все ссылки на «olddbname», «newdbname», «mypassword» (+ необязательно «root») своими эквивалентами.
  3. Выполните одно за другим в командной строке (вводя «y» при появлении запроса).
person Community    schedule 14.01.2016
comment
Не добавляйте свой пароль в консоль, так как это небезопасно. Если вы уже сделали это, используйте команду history -cw для удаления. Вместо этого оставьте пароль пустым и введите его после приглашения. - person Tommie C.; 19.09.2017
comment
Это занимает ненормально долго, более 20 минут, но без завершения. Можно ли отменить? - person Sigu Magwa; 10.09.2018

Вот что я использую:

$ mysqldump -u root -p olddb >~/olddb.sql
$ mysql -u root -p
mysql> create database newdb;
mysql> use newdb
mysql> source ~/olddb.sql
mysql> drop database olddb;
person Community    schedule 28.10.2010
comment
Невозможно для огромных баз данных. - person mikesl; 22.09.2011

Есть 2 метода:

Метод 1. Хорошо известным методом переименования схемы базы данных является сброс схемы с помощью Mysqldump и ее восстановление в другой схеме, а затем удаление старой схемы (при необходимости).

Из Shell

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

Хотя описанный выше метод прост, он требует много времени и места. Что, если размер схемы превышает 100 ГБ? Существуют методы, с помощью которых вы можете объединить приведенные выше команды вместе, чтобы сэкономить место, но это не сэкономит время.

Чтобы исправить такие ситуации, есть еще один быстрый способ переименования схем, однако при этом следует соблюдать осторожность.

Метод 2. MySQL имеет очень хорошую функцию для переименования таблиц, которая работает даже с разными схемами. Эта операция переименования является атомарной, и никто другой не может получить доступ к таблице во время ее переименования. Это займет немного времени, поскольку изменение имени таблицы или ее схемы - это всего лишь изменение метаданных. Вот процедурный подход к переименованию:

Создайте новую схему базы данных с желаемым именем. Переименуйте таблицы из старой схемы в новую, используя команду MySQL «RENAME TABLE». Отбросьте старую схему базы данных. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. MySQL «ПЕРЕИМЕНОВАТЬ ТАБЛИЦУ» не работает, если в таблицах есть триггеры. Чтобы исправить это, мы можем сделать следующее:

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) Создайте список только «БАЗОВЫХ» таблиц. Их можно найти с помощью запроса к 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

Сложности с вышеуказанными методами: нам может потребоваться обновить ГРАНТЫ для пользователей, чтобы они соответствовали правильному имени схемы. Их можно было исправить простым ОБНОВЛЕНИЕМ таблиц mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db, обновив имя old_schema до new_schema и вызвав «Сбросить привилегии;». Хотя «метод 2» кажется немного более сложным, чем «метод 1», он полностью поддерживает сценарии. Простой сценарий bash для выполнения вышеуказанных шагов в правильной последовательности может помочь вам сэкономить место и время при переименовании схем базы данных в следующий раз.

Команда администраторов баз данных Percona Remote написала сценарий под названием «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, который использовался выше для «метода 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
person Community    schedule 29.01.2014
comment
А как насчет ссылочных ограничений? - person dolmen; 05.11.2019

В настоящий момент MySQL не поддерживает переименование базы данных через командный интерфейс, но вы можете переименовать базу данных, если у вас есть доступ к каталогу, в котором MySQL хранит свои базы данных. Для установок MySQL по умолчанию это обычно находится в каталоге данных в каталоге, где был установлен MySQL. Найдите имя базы данных, которую вы хотите переименовать, в каталоге данных и переименуйте ее. Однако переименование каталога может вызвать некоторые проблемы с разрешениями. Знайте.

Примечание. Перед переименованием базы данных необходимо остановить MySQL.

Я бы рекомендовал создать новую базу данных (используя желаемое имя) и экспортировать / импортировать нужные данные из старой в новую. Довольно просто.

person Community    schedule 15.09.2008

Шаги:

  1. Нажмите http://localhost/phpmyadmin/.
  2. Выберите вашу БД
  3. Перейдите на вкладку "Операции".
  4. Будет вкладка «Переименовать базу данных в». Добавьте новое имя и установите флажок «Настроить права».
  5. Щелкните Go.

введите описание изображения здесь

person Community    schedule 19.01.2018
comment
Решение phpMyAdmin обычно является плохим решением, поскольку некоторые среды имеют ограниченную среду. - person Daniel Antunes Pinto; 29.08.2018
comment
Не очень хорошее решение, но, тем не менее, спасибо, потому что это было то, что я искал. - person jamie; 13.05.2019
comment
Пожалуйста, проголосуйте, если это сработает для вас ... это поможет ... спасибо - person Shubham Jain; 13.05.2019
comment
У меня это работает в среде phpMyAdmin, +1 - person William; 29.09.2019

Когда вы переименовываете базу данных в PHPMyAdmin, он создает дамп, затем удаляет и воссоздает базу данных с новым именем.

person Community    schedule 15.09.2008
comment
Обратите внимание, что эта функция немного скрыта на вкладке «Операции» при нажатии на базу данных. - person Maris B.; 08.03.2016

Для пользователей Mac в Sequel Pro есть опция «Переименовать базу данных» в меню «База данных». http://www.sequelpro.com/

person Community    schedule 30.11.2012
comment
Остерегайтесь этой опции, если у вас есть представления или триггеры в вашей базе данных. За этой опцией меню находится сценарий, который создаст новую базу данных и переместит все таблицы. Это не будет работать для представлений или триггеров, поэтому они останутся в вашей старой базе данных. В результате две сломанные базы данных нуждаются в исправлении. - person Olfan; 14.01.2015

Большинство ответов здесь неверны по одной из двух причин:

  1. Вы не можете просто использовать RENAME TABLE, потому что могут быть представления и триггеры. Если есть триггеры, RENAME TABLE не работает
  2. Вы не можете использовать mysqldump, если хотите «быстро» (как указано в вопросе) переименовать большую базу данных.

У Percona есть сообщение в блоге о том, как это хорошо сделать: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

и сценарий, опубликованный (сделанный?) Саймоном Р. Джонсом, который выполняет то, что предлагается в этом сообщении. Я исправил ошибку, обнаруженную в скрипте. Вы можете видеть это здесь:

https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d

Вот его копия:

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
# @see https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
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 "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '$2'" -sss`
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

Сохраните его в файл с именем rename_db и сделайте скрипт исполняемым с помощью chmod +x rename_db, затем используйте его как ./rename_db localhost old_db new_db

person Community    schedule 09.02.2017
comment
Мне нравится этот сценарий, он практически универсален. Однако он не смог обработать случай, когда есть несколько связанных представлений, в которых определитель не является корневым. - person ENargit; 26.12.2017

Можно переименовать все таблицы в базе данных, чтобы они находились в другой базе данных, без выполнения полного дампа и восстановления.

DROP PROCEDURE IF EXISTS mysql.rename_db;
DELIMITER ||
CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
SELECT CONCAT('CREATE DATABASE ', new_db, ';') `# create new database`;
SELECT CONCAT('RENAME TABLE `', old_db, '`.`', table_name, '` TO `', new_db, '`.`', table_name, '`;') `# alter table` FROM information_schema.tables WHERE table_schema = old_db;
SELECT CONCAT('DROP DATABASE `', old_db, '`;') `# drop old database`;
END||
DELIMITER ;

$ time mysql -uroot -e "call mysql.rename_db('db1', 'db2');" | mysql -uroot

Однако любые триггеры в целевой базе данных не будут счастливы. Вам нужно сначала отбросить их, а затем воссоздать после переименования.

mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot
ERROR 1435 (HY000) at line 4: Trigger in wrong schema
person Community    schedule 19.05.2010
comment
небольшая настройка, которая заставляет эту работу работать с mysql 5.x mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot Обратите внимание, вы должны использовать --batch, чтобы изменить форматирование на необработанное форматирование, которое выводит результаты без форматирования. - person mikesl; 22.09.2011

Вот командный файл, который я написал, чтобы автоматизировать его из командной строки, но он для Windows / MS-DOS.

Синтаксис: rename_mysqldb база данных newdatabase -u [пользователь] -p [пароль]

:: ***************************************************************************
:: FILE: RENAME_MYSQLDB.BAT
:: ***************************************************************************
:: DESCRIPTION
:: This is a Windows /MS-DOS batch file that automates renaming a MySQL database 
:: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks.
:: The MySQL\bin folder needs to be in your environment path or the working directory.
::
:: WARNING: The script will delete the original database, but only if it successfully
:: created the new copy. However, read the disclaimer below before using.
::
:: DISCLAIMER
:: This script is provided without any express or implied warranties whatsoever.
:: The user must assume the risk of using the script.
::
:: You are free to use, modify, and distribute this script without exception.
:: ***************************************************************************

:INITIALIZE
@ECHO OFF
IF [%2]==[] GOTO HELP
IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)
SET RDB_OLDDB=%1
SET RDB_NEWDB=%2
SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql
GOTO START

:START
SET RDB_STEP=1
ECHO Dumping "%RDB_OLDDB%"...
mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=2
ECHO Creating database "%RDB_NEWDB%"...
mysqladmin %RDB_ARGS% create %RDB_NEWDB%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=3
ECHO Loading dump into "%RDB_NEWDB%"...
mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=4
ECHO Dropping database "%RDB_OLDDB%"...
mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=5
ECHO Deleting dump...
DEL %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:ERROR_ABORT
IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force
IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%
ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:HELP
ECHO Renames a MySQL database.
ECHO Usage: %0 database new_database [OPTIONS]
ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump.
ECHO          --user=root is used if no options are specified.
GOTO END    

:END
SET RDB_OLDDB=
SET RDB_NEWDB=
SET RDB_ARGS=
SET RDB_DUMP=
SET RDB_STEP=
person Community    schedule 12.12.2008

Хранимая процедура TodoInTX у меня не совсем работала. Вот мой удар:

-- stored procedure rename_db: Rename a database my means of table copying.
-- Caveats: 
-- Will clobber any existing database with the same name as the 'new' database name.
-- ONLY copies tables; stored procedures and other database objects are not copied.
-- Tomer Altman ([email protected])

delimiter //
DROP PROCEDURE IF EXISTS rename_db;
CREATE PROCEDURE rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
    DECLARE current_table VARCHAR(100);
    DECLARE done INT DEFAULT 0;
    DECLARE old_tables CURSOR FOR select table_name from information_schema.tables where table_schema = old_db;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    SET @output = CONCAT('DROP SCHEMA IF EXISTS ', new_db, ';'); 
    PREPARE stmt FROM @output;
    EXECUTE stmt;

    SET @output = CONCAT('CREATE SCHEMA IF NOT EXISTS ', new_db, ';');
    PREPARE stmt FROM @output;
    EXECUTE stmt;

    OPEN old_tables;
    REPEAT
        FETCH old_tables INTO current_table;
        IF NOT done THEN
        SET @output = CONCAT('alter table ', old_db, '.', current_table, ' rename ', new_db, '.', current_table, ';');
        PREPARE stmt FROM @output;
        EXECUTE stmt;

        END IF;
    UNTIL done END REPEAT;

    CLOSE old_tables;

END//
delimiter ;
person Community    schedule 17.05.2011
comment
Это будет работать только для таблиц и только в том случае, если в этих таблицах нет триггеров. Представления и триггеры не будут перемещены. - person Olfan; 14.01.2015

Самый простой способ - использовать программное обеспечение HeidiSQL. Это бесплатно и с открытым исходным кодом. Он работает в Windows и на любом Linux с Wine (запускайте приложения Windows в Linux, BSD, Solaris и Mac OS X).

Чтобы загрузить HeidiSQL, перейдите к http://www.heidisql.com/download.php.

Чтобы загрузить Wine, перейдите к http://www.winehq.org/.

Чтобы переименовать базу данных в HeidiSQL, просто щелкните правой кнопкой мыши имя базы данных и выберите «Изменить». Затем введите новое имя и нажмите «ОК».

Это так просто.

person Community    schedule 07.02.2013
comment
Если в нем есть хранимые процедуры, его нельзя переименовать. - person abksharma; 28.09.2016
comment
@abksharma На самом деле вы получите сообщение Database "database_name" contains stored routine(s) which cannot be moved. Триггеры (по крайней мере, для базы данных MariDB) считаются сохраненными подпрограммами. У меня не было хранимых процедур, но я не мог переименовать базу данных, пока не сбросил все триггеры. - person izogfif; 11.02.2020

Кажется, никто об этом не упомянул, но вот другой способ:

create database NewDatabaseName like OldDatabaseName;

затем для каждой таблицы выполните:

create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;

тогда, если хочешь,

drop database OldDatabaseName;

Преимущество этого подхода заключается в том, что вся передача выполняется на сервере с почти нулевым сетевым трафиком, поэтому он будет выполняться намного быстрее, чем дамп / восстановление.

Если у вас есть хранимые процедуры / представления / и т. Д., Вы можете также перенести их.

person Community    schedule 21.09.2017
comment
Насколько я знаю, 5.x не поддерживает ключевое слово like в операторе create database? Откуда ты это взял? - person Dragas; 03.05.2018
comment
Вот ссылка для синтаксиса create table like: dev.mysql. com / doc / refman / 5.7 / en / create-table-like.html. Что касается создания базы данных вроде, похоже, с тех пор MySQL отказался от этого предложения. - person Tuncay Göncüoğlu; 04.05.2018

Для пользователей Mac вы можете использовать Sequel Pro (бесплатно), который просто предоставляет возможность переименовать базы данных. Хотя он не удаляет старую БД.

после открытия соответствующей БД просто нажмите: Database -> Rename database...

person Community    schedule 04.10.2017
comment
Иногда он оставляет старую БД живой, но она пуста. Тем не менее, если он делает копию, вы можете сделать копию и удалить старую, это все еще 2 простых шага. - person Roee Gavirel; 07.10.2017
comment
Мои stored procedures и views не копировались вместе с переименованием - person Wayne; 28.07.2020

Я задал вопрос on Server Fault, пытаясь избежать простоев при восстановлении очень больших баз данных с помощью MySQL Proxy. У меня ничего не получилось, но в конце концов я понял, что мне нужно было ПЕРЕИМЕНОВАТЬ БАЗУ ДАННЫХ, потому что дамп / импорт не подходили из-за размера нашей базы данных.

В MySQL встроена функция RENAME TABLE, поэтому я написал простой скрипт Python, который сделает эту работу за меня. Я разместил его на GitHub на случай, если он может быть полезен другим.

person Community    schedule 18.04.2010
comment
comment
ПЕРЕИМЕНОВАТЬ БАЗУ ДАННЫХ было исключено из синтаксиса, а не ПЕРЕИМЕНОВАТЬ ТАБЛИЦУ. - person Duke; 30.11.2012

Для вашего удобства ниже представлен небольшой сценарий оболочки, который должен выполняться с двумя параметрами: db-name и new db-name.

Вам может потребоваться добавить параметры входа в строки mysql, если вы не используете файл .my.cnf в своем домашнем каталоге. Пожалуйста, сделайте резервную копию перед выполнением этого сценария.


#!/usr/bin/env bash

mysql -e "CREATE DATABASE $2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns $1 -e "show tables");do
    echo "$1.$i -> $2.$i"
    mysql -e "rename TABLE $1.$i to $2.$i"
done
mysql -e "DROP DATABASE $1"
person Community    schedule 15.03.2012
comment
Это также не будет работать для таблиц с присоединенными триггерами или для представлений, которые нельзя переименовать в другие базы данных. - person Olfan; 14.01.2015

Вот быстрый способ создать сценарий переименования sql, если вам нужно переместить много таблиц.

SELECT DISTINCT CONCAT('RENAME TABLE ', t.table_schema,'.', t.table_name, ' TO ',     
t.table_schema, "_archive", '.', t.table_name, ';' ) as Rename_SQL 
FROM information_schema.tables t
WHERE table_schema='your_db_name' ;
person Community    schedule 11.08.2014
comment
Выглядит неплохо, но это не перемещает хранимые процедуры или представления. - person davidpricedev; 23.01.2015
comment
вам, вероятно, следует добавить хеш-метки, чтобы обернуть имя таблицы и имя схемы - person Funkodebat; 09.03.2015

ALTER DATABASE - это способ, предлагаемый MySQL и RENAME DATABASE сброшен.

Из 13.1.32 RENAME DATABASE Syntax < / em>:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Этот оператор был добавлен в MySQL 5.1.7, но был признан опасным и был удален в MySQL 5.1.23.

person Community    schedule 16.08.2012
comment
У вас есть пример синтаксиса? Я не знаю, как использовать alter database для переименования самой базы данных, а документация, на которую вы ссылаетесь, не предполагает, что это возможно. - person Jordan; 16.08.2012
comment
@Jordan Мне тоже было бы интересно. Я пробовал и пробовал и выяснил, что он работает только с версией ›5.1, но я не могу обновить сейчас. - person fancyPants; 21.08.2012
comment
-1: Для того, чтобы написать о предлагаемых способах, а затем привести пример не предложенного пути, при этом полностью упустив возможность даже показать пример. - person hakre; 04.06.2014
comment
Это не правильно. В документации по переименованию базы данных MySQL говорится, что rename_database была предназначена для очень специфическая задача переименования (не общий случай переименования БД), которая теперь обрабатывается с помощью alter database: 'Чтобы выполнить задачу обновления имен баз данных с новой кодировкой, используйте вместо этого ALTER DATABASE db_name UPGRADE DATA DIRECTORY NAME' Вы не можете использовать это для переименования базы данных по вашему желанию, в этой команде нет даже места для нового имени базы данных! - person Kanat Bolazar; 15.01.2015

В MySQL Administrator сделайте следующее:

  1. В разделе «Каталоги» создайте новую схему базы данных.
  2. Перейдите в Резервное копирование и создайте резервную копию старой схемы.
  3. Выполнить резервное копирование.
  4. Перейдите к Восстановить и откройте файл, созданный на шаге 3.
  5. Выберите «Другая схема» в разделе «Целевая схема» и выберите новую схему базы данных.
  6. Начать восстановление.
  7. Проверьте новую схему и, если она выглядит хорошо, удалите старую.
person Community    schedule 03.10.2008
comment
Администратор MySQL не может обрабатывать большие базы данных, и в этом нет ничего быстрого - person deadprogrammer; 04.10.2008

в phpmyadmin вы можете легко переименовать базу данных

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

попросить удалить старую таблицу и перезагрузить данные таблицы, нажмите ОК в обоих

Ваша база данных переименована

person Community    schedule 21.08.2013

Если вы используете phpMyAdmin, вы можете перейти на вкладку «Операции» после того, как выбрали базу данных, которую вы хочу переименовать. Затем перейдите в последний раздел «копировать базу данных в» (или что-то в этом роде), дайте имя и выберите параметры ниже. В этом случае, я полагаю, вы должны установить флажки «структура и данные» и «создать базу данных перед копированием» и, наконец, нажать кнопку «перейти» в этом разделе.

Кстати, я использую phpMyAdmin на испанском языке, поэтому я не уверен, как называются разделы на английском языке.

person Community    schedule 12.07.2011

Вот однострочный фрагмент Bash для перемещения всех таблиц из одной схемы в другую:

history -d $((HISTCMD-1)) && mysql -udb_user -p'db_password' -Dold_schema -ABNnqre'SHOW TABLES;' | sed -e's/.*/RENAME TABLE old_schema.`&` TO new_schema.`&`;/' | mysql -udb_user -p'db_password' -Dnew_schema

Команда history в начале просто гарантирует, что команды MySQL, содержащие пароли, не сохранятся в истории оболочки.

Убедитесь, что db_user имеет разрешения на чтение / запись / удаление для старой схемы и разрешения на чтение / запись / создание для новой схемы.

person Community    schedule 19.03.2012

Я сделал это так: сделайте резервную копию существующей базы данных. Он предоставит вам db.zip.tmp, а затем в командной строке напишите следующее

"C: \ Program Files (x86) \ MySQL \ MySQL Server 5.6 \ bin \ mysql.exe" -h localhost -u root -p [пароль] [новое имя базы данных] ‹" C: \ Backups \ db.zip.tmp "

person Community    schedule 26.07.2017

Есть причина, по которой вы не можете этого сделать. (несмотря на все попытки ответов)

  • Базовые ответы будут работать во многих случаях, а в других могут вызвать повреждение данных.
  • Стратегию нужно выбирать на основе эвристического анализа вашей базы данных.
  • Вот почему эта функция была реализована, а затем удалена. [doc]

Вам нужно будет создать дамп всех типов объектов в этой базе данных, создать новый именованный объект и затем импортировать дамп. Если это действующая система, вам необходимо ее отключить. Если вы не можете, то вам нужно будет настроить репликацию из этой базы данных в новую.

Если вы хотите увидеть команды, которые могут это сделать, @satishD содержит подробную информацию, которая передает некоторые из проблемы, вокруг которых вам нужно будет разработать стратегию, соответствующую вашей целевой базе данных.

person Community    schedule 10.12.2020

Это работает для всех баз данных и работает путем переименования каждой таблицы с помощью maatkit mysql toolkit.

Используйте mk-find для печати и переименования каждой таблицы. На странице руководства есть много других вариантов и примеров.

mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"

Если у вас установлен maatkit (что очень просто), то это самый простой способ сделать это.

person Community    schedule 12.10.2010

Сделать это можно двумя способами.

  1. ПЕРЕИМЕНОВАТЬ ТАБЛИЦУ old_db.table_name НА new_db.table_name;
  2. Перейти к операциям-> там вы можете увидеть вкладку «Параметры таблицы». вы можете редактировать имя таблицы там.
person Community    schedule 06.09.2012

Это пакетный сценарий, который я написал для переименования базы данных в Windows:

@echo off
set olddb=olddbname
set newdb=newdbname
SET count=1
SET act=mysql -uroot -e "select table_name from information_schema.tables where table_schema='%olddb%'"
mysql -uroot -e "create database %newdb%"
echo %act%
 FOR /f "tokens=*" %%G IN ('%act%') DO (
  REM echo %count%:%%G
  echo mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
  mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
  set /a count+=1
 )
mysql -uroot -e "drop database %olddb%"
person Community    schedule 06.10.2011

Ни решение TodoInTx, ни адаптированное решение user757945 у меня не работали в MySQL 5.5.16, поэтому вот моя адаптированная версия:

DELIMITER //
DROP PROCEDURE IF EXISTS `rename_database`;
CREATE PROCEDURE `rename_database` (IN `old_name` VARCHAR(20), IN `new_name` VARCHAR(20))
BEGIN
  DECLARE `current_table_name` VARCHAR(20);
  DECLARE `done` INT DEFAULT 0;
  DECLARE `table_name_cursor` CURSOR FOR SELECT `table_name` FROM `information_schema`.`tables` WHERE (`table_schema` = `old_name`);
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` = 1;

  SET @sql_string = CONCAT('CREATE DATABASE IF NOT EXISTS `', `new_name` , '`;');
  PREPARE `statement` FROM @sql_string;
  EXECUTE `statement`;
  DEALLOCATE PREPARE `statement`;

  OPEN `table_name_cursor`;
  REPEAT
    FETCH `table_name_cursor` INTO `current_table_name`;
    IF NOT `done` THEN

      SET @sql_string = CONCAT('RENAME TABLE `', `old_name`, '`.`', `current_table_name`, '` TO `', `new_name`, '`.`', `current_table_name`, '`;');
      PREPARE `statement` FROM @sql_string;
      EXECUTE `statement`;
      DEALLOCATE PREPARE `statement`;

    END IF;
  UNTIL `done` END REPEAT;
  CLOSE `table_name_cursor`;

  SET @sql_string =  CONCAT('DROP DATABASE `', `old_name`, '`;');
  PREPARE `statement` FROM @sql_string;
  EXECUTE `statement`;
  DEALLOCATE PREPARE `statement`;
END//
DELIMITER ;

Надеюсь, это поможет кому-то, кто попал в мою ситуацию! Примечание: @sql_string после этого задержится в сеансе. Я не смог написать эту функцию без ее использования.

person Community    schedule 11.01.2013

Я использовал следующий метод для переименования базы данных

  1. сделайте резервную копию файла с помощью mysqldump или любого инструмента БД, например, heidiSQL, администратора mysql и т. д.

  2. Откройте файл резервной копии (например, backupfile.sql) в каком-нибудь текстовом редакторе.

  3. Найдите и замените имя базы данных и сохраните файл.

4. Восстановите отредактированный sql файл

person Community    schedule 11.09.2013

Если вы используете иерархические представления (представления, извлекающие данные из других представлений), импорт необработанного вывода из mysqldump может не работать, поскольку mysqldump не заботится о правильном порядке представлений. Из-за этого я написал скрипт, который переупорядочивает просмотры для исправления порядка на летать.

Выглядит это так:

#!/usr/bin/env perl

use List::MoreUtils 'first_index'; #apt package liblist-moreutils-perl
use strict;
use warnings;


my $views_sql;

while (<>) {
    $views_sql .= $_ if $views_sql or index($_, 'Final view structure') != -1;
    print $_ if !$views_sql;
}

my @views_regex_result = ($views_sql =~ /(\-\- Final view structure.+?\n\-\-\n\n.+?\n\n)/msg);
my @views = (join("", @views_regex_result) =~ /\-\- Final view structure for view `(.+?)`/g);
my $new_views_section = "";
while (@views) {
    foreach my $view (@views_regex_result) {
        my $view_body = ($view =~ /\/\*.+?VIEW .+ AS (select .+)\*\/;/g )[0];
        my $found = 0;
        foreach my $view (@views) {
            if ($view_body =~ /(from|join)[ \(]+`$view`/) {
                $found = $view;
                last;
            }
        }
        if (!$found) {
            print $view;
            my $name_of_view_which_was_not_found = ($view =~ /\-\- Final view structure for view `(.+?)`/g)[0];
            my $index = first_index { $_ eq $name_of_view_which_was_not_found } @views;
            if ($index != -1) {
                splice(@views, $index, 1);
                splice(@views_regex_result, $index, 1);
            }
        }
    }
}

Использование:
mysqldump -u username -v olddatabase -p | ./mysqldump_view_reorder.pl | mysql -u username -p -D newdatabase

person Community    schedule 21.08.2015

В случае, если вы начинаете с файла дампа с несколькими базами данных, вы можете выполнить команду sed для дампа:

sed -i -- "s|old_name_database1|new_name_database1|g" my_dump.sql
sed -i -- "s|old_name_database2|new_name_database2|g" my_dump.sql
...

Затем импортируйте свой дамп. Просто убедитесь, что не будет конфликта имен.

person Community    schedule 03.07.2017
comment
... и если это старое имя базы данных присутствует в каком-либо строковом значении данных, вы также уничтожите свои данные. ой. - person Tuncay Göncüoğlu; 28.08.2018

Я разместил это Как изменить имя базы данных с помощью MySQL? сегодня, после нескольких дней чесания головы и выдергивания волос. Решение довольно простое: экспортировать схему в файл .sql, открыть файл и изменить имя базы данных / схемы в разделе sql CREAT TABLE вверху. Существует три или более экземпляров, и они могут не находиться в верхней части страницы, если в файл сохранены схемы с несколькими объектами. Таким образом можно редактировать всю базу данных, но я ожидаю, что в больших базах данных может быть довольно сложно отслеживать все экземпляры свойства или индекса таблицы.

person Community    schedule 20.04.2014

I). Не существует способа напрямую изменить имя существующей БД, но вы можете достичь цели ur, выполнив следующие шаги: - 1). Создайте newdb. 2). Используйте newdb. 3). создать таблицу table_name (выберите * из olddb.table_name);

Выполняя указанные выше действия, вы копируете данные из таблицы olddb и вставляете их в таблицу newdb. Назовите таблицу таким же.

II). ПЕРЕИМЕНОВАТЬ ТАБЛИЦУ old_db.table_name НА new_db.table_name;

person Community    schedule 02.09.2014

Вы, ребята, собираетесь застрелить меня за это, и, скорее всего, это не сработает каждый раз, и, конечно же, это противоречит всей логике, бла-бла ... Но я только что попробовал ... ОСТАНОВИТЕ двигатель MySQL, войдите в систему как root и просто переименовал БД на уровне файловой системы ....

Я использую OSX и только изменил регистр с bedbf на BEDBF. К моему удивлению, это сработало ...

Я бы не рекомендовал это для производственной БД. Я просто попробовал это в качестве эксперимента ...

В любом случае удачи :-)

person Community    schedule 02.08.2013
comment
Множество причин, почему это ужасный ответ, уже обсуждались на этой странице. - person gwideman; 30.07.2014

Здесь уже есть много действительно хороших ответов, но я не вижу версии PHP. Это скопирует 800 МБ БД примерно за секунду.

$oldDbName = "oldDBName";
$newDbName = "newDBName";
$oldDB     = new mysqli("localhost", "user", "pass", $oldDbName);
if($oldDB->connect_errno){
    echo "Failed to connect to MySQL: (" . $oldDB->connect_errno . ") " . $oldDB->connect_error;
    exit;
}
$newDBQuery = "CREATE DATABASE IF NOT EXISTS {$newDbName}";
$oldDB->query($newDBQuery);
$newDB = new mysqli("localhost", "user", "pass");
if($newDB->connect_errno){
    echo "Failed to connect to MySQL: (" . $newDB->connect_errno . ") " . $newDB->connect_error;
    exit;
}

$tableQuery  = "SHOW TABLES";
$tableResult = $oldDB->query($tableQuery);
$renameQuery = "RENAME TABLE\n";
while($table = $tableResult->fetch_array()){
    $tableName = $table["Tables_in_{$oldDbName}"];
    $renameQuery .= "{$oldDbName}.{$tableName} TO {$newDbName}.{$tableName},";
}
$renameQuery = substr($renameQuery, 0, strlen($renameQuery) - 1);
$newDB->query($renameQuery);
person Community    schedule 22.05.2016

На самом деле, самый простой ответ - экспортировать старую базу данных, а затем импортировать ее в новую, которую вы создали, чтобы заменить старую. Конечно, для этого вам следует использовать phpMyAdmin или командную строку.

Переименование и подтасовка базы данных - ПЛОХАЯ ИДЕЯ! НЕ ДЕЛАЙТЕ ЭТО. (Если только вы не «хакерский тип», который сидит в подвале матери в темноте и ест пиццу, спит днем).

У вас будет больше проблем и работы, чем вы хотите.

So,

  1. Создайте new_database и назовите его правильно.
  2. Перейдите в свой phpMyAdmin и откройте базу данных, которую хотите экспортировать.
  3. Экспортируйте его (проверьте параметры, но вы должны быть в порядке со значениями по умолчанию.
  4. Вы получите файл, похожий на этот.
  5. Расширение этого файла - .sql.

    - SQL-дамп phpMyAdmin - версия 3.2.4

    - http://www.phpmyadmin.net

    - Хост: localhost - Время генерации: 30 июня 2010 г., 12:17 - Версия сервера: 5.0.90 - Версия PHP: 5.2.6

    УСТАНОВИТЬ SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

    / *! 40101 НАБОР @OLD_CHARACTER_SET_CLIENT = @@ CHARACTER_SET_CLIENT /; /! 40101 НАБОР @OLD_CHARACTER_SET_RESULTS = @@ CHARACTER_SET_RESULTS /; /! 40101 SET @OLD_COLLATION_CONNECTION = @@ COLLATION_CONNECTION /; /! 40101 УСТАНОВИТЬ ИМЕНА utf8 * /;

    --

    - База данных: mydatab_online


    --

    - Структура таблицы для таблицы user

    СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ user (timestamp int (15) NOT NULL по умолчанию '0', ip varchar (40) NOT NULL по умолчанию '', file varchar (100) NOT NULL по умолчанию '', PRIMARY KEY (timestamp), KEY ip ( ip), КЛЮЧ file (file)) ENGINE = MyISAM DEFAULT CHARSET = latin1;

    --

    - Выгрузка данных для таблицы user

    ВСТАВИТЬ В user (timestamp, ip, file) ЗНАЧЕНИЯ (1277911052, '999.236.177.116', ''), (1277911194, '999.236.177.116', '');

Это будет ваш файл .sql. Тот, который вы только что экспортировали.

Найдите его на жестком диске; обычно это /temp. Выберите пустую базу данных с правильным именем (причина, по которой вы это читаете). СКАЗАТЬ: Импорт - ИДТИ

Подключите свою программу к правильной базе данных, указав ее в том, что обычно является файлом configuration.php. Обновите сервер (оба. Почему? Потому что я старожил UNIX, и я так сказал. Теперь вы должны быть в хорошей форме. Если у вас есть дополнительные вопросы, посетите меня в Интернете.

person Community    schedule 30.06.2010

Проще всего открыть MYSQL >> SELECT DB, имя которого вы хотите изменить >> Нажмите «операция», затем введите Новое имя в «Переименовать базу данных в: "поле, затем нажмите кнопку " Перейти ".

Простой!

person Community    schedule 05.01.2012
comment
Вы, очевидно, имеете в виду какой-то инструмент управления графическим интерфейсом. Было бы полезно, если бы вы сказали, что это было. - person phils; 25.01.2012
comment
Думаю, это хорошее решение. Хотя мой вопрос в том, как добавить внешнюю базу данных в phpmyadmin. Я имею в виду, как управлять множеством экземпляров mysql на одном сайте phpmyadmin. - person truease.com; 26.07.2012

Если вы используете phpMyAdmin, просто перейдите в папку mysql в xamp, закройте phpMyAdmin и просто переименуйте папку, которую вы только что видите, как имя своей базы данных и просто перезапустите phpMyAdmin. Вы можете видеть, что эта база данных переименована.

person Community    schedule 04.10.2010

Простой способ

ALTER DATABASE `oldName` MODIFY NAME = `newName`;

или вы можете использовать онлайн-генератор sql

person Community    schedule 16.07.2018
comment
в mysql нет ИЗМЕНИТЬ ИМЯ - person Asmir Mustafic; 18.09.2018

person    schedule
comment
Это не работает. - person FlyingZebra1; 23.01.2021