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

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

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

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

30 ответов


для 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 выберите базу данных, которую вы хотите выбрать. На вкладках есть одна называемая операция, перейдите в раздел переименование. Вот и все.

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

Enter image description here


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

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

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

SELECT CONCAT('RENAME TABLE .', table_name, ' TO .', table_name, '; ')
FROM information_schema.TABLES 
WHERE table_schema='';

или

SELECT GROUP_CONCAT('RENAME TABLE .', table_name, ' TO .', table_name SEPARATOR '; ')
FROM information_schema.TABLES 
WHERE table_schema='';

($1 и $2 являются источником и целью соответственно)

это создаст команду SQL, которую вам придется затем запустить.

отметим, что GROUP_CONCAT имеет ограничение длины по умолчанию, которое может быть превышено для баз данных с большим количеством таблиц. Вы можете изменить этот предел, запустив SET SESSION group_concat_max_len = 100000000; (или другое большое число).


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

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

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

  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

сделано...

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


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

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


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

RENAME TABLE old_db.table TO new_db.table;

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


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

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

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

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

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


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

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

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


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

ссылки: как переименовать базу данных MySQL?

#!/bin/bash
set -e # terminate execution on command failure

mysqlconn="mysql -u root -proot"
olddb=
newdb=
$mysqlconn -e "CREATE DATABASE $newdb"
params=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES \
                           WHERE table_schema='$olddb'")
for name in $params; do
      $mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name";
done;
$mysqlconn -e "DROP DATABASE $olddb"

работает:

$ sh rename_database.sh oldname newname

для тех, кто является пользователями Mac, Sequel Pro имеет опцию переименовать базу данных в меню базы данных. http://www.sequelpro.com/


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

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

Из Shell

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

хотя вышеуказанный метод легок, он время и космос уничтожая. Что делать, если схема больше, чем 100GB? есть методы, где вы можете передать вышеуказанные команды вместе, чтобы сэкономить на пространстве, однако это не сэкономит время.

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

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

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

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

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

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

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

3) дамп представления в файле out. Представления можно найти с помощью запроса на том же information_schema.TABLES таблица.

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

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

mysql> DROP TRIGGER <trigger_name>;
...

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

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

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

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

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

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

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


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

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


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

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

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

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

DROP PROCEDURE IF EXISTS mysql.rename_db;
DELIMITER ||
CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
SELECT CONCAT('CREATE DATABASE ', new_db, ';') `# create new database`;
SELECT CONCAT('RENAME TABLE `', old_db, '`.`', table_name, '` TO `', new_db, '`.`', table_name, '`;') `# alter table` FROM information_schema.tables WHERE table_schema = old_db;
SELECT CONCAT('DROP DATABASE `', old_db, '`;') `# drop old database`;
END||
DELIMITER ;

$ time mysql -uroot -e "call mysql.rename_db('db1', 'db2');" | mysql -uroot

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

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

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

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

Фирконом есть блог пост о том, как это сделать что ж: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

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

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

вот его копия:

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

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


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

хранимая процедура 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 (taltman@ai.sri.com)

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 ;

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

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


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

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


#!/usr/bin/env bash

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

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

для загрузки HeidiSQL, goto http://www.heidisql.com/download.php.

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

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

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


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

действия :

  1. нажмите http://localhost/phpmyadmin/
  2. выберите DB
  3. нажмите на вкладку Операции
  4. будет вкладка "переименовать базу данных в". Добавьте новое имя и проверьте права доступа Adjust.
  5. нажмите на Go.

enter image description here


в MySQL администратор делает следующее:

  1. В разделе каталоги создайте новую схему базы данных.
  2. перейдите в Backup и создайте резервную копию старая схема.
  3. выполнить резервное копирование.
  4. перейти к восстановлению и открыть файл созданный на Шаге 3.
  5. выберите "другая схема" в разделе Target Схема и выберите новую базу данных схема.
  6. Запуск Восстановления.
  7. Проверьте новую схему и, если она выглядит хорошо, удалите старый один.

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

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

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

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


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

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


вот однострочный фрагмент 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

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

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


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

С 13.1.32 переименовать синтаксис базы данных:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

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


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

"C:\Program файлы (х86)\с mysql\mysql сервер 5.6\Бин\и MySQL.exe " - h localhost-u root-p[пароль] [новое имя БД]