Руководство MySQL на MySQL описывает это.
Обычно я просто выгружаю базу данных и повторно импортирую ее с новым именем. Это не вариант для очень больших баз данных. Судя по всему RENAME {DATABASE | SCHEMA} db_name TO new_db_name;делает плохие вещи, существует только в нескольких версиях и в целом является плохой идеей.
Это должно работать с InnoDB, который хранит вещи совсем иначе, чем MyISAM.
Этот оператор RENAME DATABASE Syntax был добавлен в MySQL 5.1.7, но был признан опасным и был удален в MySQL 5.1.23.
Надеюсь, MySQL реализует новый рабочий оператор RENAME DATABASE, который не несет в себе никаких опасностей, поскольку в настоящее время нет простого способа выполнить эту задачу. Нет очевидной причины, почему это было опасно в документация, поэтому они должны иметь возможность произвести замену. По крайней мере, люди помещают ошибки запросов функций на свои веб-сайты. Например, bugs.mysql.com/bug.php?id=58593 и bugs.mysql.com/bug.php?id=1698.
ссылки теперь не работают ...






Когда вы переименовываете базу данных в PHPMyAdmin, он создает дамп, затем удаляет и воссоздает базу данных с новым именем.
Обратите внимание, что эта функция немного скрыта на вкладке «Операции», когда вы нажимаете на базу данных.
В настоящий момент MySQL не поддерживает переименование базы данных через командный интерфейс, но вы можете переименовать базу данных, если у вас есть доступ к каталогу, в котором MySQL хранит свои базы данных. Для установок MySQL по умолчанию это обычно находится в каталоге данных в каталоге, в котором был установлен MySQL. Найдите имя базы данных, которую вы хотите переименовать, в каталоге данных и переименуйте ее. Однако переименование каталога может вызвать некоторые проблемы с разрешениями. Знайте.
Примечание: Вы должны остановить MySQL, прежде чем сможете переименовать базу данных
Я бы рекомендовал создать новую базу данных (используя желаемое имя) и экспортировать / импортировать нужные данные из старой в новую. Довольно просто.
Три варианта:
Создайте новую базу данных, остановите сервер, переместите файлы из одной папки базы данных в другую и перезапустите сервер. Обратите внимание, что это будет работать, только если ВСЕ ваши таблицы являются MyISAM.
Создайте новую базу данных, используйте операторы CREATE TABLE ... LIKE, а затем используйте операторы INSERT ... SELECT * FROM.
Используйте mysqldump и перезагрузите с этим файлом.
+ для справки myisam. Я не мог понять, почему у меня это не сработало.
В вопросе говорится, что это должно работать для InnoDB, а не MyISAM
@ D-Rock расскажет об этом Google, который приводит сюда людей, основываясь на названии.
Перейдите в каталог базы данных:
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. В этом случае вам необходимо сбросить базу данных и повторно импортировать ее.
Переименование папок ломает игрушки.
@Rahly, даже если установлен один файл для таблицы, это все еще опасно, таблицы, созданные до того, как был установлен один файл для таблицы, будут в беде, если вы не знаете наверняка, что база данных создается после установки этого флага.
В целом, тем не менее, большинство людей будут иметь свои системы так или иначе, люди не собираются случайным образом выбирать, иметь или не иметь одну таблицу для каждого файла. Кроме того, даже в вашем сценарии, если бы таблицы были созданы до флага, они изначально не существовали бы как отдельные файлы, поэтому перемещение не сработает и все равно безопасно, никакой опасности. Помните, что база данных НЕ запускается, когда происходит перемещение.
Эквивалент для 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
В MySQL Administrator сделайте следующее:
Администратор MySQL не может обрабатывать большие базы данных, и в этом нет ничего быстрого
Вот командный файл, который я написал, чтобы автоматизировать его из командной строки, но он для 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] это не вариант для очень больших баз данных».
Не забудьте УДАЛИТЬ исходную базу данных
Блестящий ответ! Пара предложений по дальнейшему улучшению, поскольку это, вероятно, гуглится всеми способностями: (1) Переместите фрагмент кода Пабло Марина-Гарсиа наверх, поскольку он кажется лучшим ответом (2) Поместите -p<password> вместо -p везде, чтобы операторы выполнялись без быстрое появление.
Используя конвейерную версию, я получаю два запроса «Введите пароль:», например: Enter password: Enter password: Кажется, требуется один пароль, но не оба. Я упустил какую-то деталь?
Я удивлен, что об этом никто не упомянул, но вам действительно стоит добавить флаг --routines и к командам mysqldump, чтобы гарантировать, что хранимые процедуры копируются.
Я предпочитаю использовать графический интерфейс SQLyog. 1) создание новой БД с требуемым именем, а затем использование функции «Копировать на другой хост / БД» для копирования старой базы данных. 2) Экспорт БД как sqldump, а затем импорт с использованием опции «Выполнить SQL-скрипт» в меню «Инструменты»
Это решение является предпочтительным, потому что НЕ нужно перебирать все таблицы - ОГРОМНОЕ удобство. И хотя было заявлено, что это не лучший вариант для «больших» баз данных, никто не описал, что это означает количественно. Я предлагаю сначала попробовать этот способ. Ваша база данных может быть не такой уж большой, как вы думаете. В худшем случае, вероятно, проблема связана с переполнением диска, поэтому вы должны быть готовы с этим справиться.
При запуске mysqldump из команды Windows (cmd.exe) вам необходимо запустить его от имени администратора (иначе он скажет «Доступ запрещен»).
Для 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, в зависимости от вашей файловой системы, это будет логическое переименование или реальное копирование данных на диск.
Я только что сделал это с базой данных InnoDB с более чем 30 таблицами, используя параметр file_per_table, и, хотя в некоторых таблицах было более 3 миллионов строк, это было выполнено менее чем за 1 секунду. Кажется, просто переместить файлы в хранилище, а не делать что-то более сложное ... +2, если возможно :)
Обратите внимание, что это не работает для просмотров. Вы не можете переименовать представления, чтобы заставить их переходить из одной базы данных в другую. Вместо этого используйте DROP VIEW и CREATE VIEW. Неуклюжий, да. Возможно, вы захотите сделать mysqldump для перемещения представлений, предварительно переместив все таблицы. Также обратите внимание, что SHOW TABLES будет показывать таблицы и представления, так что будьте осторожны.
Также это не сработает для любых таблиц с триггерами. Вам нужно найти, сбросить и удалить триггеры перед перемещением таблицы, а затем импортировать сброшенные триггеры в целевую базу данных.
Здесь нужно знать о многом. Проверьте источник для базы данных переименования phpmyadmin
Хотя mysqldump - это не лучший вариант для больших баз данных, он поддерживает триггеры по умолчанию, а также процедуры с параметром -R или --routines (как указано в ответ) и поддержку таблиц (по умолчанию). Однако, похоже, он не поддерживает взгляды.
Обновленная (т.е. рабочая) ссылка, в которой описывается, почему RENAME DATABASE был удален: dev.mysql.com/worklog/task/?id=4030
Спасибо за ваше предложение. Обратите внимание, что вы должны добавить ';' после команды show tables, если вы не хотите, чтобы вам предлагалось ввести точку с запятой.
Или, если вы установили MySQL Utilities: mysqldbcopy --source=username@localhost:port --destination=username@localhost:port old_db:new_db и после этого удалите old_db.
Получите сценарий для переименования с помощью следующего <code> выберите 'RENAME TABLE', concat (TABLE_SCHEMA, '.', TABLE_NAME), concat ('TO <newDbName>.', TABLE_NAME) из information_schema.tables WHERE TABLE_SCHEMA = '<oldDbName > 'заказ по TABLE_NAME </code>
В phpMyAdmin я использовал Operations / Rename Database. И это было на удивление быстро, почти мгновенно (1-2 секунды), поэтому я предполагаю, что он использует эту стратегию RENAME TABLE. MySQL 5.6.
Не забудьте использовать команду history -cw в консоли после использования этого сценария оболочки, поскольку вы не хотите, чтобы пароль отображался в виде открытого текста в истории консоли.
Может кто-нибудь объяснить, что имеет в виду OP Answerer, когда говорит: «После этого вам нужно будет настроить разрешения»?
@ThomasBrew: это означает, что вам нужно выполнить SQL, например use mysql; update db set db='new_db' where db = 'old_db'; flush priviledges;
Первый вариант у меня не сработал, выбросил «Команда не найдена». Второй вариант сработал очень хорошо!
Работает ли это, если таблица имеет ссылочные ограничения? Я не ожидал.
Лично мне нравится делать это таким образом, SELECT concat ("переименовать таблицу old_database_name.", TABLE_NAME, 'в new_database_name.', TABLE_NAME, ';') FROM information_schema.tables WHERE TABLE_SCHEMA = 'old_database_name'; который создает серию команд, которые я могу выполнить вручную.
Я задал вопрос о сбое сервера пытаюсь избежать простоев при восстановлении очень больших баз данных с помощью MySQL Proxy. У меня ничего не получилось, но в конце концов я понял, что мне нужно было ПЕРЕИМЕНОВАТЬ БАЗУ ДАННЫХ, потому что дамп / импорт не подходили из-за размера нашей базы данных.
В MySQL встроена функция RENAME TABLE, поэтому я написал простой скрипт Python, который сделает эту работу за меня. У меня есть разместил на GitHub на случай, если это может быть полезно другим.
Но не забывайте про RENAME TABLE, что этот оператор был добавлен в MySQL 5.1.7, но был признан опасным и был удален в MySQL 5.1.23.
ПЕРЕИМЕНОВАТЬ БАЗУ ДАННЫХ исключено из синтаксиса, а не ПЕРЕИМЕНОВАТЬ ТАБЛИЦУ.
Я только недавно наткнулся на очень хороший способ сделать это, работает с MyISAM и InnoDB и работает очень быстро:
RENAME TABLE old_db.table TO new_db.table;
Я не помню, где я это читал, но заслуга принадлежит кому-то другому, а не мне.
@ArkadijKuzhel так не думаю. Я думаю, вы говорите о ПЕРЕИМЕНОВАНИИ БАЗЫ ДАННЫХ.
Это действительно помогло, я создал новую пустую базу данных, а затем использовал код, все таблицы были импортированы с желаемыми именами.
Это связано с той же проблемой, что и принятый ответ - «ПЕРЕИМЕНОВАНИЕ БАЗЫ ДАННЫХ было признано опасным и было удалено в MySQL 5.1.23» - из dev.mysql.com/doc/refman/5.1/en/rename-database.html
Можно переименовать все таблицы в базе данных, чтобы они находились в другой базе данных, без выполнения полного дампа и восстановления.
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, чтобы изменить форматирование на необработанное форматирование, которое выводит результаты без форматирования.
На самом деле, самый простой ответ - экспортировать старую базу данных, а затем импортировать ее в новую, которую вы создали, чтобы заменить старую. Конечно, для этого вы должны использовать phpMyAdmin или командную строку.
Переименование и подтасовка базы данных - ПЛОХАЯ ИДЕЯ! НЕ ДЕЛАТЬ ЭТО. (Если только вы не «хакерский тип», который сидит в подвале матери в темноте и ест пиццу, спит днем.)
У вас будет больше проблем и работы, чем вы хотите.
Так,
Расширение этого файла - .sql.
- дамп SQL phpMyAdmin - версия 3.2.4
- Хост: 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;
Невозможно для огромных баз данных.
Хранимая процедура 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 ;
Это будет работать только для таблиц и только в том случае, если в этих таблицах нет триггеров. Представления и триггеры при этом не перемещаются.
Если вы используете 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 Он не использует ПЕРЕИМЕНОВАНИЕ БАЗЫ ДАННЫХ, в чем проблема?
Работает ли это, если таблица имеет ссылочные ограничения? Я не ожидал.
Проще всего откройте MYSQL >> ВЫБРАТЬ БД, имя которого вы хотите изменить >> Щелкните "операция", затем введите Новое имя в поле «Переименовать базу данных в:», затем нажмите кнопку "Идти"
Простой!
Вы, очевидно, имеете в виду какой-то инструмент управления графическим интерфейсом. Было бы полезно, если бы вы сказали, что это было.
Думаю, это хорошее решение. Хотя мой вопрос в том, как добавить внешнюю базу данных в phpmyadmin. Я имею в виду, как управлять множеством экземпляров mysql на одном сайте phpmyadmin.
Думаю, решение проще и предлагалось некоторыми разработчиками. В phpMyAdmin есть операция для этого.
В phpMyAdmin выберите базу данных, которую хотите выбрать. Во вкладках есть одна под названием «Операции», перейдите в раздел переименования. Вот и все.
Он действительно, как многие предлагали, создает новую базу данных с новым именем, выгружает все таблицы старой базы данных в новую базу данных и удаляет старую базу данных.

