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

<p>руководство mysql по адресу <a href="http://web.archive.org/web/20160504181056/https://dev.mysql.com/doc/refman/5.1/en/rename-database.html">mysql</a> описывает это.</p><p>обычно я просто выкидываю базу данных и импортирую ее с новым именем. это не вариант для очень больших баз данных. очевидно <code>rename {database | schema} db\_name to new\_db\_name;</code> <a href="http://web.archive.org/web/20160504181056/https://dev.mysql.com/doc/refman/5.1/en/rename-database.html">делает плохие вещи, существует только в нескольких версиях, и в целом это плохая идея</a> .</p><p>это должно работать с <a href="http://en.wikipedia.org/wiki/innodb">innodb</a> , который хранит вещи совсем иначе, чем <a href="http://en.wikipedia.org/wiki/myisam">myisam</a> .</p>

<p>для innodb, кажется, работает следующее: создайте новую пустую базу данных, затем переименуйте каждую таблицу по очереди в новую базу данных:</p><pre><code>rename table old\_db.table to new\_db.table; </code></pre><p>вам нужно будет настроить разрешения после этого.</p><p>для сценариев в командной консоли вы можете использовать одно из следующих:</p><pre><code>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 </code></pre><p>или же</p><pre><code>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; </code></pre><p>заметки:</p><ul> <li>между параметром <code>-p</code> и паролем нет пробела. если в вашей базе данных нет пароля, удалите часть <code>-u username -ppassword</code>.</li> <li> <p>если у какой-либо таблицы есть триггер, ее нельзя переместить в другую базу данных с помощью вышеуказанного метода (приведет к ошибке <code>trigger in wrong schema</code>). если это так, используйте традиционный способ клонирования базы данных, а затем отбросьте старую:</p> <p><code>mysqldump old\_db | mysql new\_db</code></p> </li> <li> <p>если у вас есть хранимые процедуры, вы можете скопировать их впоследствии:</p> <p><code>mysqldump -r old\_db | mysql new\_db</code></p> </li> </ul>

<p>используйте эти несколько простых команд:</p><pre><code>mysqldump -u username -p -v olddatabase > olddbdump.sql mysqladmin -u username -p create newdatabase mysql -u username -p newdatabase < olddbdump.sql </code></pre><p>или, чтобы уменьшить количество операций ввода/вывода, используйте следующее, предложенное @pablo marin-garcia</p><pre><code>mysqladmin -u username -p create newdatabase mysqldump -u username -v olddatabase -p | mysql -u username -p -d newdatabase </code></pre>

<p>я думаю, что решение проще и было предложено некоторыми разработчиками. у phpmyadmin есть операция для этого.</p><p>в phpmyadmin выберите базу данных, которую вы хотите выбрать. во вкладках есть одна, которая называется операции, перейдите в раздел переименования. это все.</p><p>как и многие другие, он создает новую базу данных с новым именем, сбрасывает все таблицы старой базы данных в новую базу данных и удаляет старую базу данных.</p><p><img src="https://i.stack.imgur.com/wumcs.jpg" alt="enter image description here"></p>

<p>вы можете использовать sql для генерации сценария sql для передачи каждой таблицы в исходной базе данных в целевую базу данных.</p><p>вы должны создать базу данных назначения перед запуском скрипта, сгенерированного из команды.</p><p>вы можете использовать любой из этих двух сценариев (я изначально предложил первый, а кто-то "улучшил" мой ответ, чтобы использовать <code>group\_concat</code>. выберите, но я предпочитаю оригинал):</p><pre><code>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'; </code></pre><p>($ 1 и $ 2 - источник и цель соответственно)</p><p>это сгенерирует команду sql, которую вам нужно будет выполнить.</p><p>обратите внимание, что <code>group\_concat</code> имеет ограничение по умолчанию, которое может быть превышено для баз данных с большим количеством таблиц. вы можете изменить это ограничение, запустив <code>set session group\_concat\_max\_len = 100000000;</code> (или другое большое число).</p>

