¿Cómo cambio rápidamente el nombre de una base de datos MySQL (cambio de nombre de esquema)?

El manual de MySQL en MySQL cubre esto.

Por lo general, simplemente vuelco la base de datos y la vuelvo a importar con un nuevo nombre. Esta no es una opción para bases de datos muy grandes. Aparentemente RENAME {DATABASE | SCHEMA} db_name TO new_db_name; hace cosas malas, existe solo en un puñado de versiones y es una mala idea en general.

Esto necesita funcionar con InnoDB, que almacena las cosas de manera muy diferente a MyISAM.

preguntado el 15 de septiembre de 08 a las 19:09

Esta declaración RENAME DATABASE Syntax se agregó en MySQL 5.1.7 pero se consideró peligrosa y se eliminó en MySQL 5.1.23. -

Con suerte, MySQL implementará una nueva y funcional RENAME DATABASE declaración que no tiene ningún peligro, ya que actualmente no hay una manera fácil de realizar esta tarea. No hay ninguna razón obvia por la que fuera peligroso en el documentación por lo que deberían poder hacer un reemplazo. Al menos la gente ha puesto errores de solicitud de funciones en su sitio web. Por ejemplo, bugs.mysql.com/bug.php?id=58593 y bugs.mysql.com/bug.php?id=1698. -

los enlaces ahora están rotos ... -

30 Respuestas

Para InnoDB, lo siguiente parece funcionar: cree la nueva base de datos vacía, luego cambie el nombre de cada tabla a la nueva base de datos:

RENAME TABLE old_db.table TO new_db.table;

Deberá ajustar los permisos después de eso.

Para la creación de scripts en un shell, puede utilizar cualquiera de los siguientes:

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

OR

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

  • No hay espacio entre la opción -p y la contraseña. Si su base de datos no tiene contraseña, elimine el -u username -ppassword parte.
  • Si alguna tabla tiene un disparador, no se puede mover a otra base de datos usando el método anterior (resultará Trigger in wrong schema error). Si ese es el caso, use una forma tradicional de clonar una base de datos y luego elimine la anterior:

    mysqldump old_db | mysql new_db

  • Si tiene procedimientos almacenados, puede copiarlos posteriormente:

    mysqldump -R old_db | mysql new_db

Respondido 19 Abr '20, 14:04

Esta es una buena opción y el camino a seguir si su base de datos es grande pero no tiene tantas tablas (o está dispuesto a escribir un script para recorrer todas las tablas). Además en innodb es solo un cambio de nombre lógico y en MyISAM, dependiendo de su sistema de archivos, sería un cambio de nombre lógico o una copia real de datos en el disco. - Pablo Marín-García

Acabo de hacer esto con una base de datos InnoDB con más de 30 tablas, usando la configuración file_per_table, y aunque algunas tablas tenían más de 3 millones de filas, se completó en <1 segundo. Simplemente parece mover los archivos en el almacenamiento, en lugar de hacer algo más complicado ... +2 si es posible :) - david rix

Tenga en cuenta que esto no funcionará para las vistas. No puede cambiar el nombre de las vistas para que salten de una base de datos a otra. Usar DROP VIEW y CREATE VIEW en lugar de. Torpe, sí. Es posible que desee hacer un mysqldump para mover las vistas, después de mover primero todas las tablas. También tenga en cuenta que SHOW TABLES mostrará tablas Y vistas, así que tenga cuidado. - tuomassalo

Además, esto no funcionará para ninguna tabla con activadores. Necesita encontrar, volcar y soltar disparadores antes de mover la tabla, luego importar los disparadores volcados a la base de datos de destino. - olfan

Enlace actualizado (es decir, en funcionamiento) que documenta el motivo RENAME DATABASE fue removido: dev.mysql.com/worklog/task/?id=4030 - Alexis

Utilice estos simples comandos:

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

O para reducir las E / S, use lo siguiente como lo sugiere @Pablo Marin-García:

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

