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

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

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

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

15.09.2008 21:22:00
Yves Martin 14.08.2013 06:06:38
Это утверждение RENAME DATABASE Syntax было добавлено в MySQL 5.1.7, но было признано опасным и было удалено в MySQL 5.1.23.
zloctb 10.06.2015 14:19:46
Надеемся, что MySQL реализует новый рабочий RENAME DATABASEоператор, который не несет никаких опасностей, поскольку в настоящее время нет простого способа выполнить эту задачу. Нет очевидной причины, почему это было опасно в документации, поэтому они могли бы сделать замену. По крайней мере, люди размещают сообщения об ошибках на своем веб-сайте. Например, bugs.mysql.com/bug.php?id=58593 и bugs.mysql.com/bug.php?id=1698 .
Edward 15.04.2016 16:03:05
ссылки теперь не работают ...
oldboy 24.04.2018 20:36:47
30 ОТВЕТОВ
РЕШЕНИЕ

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

828
19.04.2020 13:51:43
Я только что сделал это с базой данных InnoDB с 30+ таблицами, используя настройку file_per_table, и хотя некоторые таблицы имели более 3 миллионов строк, это завершилось за <1 секунду. Кажется, это просто перемещает файлы в хранилище, а не делает что-то более сложное ... +2, если это возможно :)
Dave Rix 25.11.2011 12:21:13
«RENAME DATABASE был признан опасным и был удален в MySQL 5.1.23» - из dev.mysql.com/doc/refman/5.1/en/rename-database.html
Palani 1.03.2012 04:15:34
Обратите внимание, что это не будет работать для просмотров. Вы не можете переименовать представления, чтобы заставить их переходить из базы данных в другую. Используйте DROP VIEWи CREATE VIEWвместо. Неуклюжий да Возможно, вы захотите сделать, mysqldumpчтобы переместить представления, после первого перемещения всех таблиц. Также обратите внимание, что SHOW TABLESбудут показаны таблицы и представления, так что будьте осторожны.
tuomassalo 1.11.2013 12:38:41
Также это не будет работать для любых таблиц с триггерами. Вам нужно найти, сбросить и сбросить триггеры до перемещения таблицы, а затем импортировать сброшенные триггеры в целевую базу данных.
Olfan 14.01.2015 15:21:44
Обновленная (то есть рабочая) ссылка, документирующая причину RENAME DATABASEудаления: dev.mysql.com/worklog/task/?id=4030
alexis 21.05.2016 11:39:50

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

13
15.09.2008 21:24:15
Обратите внимание, что эта функция немного скрыта на вкладке «Операции», когда вы нажимаете на базу данных.
Maris B. 8.03.2016 16:50:13

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

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

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

14
15.09.2008 21:26:07

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

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

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

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

24
9.11.2015 11:45:32
+ для справки myisam. Я не мог понять, почему это не сработало для меня.
Christian Payne 14.10.2010 03:23:06
В вопросе говорится, что это должно работать для InnoDB, а не для MyISAM
D-Rock 12.03.2012 17:06:05
@ D-Rock расскажет об этом Google, который привел сюда людей по названию.
jiggunjer 4.04.2020 15:02:53

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

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

cd /var/lib/mysql/

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

/etc/init.d/mysql stop

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

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

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

24
9.11.2015 11:47:18
Переименование папок разбивает игрушки.
ViniciusPires 24.07.2013 20:54:01
@Rahly, даже если установлен один файл для каждой таблицы, это все еще опасно, таблицы, созданные до того, как был установлен один файл для каждой таблицы, будут иметь проблемы, если вы точно не знаете, что база данных создана после того, как был установлен этот флаг.
Qian Chen 5.06.2015 13:18:56
В целом, хотя большинство людей используют свои системы тем или иным способом, люди не будут случайно переключаться между тем, иметь или не иметь одну таблицу на файл. Кроме того, даже в вашем сценарии, если таблицы были созданы до флага, они не будут существовать как отдельные файлы, поэтому перемещение не будет работать, и оно все еще безопасно, без опасности. Помните, что база данных НЕ работает, когда происходит перемещение.
Rahly 10.06.2015 00:51:07
Эквивалент для 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 13:28:44

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

  1. Под Каталогами создайте новую схему базы данных.
  2. Перейдите в Резервное копирование и создайте резервную копию старой схемы.
  3. Выполнить резервное копирование.
  4. Перейдите к Восстановить и откройте файл, созданный в шаге 3.
  5. Выберите «Другая схема» в разделе «Целевая схема» и выберите новую схему базы данных.
  6. Начать восстановление.
  7. Проверьте новую схему и, если она выглядит хорошо, удалите старую.
3
3.10.2008 04:17:56
MySQL Administrator не может обрабатывать большие базы данных, и в этом нет ничего быстрого
deadprogrammer 3.10.2008 21:08:06