<p>эмуляция отсутствующей команды <code>rename database</code> в mysql:</p><ol> <li>создать новую базу данных</li> <li> <p>создайте запросы на переименование с помощью:</p> <pre><code>select concat('rename table ',table\_schema,'.',table\_name, ' to ','new\_schema.',table\_name,';') from information\_schema.tables where table\_schema like 'old\_schema'; </code></pre></li> <li> <p>запустите этот вывод</p> </li> <li>удалить старую базу данных</li> </ol><p>оно было взято из <em> <a href="http://blog.shlomoid.com/2010/02/emulating-missing-rename-database.html">эмуляция отсутствующей команды rename database в mysql</a> </em>.</p>

<p>три варианта:</p><ol> <li> <p>создайте новую базу данных, выключите сервер, переместите файлы из одной папки базы данных в другую и перезапустите сервер. обратите внимание, что это будет работать, только если все ваши таблицы являются myisam.</p> </li> <li> <p>создайте новую базу данных, используйте операторы create table ... like, а затем используйте операторы insert ... select * from.</p> </li> <li> <p>используйте mysqldump и перезагрузите этот файл.</p> </li> </ol>

<h3>простой способ</h3><p>перейдите в каталог базы данных:</p><pre><code>cd /var/lib/mysql/ </code></pre><p>выключите mysql ... это важно!</p><pre><code>/etc/init.d/mysql stop </code></pre><p>хорошо, этот способ не работает для innodb или bdb-баз данных.</p><p>переименовать базу данных:</p><pre><code>mv old-name new-name </code></pre><p>... или стол ...</p><pre><code>cd database/ mv old-name.frm new-name.frm mv old-name.myd new-name.myd mv old-name.myi new-name.myi </code></pre><p>перезапустите mysql</p><pre><code>/etc/init.d/mysql start </code></pre><p>готово...</p><p>ок, этот способ не работает с базами данных innodb или bdb. в этом случае вы должны сбросить базу данных и повторно импортировать ее.</p>

<p>я только недавно нашел очень хороший способ сделать это, работает с myisam и innodb и работает очень быстро:</p><pre><code>rename table old\_db.table to new\_db.table; </code></pre><p>я не помню, где я читал это, но заслуга достается кому-то другому, а не мне.</p>

<p>вы можете использовать этот скрипт:</p><p>справка: <a href="https://serverfault.com/questions/195221/how-to-rename-a-mysql-database"><em> как переименовать базу данных mysql? </em></a> </p><pre><code>#!/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 </code></pre>

<p>это то, что я использую:</p><pre><code>$ 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; </code></pre>

<p>простейший простой и надежный способ сделать <strong>полное</strong> переименование <em> (включая удаление старой базы данных в конце, так что это переименование, а не копия) </em>:</p><pre class="lang-none prettyprint-override"><code>mysqladmin -uroot -pmypassword create newdbname mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname mysqladmin -uroot -pmypassword drop olddbname </code></pre><p><strong>шаги:</strong></p><ol> <li>скопируйте строки в блокнот.</li> <li>замените все ссылки на "olddbname", "newdbname", "mypassword" (+ опционально "root") вашими эквивалентами.</li> <li>выполните один за другим в командной строке (введите "y" при появлении запроса).</li> </ol>

<p>в настоящее время mysql не поддерживает переименование базы данных через ее командный интерфейс, но вы можете переименовать базу данных, если у вас есть доступ к каталогу, в котором mysql хранит свои базы данных. для установок по умолчанию mysql это обычно находится в каталоге данных в каталоге, где был установлен mysql. найдите в базе данных имя базы данных, которую вы хотите переименовать, и переименуйте ее. переименование каталога может вызвать проблемы с разрешениями. быть в курсе.</p><p><strong>примечание:</strong> вы должны остановить mysql, прежде чем сможете переименовать базу данных</p><p>я бы порекомендовал создать новую базу данных (используя нужное имя) и экспортировать/импортировать необходимые данные из старой в новую. довольно просто.</p>