respondido 09 nov., 15:11

Como dijo el OP, "[esta] no es una opción para bases de datos muy grandes". - almohada

No olvide DROP la base de datos original - Pavel Radzivilovsky

¡Brillante respuesta! Un par de sugerencias para mejorar aún más, ya que probablemente todas las habilidades lo estén buscando en Google: (1) Mueva el fragmento de código de Pablo Marin-García a la parte superior, ya que parece la mejor respuesta (2) Ponga -p<password> en lugar de -p en todas partes para que las declaraciones se ejecuten sin que aparezca un mensaje. - Steve Cámaras

Al usar la versión canalizada, obtengo dos mensajes "Ingresar contraseña:" así: Enter password: Enter password: Parece que se necesita una contraseña, pero no ambas. ¿Me falta algún detalle? - Ryan

Me sorprende que nadie haya mencionado esto, pero debería agregar el --routines flag a los comandos mysqldump también, para garantizar que los procedimientos almacenados se copien. - Carlos P.

Creo que la solución es más simple y fue sugerida por algunos desarrolladores. phpMyAdmin tiene una operación para esto.

Desde phpMyAdmin, seleccione la base de datos que desea seleccionar. En las pestañas hay una llamada Operaciones, vaya a la sección de cambio de nombre. Eso es todo.

Como muchos sugirieron, crea una nueva base de datos con el nuevo nombre, vierte todas las tablas de la antigua base de datos en la nueva base de datos y elimina la antigua base de datos.

Ingrese la descripción de la imagen aquí

respondido 09 nov., 15:12

Suponiendo que incluso tenga php en su entorno o use phpmyadmin. - Chris

Bastante peligroso incluso si tiene phpMyAdmin: el back-end podría fallar en medio del proceso dejando las dos bases de datos en un estado desconocido, o podría llevar mucho tiempo, lo que provocaría que el front-end se cuelgue o que PHP agote el tiempo de espera. - mozboz

Eso es cierto @mozboz, pero he hecho esto durante 10 años y nunca tuve ese problema. Es lo mismo si ejecuta el comando a través de un shell y su computadora se bloquea. Existe una posibilidad, pero ¿qué? 1 a 1 billón? - rafia

Un script a través de la consola también es un front-end que puede colgarse con los mismos problemas. - Greg

Sin embargo, las operaciones de la consola son mucho más confiables que PhpMyAdmin, especialmente cuando se trata de grandes bases de datos, que es el caso del OP. Personalmente, recomendaría encarecidamente cualquier método de consola en lugar de PMA si tiene una base de datos razonablemente grande. No hace falta decir que, en bases de datos pequeñas, PMA es igual de bueno. - Teodor Sandu

Puede usar SQL para generar un script SQL para transferir cada tabla en su base de datos de origen a la base de datos de destino.

Debe crear la base de datos de destino antes de ejecutar el script generado a partir del comando.

Puede usar cualquiera de estos dos scripts (originalmente sugerí el primero y alguien "mejoró" mi respuesta para usar GROUP_CONCAT. Elige tú, pero prefiero el original):

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

or

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

($ 1 y $ 2 son fuente y destino respectivamente)

Esto generará un comando SQL que luego deberá ejecutar.

Tenga en cuenta que GROUP_CONCAT tiene un límite de longitud predeterminado que puede excederse para bases de datos con una gran cantidad de tablas. Puedes alterar ese límite corriendo SET SESSION group_concat_max_len = 100000000; (o algún otro gran número).

Respondido 24 Feb 18, 03:02

@BlakeFrederick No usa RENAME DATABASE, ¿cuál es el problema? - esmoquin

¿Funciona esto si la tabla tiene restricciones de referencia? Espero que no. - dolmen

Emulando a los perdidos RENAME DATABASE comando en MySQL:

  1. Crear una nueva base de datos
  2. Cree las consultas de cambio de nombre con:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
    
  3. Ejecuta esa salida

  4. Eliminar base de datos antigua

