Pergunta

O manual do MySQL em MySQL cobre isso.

Normalmente eu apenas despejo o banco de dados e reimporto-o com um novo nome.Esta não é uma opção para bancos de dados muito grandes.Aparentemente RENAME {DATABASE | SCHEMA} db_name TO new_db_name; faz coisas ruins, existe apenas em algumas versões e é uma má ideia no geral.

Isso precisa funcionar com InnoDB, que armazena coisas de maneira muito diferente de MeuISAM.

Foi útil?

Solução

Para o InnoDB, o seguinte parece funcionar:crie o novo banco de dados vazio e renomeie cada tabela para o novo banco de dados:

RENAME TABLE old_db.table TO new_db.table;

Você precisará ajustar as permissões depois disso.

Para scripts em um shell, você pode usar um dos seguintes:

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

Ou

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;

Notas:

  • Não há espaço entre a opção -p e a senha.Se seu banco de dados não tiver senha, remova o -u username -ppassword papel.
  • Se alguma tabela tiver um gatilho, ela não poderá ser movida para outro banco de dados usando o método acima (resultará Trigger in wrong schema erro).Se for esse o caso, use uma forma tradicional de clonar um banco de dados e depois descarte o antigo:

    mysqldump old_db | mysql new_db

  • Se você tiver procedimentos armazenados, poderá copiá-los posteriormente:

    mysqldump -R old_db | mysql new_db

Outras dicas

Use estes poucos comandos simples:

mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql

Ou para reduzir a E/S, use o seguinte sugerido por @Pablo Marin-Garcia:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase

Acho que a solução é mais simples e foi sugerida por alguns desenvolvedores.O phpMyAdmin possui uma operação para isso.

No phpMyAdmin, selecione o banco de dados que deseja selecionar.Nas abas existe uma chamada Operações, vá para a seção renomear.Isso é tudo.

Como muitos sugeriram, ele cria um novo banco de dados com o novo nome, despeja todas as tabelas do banco de dados antigo no novo banco de dados e descarta o banco de dados antigo.

Enter image description here

Você pode usar SQL para gerar um script SQL para transferir cada tabela do banco de dados de origem para o banco de dados de destino.

Você deve criar o banco de dados de destino antes de executar o script gerado a partir do comando.

Você pode usar qualquer um desses dois scripts (originalmente sugeri o primeiro e alguém "melhorou" minha resposta para usar GROUP_CONCAT.Faça a sua escolha, mas prefiro o original):

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

ou

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

($1 e $2 são origem e destino respectivamente)

Isso irá gerar um comando SQL que você deverá executar.

Observe que GROUP_CONCAT possui um limite de comprimento padrão que pode ser excedido para bancos de dados com um grande número de tabelas.Você pode alterar esse limite executando SET SESSION group_concat_max_len = 100000000; (ou algum outro número grande).

Emulando o que falta RENAME DATABASE comando no MySQL:

  1. Crie um novo banco de dados
  2. Crie as consultas de renomeação com:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
    
  3. Execute essa saída

  4. Excluir banco de dados antigo

Foi tirado de Emulando o comando RENAME DATABASE ausente no MySQL.

Três opções:

  1. Crie o novo banco de dados, desative o servidor, mova os arquivos de uma pasta de banco de dados para outra e reinicie o servidor.Observe que isso só funcionará se TODAS as suas tabelas forem MyISAM.

  2. Crie o novo banco de dados, use CREATE TABLE...instruções LIKE e, em seguida, use INSERT ...SELECT * FROM instruções.

  3. Use mysqldump e recarregue esse arquivo.

A maneira simples

Mude para o diretório do banco de dados:

cd /var/lib/mysql/

Desligue o MySQL...Isso é importante!

/etc/init.d/mysql stop

Ok, desta forma não funciona para bancos de dados InnoDB ou BDB.

Renomear banco de dados:

mv old-name new-name

...ou a mesa...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Reinicie o MySQL

/etc/init.d/mysql start

Feito...

OK, desta forma não funciona com bancos de dados InnoDB ou BDB.Neste caso você terá que despejar o banco de dados e importá-lo novamente.

Só recentemente descobri uma maneira muito boa de fazer isso, funciona com MyISAM e InnoDB e é muito rápida:

RENAME TABLE old_db.table TO new_db.table;

Não me lembro onde li, mas o crédito vai para outra pessoa, não para mim.

Você pode usar este script de shell:

Referência: Como renomear um banco de dados 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"

Está funcionando:

$ sh rename_database.sh oldname newname

Isto é o que eu uso:

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

A maneira mais simples e à prova de balas de fazer um completo renomear (incluindo descartar o banco de dados antigo no final, para que seja renomeado em vez de uma cópia):

mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname

Passos:

  1. Copie as linhas no Bloco de Notas.
  2. Substitua todas as referências a "olddbname", "newdbname", "mypassword" (+ opcionalmente "root") pelos seus equivalentes.
  3. Execute um por um na linha de comando (inserindo "y" quando solicitado).

