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

StackOverflow https://stackoverflow.com/questions/67093

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

С этим нужно работать ИнноДБ, который хранит вещи совсем иначе, чем МойИСАМ.

Это было полезно?

Решение

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

Другие советы

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

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 $1.', table_name, ' TO $2.', table_name, '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

или

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

($1 и $2 являются исходным и целевым соответственно)

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

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

Подражая отсутствующему RENAME DATABASE команда в MySQL:

  1. Создать новую базу данных
  2. Создайте запросы на переименование с помощью:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
    
  3. Запустите этот вывод

  4. Удалить старую базу данных

Это было взято из Эмуляция отсутствующей команды RENAME DATABASE в MySQL.

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

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

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

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

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

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

cd /var/lib/mysql/

Выключите MySQL...Это важно!

/etc/init.d/mysql stop

Хорошо, этот способ не работает для баз данных InnoDB или BDB.

Переименовать базу данных:

mv old-name new-name

...или стол...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Перезапустите MySQL

/etc/init.d/mysql start

Сделанный...

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

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

RENAME TABLE old_db.table TO new_db.table;

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

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

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

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

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

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

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

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

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

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

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

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

Ну есть 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.MySQL «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 для пользователей, чтобы они соответствовали правильному имени схемы.Это можно исправить с помощью простого ОБНОВЛЕНИЯ в таблицах mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db, обновив имя old_schema на new_schema и вызвав «Flush привилегии;».Хотя «метод 2» кажется немного более сложным, чем «метод 1», его вполне можно использовать в сценариях.Простой сценарий bash для выполнения вышеуказанных шагов в правильной последовательности может помочь вам сэкономить место и время при переименовании схем базы данных в следующий раз.

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

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

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

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


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

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


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

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

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

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

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. Вы не можете просто использовать RENAME TABLE, потому что могут быть представления и триггеры.Если есть триггеры, RENAME TABLE не работает.
  2. Вы не можете использовать mysqldump, если хотите «быстро» (как указано в вопросе) переименовать большую базу данных.

В блоге Percona есть сообщение о том, как это сделать хорошо:https://www.percona.com/blog/2013/12/24/renameing-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

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

Шаги:

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

enter image description here

я задал вопрос по ошибке сервера пытаюсь избежать простоев при восстановлении очень больших баз данных с помощью MySQL Proxy.Мне это не удалось, но в конце концов я понял, что мне нужна функция ПЕРЕИМЕНОВАТЬ БАЗУ ДАННЫХ, потому что дамп/импорт невозможен из-за размера нашей базы данных.

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

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

Возможно, вам придется добавить параметры входа в строки 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"

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

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

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

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

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

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

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

create database NewDatabaseName like OldDatabaseName;

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

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

тогда, если ты захочешь,

drop database OldDatabaseName;

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

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

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

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

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

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

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

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

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

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

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

Кстати, я использую 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 имеет разрешения на чтение/запись/удаление в старой схеме и разрешения на чтение/запись/создание в новой схеме.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top