ti-enxame.com

Como faço para renomear rapidamente um banco de dados MySQL (alterar nome do esquema)?

O manual do MySQL em MySQL cobre isso.

Normalmente eu apenas despejo o banco de dados e reimportei-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, existem apenas em algumas versões, e é uma má idéia geral .

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

866
deadprogrammer

Para o InnoDB, o seguinte parece funcionar: crie o novo banco de dados vazio e, em seguida, 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 o seu banco de dados não tiver senha, remova a parte -u username -ppassword.
  • Se alguma tabela tiver um gatilho, ele não poderá ser movido para outro banco de dados usando o método acima (resultará no erro Trigger in wrong schema). Se for esse o caso, use uma maneira tradicional de clonar um banco de dados e, em seguida, descartar o antigo:

    mysqldump old_db | mysql new_db

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

    mysqldump -R old_db | mysql new_db

756
Thorsten

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 o uso de I/O, conforme sugerido por @Pablo Marin-Garcia:

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

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

No phpMyAdmin, selecione o banco de dados que você deseja selecionar. Nas abas há um chamado Operações, vá para a seção de renomeação. Isso é tudo.

Como muitos sugeriram, crie um novo banco de dados com o novo nome, despeje todas as tabelas do banco de dados antigo no novo banco de dados e elimine o banco de dados antigo.

Enter image description here

195
raphie

Você pode usar o 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 (eu sugeri originalmente o primeiro e alguém "melhorou" minha resposta para usar GROUP_CONCAT. Faça a sua escolha, mas eu 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 fonte e alvo respectivamente)

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

Observe que GROUP_CONCAT tem um limite de tamanho 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).

97
ErichBSchulz

Emulando o comando RENAME DATABASE em falta 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 deEmulando o comando RENAME DATABASE em falta no MySQL.

33
Marciano

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 a outra e reinicie o servidor. Note que isso só funcionará se TODAS as suas tabelas forem MyISAM.

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

  3. Use mysqldump e recarregue com esse arquivo.

24
longneck

O caminho mais simples

Mude para o diretório do banco de dados:

cd /var/lib/mysql/

Encerre 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. Nesse caso, você precisa despejar o banco de dados e reimportá-lo.

23
DeeCee

Eu só recentemente encontrei uma maneira muito legal de fazer isso, funciona com MyISAM e InnoDB e é muito rápido:

RENAME TABLE old_db.table TO new_db.table;

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

19
Amr Mostafa

Você pode usar este script da 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
18
Grijesh Chauhan

Isso é 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;
16
eaykin

A maneira mais simples à prova de balas e erros de fazer um complete rename (incluindo descartar o banco de dados antigo no final, para que seja uma renomeação 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") por seus equivalentes.
  3. Execute um por um na linha de comando (inserindo "y" quando solicitado).
15
Steve Chambers

O MySQL não suporta a renomeação de 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 você deseja renomear no diretório Dados e renomeie-o. Renomear o diretório pode causar alguns problemas de permissão. Estar ciente.

Nota: Você deve parar o MySQL antes que você possa renomear o banco de dados

Eu recomendaria criar um novo banco de dados (usando o nome que você deseja) e exportar/importar os dados que você precisa do antigo para o novo. Bem simples.

14
bryanpearson

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

13
UnkwnTech

Bem, existem dois métodos:

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

Da Shell

 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 que um 100GB? Existem métodos onde você pode canalizar os comandos acima juntos para economizar espaço, no entanto, não economizará tempo.

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

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

Crie o novo esquema do banco de dados com o nome desejado. Renomeie as tabelas de esquema antigo para novo esquema, usando o comando “RENAME TABLE” do MySQL. Elimine o esquema do banco de dados antigo. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. A "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. Isto é feito usando os flags -E, -R (além de -t -d que faz o dump dos triggers) para o comando mysqldump. Uma vez que os gatilhos são despejados, 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) Gera uma lista de apenas tabelas “BASE”. Estes podem ser encontrados usando uma consulta na tabela information_schema.TABLES.

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

3) Dump as vistas em um arquivo out. As visualizações podem ser encontradas usando uma consulta na mesma tabela 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) Soltar os gatilhos nas tabelas atuais no old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Restaurar os arquivos de despejo acima, uma vez 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: Podemos precisar atualizar os GRANTS para os usuários de modo que correspondam ao schema_name correto. Estes podem ser corrigidos com uma 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 privileges;”. Embora o “método 2” pareça um pouco mais complicado do que o “método 1 ″, isso é totalmente roteirizável. Um script bash simples para executar as etapas acima na sequência apropriada pode ajudá-lo a economizar espaço e tempo ao renomear os esquemas do banco de dados na próxima vez.

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

