it-swarm-ru.tech

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

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

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

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

875
deadprogrammer

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

765
Thorsten

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

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
420
hendrasaputra

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

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

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

Enter image description here

196
raphie

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

100
ErichBSchulz

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

34
Marciano

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

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

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

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

24
longneck

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

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

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
DeeCee

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

RENAME TABLE old_db.table TO new_db.table;

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

19
Amr Mostafa

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

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

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

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

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

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" при появлении запроса).
15
Steve Chambers

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

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

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

14
bryanpearson

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

13
UnkwnTech

Ну есть 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) Создать список только таблиц "BASE". Их можно найти с помощью запроса к таблице information_schema.TABLES.

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

) Дамп представления в выходной файл. Представления можно найти с помощью запроса к той же таблице 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", который работает следующим образом:

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

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

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" менее чем за секунду. Наконец, это скрипт из 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
12
Sathish D

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

12
Duke

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

 ПРОЦЕДУРА ОТМЕНЫ, ЕСЛИ СУЩЕСТВУЕТ 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, ';') `# создать новую базу данных`; 
 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 
 ОШИБКА 1435 (HY000) в строке 4: запуск в неверной схеме 
9
TodoInTX

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

  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

8
ryantm

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

Синтаксис базы данных rename_mysqldb newdatabase -u [пользователь] -p [пароль]

:: ***************************************************************************
:: FILE: RENAME_MYSQLDB.BAT
:: ***************************************************************************
:: DESCRIPTION
:: This is a Windows /MS-DOS batch file that automates renaming a MySQL database 
:: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks.
:: The MySQL\bin folder needs to be in your environment path or the working directory.
::
:: WARNING: The script will delete the original database, but only if it successfully
:: created the new copy. However, read the disclaimer below before using.
::
:: DISCLAIMER
:: This script is provided without any express or implied warranties whatsoever.
:: The user must assume the risk of using the script.
::
:: You are free to use, modify, and distribute this script without exception.
:: ***************************************************************************

:INITIALIZE
@ECHO OFF
IF [%2]==[] GOTO HELP
IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)
SET RDB_OLDDB=%1
SET RDB_NEWDB=%2
SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql
GOTO START

:START
SET RDB_STEP=1
ECHO Dumping "%RDB_OLDDB%"...
mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=2
ECHO Creating database "%RDB_NEWDB%"...
mysqladmin %RDB_ARGS% create %RDB_NEWDB%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=3
ECHO Loading dump into "%RDB_NEWDB%"...
mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=4
ECHO Dropping database "%RDB_OLDDB%"...
mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=5
ECHO Deleting dump...
DEL %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:ERROR_ABORT
IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force
IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%
ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:HELP
ECHO Renames a MySQL database.
ECHO Usage: %0 database new_database [OPTIONS]
ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump.
ECHO          --user=root is used if no options are specified.
GOTO END    

:END
SET RDB_OLDDB=
SET RDB_NEWDB=
SET RDB_ARGS=
SET RDB_DUMP=
SET RDB_STEP=
7
Johnny

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

 - хранимая процедура rename_db: переименовать базу данных, используя мои средства копирования таблиц. 
 - Предостережения: 
 - Заметит любую существующую базу данных с тем же именем, что и у "новой". имя базы данных. 
 - ТОЛЬКО копирует таблицы; хранимые процедуры и другие объекты базы данных не копируются. 
 - Томер Альтман ([email protected]) 
 
 разделитель //
