Как быстро переименовать базу данных MySQL (изменить имя схемы)? - PullRequest
874 голосов
/ 16 сентября 2008

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

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

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

Ответы [ 47 ]

765 голосов
/ 19 февраля 2010

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

418 голосов
/ 02 июля 2009

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

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
195 голосов
/ 15 января 2012

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

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

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

Enter image description here

100 голосов
/ 26 ноября 2011

Вы можете использовать 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; (или другое большое число).

34 голосов
/ 11 августа 2012

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

24 голосов
/ 16 сентября 2008

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

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

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 голосов
/ 16 сентября 2008

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

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

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

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

19 голосов
/ 07 мая 2010

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

RENAME TABLE old_db.table TO new_db.table;

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

18 голосов
/ 07 февраля 2013

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

Ссылка: Как переименовать базу данных 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
16 голосов
/ 28 октября 2010

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

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