O MySQL não suporta renomear um banco de dados através de sua interface de comando no momento, mas você pode renomear o banco de dados se tiver acesso ao diretório no qual o MySQL armazena seus bancos de dados.Para instalações padrão do MySQL, isso geralmente está no diretório Data, no diretório onde o MySQL foi instalado.Localize o nome do banco de dados que deseja renomear no diretório Dados e renomeie-o.Renomear o diretório pode causar alguns problemas de permissão.Estar ciente.

Observação: Você deve parar o MySQL antes de renomear o banco de dados

Eu recomendaria criar um novo banco de dados (usando o nome desejado) e exportar/importar os dados necessários do antigo para o novo.Bem simples.

Quando você renomeia um banco de dados no PHPMyAdmin, ele cria um dump, descarta e recria o banco de dados com o novo nome.

Para quem é usuário de Mac, o Sequel Pro possui a opção Renomear banco de dados no menu Banco de dados.http://www.sequelpro.com/

Bem, existem 2 métodos:

Método 1: Um método bem conhecido para renomear o esquema do banco de dados é descartar o esquema usando Mysqldump e restaurá-lo em outro esquema e, em seguida, descartar o esquema antigo (se necessário).

Da casca

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

Embora o método acima seja fácil, consome tempo e espaço.E se o esquema for mais do que um 100 GB? Existem métodos onde você pode agrupar os comandos acima para economizar espaço, mas isso não economizará tempo.

Para remediar tais situações, existe outro método rápido para renomear esquemas, porém, alguns cuidados devem ser tomados ao fazê-lo.

Método 2: O MySQL tem um recurso muito bom para renomear tabelas que funciona até mesmo em esquemas diferentes.Esta operação de renomeação é atômica e ninguém mais pode acessar a tabela enquanto ela é renomeada.Isso leva pouco tempo para ser concluído, pois a alteração do nome de uma tabela ou de seu esquema é apenas uma alteração de metadados.Aqui está a abordagem processual para renomear:

Crie o novo esquema de banco de dados com o nome desejado.Renomeie as tabelas do esquema antigo para o novo esquema, usando o comando “RENAME TABLE” do MySQL.Elimine o esquema de banco de dados antigo.If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too.O “RENAME TABLE” do MySQL falha se houver gatilhos nas tabelas.Para remediar isso, podemos fazer o seguinte:

1) Dump the triggers, events and stored routines in a separate file. Isso é feito usando os sinalizadores -E, -R (além de -t -d que despeja os gatilhos) no comando mysqldump.Depois que os gatilhos forem descartados, precisaremos removê-los do esquema para que o comando RENAME TABLE funcione.

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

2) Gere uma lista apenas de tabelas “BASE”.Eles podem ser encontrados usando uma consulta em information_schema.TABLES mesa.

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

3) Despeje as visualizações em um arquivo de saída.As visualizações podem ser encontradas usando uma consulta no mesmo information_schema.TABLES mesa.

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) Solte os gatilhos nas tabelas atuais no old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Restaure os arquivos de despejo acima assim que todas as tabelas “Base” encontradas na etapa 2 forem renomeadas.

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

Complexidades com os métodos acima:Talvez seja necessário atualizar os GRANTS dos usuários para que correspondam ao esquema_name correto.Isso poderia ser corrigido com um simples UPDATE nas tabelas mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db atualizando o nome old_schema para new_schema e chamando “Flush privilégios;”.Embora o “método 2″ pareça um pouco mais complicado que o “método 1″, ele é totalmente programável.Um script bash simples para executar as etapas acima na sequência adequada pode ajudá-lo a economizar espaço e tempo ao renomear os esquemas de banco de dados na próxima vez.

A equipe Percona Remote DBA escreveu um script chamado “rename_db” que funciona da seguinte maneira:

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

Para demonstrar o uso deste script, usei um esquema de amostra “emp”, criei gatilhos de teste e armazenei rotinas nesse esquema.Tentará renomear o esquema do banco de dados usando o script, que leva alguns segundos para ser concluído, em oposição ao demorado método de despejo/restauração.

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               |
+--------------------+

Como você pode ver na saída acima, o esquema do banco de dados “emp” foi renomeado para “emp_test” em menos de um segundo.Por último, este é o script da Percona usado acima para o “método 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

É possível renomear todas as tabelas em um banco de dados para outro banco de dados sem precisar fazer um dump completo e uma restauração.

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

No entanto, quaisquer gatilhos no banco de dados de destino não ficarão satisfeitos.Você precisará descartá-los primeiro e recriá-los após a renomeação.

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

A maioria das respostas aqui está errada por um de dois motivos:

  1. Você não pode simplesmente usar RENAME TABLE, porque pode haver visualizações e gatilhos.Se houver gatilhos, RENAME TABLE falhará
  2. Você não pode usar o mysqldump se quiser renomear "rapidamente" (conforme solicitado na pergunta) um grande banco de dados