Вот командный файл, который я написал, чтобы автоматизировать его из командной строки, но это для 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=
7
12.12.2008 10:27:41

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

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
440
9.11.2015 11:48:04
Как сказал ОП, «это не вариант для очень больших баз данных».
pilcrow 7.05.2010 13:19:31
Не забудьте удалить оригинальную базу данных
Pavel Radzivilovsky 11.10.2010 12:17:03
Блестящий ответ! Несколько предложений по дальнейшему улучшению, поскольку это, вероятно, гуглится всеми способностями: (1) Переместите фрагмент кода Пабло Марин-Гарсиа на верх, так как это кажется лучшим ответом (2) Поставьте -p<password>вместо -pвезде, чтобы операторы выполнялись без появления подсказки ,
Steve Chambers 21.04.2014 19:55:27
Используя версию по каналу, я получаю два запроса «Введите пароль:», например, так: Enter password: Enter password: кажется, что используется один пароль, но не оба. Я упускаю детали?
Ryan 27.06.2014 07:59:45
Я удивлен, что никто не упомянул об этом, но вы действительно должны добавить --routinesфлаг в команды mysqldump, чтобы гарантировать копирование хранимых процедур.
Carlos P 8.10.2014 13:11:18

Я задал вопрос о сбое сервера, пытаясь обойти время простоя при восстановлении очень больших баз данных с помощью MySQL Proxy. У меня не было никакого успеха, но в конце концов я понял, что мне нужна функция RENAME DATABASE, потому что выгрузка / импорт не была возможной из-за размера нашей базы данных.

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

6
13.04.2017 12:13:47
RENAME DATABASE исключен из синтаксиса, а не RENAME TABLE.
Duke 30.11.2012 01:04:08

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

RENAME TABLE old_db.table TO new_db.table;

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

19
7.05.2010 13:15:27
@ArkadijKuzhel так не думаю. Я думаю, что вы говорите о RENAME DATABASE.
Robert Grant 15.09.2015 20:08:06
Это действительно помогло, я создал новую пустую базу данных, а затем использовал код, все таблицы были импортированы с нужными именами.
JulyOrdinary 12.05.2016 06:47:25
Это страдает от той же проблемы, что и принятый ответ - «RENAME DATABASE была признана опасной и была удалена в MySQL 5.1.23» - из dev.mysql.com/doc/refman/5.1/en/rename-database.html
Blake Frederick 9.08.2016 17:27:23

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

ПРОЦЕДУРА ОТМЕНЫ, ЕСЛИ СУЩЕСТВУЕТ mysql.rename_db;
РАЗДЕЛИТЕЛЬ ||
ПРОЦЕДУРА СОЗДАНИЯ mysql.rename_db (В VARCHAR old_db (100), В VARCHAR new_db (100))
НАЧАТЬ
SELECT CONCAT ('CREATE DATABASE', new_db, ';') `# создать новую базу данных`;
SELECT CONCAT ('RENAME TABLE `', old_db, '` .`', table_name, '`TO`', new_db, '`.`', table_name, '`;') `# изменить таблицу` FROM information_schema.tables WHERE table_schema = old_db;
SELECT CONCAT ('DROP DATABASE `', old_db, '`;') `# drop old database`;
END ||
РАЗДЕЛИТЕЛЬ;

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

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

mysql -uroot -e "call mysql.rename_db ('test', 'blah2');" | mysql -uroot
ОШИБКА 1435 (HY000) в строке 4: запуск в неверной схеме
9
19.05.2010 17:16:59
Небольшая настройка, которая делает эту работу с MySQL 5.x mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot Обратите внимание, вы должны использовать --batch, чтобы изменить форматирование на необработанное форматирование, которое выводит результаты с нулевым форматированием.
mikesl 21.09.2011 21:21:43

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

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

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

Так,

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

    - phpMyAdmin SQL Dump - версия 3.2.4

    - http://www.phpmyadmin.net

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

    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

    / *! 40101 SET @OLD_CHARACTER_SET_CLIENT = @@ CHARACTER_SET_CLIENT /; / ! 40101 SET @OLD_CHARACTER_SET_RESULTS = @@ CHARACTER_SET_RESULTS /; / ! 40101 SET @OLD_COLLATION_CONNECTION = @@ COLLATION_CONNECTION /; / ! 40101 SET NAMES utf8 * /;

    -

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


    -

    - Структура стола для стола user

    СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ user( timestampint (15) NOT NULL по умолчанию '0', ipvarchar (40) NOT NULL по умолчанию '', filevarchar (100) NOT NULL по умолчанию '', PRIMARY KEY ( timestamp), KEY ip( ip), KEY file( file)) ДВИГАТЕЛЬ = CHISSET ПО УМОЛЧАНИЮ MyISAM = latin1;

    -

    - Сброс данных для таблицы user

    Вставить в user( timestamp, ip, file) ЗНАЧЕНИЯ (1277911052, '999.236.177.116', ''), (1277911194, '999.236.177.116', '');

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

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

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

