Руководство по MySQL в MySQL описывает это.
Обычно я просто сбрасываю базу данных и reimport с новым именем. Это не вариант для очень больших баз данных. По-видимому, RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
делает плохие вещи, существует только в нескольких версиях, и это плохая идея в целом.
Это должно работать с InnoDB, который хранит вещи совсем по-другому, чем MyISAM.
Для InnoDB, похоже, работает следующее: создайте новую пустую базу данных, а затем переименуйте каждую таблицу в свою очередь в новую базу данных:
RENAME TABLE old_db.table TO new_db.table;
После этого вам нужно будет настроить разрешения.
Для сценариев в оболочке вы можете использовать одно из следующих действий:
mysql -u username -ppassword old_db -sNe 'show tables' | while read table; \
do mysql -u username -ppassword -sNe "rename table old_db.$table to new_db.$table"; done
или
for table in `mysql -u root -ppassword -s -N -e "use old_db;show tables from old_db;"`; do mysql -u root -ppassword -s -N -e "use old_db;rename table old_db.$table to new_db.$table;"; done;
Примечания: между опцией -p
и паролем нет пробела. Если ваша база данных не имеет пароля, удалите часть -u username -ppassword
.
Кроме того, если у вас есть хранимые процедуры, вы можете их скопировать позже:
mysqldump -R old_db | mysql new_db
Используйте эти несколько простых команд:
mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql
Или для уменьшения ввода-вывода используйте следующее, предложенное @Pablo Marin-Garcia:
mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase
Я думаю, что решение проще и было предложено некоторыми разработчиками. Для этого у phpMyAdmin есть операция.
Из phpMyAdmin выберите базу данных, которую вы хотите выбрать. На вкладках там называется "Операции", перейдите в раздел переименования. Это все.
Он, как и многие другие, создает новую базу данных с новым именем, удаляет все таблицы старой базы данных в новую базу данных и удаляет старую базу данных.
Вы можете использовать SQL для генерации сценария SQL для переноса каждой таблицы в исходной базе данных в целевую базу данных.
Перед запуском сценария, созданного в команде, необходимо создать базу данных назначения.
Вы можете использовать любой из этих двух сценариев (я изначально предложил, чтобы кто-то "улучшил" мой ответ, чтобы использовать GROUP_CONCAT
. Возьмите свой выбор, но я предпочитаю оригинал):
SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')
FROM information_schema.TABLES
WHERE table_schema='$1';
или
SELECT GROUP_CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name SEPARATOR '; ')
FROM information_schema.TABLES
WHERE table_schema='$1';
($ 1 и $ 2 - источник и целевой показатель соответственно)
Это создаст команду SQL, которую вам нужно будет запустить.
Обратите внимание, что GROUP_CONCAT
имеет ограничение по умолчанию, которое может быть превышено для баз данных с большим количеством таблиц. Вы можете изменить этот предел, выполнив SET SESSION group_concat_max_len = 100000000;
(или какое-то другое большое количество).
Три варианта:
Создайте новую базу данных, снизьте сервер, переместите файлы из одной папки базы данных в другую и перезапустите сервер. Обратите внимание, что это будет работать, только если ВСЕ ваши таблицы являются MyISAM.
Создайте новую базу данных, используйте инструкции CREATE TABLE... LIKE, а затем используйте инструкции INSERT... SELECT * FROM.
Используйте 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;
Я не помню, где я его читал, но кредит принадлежит другому, а не мне.
Эмуляция отсутствующей команды RENAME DATABASE
в MySQL:
Создайте запросы переименования с помощью:
SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
' TO ','new_schema.',table_name,';')
FROM information_schema.TABLES
WHERE table_schema LIKE 'old_schema';
Запустите этот вывод
Это было взято из Эмулировать недостающую команду RENAME DATABASE в MySQL.
Это то, что я использую:
$ 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
Шаги:
Когда вы переименовываете базу данных в 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 есть очень хорошая функция для переименования таблиц, которые даже работают в разных схемах. Эта операция переименования является атомарной, и никто другой не может получить доступ к таблице при ее переименовании. Это займет короткое время, так как изменение имени таблицы или ее схемы - это только изменение метаданных. При выполнении переименования существует процедурный подход:
Создайте новую схему базы данных с нужным именем.
Переименуйте таблицы из старой схемы в новую схему, используя команду "RENAME TABLE" MySQL.
Отбросьте старую схему базы данных.
If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too
. MySQLs "RENAME TABLE" терпит неудачу, если в таблицах существуют триггеры. Чтобы исправить это, мы можем сделать следующее:
1) Dump the triggers, events and stored routines in a separate file.
Это выполняется с использованием флагов -E, -R (в дополнение к -t -d, который сбрасывает триггеры) команде mysqldump. После того, как триггеры будут сброшены, нам нужно будет удалить их из схемы, чтобы команда RENAME TABLE работала.
$ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out
2) Создайте список только таблиц "BASE". Их можно найти, используя запрос в таблице information_schema.TABLES
.
mysql> select TABLE_NAME from information_schema.tables where
table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';
3) Дамп представлений в выходном файле. Представления можно найти, используя запрос в той же таблице information_schema.TABLES
.
mysql> select TABLE_NAME from information_schema.tables where
table_schema='<old_schema_name>' and TABLE_TYPE='VIEW';
$ mysqldump <database> <view1> <view2> … > views.out
4) Отбросьте триггеры в текущих таблицах в old_schema.
mysql> DROP TRIGGER <trigger_name>;
...
5) Восстановите вышеуказанные файлы дампа, как только все базовые таблицы, найденные на шаге 2, будут переименованы.
mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name;
...
$ mysql <new_schema> < views.out
$ mysql <new_schema> < stored_routines_triggers_events.out
Трудности с помощью вышеописанных методов. Возможно, нам потребуется обновить GRANTS для пользователей, чтобы они соответствовали правильному имени схемы. Они могут быть исправлены с помощью простых UPDATE таблиц mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db, обновляющих имя old_schema до new_schema и вызывающих "привилегии Flush". Хотя "метод 2" кажется немного более сложным, чем "метод 1", это вполне возможно для сценариев. Простой bash script для выполнения вышеуказанных шагов в правильной последовательности может помочь вам сэкономить место и время при переименовании схем баз данных в следующий раз.
Команда Percona Remote DBA написала script под названием "rename_db", который работает следующим образом:
[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>
Чтобы продемонстрировать использование этого script, использовали примерную схему "emp", создали тестовые триггеры, сохраненные подпрограммы на этой схеме. Попробует переименовать схему базы данных с помощью script, для завершения которой требуется несколько секунд, а не времени, использующего метод дампа/восстановления.
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" менее чем за секунду. Наконец, это script из Percona, который используется выше для "метода 2".
#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
set -e
if [ -z "$3" ]; then
echo "rename_db <server> <database> <new_database>"
exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
echo "ERROR: New database already exists $3"
exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
echo "Error retrieving tables from $2"
exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
echo "drop trigger $TRIGGER"
mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
echo "rename table $2.$TABLE to $3.$TABLE"
mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
echo "loading views"
mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
echo "Dropping database $2"
mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
COLUMNS_PRIV=" UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
PROCS_PRIV=" UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
TABLES_PRIV=" UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
DB_PRIV=" UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
echo " flush privileges;"
fi
Вы можете использовать этот сценарий оболочки:
Справка: Как переименовать базу данных 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
set -e
в начало скрипта, что приведет к прекращению выполнения при сбое и должно смягчить эту проблему.
Можно переименовать все таблицы в базе данных в другую базу данных без необходимости выполнять полный сброс и восстановление.
DROP PROCEDURE IF EXISTS mysql.rename_db; DELIMITER || CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100)) BEGIN SELECT CONCAT('CREATE DATABASE ', new_db, ';') `# create new database`; SELECT CONCAT('RENAME TABLE `', old_db, '`.`', table_name, '` TO `', new_db, '`.`', table_name, '`;') `# alter table` FROM information_schema.tables WHERE table_schema = old_db; SELECT CONCAT('DROP DATABASE `', old_db, '`;') `# drop old database`; END|| DELIMITER ; $ time mysql -uroot -e "call mysql.rename_db('db1', 'db2');" | mysql -uroot
Однако любые триггеры в целевом db не будут счастливы. Сначала вам нужно отбросить их, а затем воссоздать их после переименования.
mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot ERROR 1435 (HY000) at line 4: Trigger in wrong schema
mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot
Обратите внимание, вы должны использовать --batch для изменения форматирования на необработанное форматирование, которое выводит результаты без форматирования.
Большинство ответов здесь неверны по одной из двух причин:
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
Хранимая процедура TodoInTX для меня не работала. Здесь мой удар по нему:
-- stored procedure rename_db: Rename a database my means of table copying. -- Caveats: -- Will clobber any existing database with the same name as the 'new' database name. -- ONLY copies tables; stored procedures and other database objects are not copied. -- Tomer Altman ([email protected]) delimiter // DROP PROCEDURE IF EXISTS rename_db; CREATE PROCEDURE rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100)) BEGIN DECLARE current_table VARCHAR(100); DECLARE done INT DEFAULT 0; DECLARE old_tables CURSOR FOR select table_name from information_schema.tables where table_schema = old_db; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SET @output = CONCAT('DROP SCHEMA IF EXISTS ', new_db, ';'); PREPARE stmt FROM @output; EXECUTE stmt; SET @output = CONCAT('CREATE SCHEMA IF NOT EXISTS ', new_db, ';'); PREPARE stmt FROM @output; EXECUTE stmt; OPEN old_tables; REPEAT FETCH old_tables INTO current_table; IF NOT done THEN SET @output = CONCAT('alter table ', old_db, '.', current_table, ' rename ', new_db, '.', current_table, ';'); PREPARE stmt FROM @output; EXECUTE stmt; END IF; UNTIL done END REPEAT; CLOSE old_tables; END// delimiter ;
Вот командный файл, который я написал для его автоматизации из командной строки, но для Windows/MS-DOS.
Синтаксис - это rename_mysqldb database newdatabase -u [user] -p [пароль]
:: ***************************************************************************
:: FILE: RENAME_MYSQLDB.BAT
:: ***************************************************************************
:: DESCRIPTION
:: This is a Windows /MS-DOS batch file that automates renaming a MySQL database
:: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks.
:: The MySQL\bin folder needs to be in your environment path or the working directory.
::
:: WARNING: The script will delete the original database, but only if it successfully
:: created the new copy. However, read the disclaimer below before using.
::
:: DISCLAIMER
:: This script is provided without any express or implied warranties whatsoever.
:: The user must assume the risk of using the script.
::
:: You are free to use, modify, and distribute this script without exception.
:: ***************************************************************************
:INITIALIZE
@ECHO OFF
IF [%2]==[] GOTO HELP
IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)
SET RDB_OLDDB=%1
SET RDB_NEWDB=%2
SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql
GOTO START
:START
SET RDB_STEP=1
ECHO Dumping "%RDB_OLDDB%"...
mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=2
ECHO Creating database "%RDB_NEWDB%"...
mysqladmin %RDB_ARGS% create %RDB_NEWDB%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=3
ECHO Loading dump into "%RDB_NEWDB%"...
mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=4
ECHO Dropping database "%RDB_OLDDB%"...
mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=5
ECHO Deleting dump...
DEL %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END
:ERROR_ABORT
IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force
IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%
ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END
:HELP
ECHO Renames a MySQL database.
ECHO Usage: %0 database new_database [OPTIONS]
ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump.
ECHO --user=root is used if no options are specified.
GOTO END
:END
SET RDB_OLDDB=
SET RDB_NEWDB=
SET RDB_ARGS=
SET RDB_DUMP=
SET RDB_STEP=
Для вашего удобства ниже представлен небольшой shellscript, который должен быть выполнен с двумя параметрами: db-name и new db-name.
Вам может потребоваться добавить параметры входа в mysql-строки, если вы не используете файл .my.cnf в своем домашнем каталоге. Перед выполнением этого script сделайте резервную копию.
#!/usr/bin/env bash
mysql -e "CREATE DATABASE $2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns $1 -e "show tables");do
echo "$1.$i -> $2.$i"
mysql -e "rename TABLE $1.$i to $2.$i"
done
mysql -e "DROP DATABASE $1"
I задал вопрос о сбое сервера, пытаясь обойти время простоя при восстановлении очень больших баз данных с помощью MySQL Proxy. У меня не было никакого успеха, но в конце концов я понял, что я хотел использовать функциональность RENAME DATABASE, потому что dump/import не был вариантом из-за размера нашей базы данных.
Есть функция RENAME TABLE, встроенная в MySQL, поэтому я закончил писать простой Python script, чтобы выполнить эту работу для меня. Я разместил его на GitHub, если он может быть полезен другим.
RENAME TABLE
, что это утверждение было добавлено в MySQL 5.1.7, но было признано опасным и удалено в MySQL 5.1.23.
Самый простой способ - использовать программное обеспечение HeidiSQL. Он бесплатный и с открытым исходным кодом. Он работает в Windows и на любом Linux с Wine (запускать приложения Windows на Linux, BSD, Solaris и Mac и X & X).
Чтобы загрузить HeidiSQL, перейдите http://www.heidisql.com/download.php.
Чтобы загрузить Wine, goto http://www.winehq.org/.
Чтобы переименовать базу данных в HeidiSQL, просто щелкните правой кнопкой мыши по имени базы данных и выберите "Изменить". Затем введите новое имя и нажмите "ОК".
Это так просто.
Вот быстрый способ создания переименования sql script, если у вас много таблиц для перемещения.
SELECT DISTINCT CONCAT('RENAME TABLE ', t.table_schema,'.', t.table_name, ' TO ',
t.table_schema, "_archive", '.', t.table_name, ';' ) as Rename_SQL
FROM information_schema.tables t
WHERE table_schema='your_db_name' ;
Для пользователей Mac вы можете использовать Sequel Pro
(бесплатно), которые просто предоставляют возможность переименовывать базы данных. Хотя он не удаляет старую БД.
как только открыть соответствующую БД, просто нажмите: Database
→ Rename database...
Кажется, никто не упомянул об этом, но вот еще один способ:
create database NewDatabaseName like OldDatabaseName;
то для каждой таблицы выполните:
create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;
тогда, если вы хотите,
drop database OldDatabaseName;
Этот подход имел бы преимущество в том, что он выполнял всю передачу на сервере с почти нулевым сетевым трафиком, поэтому он будет работать намного быстрее, чем сброс/восстановление.
Если у вас есть хранимые процедуры/представления/etc, вы также можете их перенести.
create database
? Откуда ты это взял?
create table like
синтаксису: dev.mysql.com/doc/refman/5.7/en/create-table-like.html . Что касается создания базы данных, похоже, MySQL с тех пор отбросил это предложение.
Я сделал это так: Сделайте резервную копию существующей базы данных. Он предоставит вам db.zip.tmp, а затем в командной строке напишите
"C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin\mysql.exe" -h localhost -u root -p [пароль] [новое имя db] < "C:\Подпорки\db.zip.tmp"
в phpmyadmin вы можете легко переименовать базу данных
select database
goto operations tab
in that rename Database to :
type your new database name and click go
попросите отказаться от старой таблицы и перезагрузить данные таблицы, нажмите "ОК" в обоих
Ваша база данных переименована
ALTER DATABASE
- это предлагаемый способ для MySQL и RENAME DATABASE
.
Из 13.1.32 Синтаксис DENABASE RENAME:
RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
Этот оператор был добавлен в MySQL 5.1.7, но он оказался опасным и был удален в MySQL 5.1.23.
alter database
для переименования самой базы данных, и документация, на которую вы ссылались, не предполагает, что это возможно.
Вот однострочный фрагмент 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
имеет права на чтение/запись/удаление старой схемы и права на чтение/запись/создание новой схемы.
Если вы используете phpMyAdmin, вы можете перейти на вкладку "операции", как только вы выбрали базу данных, которую хотите переименовать. Затем перейдите в последний раздел "Копировать базу данных в" (или что-то в этом роде), укажите имя и выберите параметры ниже. В этом случае, я думаю, вы должны выбрать флажки "структура и данные" и "создать базу данных перед копированием" и, наконец, нажать кнопку "идти" в этом разделе.
Кстати, я использую phpMyAdmin на испанском, поэтому я не уверен, что имена разделов на английском языке.
В MySQL Administrator выполните следующие действия:
Шаги:
Вы можете сделать это двумя способами.
Это пакет script, который я написал для переименования базы данных в 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%"
Это работает для всех баз данных и работает, переименовывая каждую таблицу с помощью maatkit mysql toolkit
Используйте mk-find для печати и переименования каждой таблицы. справочная страница содержит больше возможностей и примеров
mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"
Если у вас установлен maatkit (что очень просто), то это самый простой способ сделать это.
В случае, когда вы начинаете с файла дампа с несколькими базами данных, вы можете выполнить команду 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
...
Затем импортируйте свой свалку. Просто убедитесь, что конфликт имен не будет.
Если вы используете иерархические представления (представления, извлекающие данные из других представлений), импорт необработанного вывода из mysqldump может не работать, поскольку mysqldump не заботится о правильном порядке просмотра. Из-за этого я написал script, который переупорядочивает представления для правильного порядка на лету.
Он выглядит следующим образом:
#!/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
Я использовал следующий метод для переименования базы данных
возьмите резервную копию файла с помощью mysqldump или любого инструмента DB, например, heidiSQL, администратор mysql и т.д.
Откройте резервный файл (например, файл backupfile.sql) в текстовом редакторе.
Найдите и замените имя базы данных и сохраните файл.
4. Восстановить отредактированный файл sql
Ни решение TodoInTx, ни адаптированное для пользователя757945 решение не работало для меня в 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
будет задерживаться в сеансе позже. Я не смог написать эту функцию, не используя ее.
Простой способ
ALTER DATABASE 'oldName' MODIFY NAME = 'newName';
или вы можете использовать онлайн-генератор sql
I). Нет прямого способа, с помощью которого u может изменить имя существующей БД Но вы можете достичь цели ur, выполнив следующие шаги: - 1). Создать newdb. 2). Используйте newdb. 3). create table table_name (выберите * из olddb.table_name);
Сделав это, скопируйте данные из таблицы olddb и вставив их в таблицу newdb. Дайте имя этой таблицы.
II). RENAME TABLE old_db.table_name TO new_db.table_name;
Я разместил это Как мне изменить имя базы данных с помощью MySQL? сегодня после нескольких дней царапин на голове и вытягивания волос. Решение довольно просто экспортировать схему в файл .sql и открыть файл и изменить имя базы данных/схемы в разделе sql CREAT TABLE вверху. Есть три экземпляра или больше и не может быть в верхней части страницы, если в файл сохранены многомерные схемы. Это возможно для редактирования всей базы данных таким образом, но я ожидаю, что в больших базах данных это может быть довольно болью после всех экземпляров свойства или индекса таблицы.
Вы, ребята, застрелите меня за это, и, скорее всего, это не сработает каждый раз, и конечно, это против всех логических бла-бла... Но то, что я только что пробовал, - это... ОСТАНОВИТЕ двигатель MySQL, войдите в систему под учетной записью root и просто переименуйте DB на уровне файловой системы....
Я на OSX, и только изменил случай, от bedbf до BEDBF. К моему удивлению, это сработало...
Я бы не рекомендовал его на производственной БД. Я просто попробовал это как эксперимент...
Удачи в любом случае: -)
Здесь есть много действительно хороших ответов, но я не вижу PHP-версию. Это копирует 800M DB примерно через секунду.
$oldDbName = "oldDBName";
$newDbName = "newDBName";
$oldDB = new mysqli("localhost", "user", "pass", $oldDbName);
if($oldDB->connect_errno){
echo "Failed to connect to MySQL: (" . $oldDB->connect_errno . ") " . $oldDB->connect_error;
exit;
}
$newDBQuery = "CREATE DATABASE IF NOT EXISTS {$newDbName}";
$oldDB->query($newDBQuery);
$newDB = new mysqli("localhost", "user", "pass");
if($newDB->connect_errno){
echo "Failed to connect to MySQL: (" . $newDB->connect_errno . ") " . $newDB->connect_error;
exit;
}
$tableQuery = "SHOW TABLES";
$tableResult = $oldDB->query($tableQuery);
$renameQuery = "RENAME TABLE\n";
while($table = $tableResult->fetch_array()){
$tableName = $table["Tables_in_{$oldDbName}"];
$renameQuery .= "{$oldDbName}.{$tableName} TO {$newDbName}.{$tableName},";
}
$renameQuery = substr($renameQuery, 0, strlen($renameQuery) - 1);
$newDB->query($renameQuery);
Проще всего, откройте MYSQL → SELECT DB, имя которого вы хотите изменить → Нажмите "операция" , затем поместите новое имя в "Переименовать" базы данных: "поле, затем нажмите кнопку " Перейти "
Simple!
Действительно, самый простой ответ - экспортировать свою старую базу данных, а затем импортировать ее в новую, созданную для замены старой. Конечно, вы должны использовать phpMyAdmin или командную строку для этого.
Переименование и настройка Джерри базы данных - это БАД-ИДЕЯ! НЕ ДЕЛАЙТЕ ЭТО. (Если вы не являетесь "хакерским типом", сидящим в подвале вашей матери в темноте и едящей пиццу в течение дня.)
У вас будет больше проблем и работы, чем вы хотите.
Итак,
Расширением в этом файле является .sql
- phpMyAdmin SQL Dump - версия 3.2.4
- Хост: localhost - Время генерации: 30 июня 2010 года в 12:17 - Версия сервера: 5.0.90 - Версия PHP: 5.2.6
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
/*! 40101 SET @OLD_CHARACTER_SET_CLIENT = @@CHARACTER_SET_CLIENT/; /! 40101 SET @OLD_CHARACTER_SET_RESULTS = @@CHARACTER_SET_RESULTS/; /! 40101 SET @OLD_COLLATION_CONNECTION = @@COLLATION_CONNECTION/; /! 40101 SET NAMES utf8 */;
-
mydatab_online
-
user
СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ user
(timestamp
int (15) NOT NULL по умолчанию '0', ip
varchar (40) NOT NULL default '', file
varchar (100) NOT NULL default '', ПЕРВИЧНЫЙ КЛЮЧ (timestamp
), КЛЮЧ ip
(ip
), КЛЮЧ file
(file
)
) ENGINE = MyISAM DEFAULT CHARSET = latin1;
-
user
INSERT INTO user
(timestamp
, ip
, file
) ЦЕННОСТИ
(1277911052, '999.236.177.116', ''),
(1277911194, '999.236.177.116', '');
Это будет ваш .sql файл. Тот, который вы только что экспортировали.
Найдите его на жестком диске; обычно он находится в /temp
. Выберите пустую базу данных с правильным именем (причина, по которой вы это читаете).
SAY: Импорт - GO
Подключите свою программу к правильной базе данных, введя ее в файл, который обычно является конфигурационным .php. Обновите сервер (оба. Почему? Потому что я UNIX oldtimer, и я так сказал. Теперь вы должны быть в хорошей форме. Если у вас есть дополнительные вопросы, посетите меня в Интернете.
Если вы используете phpMyAdmin, вы просто переходите в папку mysql
в xamp, закрываете phpMyAdmin и просто переименовываете папку вы просто видите там свое имя базы данных и просто перезапустите phpMyAdmin. Вы можете видеть, что эта база данных переименована.