Предполагая, что у вас даже есть php в вашей среде или вы используете phpmyadmin.
Довольно опасно, даже если у вас есть phpMyAdmin - серверная часть может выйти из строя в середине процесса, оставив два dbs в неизвестном состоянии, или это может занять очень много времени, что приведет к зависанию внешнего интерфейса или тайм-ауту PHP.
Это правда @mozboz, но я занимаюсь этим уже 10 лет и никогда не сталкивался с этой проблемой. То же самое, если вы запускаете команду через оболочку и ваш компьютер дает сбой. Есть возможность, но что? 1 к 1 квадриллиону?
Скрипт через консоль также является интерфейсом, который может зависать с теми же проблемами.
Тем не менее, консольные операции намного надежнее, чем PhpMyAdmin, особенно когда задействованы большие базы данных, что является случаем OP. Лично я настоятельно рекомендую любой консольный метод, а не PMA, если у вас достаточно большая база данных. Излишне говорить, что для небольших баз данных PMA также хорош.
Консольные операции также могут быть защищены от зависаний и сбоев в сети с помощью gnu screen для их запуска.
Относительно этих различных проблем, кажется, есть два очевидных решения. 1 - Всегда сначала тестируйте в своей среде разработки. 2 - Вместо переименования можно скопировать на новое имя. Вы всегда можете вернуться к исходной БД.
@AyexeM Это абсолютно верно, среда или инструмент, который вы используете, всегда требуют создания резервной копии или копирования данных, независимо от процесса, который вы планируете делать. Восстановление данных, в зависимости от количества данных, обычно выполняется быстро. Согласовано.
Это очень хороший ответ ... особенно когда все, что я делаю, это тестирую некоторые книжные упражнения ... в php и phpmyadmin. Я неправильно назвал свой db ... и создал несколько таблиц ... и теперь все, что мне нужно сделать, это переименовать db ... и вуаля ... работа сделана.
phpmyadmin - надежный инструмент. Я надеюсь, что они реализуют эту функциональность как правильный ACID транзакция, используя ведение журнала и повторную прокрутку при обнаружении ошибок? Хотя я на самом деле этого не проверял.
Я проделал это со многими базами данных разного размера, используя phpMyAdmin. На сегодняшний день у меня ни разу не было неудач. Предостережение: мы используем только MyISAM, таблицы InnoDB не используются ни в одной из наших систем (хорошо, за небольшими исключениями).
Я получаю сообщение об ошибке «Уведомление в ./libraries/operations.lib.php#361. Неопределенная переменная: sql_query. Backtrace ./db_operations.php#69: PMA_createDbBeforeCopy ()»
Для вашего удобства ниже представлен небольшой сценарий оболочки, который должен выполняться с двумя параметрами: 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 "
Это тоже не будет работать для таблиц с присоединенными триггерами или для представлений, которые нельзя переименовать в другие базы данных.
Вот однострочный фрагмент 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:
Создайте запросы на переименование с помощью:
SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
' TO ','new_schema.',table_name,';')
FROM information_schema.TABLES
WHERE table_schema LIKE 'old_schema';
Запустите этот вывод
Взято из Эмуляция отсутствующей команды RENAME DATABASE в MySQL.
Идеально! Я тестировал это с таблицами InnoDB и MyISAM. Самое быстрое решение, которое я тестировал (переименование таблицы практически мгновенно, без задержек)!
Большой! Только не забудьте потом исправить привилегии.
пс. Лучше сделать это перед запуском запросов на переименование, если вы работаете с живой БД.
Работает ли это, если таблица имеет ссылочные ограничения? Я не ожидал.
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 Мне тоже было бы интересно. Я пробовал и пробовал и выяснил, что он работает только с версией> 5.1, но я не могу обновить его прямо сейчас.
-1: Для того, чтобы написать о предлагаемых способах, а затем дать пример не предложенного пути, полностью пропустив даже показать пример.
Это не правильно. Документация по переименованию базы данных MySQL говорит, что rename_database была предназначена для очень конкретной задачи переименования (не общего случая переименования БД), которая теперь обрабатывается с помощью alter database: 'Чтобы выполнить задачу обновления имен баз данных с новой кодировкой, используйте ALTER DATABASE db_name UPGRADE DATA DIRECTORY NAME вместо этого 'Вы не можете использовать это для переименования базы данных по своему усмотрению, в этой команде нет даже места для нового имени базы данных!
Сделать это можно двумя способами.
Для пользователей Mac в Sequel Pro есть опция «Переименовать базу данных» в меню «База данных». http://www.sequelpro.com/
Остерегайтесь этой опции, если у вас есть представления или триггеры в вашей базе данных. За этой опцией меню находится сценарий, который создаст новую базу данных и переместит все таблицы. Это не будет работать для представлений или триггеров, поэтому они останутся в вашей старой базе данных. В результате две сломанные базы данных нуждаются в исправлении.
Ни решение 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, у вас могут быть ограниченные права. Причина сбоя переименования, но отказ от успешного выполнения приводит к удалению базы данных. В остальном хороший сценарий.
Я добавил set -e в начало скрипта, что приведет к прекращению выполнения в случае сбоя и должно уменьшить эту проблему.
Самый простой способ - использовать программное обеспечение HeidiSQL. Это бесплатно и с открытым исходным кодом. Он работает в Windows и в любом Linux с Вино (запускайте приложения Windows в Linux, BSD, Solaris и Mac OS X).
Чтобы загрузить HeidiSQL, перейдите к http://www.heidisql.com/download.php.
Чтобы загрузить Wine, перейдите к http://www.winehq.org/.
Чтобы переименовать базу данных в HeidiSQL, просто щелкните правой кнопкой мыши имя базы данных и выберите «Изменить». Затем введите новое имя и нажмите «ОК».
Это так просто.
Если в нем есть хранимые процедуры, его нельзя переименовать.
@abksharma На самом деле вы получите сообщение Database "database_name" contains stored routine(s) which cannot be moved.. Триггеры (по крайней мере, для базы данных MariDB) считаются сохраненными процедурами. У меня не было хранимых процедур, но я не мог переименовать базу данных, пока не сбросил все триггеры.
Вы, ребята, собираетесь застрелить меня за это, и, скорее всего, это не сработает каждый раз, и, конечно же, это противоречит всей логике, бла-бла ... Но я только что попробовал ... ОСТАНОВИТЕ двигатель MySQL, войдите в систему как root и просто переименовал БД на уровне файловой системы ....
Я использую OSX, и только изменил регистр, с bedbf на BEDBF. К моему удивлению, это сработало ...
Я бы не рекомендовал это на производственной БД. Я просто попробовал это в качестве эксперимента ...
Удачи в любом случае :-)
Множество причин, почему это ужасный ответ, уже обсуждались на этой странице.
в phpmyadmin можно легко переименовать базу данных
select database
goto operations tab
in that rename Database to :
type your new database name and click go
попросить удалить старую таблицу и перезагрузить данные таблицы, нажмите ОК в обоих
Ваша база данных переименована
Я использовал следующий метод для переименования базы данных
сделайте резервную копию файла с помощью mysqldump или любого инструмента БД, например, heidiSQL, администратора mysql и т. д.
Откройте файл резервной копии (например, backupfile.sql) в каком-нибудь текстовом редакторе.
Найдите и замените имя базы данных и сохраните файл.
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
А как насчет ссылочных ограничений?
Я опубликовал этот Как изменить имя базы данных с помощью 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' ;
Выглядит неплохо, но это не перемещает хранимые процедуры или представления.
вам, вероятно, следует добавить хеш-метки, чтобы обернуть имя таблицы и имя схемы
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
Шаги:
Не добавляйте свой пароль в консоль, так как это небезопасно. Если вы уже сделали это, используйте команду history -cw для удаления. Вместо этого оставьте пароль пустым и введите его после приглашения.
Это занимает ненормально долго, более 20 минут, но без завершения. Можно ли отменить?
Здесь уже есть много действительно хороших ответов, но я не вижу версии 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);
Большинство ответов здесь неверны по одной из двух причин:
У 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.
Мне нравится этот сценарий, он практически универсален. Однако он не смог обработать случай, когда есть несколько связанных представлений, в которых определитель не является корневым.
В случае, если вы начинаете с файла дампа с несколькими базами данных, вы можете выполнить команду 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
...
Затем импортируйте свой дамп. Просто убедитесь, что не будет конфликта имен.
... и если это старое имя базы данных присутствует в любом строковом значении данных, вы также уничтожите свои данные. ой.
Я сделал это так: Сделайте резервную копию вашей существующей базы данных. Он предоставит вам 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? Откуда ты это взял?
Вот ссылка на синтаксис create table like: dev.mysql.com/doc/refman/5.7/en/create-table-like.html. Что касается создания базы данных вроде, похоже, с тех пор MySQL отказался от этого предложения.
Для пользователей Mac вы можете использовать Sequel Pro (бесплатно), который просто предоставляет возможность переименовать базы данных. Хотя он не удаляет старую БД.
после открытия соответствующей БД просто нажмите: Database -> Rename database...
Иногда он оставляет старую БД живой, но она пуста. Тем не менее, если он сделает копию, вы можете сделать копию и удалить старую, это все еще 2 простых шага.
Мои stored procedures и views не копировались вместе с переименованием
Шаги:
Решение phpMyAdmin обычно является плохим решением, поскольку некоторые среды имеют ограниченную среду.
Не «хорошее» решение, но тем не менее спасибо, так как это было то, что я искал.
Пожалуйста, проголосуйте, если это сработает для вас ... это поможет ... спасибо
Это работает для меня в среде phpMyAdmin, +1
Простой способ
ALTER DATABASE `oldName` MODIFY NAME = `newName`;
или вы можете использовать онлайн-генератор sql
в mysql нет ИЗМЕНИТЬ ИМЯ
UPDATE `db`SET Db = 'new_db_name' where Db = 'old_db_name';
Это не работает.
Есть причина, по которой вы не можете этого сделать. (несмотря на все попытки ответов)
Вам нужно будет создать дамп этой базы данных все типы объектов в, создать новую, а затем импортировать дамп. Если это действующая система, вам необходимо ее отключить. Если вы не можете, то вам нужно будет настроить репликацию из этой базы данных в новую.
Если вы хотите увидеть команды, которые могут это сделать, @satishD имеет подробности, который передает некоторые проблемы, для решения которых вам необходимо создать стратегию, соответствующую вашей целевой базе данных.
Также на serverfault: serverfault.com/questions/195221/how-to-rename-a-mysql-datab ase