Fue tomado de Emulando el comando RENAME DATABASE faltante en MySQL.

respondido 09 nov., 15:12

¡Perfecto! Probé esto con tablas InnoDB y MyISAM. ¡La solución más rápida que probé (cambiar el nombre de la tabla es casi instantáneo, sin demora)! - Felipe

¡Estupendo! Solo recuerda arreglar los privilegios después. - Farynaio

PD. Es mejor hacer esto antes de ejecutar las consultas de cambio de nombre si está trabajando en una base de datos en vivo. - Farynaio

¿Funciona esto si la tabla tiene restricciones de referencia? Espero que no. - dolmen

Puede utilizar este script de shell:

Referencia: ¿Cómo cambiar el nombre de una base de datos 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"

Esta funcionando:

$ sh rename_database.sh oldname newname

Respondido 09 Abr '18, 16:04

Cuidado con esto. Si no está iniciando sesión con el usuario root, es posible que tenga permisos limitados. Causando que el cambio de nombre falle pero que la caída sea exitosa, lo que resulta en una base de datos descartada Buen guión de lo contrario. - Lex

yo añadí set -e al principio de la secuencia de comandos, lo que provocará que la ejecución finalice en caso de error y debería mitigar ese problema. - Mikkel

Tres opciones:

  1. Cree la nueva base de datos, apague el servidor, mueva los archivos de una carpeta de base de datos a otra y reinicie el servidor. Tenga en cuenta que esto solo funcionará si TODAS sus tablas son MyISAM.

  2. Cree la nueva base de datos, utilice las sentencias CREATE TABLE ... LIKE y luego utilice las sentencias INSERT ... SELECT * FROM.

  3. Use mysqldump y vuelva a cargar con ese archivo.

respondido 09 nov., 15:11

+ para la referencia myisam. No podía entender por qué esto no me había funcionado. - cristian payne

La pregunta establece que esto debe funcionar para InnoDB, no MyISAM - D-rock

@ D-Rock dígale eso a Google, quien trae gente aquí según el título. - jiggunjer

La forma sencilla

Cambie al directorio de la base de datos:

cd /var/lib/mysql/

Apague MySQL ... ¡Esto es importante!

/etc/init.d/mysql stop

De acuerdo, esta forma no funciona para bases de datos InnoDB o BDB.

Cambiar el nombre de la base de datos:

mv old-name new-name

... o la 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 MySQL

/etc/init.d/mysql start

Hecho...

De acuerdo, esta forma no funciona con bases de datos InnoDB o BDB. En este caso, debe volcar la base de datos y volver a importarla.

Respondido el 20 de junio de 20 a las 10:06

Cambiar el nombre de las carpetas rompe los juguetes. - Vinicius Pires

@Rahly, incluso si se establece un archivo por tabla, sigue siendo peligroso, las tablas creadas antes de que se estableciera un archivo por tabla estarán en problemas, a menos que sepa con certeza que la base de datos se creó después de que se estableció esa marca. - qian chen

Sin embargo, en términos generales, la mayoría de la gente va a tener sus sistemas de una forma u otra, la gente no va a cambiar al azar sobre si tener o no una tabla por archivo. Además, incluso en su escenario, si las tablas se crearon antes de la bandera, no existirían como archivos separados en primer lugar, por lo que el movimiento no funcionaría y aún es seguro, sin peligro. Recuerde, la base de datos NO se está ejecutando cuando se está realizando el traslado. - raly

El equivalente para mysql instalado con homebrew en OS X: launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist cd /usr/local/var/mysql mv old-name new-name launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist - Coberlin

Recientemente me encontré con una forma muy agradable de hacerlo, funciona con MyISAM e InnoDB y es muy rápido:

RENAME TABLE old_db.table TO new_db.table;

No recuerdo dónde lo leí, pero el crédito es para otra persona, no para mí.

