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

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

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

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

51 ответ

Решение

Для 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 часть.

Также, если у вас есть хранимые процедуры, вы можете скопировать их впоследствии:

mysqldump -R old_db | mysql new_db

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

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

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

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

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

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

Подражая пропавшим 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.

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

Справка: Как переименовать базу данных 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

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

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

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

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

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

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

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

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

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

шаги:

  1. Скопируйте строки в блокнот.
  2. Замените все ссылки на "olddbname", "newdbname", "mypassword" (+ опционально "root") вашими эквивалентами.
  3. Выполните один за другим в командной строке (введите "y" при появлении запроса).

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

RENAME TABLE old_db.table TO new_db.table;

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

Шаги:

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

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

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

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

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

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

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

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

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

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

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
# @see https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '$2'" -sss`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi

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

Ну есть 2 способа:

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

Из оболочки

 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, "RENAME TABLE" MySQL завершается ошибкой, если в таблицах существуют триггеры. Чтобы исправить это, мы можем сделать следующие вещи:

1) Dump the triggers, events and stored routines in a separate file. Это делается с помощью флагов -E, -R (в дополнение к -t -d, который выводит триггеры) в команду mysqldump. После сброса триггеров нам нужно будет удалить их из схемы, чтобы команда RENAME TABLE работала.

 $ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out

2) Сформировать список только "базовых" таблиц. Их можно найти с помощью запроса на information_schema.TABLES Таблица.

 mysql> select TABLE_NAME from information_schema.tables where 
    table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';

3) Дамп представления в выходной файл. Представления могут быть найдены с использованием запроса на тот же information_schema.TABLES Таблица.

mysql> select TABLE_NAME from information_schema.tables where 
   table_schema='<old_schema_name>' and TABLE_TYPE='VIEW';
 $ mysqldump <database> <view1> <view2> … > views.out

4) Отбросьте триггеры на текущих таблицах в old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Восстановите вышеуказанные файлы дампа, как только все "базовые" таблицы, найденные на шаге №2, будут переименованы.

mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name;
...
$ mysql <new_schema> < views.out
$ mysql <new_schema> < stored_routines_triggers_events.out

Сложности с вышеуказанными методами: нам может потребоваться обновить GRANTS для пользователей, чтобы они соответствовали правильному имени схемы. Они могут быть исправлены с помощью простого UPDATE для таблиц mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db, обновляющих имя old_schema до new_schema и вызывающих "Flush privileges;". Хотя "метод 2" кажется немного сложнее, чем "метод 1", это полностью сценарием. Простой скрипт bash для выполнения вышеуказанных шагов в правильной последовательности может помочь вам сэкономить место и время при переименовании схем базы данных в следующий раз.

Команда Percona Remote DBA написала скрипт под названием "rename_db", который работает следующим образом:

[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>

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

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp                |
| mysql              |
| performance_schema |
| test               |
+--------------------+


[root@dba ~]# time /tmp/rename_db localhost emp emp_test
create database emp_test DEFAULT CHARACTER SET latin1
drop trigger salary_trigger
rename table emp.__emp_new to emp_test.__emp_new
rename table emp._emp_new to emp_test._emp_new
rename table emp.departments to emp_test.departments
rename table emp.dept to emp_test.dept
rename table emp.dept_emp to emp_test.dept_emp
rename table emp.dept_manager to emp_test.dept_manager
rename table emp.emp to emp_test.emp
rename table emp.employees to emp_test.employees
rename table emp.salaries_temp to emp_test.salaries_temp
rename table emp.titles to emp_test.titles
loading views
loading triggers, routines and events
Dropping database emp

real    0m0.643s
user    0m0.053s
sys     0m0.131s


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp_test           |
| mysql              |
| performance_schema |
| test               |
+--------------------+

Как видно из вышеприведенного вывода, схема базы данных "emp" была переименована в "emp_test" менее чем за секунду. Наконец, это скрипт из Percona, который используется выше для "метода 2".

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi

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

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

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

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

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

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

create database NewDatabaseName like OldDatabaseName;

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

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

затем, если вы хотите,

drop database OldDatabaseName;

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

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

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

ПРОЦЕДУРА ОТМЕНЫ, ЕСЛИ СУЩЕСТВУЕТ 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: запуск в неверной схеме

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

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

Для вашего удобства ниже приведен небольшой шелл-скрипт, который должен выполняться с двумя параметрами: 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"

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

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

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

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

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

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

Хранимая процедура 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;
    ОБЪЯВЛЯЕТ КУРСОР 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;

КОНЕЦ//
разделитель;

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

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

There is a reason you cannot do this. (despite all the attempted answers)

  • Basic answers will work in many cases, and in others cause data corruptions.
  • A strategy needs to be chosen based on heuristic analysis of your database.
  • That is the reason this feature was implemented, and then removed. [ doc]

You'll need to dump all object types in that database, create the newly named one and then import the dump. If this is a live system you'll need to take it down. If you cannot, then you will need to setup replication from this database to the new one.

If you want to see the commands that could do this, @satishD has the details, which conveys some of the challenges around which you'll need to build a strategy that matches your target database.

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

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.

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

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

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

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

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

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

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