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

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

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

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

Также на serverfault: serverfault.com/questions/195221/how-to-rename-a-mysql-datab‌ ase

Yves Martin 14.08.2013 10:06

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

zloctb 10.06.2015 17:19

Надеюсь, MySQL реализует новый рабочий оператор RENAME DATABASE, который не несет в себе никаких опасностей, поскольку в настоящее время нет простого способа выполнить эту задачу. Нет очевидной причины, почему это было опасно в документация, поэтому они должны иметь возможность произвести замену. По крайней мере, люди помещают ошибки запросов функций на свои веб-сайты. Например, bugs.mysql.com/bug.php?id=58593 и bugs.mysql.com/bug.php?id=1698.

Edward 15.04.2016 19:03

ссылки теперь не работают ...

oldboy 24.04.2018 23:36
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1 016
4
1 313 362
49
Перейти к ответу Данный вопрос помечен как решенный

Ответы 49

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

Обратите внимание, что эта функция немного скрыта на вкладке «Операции», когда вы нажимаете на базу данных.

Maris B. 08.03.2016 19:50

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

Примечание: Вы должны остановить MySQL, прежде чем сможете переименовать базу данных

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

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

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

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

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

+ для справки myisam. Я не мог понять, почему у меня это не сработало.

Christian Payne 14.10.2010 07:23

В вопросе говорится, что это должно работать для InnoDB, а не MyISAM

D-Rock 12.03.2012 21:06

@ D-Rock расскажет об этом Google, который приводит сюда людей, основываясь на названии.

jiggunjer 04.04.2020 18:02

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

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

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. В этом случае вам необходимо сбросить базу данных и повторно импортировать ее.

Переименование папок ломает игрушки.

ViniciusPires 25.07.2013 00:54

@Rahly, даже если установлен один файл для таблицы, это все еще опасно, таблицы, созданные до того, как был установлен один файл для таблицы, будут в беде, если вы не знаете наверняка, что база данных создается после установки этого флага.

Qian Chen 05.06.2015 16:18

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

Rahly 10.06.2015 03:51

Эквивалент для 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

coberlin 19.08.2015 16:28

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

  1. В разделе «Каталоги» создайте новую схему базы данных.
  2. Перейдите в Резервное копирование и создайте резервную копию старая схема.
  3. Выполнить резервное копирование.
  4. Зайдите в Восстановить и откройте файл создан на шаге 3.
  5. Выберите «Другая схема» в разделе «Цель». Схема и выберите новую базу данных схема.
  6. Начать восстановление.
  7. Проверьте новую схему и, если она выглядит хорошо, удали старую.

Администратор MySQL не может обрабатывать большие базы данных, и в этом нет ничего быстрого

deadprogrammer 04.10.2008 01:08

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

Синтаксис: rename_mysqldb database 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=

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

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

Как сказано в OP, «[t] это не вариант для очень больших баз данных».

pilcrow 07.05.2010 17:19

Не забудьте УДАЛИТЬ исходную базу данных

Pavel Radzivilovsky 11.10.2010 16:17

Блестящий ответ! Пара предложений по дальнейшему улучшению, поскольку это, вероятно, гуглится всеми способностями: (1) Переместите фрагмент кода Пабло Марина-Гарсиа наверх, поскольку он кажется лучшим ответом (2) Поместите -p<password> вместо -p везде, чтобы операторы выполнялись без быстрое появление.

Steve Chambers 21.04.2014 23:55

Используя конвейерную версию, я получаю два запроса «Введите пароль:», например: Enter password: Enter password: Кажется, требуется один пароль, но не оба. Я упустил какую-то деталь?

Ryan 27.06.2014 11:59

Я удивлен, что об этом никто не упомянул, но вам действительно стоит добавить флаг --routines и к командам mysqldump, чтобы гарантировать, что хранимые процедуры копируются.

Carlos P 08.10.2014 17:11