contestado el 07 de mayo de 10 a las 14:05

@ArkadijKuzhel no lo creo. Creo que estás hablando de RENAME DATABASE. - robar subvención

Esto realmente ayudó, creé una nueva base de datos en blanco y luego usé el código, todas las tablas se importaron con los nombres deseados. - Julio ordinario

Esto tiene el mismo problema que la respuesta aceptada - "RENAME DATABASE resultó peligroso y se eliminó en MySQL 5.1.23" - de dev.mysql.com/doc/refman/5.1/en/rename-database.html - blake frederick

La forma más simple, infalible y a prueba de balas de hacer un completar rebautizar (incluida la eliminación de la base de datos anterior al final para que sea un cambio de nombre en lugar de una copia):

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

Pasos:

  1. Copie las líneas en el Bloc de notas.
  2. Reemplace todas las referencias a "olddbname", "newdbname", "mypassword" (+ opcionalmente "root") con sus equivalentes.
  3. Ejecute uno por uno en la línea de comando (ingresando "y" cuando se le solicite).

contestado el 16 de mayo de 17 a las 10:05

Evite agregar su contraseña a la consola, ya que no es segura. Si ya hizo esto, use history -cw para eliminar. En su lugar, deje la contraseña vacía e introdúzcala después de la solicitud. - Tomi C.

Está tardando demasiado, más de 20 minutos sin terminar. ¿Está bien cancelar? - Sigu Magwa

Esto es lo que 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;

Respondido 28 Oct 10, 16:10

No es factible para grandes bases de datos. - Mikel

Bueno, hay 2 métodos:

Método 1: Un método conocido para cambiar el nombre del esquema de la base de datos es volcar el esquema usando Mysqldump y restaurarlo en otro esquema, y ​​luego eliminar el esquema anterior (si es necesario).

De Shell

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

Aunque el método anterior es fácil, consume tiempo y espacio. ¿Y si el esquema es más que un 100 GB? Hay métodos en los que puede unir los comandos anteriores para ahorrar espacio, sin embargo, no ahorrará tiempo.

Para remediar estas situaciones, existe otro método rápido para cambiar el nombre de los esquemas, sin embargo, se debe tener cuidado al hacerlo.

Método 2: MySQL tiene una característica muy buena para cambiar el nombre de las tablas que incluso funciona en diferentes esquemas. Esta operación de cambio de nombre es atómica y nadie más puede acceder a la tabla mientras se le cambia el nombre. Esto lleva poco tiempo para completarse, ya que cambiar el nombre de una tabla o su esquema es solo un cambio de metadatos. Aquí hay un enfoque de procedimiento al hacer el cambio de nombre:

Cree el nuevo esquema de base de datos con el nombre deseado. Cambie el nombre de las tablas de esquema antiguo a esquema nuevo, usando el comando "RENAME TABLE" de MySQL. Elimine el esquema de base de datos anterior. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. "RENAME TABLE" de MySQL falla si existen disparadores en las tablas. Para remediar esto, podemos hacer lo siguiente:

1) Dump the triggers, events and stored routines in a separate file. Esto se hace usando los indicadores -E, -R (además de -t -d que descarga los disparadores) en el comando mysqldump. Una vez que se descargan los desencadenadores, tendremos que eliminarlos del esquema para que funcione el comando RENAME TABLE.

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

2) Genere una lista de solo tablas "BASE". Estos se pueden encontrar mediante una consulta en information_schema.TABLES mesa.

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

3) Volcar las vistas en un archivo de salida. Las vistas se pueden encontrar mediante una consulta en el mismo 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) Suelta los disparadores en las tablas actuales en old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Restaure los archivos de volcado anteriores una vez que se cambie el nombre de todas las tablas "Base" que se encuentran en el paso 2.

mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name;
...
$ mysql <new_schema> < views.out
$ mysql <new_schema> < stored_routines_triggers_events.out