[[email protected]~]# /tmp/rename_db
rename_db <server> <database> <new_database>

Para demonstrar o uso desse script, usei um esquema de amostra “emp”, criei gatilhos de teste, rotinas armazenadas 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 método de despejo/restauração demorado.

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


[[email protected] ~]# 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 fim, este é o script do Percona que é 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
12
Sathish D

Para aqueles que são usuários de Mac, o Sequel Pro possui uma opção Renomear Banco de Dados no menu Banco de Dados. http://www.sequelpro.com/

12
Duke

É possível renomear todas as tabelas dentro de um banco de dados para estar sob outro banco de dados sem ter que fazer um despejo completo e restaurar.

 PROCEDIMENTO DE QUEDA SE EXISTE mysql.rename_db; 
 DELIMITER || 
 CREATE PROCEDURE mysql.rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100)) 
 BEGIN 
 SELECIONAR CONCAT ('CREATE DATABASE', new_db, ';') `# criar novo banco de dados`; 
 SELECIONAR CONCAT ('RENAME TABLE`', old_db, '`.`', table_name, '`TO`', new_db, '`.`', table_name, '`;') `# alter table` FROM information_schema.tables WHERE table_schema = old_db; 
 SELECIONAR CONCAT ('DROP DATABASE' ' , old_db, '`;')` # drop old database`; 
 END || 
 DELIMITER; 
 
 $ tempo mysql -uroot -e "chamar mysql .rename_db ('db1', 'db2'); " | mysql -uroot 

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

 mysql -uroot -e "chame o mysql.rename_db ('teste', 'blah2');" | mysql -uroot 
 ERRO 1435 (HY000) na linha 4: Disparar no esquema errado 
9
TodoInTX

A maioria das respostas aqui está errada por uma das duas razões:

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

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 nesse post. Eu consertei um bug que encontrei no script. Você pode vê-lo aqui:

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

Aqui está uma cópia:

#!/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 e use-o como ./rename_db localhost old_db new_db

8
ryantm

Aqui está um arquivo em lote que eu escrevi para automatizá-lo a partir da linha de comando, mas para o Windows/MS-DOS.

A sintaxe é rename_mysqldb database 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=
7
Johnny

O procedimento armazenado de TodoInTX não funcionou bem para mim. Aqui está minha facada nisso:

 - procedimento armazenado rename_db: Renomeia um banco de dados do meu meio de cópia de tabela 
 - Advertências: 
 - Irá sobrescrever qualquer banco de dados existente com o mesmo nome que o 'novo' nome do banco de dados. 
 - APENAS copia tabelas; procedimentos armazenados e outros objetos do banco de dados não são copiados. 
 - Tomer Altman ([email protected]) 
 
 delimitador //
 PROCEDIMENTO DE DROGAS SE EXISTE rename_db; 
 CREATE PROCEDURE rename_db (IN old_db VARCHAR (100), NO new_db VARCHAR (100)) 
 BEGIN 
 DECLARAR current_table VARCHAR (100); 
 DECLARAR feito INT DEFAULT 0; 
 DECLARAR old_tables CURSOR FOR selecionar table_name de information_schema.tables onde table_schema = old_db; 
 DECLARAR CONTINUAR MANIPULADOR NÃO ENCONTRADO SET done = 1; 
 
 SET @ saída = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';'); 
 PREPARE stmt FROM @output; 
 EXECUTAR stmt; 
 
 SET @output = CONCAT ('CREATE SCHEMA SE NÃO EXISTE', new_db, ';'); 
 PREPARE stmt FROM @output; 
 EXECUTAR stmt; 
 
 OPEN old_tables; 
 REPETIR 
 FETCH old_tables INTO current_table; ____.] SE NÃO FEITO ENTÃO 
 SET @ saída = CONCAT ('alter table', old_db, '.', Tabela_atual, 'renomear', new_db, '.', Tabela_atual, ';'); 
 PREPARE ESTADO DE @ saída; 
 EXECUTAR o termo; 
 
 FIM SE; 
 ATÉ finalizado REPETIR; 
 
 FECHAR old_tables; 
 
 END //
 Delimiter; 