<p>когда вы переименовываете базу данных в phpmyadmin, она создает дамп, затем удаляет и заново создает базу данных с новым именем.</p>

<p>ну есть 2 метода:</p><p><strong>метод 1:</strong> хорошо известный метод для переименования схемы базы данных - выгрузить схему с помощью mysqldump и восстановить ее в другой схеме, а затем отбросить старую схему (если необходимо).</p><p>из оболочки</p><pre><code> mysqldump emp > emp.out mysql -e "create database employees;" mysql employees < emp.out mysql -e "drop database emp;" </code></pre><p>хотя описанный выше метод прост, он требует много времени и пространства. что, если схема больше чем <strong>100 гб?</strong> существуют методы, в которых вы можете объединить перечисленные выше команды вместе, чтобы сэкономить место, однако это не сэкономит время.</p><p>чтобы исправить такие ситуации, существует другой быстрый способ переименования схем, однако, при этом необходимо соблюдать осторожность.</p><p><strong>метод 2:</strong> mysql имеет очень хорошую функцию для переименования таблиц, которая работает даже в разных схемах. эта операция переименования является атомарной, и никто другой не может получить доступ к таблице во время ее переименования. это займет короткое время, так как изменение имени таблицы или ее схемы - это только изменение метаданных. вот процедурный подход к переименованию:</p><p>создайте новую схему базы данных с нужным именем. переименуйте таблицы из старой схемы в новую, используя команду mysql "rename table". удалите старую схему базы данных. <code>if there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too</code>. "rename table" mysql завершается ошибкой, если в таблицах существуют триггеры. чтобы исправить это, мы можем сделать следующие вещи:</p><p><strong>1)</strong> <code>dump the triggers, events and stored routines in a separate file.</code> это делается с помощью флагов -e, -r (в дополнение к -t -d, который выводит триггеры) в команду mysqldump. после сброса триггеров нам нужно будет удалить их из схемы, чтобы команда rename table работала.</p><pre><code> $ mysqldump <old_schema_name> -d -t -r -e > stored_routines_triggers_events.out <strong>2)</strong> создать список только таблиц "base". их можно найти с помощью запроса к таблице information_schema.tables. mysql> select table_name from information_schema.tables where table_schema='<old_schema_name>' and table_type='base table'; <strong>)</strong> дамп представления в выходной файл. представления можно найти с помощью запроса к той же таблице 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 </code></pre><p><strong>4)</strong> сбросить триггеры на текущих таблицах в old\_schema.</p><pre><code>mysql> drop trigger <trigger\_name>; ... </code></pre><p><strong>5)</strong> восстановите вышеуказанные файлы дампа, как только все "базовые" таблицы, найденные на шаге №2, будут переименованы.</p><pre><code>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 </code></pre><p>сложности с вышеуказанными методами: нам может потребоваться обновить grants для пользователей, чтобы они соответствовали правильному имени схемы. они могут быть исправлены с помощью простого update для таблиц mysql.columns\_priv, mysql.procs\_priv, mysql.tables\_priv, mysql.db, обновляющих имя old\_schema до new\_schema и вызывающих "flush privileges;". хотя "метод 2" кажется немного более сложным, чем "метод 1", он полностью подходит для сценариев. простой скрипт bash для выполнения вышеуказанных шагов в правильной последовательности поможет сэкономить место и время при следующем переименовании схем базы данных.</p><p>команда percona remote dba написала сценарий "rename\_db", который работает следующим образом:</p><pre><code>[root@dba~]# /tmp/rename\_db rename\_db <server> <database> <new\_database> </code></pre><p>чтобы продемонстрировать использование этого скрипта, использовали образец схемы "emp", создали триггеры тестирования, сохранили подпрограммы в этой схеме. попытка переименовать схему базы данных с помощью сценария, который занимает несколько секунд, в отличие от трудоемкого метода дампа/восстановления.</p><pre><code>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 | +--------------------+ </code></pre><p>как видно из вышеприведенного вывода, схема базы данных "emp" была переименована в "emp\_test" менее чем за секунду. наконец, это скрипт из percona, который используется выше для "метода 2".</p><pre><code>#!/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 $2g" -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 

