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

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

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

Enter image description here

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

RENAME TABLE old_db.table TO new_db.table;

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

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

Ответ 11

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

Ответ 12

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

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

Шаги:

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

Ответ 13

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

Ответ 14

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

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

Ответ 15

Ну есть 2 метода:

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

Из оболочки

 mysqldump emp > emp.out
 mysql -e "CREATE DATABASE employees;"
 mysql employees < emp.out 
 mysql -e "DROP DATABASE emp;"

Несмотря на то, что вышеупомянутый метод прост, это время и пространство. Что делать, если схема больше, чем 100 ГБ?. Существуют методы, с помощью которых вы можете объединить приведенные выше команды, чтобы сохранить их в пространстве, однако это не сэкономит время.

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

Метод 2: У MySQL есть очень хорошая функция для переименования таблиц, которые даже работают в разных схемах. Эта операция переименования является атомарной, и никто другой не может получить доступ к таблице при ее переименовании. Это займет короткое время, так как изменение имени таблицы или ее схемы - это только изменение метаданных. При выполнении переименования существует процедурный подход:

Создайте новую схему базы данных с нужным именем. Переименуйте таблицы из старой схемы в новую схему, используя команду "RENAME TABLE" MySQL. Отбросьте старую схему базы данных. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. MySQLs "RENAME TABLE" терпит неудачу, если в таблицах существуют триггеры. Чтобы исправить это, мы можем сделать следующее:

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

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

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

[[email protected]~]# /tmp/rename_db
rename_db <server> <database> <new_database>

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

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


[[email protected] ~]# 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" менее чем за секунду. Наконец, это script из 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

Ответ 16

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

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

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

mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot
ERROR 1435 (HY000) at line 4: Trigger in wrong schema

Ответ 17

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

Синтаксис - это rename_mysqldb database newdatabase -u [user] -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=

Ответ 18

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

Ответ 19

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

  1. Вы не можете использовать RENAME TABLE, потому что могут быть представления и триггеры. Если есть триггеры, 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

Ответ 20

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

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

Ответ 21

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

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


#!/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"

Ответ 22

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

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

Чтобы загрузить Wine, goto http://www.winehq.org/.

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

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

Ответ 23

Вот быстрый способ создания переименования sql script, если у вас много таблиц для перемещения.

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

Ответ 24

В MySQL Administrator выполните следующие действия:

  • В разделе "Каталоги" создайте новую схему базы данных.
  • Перейдите в Резервное копирование и создайте резервную копию старой схемы.
  • Выполнить резервное копирование.
  • Перейдите в раздел "Восстановить" и откройте файл созданный на шаге 3.
  • Выберите "Другая схема" в разделе "Цель" Схему и выберите новую базу данных схема.
  • Запустить восстановление.
  • Проверить новую схему и, если она выглядит хорошо, удалите старый.

Ответ 25

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

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

Ответ 26

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

Ответ 27

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

Из 13.1.32 Синтаксис DENABASE RENAME:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

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

Ответ 28

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

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

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

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

Ответ 29

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

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

Ответ 30

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

create database NewDatabaseName like OldDatabaseName;

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

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

тогда, если вы хотите,

drop database OldDatabaseName;

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

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