-3
9.11.2015 11:57:05

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

-4
9.11.2015 12:01:55

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

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

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

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

2
12.10.2010 18:30:29

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

$ 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;
15
28.10.2010 15:01:12
Не выполнимо для огромных баз данных.
mikesl 21.09.2011 21:24:14

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

- хранимая процедура rename_db: переименование базы данных моими средствами копирования таблиц.
- Предостережения: 
- Будет забивать любую существующую базу данных с тем же именем, что и «новое» имя базы данных.
- ТОЛЬКО копирует таблицы; хранимые процедуры и другие объекты базы данных не копируются.
- Томер Альтман (taltman@ai.sri.com)

разделитель //
ПРОЦЕДУРА ОТМЕНЫ, ЕСЛИ СУЩЕСТВУЕТ rename_db;
ПРОЦЕДУРА СОЗДАНИЯ rename_db (В VARCHAR old_db (100), В VARCHAR new_db (100))
НАЧАТЬ
    ОБЪЯВИТЬ current_table VARCHAR (100);
    ОБЪЯВИТЬ сделано INT DEFAULT 0;
    ОБЪЯВЛЯЙТЕ CURSOR old_tables CURSOR FOR: выберите имя_таблицы из information_schema.tables, где table_schema = old_db;
    ЗАЯВИТЕ ПРОДОЛЖАЕТЕ ОБРАЩАТЬСЯ ЗА НЕ НАЙДЕННЫЙ УСТАНОВЛЕНО выполнено = 1;

    SET @output = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';'); 
    ПОДГОТОВИТЬ stmt ОТ @output;
    EXECUTE stmt;

    SET @output = CONCAT ('СОЗДАТЬ СХЕМУ ЕСЛИ НЕ СУЩЕСТВУЕТ', new_db, ';');
    ПОДГОТОВИТЬ stmt ОТ @output;
    EXECUTE stmt;

    OPEN old_tables;
    ПОВТОРЕНИЕ
        FETCH old_tables INTO current_table;
        Если не сделано, то
        SET @output = CONCAT ('изменить таблицу', old_db, '.', Current_table, 'rename', new_db, '.', Current_table, ';');
        ПОДГОТОВИТЬ stmt ОТ @output;
        EXECUTE stmt;

        END IF;
    ДО КОНЦА, ПОВТОРЕННОГО;

    ЗАКРЫТЬ old_tables;

КОНЕЦ//
разделитель;
7
17.05.2011 18:24:19
Это будет работать только для таблиц, и только если в этих таблицах нет триггеров. Представления и триггеры не будут перемещены этим.
Olfan 14.01.2015 15:05:22

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

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

3
9.11.2015 12:03:22

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

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

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

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

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

или

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

($ 1 и $ 2 - источник и цель соответственно)

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

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

107
24.02.2018 03:19:46
@BlakeFrederick Он не использует базу данных RENAME, так в чем же проблема?
tuxayo 17.08.2016 08:36:37
Это работает, если таблица имеет ссылочные ограничения? Я ожидаю, что нет.
dolmen 5.11.2019 16:25:30

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

Просто!

-3
9.11.2015 12:05:47
Вы, очевидно, имеете в виду какой-то инструмент управления графическим интерфейсом. Было бы полезно, если бы вы сказали, что это было.
phils 25.01.2012 01:46:50
Я думаю, что это хорошее решение. Хотя мой вопрос, как добавить внешнюю базу данных в phpmyadmin. Я имею в виду, как управлять множеством экземпляров mysql на одном сайте phpmyadmin.
truease.com 26.07.2012 09:13:35

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

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

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

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

203
9.11.2015 12:07:24
Предполагая, что у вас даже есть php в вашей среде или вы используете phpmyadmin.
Chris 28.08.2012 18:41:27
Довольно опасно, даже если у вас есть phpMyAdmin - сервер может потерпеть неудачу в середине процесса, оставив две базы данных в неизвестном состоянии, или это может занять очень много времени, что приведет к зависанию интерфейса или тайм-ауту PHP.
mozboz 14.09.2012 16:25:19
Это правда @mozboz, но я делал это в течение 10 лет, и у меня никогда не было такой проблемы. То же самое, если вы запускаете команду через оболочку и ваш компьютер падает. Есть возможность, но что? От 1 до 1 квадриллиона?
raphie 22.09.2012 13:24:48
Скрипт через консоль также является внешним интерфейсом, который может зависать при тех же проблемах.
Greg 24.09.2012 02:45:16
Тем не менее, консольные операции гораздо надежнее, чем PhpMyAdmin, особенно там, где задействованы большие базы данных, как в случае с OP. Лично я настоятельно рекомендую любой консольный метод, а не PMA, если у вас достаточно большая база данных. Излишне говорить, что для небольших баз данных PMA также хорош.
Teodor Sandu 25.04.2013 07:12:57