7
user757945

Para sua conveniência, abaixo está um pequeno shellscript que deve ser executado com dois parâmetros: db-name e new db-name.

Você pode precisar adicionar parâmetros de login às linhas mysql se não usar o arquivo .my.cnf em seu diretório home. Por favor, 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"
6
gerrit damen

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

Existe uma funcionalidade RENAME TABLE embutida no MySQL, então acabei escrevendo um script Python simples para fazer o trabalho para mim. Eu postou no GitHub no caso de ser útil para os outros.

6
cclark

Passos :

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

 enter image description here

6
Shubham Jain

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

Para fazer o download do HeidiSQL, goto http://www.heidisql.com/download.php .

Para baixar o Wine, goto http://www.winehq.org/ .

Para renomear um banco de dados no HeidiSQL, clique com o botão direito do mouse no nome do banco de dados e selecione 'Editar'. Em seguida, digite um novo nome e pressione 'OK'.

É tão simples.

5
Fathah Rehman P

Aqui está uma maneira rápida de gerar renomear script sql, 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' ;
4
yantaq

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 um tráfego de rede próximo a zero, portanto, ele será muito mais rápido do que um dump/restore.

Se você tiver stored procedures/views/etc, você pode querer transferi-los também.

4
Tuncay Göncüoğlu

Para usuários do mac, você pode usar Sequel Pro (free), que apenas fornece a opção de renomear bancos de dados. Embora não exclua o DB antigo.

depois de abrir o DB relevante, basta clicar em: Database -> Rename database...

4
Roee Gavirel

No MySQL Administrator, 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 backup.
  4. Vá para Restaurar e abra o arquivo criado na etapa 3.
  5. Selecione 'Outro Esquema' sob Esquema de Destino e selecione o novo esquema do banco de dados.
  6. Inicie a restauração.
  7. Verifique o novo esquema e, se parecer bom, exclua o antigo.
3
Tom

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

pedir para soltar a tabela antiga e recarregar os dados da tabela, clique em OK em ambos

Seu banco de dados é renomeado

3
murtaza.webdev

Se você estiver usando phpMyAdmin você pode ir para a aba "operações" depois de ter selecionado 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. Neste caso, eu acho que você deve selecionar "estrutura e dados" e "criar banco de dados antes de copiar" caixas de seleção e, finalmente, pressione o botão "go" nessa seção.

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

3
ecruz

Aqui está um snippet de 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 history no início simplesmente assegura que os comandos do MySQL que contêm senhas não sejam salvos no histórico do Shell.

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

3
coffeefiend

Eu fiz assim: Faça backup do seu banco de dados existente. Ele lhe dará um db.Zip.tmp e, em seguida, no prompt de comando

"C:\Arquivos de Programas (x86)\MySQL\MySQL Server 5.6\bin\mysql.exe" -h localhost -u raiz -p [senha] [nome do novo db] <"C:\Backups\db.Zip.tmp "

3
Samra

Você pode fazer isso de duas maneiras.

  1. RENAME TABLE old_db.table_name TO new_db.table_name;
  2. Vá para operações-> lá você pode ver a aba Table options. você pode editar o nome da tabela lá.
2
jeeva