Я предпочитаю использовать графический интерфейс SQLyog. 1) создание новой БД с требуемым именем, а затем использование функции «Копировать на другой хост / БД» для копирования старой базы данных. 2) Экспорт БД как sqldump, а затем импорт с использованием опции «Выполнить SQL-скрипт» в меню «Инструменты»

user7161651 03.04.2017 16:13

Это решение является предпочтительным, потому что НЕ нужно перебирать все таблицы - ОГРОМНОЕ удобство. И хотя было заявлено, что это не лучший вариант для «больших» баз данных, никто не описал, что это означает количественно. Я предлагаю сначала попробовать этот способ. Ваша база данных может быть не такой уж большой, как вы думаете. В худшем случае, вероятно, проблема связана с переполнением диска, поэтому вы должны быть готовы с этим справиться.

Tom Wilson 20.03.2019 20:31

При запуске mysqldump из команды Windows (cmd.exe) вам необходимо запустить его от имени администратора (иначе он скажет «Доступ запрещен»).

Björn 24.11.2020 16:55
Ответ принят как подходящий

Для 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

ИЛИ ЖЕ

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

Это хороший вариант и подходящий вариант, если ваш db большой, но у вас не так много таблиц (или вы хотите написать сценарий для цикла для всех таблиц). Кроме того, в innodb это всего лишь логическое переименование, а в MyISAM, в зависимости от вашей файловой системы, это будет логическое переименование или реальное копирование данных на диск.

Pablo Marin-Garcia 29.09.2010 19:57

Я только что сделал это с базой данных InnoDB с более чем 30 таблицами, используя параметр file_per_table, и, хотя в некоторых таблицах было более 3 миллионов строк, это было выполнено менее чем за 1 секунду. Кажется, просто переместить файлы в хранилище, а не делать что-то более сложное ... +2, если возможно :)

Dave Rix 25.11.2011 16:21

Обратите внимание, что это не работает для просмотров. Вы не можете переименовать представления, чтобы заставить их переходить из одной базы данных в другую. Вместо этого используйте DROP VIEW и CREATE VIEW. Неуклюжий, да. Возможно, вы захотите сделать mysqldump для перемещения представлений, предварительно переместив все таблицы. Также обратите внимание, что SHOW TABLES будет показывать таблицы и представления, так что будьте осторожны.

tuomassalo 01.11.2013 16:38

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

Olfan 14.01.2015 18:21

Здесь нужно знать о многом. Проверьте источник для базы данных переименования phpmyadmin

Peter V. Mørch 11.02.2016 16:07

Хотя mysqldump - это не лучший вариант для больших баз данных, он поддерживает триггеры по умолчанию, а также процедуры с параметром -R или --routines (как указано в ответ) и поддержку таблиц (по умолчанию). Однако, похоже, он не поддерживает взгляды.

Edward 15.04.2016 22:13

Обновленная (т.е. рабочая) ссылка, в которой описывается, почему RENAME DATABASE был удален: dev.mysql.com/worklog/task/?id=4030

alexis 21.05.2016 14:39

Спасибо за ваше предложение. Обратите внимание, что вы должны добавить ';' после команды show tables, если вы не хотите, чтобы вам предлагалось ввести точку с запятой.

Izerlotti 13.07.2016 20:44

Или, если вы установили MySQL Utilities: mysqldbcopy --source=username@localhost:port --destination=username@localhost:port old_db:new_db и после этого удалите old_db.

bjmi 30.08.2016 11:12

Получите сценарий для переименования с помощью следующего <code> выберите 'RENAME TABLE', concat (TABLE_SCHEMA, '.', TABLE_NAME), concat ('TO <newDbName>.', TABLE_NAME) из information_schema.tables WHERE TABLE_SCHEMA = '<oldDbName > 'заказ по TABLE_NAME </code>

ChrisR 31.08.2016 10:01

В phpMyAdmin я использовал Operations / Rename Database. И это было на удивление быстро, почти мгновенно (1-2 секунды), поэтому я предполагаю, что он использует эту стратегию RENAME TABLE. MySQL 5.6.

Buttle Butkus 20.03.2017 11:35