для тех, кто является пользователями mac, sequel pro имеет опцию rename database в меню database. <a href="http://www.sequelpro.com/">http://www.sequelpro.com/ 

можно переименовать все таблицы в базе данных, чтобы они были в другой базе данных без необходимости выполнять полный дамп и восстановление. процедура отмены, если существует mysql.rename_db; delimiter || create procedure mysql.rename_db (in old_db varchar (100), in new_db varchar (100)) begin select concat ('create database', new_db, ';') # создать новую базу данных; select concat ('rename table', old_db, '.', table_name, 'to', new_db, '.', table_name, ';') # alter table from information_schema.tables where table_schema = old_db; select concat ('drop database' , old_db, ';') # drop old database; end || delimiter; $ time mysql -uroot -e "call mysql .rename\_db ('db1', 'db2'); " | mysql -uroot </pre><p>однако любые триггеры в целевой бд не будут счастливы. сначала вам нужно будет удалить их, а затем переименовать.</p><pre> mysql -uroot -e "call mysql.rename\_db ('test', 'blah2');" | mysql -uroot ошибка 1435 (hy000) в строке 4: запуск в неверной схеме </pre>

<p>большинство ответов здесь неверны по одной из двух причин:</p><ol> <li>вы не можете просто использовать rename table, потому что могут быть представления и триггеры. если есть триггеры, сбой переименования таблицы</li> <li>вы не можете использовать mysqldump, если хотите "быстро" (как это было задано в вопросе) переименовать большую базу данных</li> </ol><p>у percona есть запись в блоге о том, как сделать это хорошо: <a href="https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/">https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/</a> </p><p>и сценарий, опубликованный (сделанный?) саймоном р. джонсом, который делает то, что предлагается в этом посте. я исправил ошибку, обнаруженную в скрипте. вы можете видеть это здесь:</p><p> <a href="https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d">https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d</a> </p><p>вот копия этого:</p><pre><code>#!/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 mysqlbin 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 для меня не совсем работает. вот мой удар в этом: - хранимая процедура rename_db: переименовать базу данных, используя мои средства копирования таблиц. - предостережения: - заметит любую существующую базу данных с тем же именем, что и у "новой". имя базы данных. - только копирует таблицы; хранимые процедуры и другие объекты базы данных не копируются. - томер альтман (taltman@ai.sri.com) разделитель // drop процедура если существует rename_db; create procedure rename_db (in old_db varchar (100), in new_db varchar (100)) begin объявляет current_table varchar (100); закрыть int default 0; объявляет old_tables cursor for выбрать имя_таблицы из information_schema.tables где table_schema = old_db; объявить продолжить handler for not found set выполнено = 1; set @output = concat ('drop schema if exists', new_db, ';'); prepare stmt from @output; execute stmt; set @output = concat ('создать схему если не существует', new_db, ';'); prepare stmt from @output; execute stmt; open old_tables; repeat fetch old_tables into current_table; если не выполнено, то set @output = concat ('изменить таблицу', old_db, '.', current_table, 'rename', new_db, '.', current_table, ';'); prepare stmt from @output; execute stmt; end if; до конца end repeat; закрыть old_tables; end // разделитель; 

шаги: нажмите <a href="http://localhost/phpmyadmin/">http: // localhost/phpmyadmin /  выберите свою бд нажмите на вкладку операции там будет вкладка "переименовать базу данных". добавьте новое имя и установите флажок настроить привилегии. нажмите на go.  <a href="https://i.stack.imgur.com/0atgz.jpg"><img src="https://i.stack.imgur.com/0atgz.jpg" alt="enter image description here"> 