Complejidades con los métodos anteriores: es posible que necesitemos actualizar las SUBVENCIONES para los usuarios para que coincidan con el nombre_esquema correcto. Estos podrían solucionarse con una simple ACTUALIZACIÓN en las tablas mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db actualizando el nombre old_schema a new_schema y llamando a “Flush privileges;”. Aunque el "método 2" parece un poco más complicado que el "método 1", esto es totalmente programable. Un script bash simple para llevar a cabo los pasos anteriores en la secuencia adecuada puede ayudarlo a ahorrar espacio y tiempo al cambiar el nombre de los esquemas de la base de datos la próxima vez.

El equipo de Percona Remote DBA ha escrito un script llamado "rename_db" que funciona de la siguiente manera:

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

Para demostrar el uso de este script, usó un esquema de muestra "emp", creó disparadores de prueba, almacenó rutinas en ese esquema. Intentará cambiar el nombre del esquema de la base de datos utilizando el script, que tarda algunos segundos en completarse en lugar del método de volcado / restauración que consume mucho tiempo.

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 puede ver en la salida anterior, el esquema de base de datos "emp" se renombró a "emp_test" en menos de un segundo. Por último, este es el script de Percona que se utiliza anteriormente para el "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

Respondido el 29 de enero de 14 a las 11:01

¿Qué pasa con las restricciones referenciales? - dolmen

MySQL no admite el cambio de nombre de una base de datos a través de su interfaz de comandos en este momento, pero puede cambiar el nombre de la base de datos si tiene acceso al directorio en el que MySQL almacena sus bases de datos. Para las instalaciones predeterminadas de MySQL, esto generalmente se encuentra en el directorio de datos en el directorio donde se instaló MySQL. Busque el nombre de la base de datos a la que desea cambiarle el nombre en el directorio de datos y cámbiele el nombre. Sin embargo, cambiar el nombre del directorio podría causar algunos problemas de permisos. Sea consciente.

Nota: Debe detener MySQL antes de poder cambiar el nombre de la base de datos

Recomendaría crear una nueva base de datos (usando el nombre que desee) y exportar / importar los datos que necesita de la antigua a la nueva. Bastante simple.

Respondido el 15 de Septiembre de 08 a las 22:09

pasos:

  1. Golpear http://localhost/phpmyadmin/
  2. Seleccione su base de datos
  3. Haga clic en la pestaña Operaciones
  4. Habrá una pestaña como "Cambiar el nombre de la base de datos a". Agregue un nuevo nombre y marque Ajustar privilegios.
  5. Haz clic en Ir.

enter image description here

Respondido el 19 de enero de 18 a las 08:01

Una solución phpMyAdmin suele ser una mala solución ya que algunos entornos tienen un entorno restringido. - Daniel Antunes Pinto

No es una "buena" solución, pero gracias de todos modos, ya que era lo que estaba buscando. - jamie

Vota si te funciona ... te ayudará ... gracias - Shubham jainista

Esto funciona para mí, en el entorno phpMyAdmin, +1 - William

Cuando cambia el nombre de una base de datos en PHPMyAdmin, crea un volcado, luego suelta y recrea la base de datos con el nuevo nombre.

Respondido el 15 de Septiembre de 08 a las 22:09

Tenga en cuenta que esta función está un poco oculta en la pestaña "Operaciones", cuando hace clic en la base de datos. - maris b

Para aquellos que son usuarios de Mac, Sequel Pro tiene una opción Cambiar nombre de base de datos en el menú Base de datos. http://www.sequelpro.com/

respondido 30 nov., 12:01

Tenga cuidado con esta opción si tiene vistas o activadores en su base de datos. Detrás de esta opción de menú hay un script que creará una nueva base de datos y moverá todas las tablas. Esto no funcionará para vistas o activadores, por lo que se dejarán atrás en su base de datos anterior. El resultado son dos bases de datos dañadas que necesitan reparación. - olfan