Не забудьте использовать команду history -cw в консоли после использования этого сценария оболочки, поскольку вы не хотите, чтобы пароль отображался в виде открытого текста в истории консоли.

Vincent 07.10.2017 21:08

Может кто-нибудь объяснить, что имеет в виду OP Answerer, когда говорит: «После этого вам нужно будет настроить разрешения»?

0xVox 26.07.2018 11:58

@ThomasBrew: это означает, что вам нужно выполнить SQL, например use mysql; update db set db='new_db' where db = 'old_db'; flush priviledges;

dma_k 14.02.2019 02:32

Первый вариант у меня не сработал, выбросил «Команда не найдена». Второй вариант сработал очень хорошо!

Lucas Bustamante 12.07.2019 17:40

Работает ли это, если таблица имеет ссылочные ограничения? Я не ожидал.

dolmen 05.11.2019 19:24

Лично мне нравится делать это таким образом, SELECT concat ("переименовать таблицу old_database_name.", TABLE_NAME, 'в new_database_name.', TABLE_NAME, ';') FROM information_schema.tables WHERE TABLE_SCHEMA = 'old_database_name'; который создает серию команд, которые я могу выполнить вручную.

jbrahy 14.07.2020 21:21

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

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

ПЕРЕИМЕНОВАТЬ БАЗУ ДАННЫХ исключено из синтаксиса, а не ПЕРЕИМЕНОВАТЬ ТАБЛИЦУ.

Duke 30.11.2012 05:04

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

RENAME TABLE old_db.table TO new_db.table;

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

@ArkadijKuzhel так не думаю. Я думаю, вы говорите о ПЕРЕИМЕНОВАНИИ БАЗЫ ДАННЫХ.

Rob Grant 15.09.2015 23:08

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

JulyOrdinary 12.05.2016 09:47

Это связано с той же проблемой, что и принятый ответ - «ПЕРЕИМЕНОВАНИЕ БАЗЫ ДАННЫХ было признано опасным и было удалено в MySQL 5.1.23» - из dev.mysql.com/doc/refman/5.1/en/rename-database.html

Blake Frederick 09.08.2016 20:27

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

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

небольшая настройка, которая делает эту работу с mysql 5.x mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot Обратите внимание, вы должны использовать --batch, чтобы изменить форматирование на необработанное форматирование, которое выводит результаты без форматирования.

mikesl 22.09.2011 01:21

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

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

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