Для вашего удобства ниже приведен небольшой шелл-скрипт, который должен выполняться с двумя параметрами: 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"
6
9.11.2015 12:08:42
Это также не будет работать для таблиц с прикрепленными триггерами или для представлений, которые нельзя переименовать в другие базы данных.
Olfan 14.01.2015 15:16:10

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

3
9.11.2015 12:11:19

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

40
9.11.2015 12:12:35
Отлично! Я проверил это с помощью таблиц InnoDB и MyISAM. Самое быстрое решение, которое я тестировал (переименование таблицы происходит практически мгновенно, без задержек)!
Philipp 9.10.2018 14:29:41
Большой! Просто не забудьте исправить привилегии впоследствии.
Adam Faryna 30.08.2019 12:43:09
пс. Лучше сделать это перед выполнением запросов на переименование, если вы работаете с работающей БД.
Adam Faryna 30.08.2019 13:02:11
Это работает, если таблица имеет ссылочные ограничения? Я ожидаю, что нет.
dolmen 5.11.2019 16:25:44

ALTER DATABASEпредложенный способ обойти это MySQL и RENAME DATABASEотброшен.

Начиная с 13.1.32. Синтаксис базы данных RENAME :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

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

4
9.11.2015 12:16:45
У вас есть пример синтаксиса? Я не знаю ни одного способа alter databaseпереименования самой базы данных, и документация, на которую вы ссылались, не предполагает, что это возможно.
Jordan 16.08.2012 02:10:13
@ Джордан, мне тоже будет интересно. Я попробовал и попробовал и обнаружил, что это работает только с версией> 5.1, но я не могу обновить прямо сейчас.
fancyPants 21.08.2012 14:10:35
-1: Для записи о предложенных способах, а затем привести пример не предложенного способа, в то время как полностью отсутствует даже показать пример.
hakre 4.06.2014 10:53:09
Это не верно. В документации MySQL по переименованию базы данных говорится, что rename_database предназначалась для очень специфической задачи переименования (не общего случая переименования БД), которая теперь обрабатывается с помощью alter database: «Чтобы выполнить задачу обновления имен базы данных с новой кодировкой, используйте ALTER DATABASE db_name UPGRADE. DATA DIRECTORY NAME вместо 'Вы не можете использовать это, чтобы переименовать базу данных, как хотите, в этой команде даже нет места для нового имени базы данных!
Kanat Bolazar 15.01.2015 00:21:21

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

  1. ПЕРЕИМЕНОВАТЬ СТОЛ old_db.table_name TO new_db.table_name;
  2. Перейти к операции-> там вы можете увидеть вкладку Параметры таблицы. Вы можете редактировать имя таблицы там.
2
6.09.2012 12:47:42

Для тех, кто является пользователями Mac, Sequel Pro имеет опцию Rename Database в меню Database. http://www.sequelpro.com/

12
30.11.2012 01:06:26
Остерегайтесь этой опции, если у вас есть какие-либо представления или триггеры в вашей базе данных. За этой опцией меню находится скрипт, который создаст новую базу данных и переместит все таблицы. Это не будет работать для представлений или триггеров, поэтому они останутся в вашей старой базе данных. В результате две поврежденные базы данных нуждаются в исправлении.
Olfan 14.01.2015 15:02:11

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

1
11.01.2013 22:33:05

Вы можете использовать этот скрипт:

Справка: Как переименовать базу данных 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
22
9.04.2018 15:59:54
Осторожнее с этим. Если вы не входите в систему как пользователь root, у вас может быть ограниченное разрешение. Причинение переименования не удастся, но удачное завершение приведет к удалению базы данных. Хороший сценарий в противном случае.
Lex 6.03.2013 21:46:34
Я добавил set -eв начало сценария, что приведет к прекращению выполнения при сбое и должно смягчить эту проблему.
Mikkel 9.04.2018 16:00:41

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

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

Чтобы скачать Wine, перейдите по ссылке http://www.winehq.org/ .

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

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

7
9.11.2015 12:58:02
Если он имеет хранимые процедуры, он не может быть переименован.
abksharma 28.09.2016 07:32:33
@abksharma На самом деле вы получите Database "database_name" contains stored routine(s) which cannot be moved.триггеры сообщений (по крайней мере, для базы данных MariDB), которые считаются хранимыми процедурами. У меня не было никаких хранимых процедур, но я не мог переименовать базу данных, пока я не сбросил все триггеры.
izogfif 11.02.2020 10:06:51