DROP ПРОЦЕДУРА ЕСЛИ СУЩЕСТВУЕТ rename_db; 
 CREATE PROCEDURE rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100)) 
 BEGIN 
 ОБЪЯВЛЯЕТ current_table VARCHAR (100); 
 ЗАКРЫТЬ INT DEFAULT 0; 
 ОБЪЯВЛЯЕТ old_tables CURSOR FOR выбрать имя_таблицы из information_schema.tables где table_schema = old_db; 
 ОБЪЯВИТЬ ПРОДОЛЖИТЬ HANDLER FOR NOT FOUND SET выполнено = 1; 
 
 SET @output = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';'); 
 PREPARE stmt FROM @output; 
 EXECUTE stmt; 
 
 SET @output = CONCAT ('СОЗДАТЬ СХЕМУ ЕСЛИ НЕ СУЩЕСТВУЕТ', new_db, ';'); 
 PREPARE stmt FROM @output; 
 EXECUTE stmt; 
 
 OPEN old_tables; 
 REPEAT 
 FETCH old_tables INTO current_table; 
 ЕСЛИ НЕ выполнено, ТО 
 SET @output = CONCAT ('изменить таблицу', old_db, '.', Current_table, 'rename', new_db, '.', Current_table, ';'); 
 PREPARE stmt FROM @output; 
 EXECUTE stmt; 
 
 END IF; 
 До конца END REPEAT; 
 
 ЗАКРЫТЬ old_tables; 
 
 END //
 Разделитель; 
7
user757945

Шаги:

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

enter image description here

7
Shubham Jain

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

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


#!/usr/bin/env bash

mysql -e "CREATE DATABASE $2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns $1 -e "show tables");do
    echo "$1.$i -> $2.$i"
    mysql -e "rename TABLE $1.$i to $2.$i"
done
mysql -e "DROP DATABASE $1"
6
gerrit damen

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

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

6
cclark

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

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

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

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

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

5
Fathah Rehman P

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

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

create database NewDatabaseName like OldDatabaseName;

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

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

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

drop database OldDatabaseName;

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

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

4
Tuncay Göncüoğlu

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

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

4
Roee Gavirel

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

  1. Под Каталогами создайте новую схему базы данных.
  2. Перейдите в Резервное копирование и создайте резервную копию старой схемы.
  3. Выполнить резервное копирование.
  4. Перейдите к Восстановить и откройте файл, созданный в шаге 3.
  5. Выберите "Другая схема" в разделе "Целевая схема" и выберите новую схему базы данных.
  6. Начать восстановление.
  7. Проверьте новую схему и, если она выглядит хорошо, удалите старую.
3
Tom

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

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

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

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

3
murtaza.webdev

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

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

3
ecruz

Вот однострочный фрагмент Bash для перемещения всех таблиц из одной схемы в другую:

history -d $((HISTCMD-1)) && mysql -udb_user -p'db_password' -Dold_schema -ABNnqre'SHOW TABLES;' | sed -e's/.*/RENAME TABLE old_schema.`&` TO new_schema.`&`;/' | mysql -udb_user -p'db_password' -Dnew_schema

Команда history в начале просто гарантирует, что команды MySQL, содержащие пароли, не будут сохранены в истории оболочки.

Убедитесь, что db_user имеет разрешения на чтение/запись/удаление в старой схеме, а также разрешения на чтение/запись/создание в новой схеме.

3
coffeefiend

Я сделал это так: создайте резервную копию существующей базы данных. Это даст вам 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 "

3
Samra

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

  1. Переименовать таблицу old_db.table_name TO new_db.table_name;
  2. Перейти к операции-> там вы можете увидеть вкладку Параметры таблицы. Вы можете редактировать имя таблицы там.
2
jeeva

Это пакетный скрипт, который я написал для переименования базы данных в Windows:

@echo off
set olddb=olddbname
set newdb=newdbname
SET count=1
SET act=mysql -uroot -e "select table_name from information_schema.tables where table_schema='%olddb%'"
mysql -uroot -e "create database %newdb%"
echo %act%
 FOR /f "tokens=*" %%G IN ('%act%') DO (
  REM echo %count%:%%G
  echo mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
  mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
  set /a count+=1
 )
mysql -uroot -e "drop database %olddb%"
2
Nadav Benedek

ALTER DATABASE - это предложенный способ обхода MySQL, и RENAME DATABASE отбрасывается.

From 13.1.32 Синтаксис RENAME DATABASE:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

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

2
xelber

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

Используйте mk-find, чтобы распечатать и переименовать каждую таблицу. У man page есть еще много опций и примеров

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

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

2
Morgan Christiansson

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

Затем импортируйте свой дамп. Просто убедитесь, что не будет никакого конфликта имен.

1
RotS