Так,

  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 /; /R! SET 40101 НАБОР @1018_COLLATION_COOLATION_!

    -

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


    -

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

    СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ user ( timestamp int (15) NOT NULL по умолчанию '0', ip varchar (40) NOT NULL по умолчанию '', file varchar (100) NOT NULL по умолчанию '', ПЕРВИЧНЫЙ КЛЮЧ (timestamp), КЛЮЧ 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 Старожил, и я так сказал. Теперь ты должен быть в хорошей форме. Если у вас есть дополнительные вопросы, посетите меня в Интернете.

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

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

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

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

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

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

$ 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;

Невозможно для огромных баз данных.

mikesl 22.09.2011 01:24

Хранимая процедура 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 ;

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

Olfan 14.01.2015 18:05

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

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

Это пакетный сценарий, который я написал для переименования базы данных в 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%"

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

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

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

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

или же

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

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

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

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

@BlakeFrederick Он не использует ПЕРЕИМЕНОВАНИЕ БАЗЫ ДАННЫХ, в чем проблема?

tuxayo 17.08.2016 11:36

Работает ли это, если таблица имеет ссылочные ограничения? Я не ожидал.

dolmen 05.11.2019 19:25

Проще всего откройте MYSQL >> ВЫБРАТЬ БД, имя которого вы хотите изменить >> Щелкните "операция", затем введите Новое имя в поле «Переименовать базу данных в:», затем нажмите кнопку "Идти"

Простой!

Вы, очевидно, имеете в виду какой-то инструмент управления графическим интерфейсом. Было бы полезно, если бы вы сказали, что это было.

phils 25.01.2012 05:46

Думаю, это хорошее решение. Хотя мой вопрос в том, как добавить внешнюю базу данных в phpmyadmin. Я имею в виду, как управлять множеством экземпляров mysql на одном сайте phpmyadmin.

truease.com 26.07.2012 13:13

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

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

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

Enter image description here

Предполагая, что у вас даже есть php в вашей среде или вы используете phpmyadmin.

Chris 28.08.2012 22:41

Довольно опасно, даже если у вас есть phpMyAdmin - серверная часть может выйти из строя в середине процесса, оставив два dbs в неизвестном состоянии, или это может занять очень много времени, что приведет к зависанию внешнего интерфейса или тайм-ауту PHP.

mozboz 14.09.2012 20:25

Это правда @mozboz, но я занимаюсь этим уже 10 лет и никогда не сталкивался с этой проблемой. То же самое, если вы запускаете команду через оболочку и ваш компьютер дает сбой. Есть возможность, но что? 1 к 1 квадриллиону?

raphie 22.09.2012 17:24

Скрипт через консоль также является интерфейсом, который может зависать с теми же проблемами.

Greg 24.09.2012 06:45

Тем не менее, консольные операции намного надежнее, чем PhpMyAdmin, особенно когда задействованы большие базы данных, что является случаем OP. Лично я настоятельно рекомендую любой консольный метод, а не PMA, если у вас достаточно большая база данных. Излишне говорить, что для небольших баз данных PMA также хорош.

Teodor Sandu 25.04.2013 11:12

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

Danny Staple 14.08.2013 13:56

Относительно этих различных проблем, кажется, есть два очевидных решения. 1 - Всегда сначала тестируйте в своей среде разработки. 2 - Вместо переименования можно скопировать на новое имя. Вы всегда можете вернуться к исходной БД.

AyexeM 06.09.2013 22:16

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

raphie 01.10.2013 19:17

Это очень хороший ответ ... особенно когда все, что я делаю, это тестирую некоторые книжные упражнения ... в php и phpmyadmin. Я неправильно назвал свой db ... и создал несколько таблиц ... и теперь все, что мне нужно сделать, это переименовать db ... и вуаля ... работа сделана.

ihightower 06.12.2013 22:46

phpmyadmin - надежный инструмент. Я надеюсь, что они реализуют эту функциональность как правильный ACID транзакция, используя ведение журнала и повторную прокрутку при обнаружении ошибок? Хотя я на самом деле этого не проверял.

Domi 07.06.2014 22:17

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

TheSatinKnight 28.05.2017 08:21

Я получаю сообщение об ошибке «Уведомление в ./libraries/operations.lib.php#361. Неопределенная переменная: sql_query. Backtrace ./db_operations.php#69: PMA_createDbBeforeCopy ()»

Paul Chris Jones 10.03.2019 17:52

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

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


#!/usr/bin/env bash

mysql -e "CREATE DATABASE  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns  -e "show tables");do
    echo ".$i -> .$i"
    mysql -e "rename TABLE .$i to .$i"
done
mysql -e "DROP DATABASE "

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

Olfan 14.01.2015 18:16

Вот однострочный фрагмент 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 имеет разрешения на чтение / запись / удаление для старой схемы и разрешения на чтение / запись / создание для новой схемы.

Эмуляция отсутствующей команды 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.

Идеально! Я тестировал это с таблицами InnoDB и MyISAM. Самое быстрое решение, которое я тестировал (переименование таблицы практически мгновенно, без задержек)!

Philipp 09.10.2018 17:29

Большой! Только не забудьте потом исправить привилегии.

farynaio 30.08.2019 15:43

пс. Лучше сделать это перед запуском запросов на переименование, если вы работаете с живой БД.

farynaio 30.08.2019 16:02

Работает ли это, если таблица имеет ссылочные ограничения? Я не ожидал.

dolmen 05.11.2019 19:25

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

От 13.1.32 Синтаксис RENAME DATABASE:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

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

У вас есть пример синтаксиса? Я не знаю, как использовать alter database для переименования самой базы данных, и документация, на которую вы ссылаетесь, не предполагает, что это возможно.

Jordan 16.08.2012 06:10

@Jordan Мне тоже было бы интересно. Я пробовал и пробовал и выяснил, что он работает только с версией> 5.1, но я не могу обновить его прямо сейчас.

fancyPants 21.08.2012 18:10

-1: Для того, чтобы написать о предлагаемых способах, а затем дать пример не предложенного пути, полностью пропустив даже показать пример.

hakre 04.06.2014 14:53

Это не правильно. Документация по переименованию базы данных MySQL говорит, что rename_database была предназначена для очень конкретной задачи переименования (не общего случая переименования БД), которая теперь обрабатывается с помощью alter database: 'Чтобы выполнить задачу обновления имен баз данных с новой кодировкой, используйте ALTER DATABASE db_name UPGRADE DATA DIRECTORY NAME вместо этого 'Вы не можете использовать это для переименования базы данных по своему усмотрению, в этой команде нет даже места для нового имени базы данных!

Kanat Bolazar 15.01.2015 03:21

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

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

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

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

Olfan 14.01.2015 18:02

Ни решение 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 останется в сеансе позже. Я не смог написать эту функцию без ее использования.

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

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

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

mysqlconn = "mysql -u root -proot"
olddb=
newdb=
$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

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

Lex 07.03.2013 01:46

Я добавил set -e в начало скрипта, что приведет к прекращению выполнения в случае сбоя и должно уменьшить эту проблему.

Mikkel 09.04.2018 19:00

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

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

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

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

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

Если в нем есть хранимые процедуры, его нельзя переименовать.

abksharma 28.09.2016 10:32

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

izogfif 11.02.2020 13:06

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

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

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

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

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

gwideman 30.07.2014 15:14

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

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

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

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

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

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

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

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

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

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

Сложности с вышеуказанными методами: нам может потребоваться обновить ГРАНТЫ для пользователей, чтобы они соответствовали правильному schema_name. Их можно было исправить простым ОБНОВЛЕНИЕМ таблиц 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 "" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h  -e "show databases like ''" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists "
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h  -e "show create database \G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print }' | awk '{print }'`
TABLES=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from "
    exit 1
fi
echo "create database  DEFAULT CHARACTER SET $character_set"
mysql -h  -e "create database  DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h   -e "show triggers\G" | grep Trigger: | awk '{print }'`
VIEWS=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h   $VIEWS > /tmp/_views${TIMESTAMP}.dump
fi
mysqldump -h   -d -t -R -E > /tmp/_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h   -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table .$TABLE to .$TABLE"
    mysql -h   -e "SET FOREIGN_KEY_CHECKS=0; rename table .$TABLE to .$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h   < /tmp/_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h   < /tmp/_triggers${TIMESTAMP}.dump
TABLES=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database "
    mysql -h   -e "drop database "
fi
if [ `mysql -h  -e "select count(*) from mysql.columns_priv where db=''" -sss` -gt 0 ]; then
    COLUMNS_PRIV = "    UPDATE mysql.columns_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.procs_priv where db=''" -sss` -gt 0 ]; then
    PROCS_PRIV = "    UPDATE mysql.procs_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.tables_priv where db=''" -sss` -gt 0 ]; then
    TABLES_PRIV = "    UPDATE mysql.tables_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.db where db=''" -sss` -gt 0 ]; then
    DB_PRIV = "    UPDATE mysql.db set db='' WHERE db='';"
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

А как насчет ссылочных ограничений?

dolmen 05.11.2019 19:29

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

Вот быстрый способ создать сценарий переименования 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' ;

Выглядит неплохо, но это не перемещает хранимые процедуры или представления.

davidpricedev 23.01.2015 18:35

вам, вероятно, следует добавить хеш-метки, чтобы обернуть имя таблицы и имя схемы

Funkodebat 09.03.2015 22:14

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

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

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

Если вы используете иерархические представления (представления, извлекающие данные из других представлений), импорт необработанного вывода из 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

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

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» при появлении запроса).

Не добавляйте свой пароль в консоль, так как это небезопасно. Если вы уже сделали это, используйте команду history -cw для удаления. Вместо этого оставьте пароль пустым и введите его после приглашения.

Tommie C. 19.09.2017 08:51

Это занимает ненормально долго, более 20 минут, но без завершения. Можно ли отменить?

Sigu Magwa 10.09.2018 12:54

Здесь уже есть много действительно хороших ответов, но я не вижу версии 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);

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

  1. Вы не можете просто использовать 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 "" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h  -e "show databases like ''" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists "
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h  -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = ''" -sss`
TABLES=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from "
    exit 1