Este é o script em lote que escrevi para renomear um banco de dados no 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%"
2
Nadav Benedek

ALTER DATABASE é o caminho proposto em torno disso pelo MySQL e RENAME DATABASE é descartado.

De13.1.32 RENAME DATABASE Sintaxe:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Esta declaração foi adicionada no MySQL 5.1.7, mas foi considerada perigosa e foi removida no MySQL 5.1.23.

2
xelber

Isso funciona para todos os bancos de dados e funciona renomeando cada tabela com o kit de ferramentas maatkit mysql

Use o mk-find para imprimir e renomear cada tabela. A página man tem muito mais opções e exemplos

mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"

Se você tem o maatkit instalado ( que é muito fácil ), então esta é a maneira mais simples de fazê-lo.

2
Morgan Christiansson

No caso em que você começa a partir de um arquivo de despejo com vários bancos de dados, você pode executar um sed no dump:

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

Então importe seu despejo. Apenas garanta que não haverá conflitos de nome.

1
RotS

Nem a solução de TodoInTx nem a solução adaptada de user757945 funcionaram para mim no MySQL 5.5.16, então aqui está minha versão adaptada:

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 ;

Espero que ajude alguém que está na minha situação! Nota: @sql_string permanecerá na sessão depois. Eu não consegui escrever essa função sem usá-la.

1
Milosz

Eu usei o seguinte método para renomear o banco de dados

  1. faça backup do arquivo usando o mysqldump ou qualquer ferramenta de banco de dados, por exemplo, heidiSQL, administrador do mysql, etc.

  2. Abra o arquivo de backup (por exemplo, arquivo de backup.sql) em algum editor de texto.

  3. Pesquise e substitua o nome do banco de dados e salve o arquivo.

4.Restaurar o arquivo sql editado

1
Adarsha

Se você usar visões hierárquicas (visualizações puxando dados de outras visões), a importação da saída bruta do mysqldump pode não funcionar, já que o mysqldump não se importa com a ordem correta das visões. Devido a isso, eu escreveu script que reordena as views para corrigir a ordem na hora.

Isso parece assim:

#!/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);
            }
        }
    }
}

Uso:
mysqldump -u username -v olddatabase -p | ./mysqldump_view_reorder.pl | mysql -u username -p -D newdatabase

1
gadelat

Vocês estão indo atirar em mim para isso, e muito provavelmente isso não vai funcionar toda vez, e com certeza, é contra toda a lógica blá blá ... Mas o que acabei de tentar é ... PARE o mecanismo MySQL, faça o login como root e simplesmente renomeou o DB no nível do sistema de arquivos ....

Eu estou no OSX, e só mudei o caso, de bedbf para BEDBF. Para minha surpresa, funcionou...

Eu não recomendaria isso em um banco de dados de produção. Eu apenas tentei isso como um experimento ...

Boa sorte de qualquer maneira :-)

0
Lawrence

Eu postei este Como faço para alterar o nome do banco de dados usando o MySQL? hoje depois de dias de coceira na cabeça e puxões de cabelo. A solução é muito simples exportar um esquema para um arquivo .sql e abrir o arquivo e alterar o nome do banco de dados/esquema na seção sql CREAT TABLE na parte superior. Existem três instâncias ou mais e podem não estar no topo da página se os esquemas multible forem salvos no arquivo. É possível editar todo o banco de dados dessa maneira, mas espero que em grandes bancos de dados possa ser um problema seguir todas as instâncias de uma propriedade ou índice de tabela.

0
E.R.Rider

I). Não há nenhuma maneira diretamente pelo qual vc pode mudar o nome de um banco de dados existente, mas vc pode atingir ur target seguindo os passos abaixo: - 1). Crie o newdb. 2). Use newdb. 3). criar tabela table_name (select * from olddb.table_name);

Fazendo acima, você copia os dados da tabela do olddb e os insere na tabela newdb. Dê o nome da mesa mesmo.

II). RENAME TABLE old_db.table_name TO new_db.table_name;

0
rajesh