La mayoría de las respuestas aquí son incorrectas por una de dos razones:

  1. No puede simplemente usar RENAME TABLE, porque puede haber vistas y disparadores. Si hay desencadenantes, RENAME TABLE falla
  2. No puede usar mysqldump si desea "rápidamente" (como se solicita en la pregunta) cambiar el nombre de una base de datos grande

Percona tiene una publicación de blog sobre cómo hacer esto bien: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

y guión publicado (¿hecho?) por Simon R Jones que hace lo que se sugiere en esa publicación. Arreglé un error que encontré en el script. Puedes verlo aqui:

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

Aquí hay una copia del mismo:

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

Guárdelo en un archivo llamado rename_db y hacer que el script sea ejecutable con chmod +x rename_db entonces úsalo como ./rename_db localhost old_db new_db

Respondido el 17 de junio de 17 a las 00:06

Me gusta este guión, es casi universal. Sin embargo, no pudo procesar un caso cuando hay varias VIEWs encadenadas donde el definidor no es root. - ESargit

Es posible cambiar el nombre de todas las tablas dentro de una base de datos para que estén bajo otra base de datos sin tener que hacer un volcado completo y restaurar.

PROCEDIMIENTO DE SOLICITUD SI EXISTE mysql.rename_db; DELIMITER || CREAR PROCEDIMIENTO mysql.rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100)) BEGIN SELECT CONCAT ('CREATE DATABASE', new_db, ';') `# crear nueva base de datos`; 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`; FIN || DELIMITER; $ time mysql -uroot -e "llamar a mysql.rename_db ('db1', 'db2');" | mysql -uroot

Sin embargo, cualquier disparador en la base de datos de destino no será feliz. Primero deberá soltarlos y luego volver a crearlos después del cambio de nombre.

mysql -uroot -e "llamar a mysql.rename_db ('prueba', 'blah2');" | mysql -uroot ERROR 1435 (HY000) en la línea 4: Disparador en esquema incorrecto

contestado el 19 de mayo de 10 a las 18:05

pequeño ajuste que hace que esto funcione con mysql 5.x mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot Tenga en cuenta que debe usar --batch para cambiar el formato a formato sin formato que genera los resultados con formato cero. - Mikel

Aquí hay un archivo por lotes que escribí para automatizarlo desde la línea de comandos, pero para Windows / MS-DOS.

La sintaxis es rename_mysqldb database newdatabase -u [usuario] -p [contraseña]

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

Respondido el 12 de diciembre de 08 a las 10:12

El procedimiento almacenado de TodoInTX no funcionó del todo para mí. Aquí está mi puñalada:

- procedimiento almacenado rename_db: Cambiar el nombre de una base de datos por mi medio de copiar la tabla. - Advertencias: - Golpeará cualquier base de datos existente con el mismo nombre que el "nuevo" nombre de la base de datos. - SOLO copia tablas; los procedimientos almacenados y otros objetos de la base de datos no se copian. - Tomer Altman (taltman@ai.sri.com) delimitador // PROCEDIMIENTO DE SOLICITUD SI EXISTE rename_db; CREAR PROCEDIMIENTO rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100)) BEGIN DECLARE current_table VARCHAR (100); DECLARE done INT DEFAULT 0; DECLARAR tablas_antiguas CURSOR PARA seleccionar nombre_tabla de esquema_información. tablas donde esquema_tabla = db_antiguo; DECLARAR CONTINUAR MANIPULADOR PARA NO ENCONTRADO SET done = 1; SET @output = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';'); PREPARE stmt FROM @output; EJECUTAR stmt; SET @output = CONCAT ('CREAR ESQUEMA SI NO EXISTE', new_db, ';'); PREPARE stmt FROM @output; EJECUTAR stmt; OPEN old_tables; REPETIR FETCH old_tables INTO current_table; SI NO lo hizo ENTONCES SET @output = CONCAT ('alterar tabla', old_db, '.', Current_table, 'renombrar', new_db, '.', Current_table, ';'); PREPARE stmt FROM @output; EJECUTAR stmt; TERMINARA SI; HASTA TERMINAR REPETIR; CLOSE old_tables; END // delimitador;

contestado el 17 de mayo de 11 a las 19:05

Esto funcionará solo para tablas, y solo si estas tablas no tienen ningún activador. Esto no moverá las vistas ni los disparadores. - olfan

El método más simple es utilizar el software HeidiSQL. Es gratis y de código abierto. Se ejecuta en Windows y en cualquier Linux con Vino (ejecute aplicaciones de Windows en Linux, BSD, Solaris y Mac OS X).

Para descargar HeidiSQL, vaya a http://www.heidisql.com/download.php.

Para descargar Wine, vaya a http://www.winehq.org/.

Para cambiar el nombre de una base de datos en HeidiSQL, simplemente haga clic derecho en el nombre de la base de datos y seleccione 'Editar'. Luego ingrese un nuevo nombre y presione 'OK'.

Es muy simple

respondido 09 nov., 15:12

Si tiene procedimientos almacenados, no se puede cambiar el nombre. - abksharma

@abksharma En realidad recibirás un mensaje Database "database_name" contains stored routine(s) which cannot be moved. Los disparadores (al menos para la base de datos MariDB) se cuentan como rutinas almacenadas. No tenía ningún procedimiento almacenado, pero no pude cambiar el nombre de la base de datos hasta que eliminé todos los desencadenantes. - izogfif

Parece que nadie mencionó esto, pero aquí hay otra forma:

create database NewDatabaseName like OldDatabaseName;

luego, para cada mesa, haz lo siguiente:

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

entonces, si quieres,

drop database OldDatabaseName;

Este enfoque tendría la ventaja de realizar la transferencia completa en el servidor con tráfico de red casi nulo, por lo que será mucho más rápido que un volcado / restauración.

Si tiene procedimientos / vistas / etc. almacenados, es posible que también desee transferirlos.

Respondido el 21 de Septiembre de 17 a las 16:09

Hasta donde yo sé, 5.x no admite la palabra clave "me gusta" en create database ¿declaración? ¿De dónde sacaste eso? - Dragas

Aquí está el enlace para create table like sintaxis: dev.mysql.com/doc/refman/5.7/en/create-table-like.html . En cuanto a la creación de una base de datos, parece que MySQL eliminó esa cláusula desde entonces. - Tuncay Göncüoğlu

I hizo una pregunta sobre la falla del servidor tratando de evitar el tiempo de inactividad al restaurar bases de datos muy grandes mediante el uso de MySQL Proxy. No tuve ningún éxito, pero al final me di cuenta de que lo que quería era la funcionalidad RENOMBRAR BASE DE DATOS porque volcar / importar no era una opción debido al tamaño de nuestra base de datos.

Hay una funcionalidad RENAME TABLE incorporada en MySQL, así que terminé escribiendo un script de Python simple para hacer el trabajo por mí. He lo publicó en GitHub en caso de que pueda ser de utilidad para otros.

Respondido 13 Abr '17, 13:04

RENAME DATABASE se eliminó de la sintaxis, no RENAME TABLE. - Duque

Para su comodidad, a continuación se muestra un pequeño shellscript que debe ejecutarse con dos parámetros: db-name y new db-name.

Es posible que deba agregar parámetros de inicio de sesión a las líneas mysql si no usa el archivo .my.cnf en su directorio de inicio. Haga una copia de seguridad antes de ejecutar 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"

respondido 09 nov., 15:12

Esto tampoco funcionará para tablas con activadores adjuntos o para vistas que no se pueden renombrar en otras bases de datos. - olfan

Para usuarios de mac, puede usar Sequel Pro (gratis), que solo ofrece la opción de cambiar el nombre de las bases de datos. Aunque no elimina la antigua base de datos.

una vez que abra la base de datos relevante, simplemente haga clic en: Database -> Rename database...

Respondido 04 Oct 17, 07:10

A veces deja viva la antigua base de datos pero está vacía. Aún así, si hace una copia, puede hacer la copia y eliminar la anterior, todavía son 2 simples pasos. - Roee Gavirel

My stored procedures y views no se copiaron junto con el cambio de nombre - Wayne

Aquí hay una forma rápida de generar un script sql de cambio de nombre, si tiene muchas tablas 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' ;

Respondido 11 ago 14, 20:08

Se ve bien, pero esto no mueve los procedimientos almacenados o las vistas. - davidpricedev

probablemente debería agregar marcas de almohadilla para envolver el nombre de la tabla y el nombre del esquema - funkodebat

ALTER DATABASE es la forma propuesta por MySQL y RENAME DATABASE se deja caer.

Desde 13.1.32 Sintaxis de RENAME DATABASE:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Esta declaración se agregó en MySQL 5.1.7, pero se consideró peligrosa y se eliminó en MySQL 5.1.23.

respondido 09 nov., 15:12

¿Tiene alguna sintaxis de ejemplo? No conozco ninguna forma de usar alter database para cambiar el nombre de la base de datos, y la documentación a la que vinculó no sugiere que sea posible. - Jordania

@Jordan Yo también estaría interesado. Intenté y probé y descubrí que solo funciona con la versión> 5.1, pero no puedo actualizar en este momento. - pantalones de lujo

-1: Por escribir sobre las formas propuestas, luego dar un ejemplo de la forma no propuesta mientras falta por completo para mostrar el ejemplo. - hakré

Esto está mal. Documentación de la base de datos de cambio de nombre de MySQL dice que rename_database estaba destinado a una tarea de cambio de nombre muy específica (no el caso general de cambio de nombre de DB), que ahora se maneja con alter database: 'Para realizar la tarea de actualizar los nombres de la base de datos con la nueva codificación, use ALTER DATABASE db_name ACTUALIZAR NOMBRE DEL DIRECTORIO DE DATOS en su lugar 'No puede usar esto para cambiar el nombre de la base de datos como desee, ¡ni siquiera hay lugar para un nuevo nombre de base de datos en este comando! - Kanat Bolazar

En MySQL Administrator, haga lo siguiente:

  1. En Catálogos, cree un nuevo esquema de base de datos.
  2. Vaya a Copia de seguridad y cree una copia de seguridad del esquema anterior.
  3. Ejecute la copia de seguridad.
  4. Vaya a Restaurar y abra el archivo creado en el paso 3.
  5. Seleccione 'Otro esquema' en Esquema de destino y seleccione el nuevo esquema de base de datos.
  6. Iniciar restauración.
  7. Verifique el nuevo esquema y, si se ve bien, elimine el anterior.

Respondido 03 Oct 08, 05:10

El administrador de MySQL no puede manejar grandes bases de datos y no hay nada rápido al respecto. programador muerto

in phpMyAdmin puede cambiar el nombre de la base de datos fácilmente

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

solicite quitar la tabla anterior y volver a cargar los datos de la tabla, haga clic en Aceptar en ambos

Se cambia el nombre de su base de datos

Respondido 21 ago 13, 07:08

Si está utilizando phpMyAdmin puede ir a la pestaña "operaciones" una vez que haya seleccionado la base de datos a la que desea cambiar el nombre. Luego vaya a la última sección "copiar la base de datos a" (o algo así), dé un nombre y seleccione las opciones a continuación. En este caso, supongo que debes seleccionar "estructura y datos" y "crear base de datos antes de copiar" las casillas de verificación y, finalmente, presionar el botón "ir" en esa sección.

Por cierto, estoy usando phpMyAdmin en español, así que no estoy seguro de cuáles son los nombres de las secciones en inglés.

respondido 09 nov., 15:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.