fi
echo "create database  DEFAULT CHARACTER SET $character_set"
mysql -h  -e "create database  DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h   -e "show triggers\G" | grep Trigger: | awk '{print }'`
VIEWS=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h   $VIEWS > /tmp/_views${TIMESTAMP}.dump
fi
mysqldump -h   -d -t -R -E > /tmp/_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h   -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table .$TABLE to .$TABLE"
    mysql -h   -e "SET FOREIGN_KEY_CHECKS=0; rename table .$TABLE to .$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h   < /tmp/_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h   < /tmp/_triggers${TIMESTAMP}.dump
TABLES=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database "
    mysql -h   -e "drop database "
fi
if [ `mysql -h  -e "select count(*) from mysql.columns_priv where db=''" -sss` -gt 0 ]; then
    COLUMNS_PRIV = "    UPDATE mysql.columns_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.procs_priv where db=''" -sss` -gt 0 ]; then
    PROCS_PRIV = "    UPDATE mysql.procs_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.tables_priv where db=''" -sss` -gt 0 ]; then
    TABLES_PRIV = "    UPDATE mysql.tables_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.db where db=''" -sss` -gt 0 ]; then
    DB_PRIV = "    UPDATE mysql.db set db='' WHERE db='';"
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.

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

ENargit 26.12.2017 14:44

В случае, если вы начинаете с файла дампа с несколькими базами данных, вы можете выполнить команду 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
...

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

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

Tuncay Göncüoğlu 28.08.2018 18:48

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

"C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin\mysql.exe" -h localhost -u root -p[password] [new db name] < "C:\Backups\db.zip.tmp"

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

create database NewDatabaseName like OldDatabaseName;

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

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

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

drop database OldDatabaseName;

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

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

Насколько я знаю, 5.x не поддерживает ключевое слово "like" в операторе create database? Откуда ты это взял?

Dragas 03.05.2018 13:44

Вот ссылка на синтаксис create table like: dev.mysql.com/doc/refman/5.7/en/create-table-like.html. Что касается создания базы данных вроде, похоже, с тех пор MySQL отказался от этого предложения.

Tuncay Göncüoğlu 04.05.2018 14:40

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

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

Иногда он оставляет старую БД живой, но она пуста. Тем не менее, если он сделает копию, вы можете сделать копию и удалить старую, это все еще 2 простых шага.

Roee Gavirel 07.10.2017 12:10

Мои stored procedures и views не копировались вместе с переименованием

Wayne 28.07.2020 04:49

Шаги:

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

Решение phpMyAdmin обычно является плохим решением, поскольку некоторые среды имеют ограниченную среду.

Daniel Antunes Pinto 29.08.2018 18:27

Не «хорошее» решение, но тем не менее спасибо, так как это было то, что я искал.

jamie 13.05.2019 17:50

Пожалуйста, проголосуйте, если это сработает для вас ... это поможет ... спасибо

Shubham Jain 13.05.2019 17:51

Это работает для меня в среде phpMyAdmin, +1

William 29.09.2019 12:28

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

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

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

в mysql нет ИЗМЕНИТЬ ИМЯ

Asmir Mustafic 18.09.2018 15:06

UPDATE `db`SET Db = 'new_db_name' where Db = 'old_db_name';

Это не работает.

FlyingZebra1 23.01.2021 19:35

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

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

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

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

Другие вопросы по теме