для вашего удобства ниже приведен небольшой скрипт, который должен быть выполнен с двумя параметрами: db-name и new db-name.вам может потребоваться добавить параметры входа в mysql-строки, если вы не используете .my.cnf-файл в вашем домашнем каталоге. пожалуйста, сделайте резервную копию перед выполнением этого скрипта.#!/usr/bin/env bash mysql -e "create database $2 default character set utf8 collate utf8\_general\_ci;" for i in $(mysql -ns $1 -e "show tables");do echo "$1.$i -> $2.$i" mysql -e "rename table $1.$i to $2.$i" done mysql -e "drop database $1" 

я <a href="https://serverfault.com/questions/126509/how-to-proxy-to-different-named-databases-on-the-same-server-using-mysql-proxy">поставил вопрос о сбое сервера пытаюсь обойти время простоя при восстановлении очень больших баз данных с помощью mysql proxy. у меня не было никакого успеха, но в конце концов я понял, что мне нужна функциональность rename database, потому что дамп/импорт не был опцией из-за размера нашей базы данных.в mysql встроена функциональность rename table, поэтому я написал простой сценарий python, чтобы выполнить эту работу за меня. я <a href="http://github.com/cclark/rename-mysql-db">разместил его на github на случай, если он будет полезен другим.

самый простой способ - использовать программное обеспечение heidisql. это бесплатно и с открытым исходным кодом. он работает на windows и на любом linux с <a href="http://en.wikipedia.org/wiki/wine_%28software%29">wine (запускайте приложения windows на linux, bsd, solaris и mac os x).чтобы загрузить heidisql, перейдите <a href="http://www.heidisql.com/download.php">http://www.heidisql.com/download.php .чтобы скачать wine, перейдите <a href="http://www.winehq.org/">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 administrator сделайте следующее: под каталогами создайте новую схему базы данных. перейдите в резервное копирование и создайте резервную копию старой схемы. выполнить резервное копирование. перейдите к восстановить и откройте файл, созданный в шаге 3. выберите "другая схема" в разделе "целевая схема" и выберите новую схему базы данных. начать восстановление. проверьте новую схему и, если она выглядит хорошо, удалите старую. 

в <strong>phpmyadmin</strong> вы можете легко переименовать базу данныхselect database goto operations tab in that rename database to : type your new database name and click go попросить удалить старую таблицу и перезагрузить данные таблицы, нажмите ok в обоихваша база данных переименована

если вы используете <a href="http://en.wikipedia.org/wiki/phpmyadmin">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 </code></pre><p>команда history в начале просто гарантирует, что команды mysql, содержащие пароли, не будут сохранены в истории оболочки.</p><p>убедитесь, что <code>db\_user</code> имеет разрешения на чтение/запись/удаление в старой схеме, а также разрешения на чтение/запись/создание в новой схеме.</p>

<p>я сделал это так: создайте резервную копию существующей базы данных. это даст вам db.zip.tmp, а затем в командной строке напишите следующее</p><blockquote> <p>"c:\program files (x86)\mysql\mysql server 5.6\bin\mysql.exe" -h localhost -u root -p [пароль] [новое имя базы данных] <"c:\backups\db.zip.tmp "</p> </blockquote>

<p>вы можете сделать это двумя способами.</p><ol> <li>переименовать таблицу old\_db.table\_name to new\_db.table\_name;</li> <li>перейти к операции-> там вы можете увидеть вкладку параметры таблицы. вы можете редактировать имя таблицы там.</li> </ol>

<p>это пакетный скрипт, который я написал для переименования базы данных в windows:</p><pre><code>@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%" </code></pre>

<p> <a href="http://dev.mysql.com/doc/refman/5.1/en/alter-database.html"><code>alter database</code></a> - это предложенный способ обхода mysql, и <code>rename database</code> отбрасывается.</p><p>from <em> <a href="http://dev.mysql.com/doc/refman/5.1/en/rename-database.html">13.1.32 синтаксис rename database</a> </em>:</p><pre><code>rename {database | schema} db\_name to new\_db\_name; </code></pre><p>этот оператор был добавлен в mysql 5.1.7, но он был признан опасным и был удален в mysql 5.1.23.</p>