Ни решение для TodoInTx, ни адаптированное решение user757945 не работали для меня на MySQL 5.5.16, так что вот моя адаптированная версия:

DELIMITER //
DROP PROCEDURE IF EXISTS `rename_database`;
CREATE PROCEDURE `rename_database` (IN `old_name` VARCHAR(20), IN `new_name` VARCHAR(20))
BEGIN
  DECLARE `current_table_name` VARCHAR(20);
  DECLARE `done` INT DEFAULT 0;
  DECLARE `table_name_cursor` CURSOR FOR SELECT `table_name` FROM `information_schema`.`tables` WHERE (`table_schema` = `old_name`);
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` = 1;

  SET @sql_string = CONCAT('CREATE DATABASE IF NOT EXISTS `', `new_name` , '`;');
  PREPARE `statement` FROM @sql_string;
  EXECUTE `statement`;
  DEALLOCATE PREPARE `statement`;

  OPEN `table_name_cursor`;
  REPEAT
    FETCH `table_name_cursor` INTO `current_table_name`;
    IF NOT `done` THEN

      SET @sql_string = CONCAT('RENAME TABLE `', `old_name`, '`.`', `current_table_name`, '` TO `', `new_name`, '`.`', `current_table_name`, '`;');
      PREPARE `statement` FROM @sql_string;
      EXECUTE `statement`;
      DEALLOCATE PREPARE `statement`;

    END IF;
  UNTIL `done` END REPEAT;
  CLOSE `table_name_cursor`;

  SET @sql_string =  CONCAT('DROP DATABASE `', `old_name`, '`;');
  PREPARE `statement` FROM @sql_string;
  EXECUTE `statement`;
  DEALLOCATE PREPARE `statement`;
END//
DELIMITER ;

Надеюсь, это поможет кому-то, кто в моей ситуации! Примечание: @sql_string будет задерживаться в сессии позже. Я не смог написать эту функцию без ее использования.

1
Milosz

Я использовал следующий метод для переименования базы данных

  1. сделать резервную копию файла, используя mysqldump или любой инструмент БД, например, heidiSQL, администратор mysql и т. д.

  2. Откройте файл резервной копии (например, backupfile.sql) в каком-либо текстовом редакторе.

  3. Найдите и замените имя базы данных и сохраните файл.

4. Восстановите отредактированный файл sql.

1
Adarsha

Если вы используете иерархические представления (представления, извлекающие данные из других представлений), импорт необработанного вывода из 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

1
gadelat

Вы, ребята, собираетесь застрелить меня за это, и, скорее всего, это не будет работать каждый раз, и, конечно же, это противоречит всей логике, бла-бла ... Но то, что я только что попробовал, это ... ОСТАНОВИТЕ движок MySQL, войдите в систему как корень и просто переименовал БД на уровне файловой системы ....

Я на OSX, и только изменил дело, с bedbf на BEDBF. К моему удивлению это сработало ...

Я бы не рекомендовал это на производственной БД. Я просто попробовал это как эксперимент ...

Удачи в любом случае :-)

0
Lawrence

Я отправил это Как я могу изменить имя базы данных, используя MySQL? сегодня после дней царапин на голове и выдергивания волос. Решение - просто экспортировать схему в файл .sql, открыть файл и изменить имя базы данных/схемы в разделе sql CREAT TABLE вверху. Существует три или более экземпляров, которые могут отсутствовать в верхней части страницы, если в файл сохраняются многослойные схемы. Таким способом можно отредактировать всю базу данных, но я ожидаю, что в больших базах данных это может быть довольно сложной задачей после всех случаев использования свойства таблицы или индекса.

0
E.R.Rider

I). Нет способа напрямую изменить имя существующей БД, но вы можете достичь цели, выполнив следующие действия: - 1). Создать newdb. 2). Используйте newdb. 3). создать таблицу table_name (выбрать * из olddb.table_name);

Делая это выше, вы копируете данные из таблицы olddb и вставляете их в таблицу newdb. Дайте имя столу так же.

II). Переименовать таблицу old_db.table_name TO new_db.table_name;

0
rajesh