Percona tem uma postagem no blog sobre como fazer isso bem:https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

e roteiro postado (feito?) por Simon R Jones que faz o que é sugerido naquele post.Corrigi um bug que encontrei no script.Você pode vê-lo aqui:

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

Aqui está uma cópia dele:

#!/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

Salve-o em um arquivo chamado rename_db e torne o script executável com chmod +x rename_db então use como ./rename_db localhost old_db new_db

Aqui está um arquivo em lote que escrevi para automatizá-lo na linha de comando, mas para Windows/MS-DOS.

A sintaxe é rename_mysqldb banco de dados newdatabase -u [usuário] -p[senha]

:: ***************************************************************************
:: 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=

O procedimento armazenado do TodoInTX não funcionou muito bem para mim.Aqui está minha tentativa:

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

Passos :

  1. Bater http://localhost/phpmyadmin/
  2. Selecione seu banco de dados
  3. Clique na guia Operações
  4. Haverá uma guia como "Renomear banco de dados para".Adicione um novo nome e marque Ajustar privilégios.
  5. Clique em Ir.

enter image description here

EU fez uma pergunta sobre falha do servidor tentando contornar o tempo de inatividade ao restaurar bancos de dados muito grandes usando o MySQL Proxy.Não tive sucesso, mas no final percebi que o que eu queria era a funcionalidade RENAME DATABASE porque dump/import não era uma opção devido ao tamanho do nosso banco de dados.

Há uma funcionalidade RENAME TABLE incorporada ao MySQL, então acabei escrevendo um script Python simples para fazer o trabalho para mim.Eu tenho postou no GitHub caso possa ser útil para outros.

Para sua comodidade, segue abaixo um pequeno shellscript que deve ser executado com dois parâmetros:nome do banco de dados e novo nome do banco de dados.

Pode ser necessário adicionar parâmetros de login às linhas mysql se você não usar o arquivo .my.cnf em seu diretório inicial.Faça um backup antes de executar este 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"

O método mais simples é usar o software HeidiSQL.É gratuito e de código aberto.Ele roda em Windows e em qualquer Linux com Vinho (execute aplicativos do Windows em Linux, BSD, Solaris e Mac OS X).

Para baixar o HeidiSQL, vá para http://www.heidisql.com/download.php.

Para baixar o Wine, vá para http://www.winehq.org/.

Para renomear um banco de dados no HeidiSQL, basta clicar com o botão direito no nome do banco de dados e selecionar 'Editar'.Em seguida, insira um novo nome e pressione 'OK'.

É tão simples.

Aqui está uma maneira rápida de gerar um script sql de renomeação, se você tiver muitas tabelas para mover.

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

Parece que ninguém mencionou isso, mas aqui está outra maneira:

create database NewDatabaseName like OldDatabaseName;

então para cada tabela faça:

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

então, se você quiser,

drop database OldDatabaseName;

Essa abordagem teria a vantagem de fazer toda a transferência no servidor com tráfego de rede quase nulo, portanto, seria muito mais rápido do que um despejo/restauração.

Se você tiver procedimentos/visualizações/etc armazenados, talvez queira transferi-los também.

Para usuários de Mac, você pode usar Sequel Pro (gratuito), que oferece apenas a opção de renomear bancos de dados.Embora não exclua o banco de dados antigo.

depois de abrir o banco de dados relevante, basta clicar: Database --> Rename database...

No Administrador MySQL faça o seguinte:

  1. Em Catálogos, crie um novo esquema de banco de dados.
  2. Vá para Backup e crie um backup do esquema antigo.
  3. Execute o backup.
  4. Vá para restaurar e abra o arquivo criado na Etapa 3.
  5. Selecione 'outro esquema' em esquema de destino e selecione o novo esquema de banco de dados.
  6. Inicie a restauração.
  7. Verifique o novo esquema e, se parecer bom, exclua o antigo.

em phpmyadmin você pode facilmente renomear o banco de dados

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

peça para descartar a tabela antiga e recarregar os dados da tabela, clique em OK em ambos

Seu banco de dados foi renomeado

Se você estiver usando phpMyAdmin você pode ir para a guia "operações" depois de selecionar o banco de dados que deseja renomear.Em seguida, vá para a última seção “copiar banco de dados para” (ou algo parecido), dê um nome e selecione as opções abaixo.Nesse caso, acho que você deve marcar as caixas de seleção "estrutura e dados" e "criar banco de dados antes de copiar" e, por fim, pressionar o botão "ir" nessa seção.

A propósito, estou usando o phpMyAdmin em espanhol, então não tenho certeza de quais são os nomes das seções em inglês.

Aqui está um snippet Bash de uma linha para mover todas as tabelas de um esquema para outro:

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

O comando de histórico no início simplesmente garante que os comandos do MySQL contendo senhas não sejam salvos no histórico do shell.

Certifique-se de que db_user tem permissões de leitura/gravação/descarte no esquema antigo e permissões de leitura/gravação/criação no novo esquema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top