<p>это работает для всех баз данных и работает путем переименования каждой таблицы с помощью <a href="http://www.maatkit.org/">maatkit mysql toolkit</a> </p><p>используйте mk-find, чтобы распечатать и переименовать каждую таблицу. у <a href="http://www.maatkit.org/doc/mk-find.html">man page</a> есть еще много опций и примеров</p><pre><code>mk-find --dblike old\_database --print --exec "rename table %d.%n to new\_database.%n" </code></pre><p>если у вас установлен maatkit ( <a href="http://www.maatkit.org/download">что очень просто</a> ), то это самый простой способ сделать это.</p>

<p>в случае, если вы начинаете с файла дампа с несколькими базами данных, вы можете выполнить sed для дампа:</p><pre><code>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 ... </code></pre><p>затем импортируйте свой дамп. просто убедитесь, что не будет никакого конфликта имен.</p>

<p>ни решение для todointx, ни адаптированное решение user757945 не работали для меня на mysql 5.5.16, так что вот моя адаптированная версия:</p><pre><code>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 ; </code></pre><p>надеюсь, это поможет кому-то, кто в моей ситуации! примечание: <code>@sql\_string</code> будет задерживаться в сессии позже. я не смог написать эту функцию без ее использования.</p>

<p>я использовал следующий метод для переименования базы данных</p><ol> <li> <p>сделать резервную копию файла, используя mysqldump или любой инструмент бд, например, heidisql, администратор mysql и т. д.</p> </li> <li> <p>откройте файл резервной копии (например, backupfile.sql) в каком-либо текстовом редакторе.</p> </li> <li> <p>найдите и замените имя базы данных и сохраните файл.</p> </li> </ol><p>4. восстановите отредактированный файл sql.</p>

<p>если вы используете иерархические представления (представления, извлекающие данные из других представлений), импорт необработанного вывода из mysqldump может не работать, поскольку mysqldump не заботится о правильном порядке представлений. из-за этого я <a href="https://github.com/gadelat/mysqldump-view-reorder.git">написал сценарий</a> , который переупорядочивает представления, чтобы исправить порядок на лету.</p><p>это выглядит так:</p><pre><code>#!/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); } } } } </code></pre><p>использование:<br> <code>mysqldump -u username -v olddatabase -p | ./mysqldump\_view\_reorder.pl | mysql -u username -p -d newdatabase</code></p>

<p>вы, ребята, собираетесь застрелить меня за это, и, скорее всего, это не будет работать каждый раз, и, конечно же, это противоречит всей логике, бла-бла ... но то, что я только что попробовал, это ... остановите движок mysql, войдите в систему как корень и просто переименовал бд на уровне файловой системы ....</p><p>я на osx, и только изменил дело, с bedbf на bedbf. к моему удивлению это сработало ...</p><p>я бы не рекомендовал это на производственной бд. я просто попробовал это как эксперимент ...</p><p>удачи в любом случае :-)</p>

<p>я отправил это <a href="https://stackoverflow.com/questions/19806065/how-to-change-database-name-using-mysql/23183723#23183723">как я могу изменить имя базы данных, используя mysql?</a> сегодня после дней царапин на голове и выдергивания волос. решение - просто экспортировать схему в файл .sql, открыть файл и изменить имя базы данных/схемы в разделе sql creat table вверху. существует три или более экземпляров, которые могут отсутствовать в верхней части страницы, если в файл сохраняются многослойные схемы. таким способом можно отредактировать всю базу данных, но я ожидаю, что в больших базах данных это может быть довольно сложной задачей после всех случаев использования свойства таблицы или индекса.</p>

<p>i). нет способа напрямую изменить имя существующей бд, но вы можете достичь цели, выполнив следующие действия: - 1). создать newdb. 2). используйте newdb. 3). создать таблицу table\_name (выбрать * из olddb.table\_name);</p><p>делая это выше, вы копируете данные из таблицы olddb и вставляете их в таблицу newdb. дайте имя столу так же.</p><p>ii). переименовать таблицу old\_db.table\_name to new\_db.table\_name;</p>