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

El manual de MySQL en MySQL cubre esto.

Por lo general, solo vuelco la base de datos y la reimporte 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; RENAME {DATABASE | SCHEMA} db_name TO new_db_name; hace cosas malas, existen solo en un puñado de versiones, y es una mala idea en general .

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

Para InnoDB, lo siguiente parece funcionar: crear la nueva base de datos vacía, luego renombrar cada tabla a su vez en la nueva base de datos:

 RENAME TABLE old_db.table TO new_db.table; 

Deberá ajustar los permisos después de eso.

Para crear scripts en un shell, puede usar 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 

O

 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 la parte -u username -ppassword .

Además, si tiene procedimientos almacenados, puede copiarlos después:

 mysqldump -R old_db | mysql new_db 

Use estos pocos comandos simples:

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

O para reducir la E / S use lo siguiente como lo sugiere @Pablo Marin-Garcia:

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

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 tabs 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, vuelca todas las tablas de la base de datos anterior en la nueva base de datos y descarta la base de datos anterior.

Ingrese la descripción de la imagen aquí

Puede usar SQL para generar un script SQL para transferir cada tabla en su base de datos fuente 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 . Haga su elección, pero prefiero el original):

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

o

 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 las bases de datos con una gran cantidad de tablas. Puede modificar ese límite ejecutando SET SESSION group_concat_max_len = 100000000; (o algún otro gran número).

Tres opciones:

  1. Cree la nueva base de datos, baje el servidor, mueva los archivos de una carpeta de base de datos a la 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, use las sentencias CREATE TABLE … LIKE y luego use las instrucciones INSERT … SELECT * FROM.

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

La manera simple

Cambiar al directorio de la base de datos:

 cd /var/lib/mysql/ 

Apaga MySQL … ¡Esto es importante!

 /etc/init.d/mysql stop 

Está bien, de esta manera no funciona para InnoDB o bases de datos BDB.

Renombrar 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 

Reiniciar MySQL

 /etc/init.d/mysql start 

Hecho…

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

Recientemente me encontré con una forma muy buena 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 mérito recae en alguien más que yo.

Emulando el comando RENAME DATABASE faltante en MySQL:

  1. Crea 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 una base de datos vieja

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

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; 

MySQL no admite el cambio de nombre de una base de datos a través de su interfaz de comando 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 cambiar el nombre en el directorio de datos y cámbiele el nombre. Renombrar el directorio podría causar algunos problemas de permisos. Ten cuidado

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 los antiguos a los nuevos. Bastante simple.

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

La forma más simple de hacer un cambio de nombre completo (incluyendo la eliminación de la base de datos anterior al final, por lo que es 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).

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

Bueno, hay 2 métodos:

Método 1: un método bien conocido para cambiar el nombre del esquema de la base de datos es volcar el esquema utilizando Mysqldump y restaurarlo en otro esquema, y ​​luego descartar 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. ¿Qué pasa si el esquema es más de 100 GB? Existen métodos donde puede canalizar los comandos anteriores para ahorrar espacio, sin embargo, no ahorrará tiempo.

Para remediar tales situaciones, hay 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 muy buena característica 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 renombra. Esto lleva un corto 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 para hacer el cambio de nombre:

Cree el nuevo esquema de base de datos con el nombre deseado. Cambie el nombre de las tablas del esquema anterior al nuevo esquema, utilizando el comando "RENOMBRE DE LA TABLA" de MySQL. Suelta el viejo esquema de la base de datos. 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 desencadenantes 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 indicadores -E, -R (además de -t -d que descarga los disparadores) al comando mysqldump. Una vez que los activadores se vuelquen, tendremos que soltarlos del esquema, para que funcione el comando RENOMBRAR TABLA.

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

2) Genere una lista de solo tablas "BASE". Se pueden encontrar utilizando una consulta en information_schema.TABLES tabla information_schema.TABLES .

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

3) Vuelca las vistas en un archivo de salida. Las vistas se pueden encontrar usando una consulta en la misma tabla information_schema.TABLES .

 mysql> select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='VIEW'; $ mysqldump    … > views.out 

4) Coloque los desencadenantes en las tablas actuales en el old_schema.

 mysql> DROP TRIGGER ; ... 

5) Restaure los archivos de volcado antes una vez que todas las tablas "Base" encontradas en el paso # 2 sean renombradas.

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

Complejidades con los métodos anteriores: es posible que necesitemos actualizar las SUBVENCIONES para los usuarios de forma que coincidan con el nombre_esquema correcto. Estos podrían corregirse 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 guionizable. Un script bash simple para llevar a cabo los pasos anteriores en la secuencia adecuada puede ayudarlo a ahorrar espacio y tiempo al renombrar los esquemas de la base de datos la próxima vez.

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

 [root@dba~]# /tmp/rename_db rename_db    

Para demostrar el uso de esta secuencia de comandos, se utilizó un esquema de muestra "emp", se crearon activadores de prueba y se guardaron las rutinas en ese esquema. Intentará cambiar el nombre del esquema de la base de datos utilizando la secuencia de comandos, que tarda unos segundos en completarse en lugar del método de restauración / volcado que consume 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 el resultado anterior, el esquema de la base de datos "emp" se renombró a "emp_test" en menos de un segundo. Por último, esta es la secuencia de comandos de Percona que se utiliza arriba para el "método 2".

 #!/bin/bash # Copyright 2013 Percona LLC and/or its affiliates set -e if [ -z "$3" ]; then echo "rename_db   " 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 

Puede usar 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 

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

 PROCEDIMIENTO DE CAÍDA SI EXISTE mysql.rename_db;
 DELIMITER ||
 CREAR PROCEDIMIENTO mysql.rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100))
 EMPEZAR
 SELECCIONE CONCAT ('CREATE DATABASE', new_db, ';') `# create new database`;
 SELECCIONE CONCAT ('RENAME TABLE `', old_db, '' .``, table_name, '' TO` ', new_db,' '.``, table_name,' ';') `# alter table` DESDE information_schema.tables DONDE table_schema = old_db;
 SELECCIONE CONCAT ('DROP DATABASE `', old_db, '`;') `# drop old database`;
 FIN ||
 DELIMITER;

 $ time mysql -uroot -e "call mysql.rename_db ('db1', 'db2');"  |  mysql -uroot

Sin embargo, cualquier desencadenante en el destino db no será feliz. Tendrá que soltarlos primero y luego volver a crearlos después del cambio de nombre.

 mysql -uroot -e "llamada mysql.rename_db ('test', 'blah2');"  |  mysql -uroot
 ERROR 1435 (HY000) en la línea 4: desencadenar en el esquema incorrecto

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

La syntax es rename_mysqldb database newdatabase -u [user] -p [password]

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

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

 - procedimiento almacenado rename_db: cambiar el nombre de una base de datos a mis medios de copia de tabla.
 - Advertencias: 
 - Bloqueará 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 base de datos no se copian.
 - Tomer Altman (taltman@ai.sri.com)

 delimitador //
 PROCEDIMIENTO DE CAÍDA SI EXISTE rename_db;
 CREATE PROCEDURE rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100))
 EMPEZAR
     DECLARAR current_table VARCHAR (100);
     DECLARAR hecho INT DEFECTO 0;
     DECLARAR old_tables CURSOR PARA seleccionar table_name de information_schema.tables donde table_schema = old_db;
     DECLARAR CONTINUAR HANDLER PARA EL SET NO ENCONTRADO done = 1;

     SET @output = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';'); 
     PREPARAR stmt FROM @output;
     EJECUTAR stmt;

     SET @output = CONCAT ('CREATE SCHEMA IF NOT EXISTS', new_db, ';');
     PREPARAR stmt FROM @output;
     EJECUTAR stmt;

     ABIERTO old_tables;
     REPETIR
         FETCH old_tables INTO current_table;
         SI NO HECHO ENTONCES
         SET @output = CONCAT ('alter table', old_db, '.', Current_table, 'rename', new_db, '.', Current_table, ';');
         PREPARAR stmt FROM @output;
         EJECUTAR stmt;

         TERMINARA SI;
     HASTA hecho END REPEAT;

     CIERRA old_tables;

 FIN//
 delimitador;

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

  1. No puede usar RENAME TABLE, porque puede haber vistas y activadores. Si hay activadores, RENAME TABLE falla
  2. No puede usar mysqldump si quiere “rápidamente” (como se solicita en la pregunta) renombrar una gran base de datos

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

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

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

Aquí hay una copia de esto:

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

Save it to a file called rename_db and make the script executable with chmod +x rename_db then use it like ./rename_db localhost old_db new_db

I posed a question on Server Fault trying to get around downtime when restring very large databases by using MySQL Proxy. I didn’t have any success, but I realized in the end what I wanted was RENAME DATABASE functionality because dump/import wasn’t an option due to the size of our database.

There is a RENAME TABLE functionality built in to MySQL so I ended up writing a simple Python script to do the job for me. I’ve posted it on GitHub in case it could be of use to others.

For your convenience, below is a small shellscript that has to be executed with two parameters: db-name and new db-name.

You might need to add login-parameters to the mysql-lines if you don’t use the .my.cnf-file in your home-directory. Please make a backup before executing this 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" 

The simplest method is to use HeidiSQL software. It’s free and open source. It runs on Windows and on any Linux with Wine (run Windows applications on Linux, BSD, Solaris and Mac OS X).

To download HeidiSQL, goto http://www.heidisql.com/download.php .

To download Wine, goto http://www.winehq.org/ .

To rename a database in HeidiSQL, just right click on the database name and select ‘Edit’. Then enter a new name and press ‘OK’.

It is so simple.

Here is a quick way to generate renaming sql script, if you have many tables to move.

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

In MySQL Administrator do the following:

  1. Under Catalogs, create a new database schema.
  2. Go to Backup and create a backup of the old schema.
  3. Execute backup.
  4. Go to Restore and open the file created in step 3.
  5. Select ‘Another Schema’ under Target Schema and select the new database schema.
  6. Start Restore.
  7. Verify new schema and, if it looks good, delete the old one.

in phpmyadmin you can easily rename the database

 select database goto operations tab in that rename Database to : type your new database name and click go 

ask to drop old table and reload table data click OK in both

Your database is renamed

If you are using phpMyAdmin you can go to the “operations” tab once you have selected the database you want to rename. Then go to the last section “copy database to” (or something like that), give a name, and select the options below. In this case, I guess you must select “structure and data” and “create database before copying” checkboxes and, finally, press the “go” button in that section.

By the way, I’m using phpMyAdmin in Spanish so I’m not sure what the names of the sections are in English.

Here is a one-line Bash snippet to move all tables from one schema to another:

 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 

The history command at the start simply ensures that the MySQL commands containing passwords aren’t saved to the shell history.

Make sure that db_user has read/write/drop permissions on the old schema, and read/write/create permissions on the new schema.

ALTER DATABASE is the proposed way around this by MySQL and RENAME DATABASE is dropped.

From 13.1.32 RENAME DATABASE Syntax :

 RENAME {DATABASE | SCHEMA} db_name TO new_db_name; 

This statement was added in MySQL 5.1.7, but it was found to be dangerous and was removed in MySQL 5.1.23.

I did it this way: Take backup of your existing database. It will give you a db.zip.tmp and then in command prompt write following

“C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin\mysql.exe” -h localhost -u root -p[password] [new db name] < "C:\Backups\db.zip.tmp"

Seems noone mentioned this but here is another way:

 create database NewDatabaseName like OldDatabaseName; 

then for each table do:

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

then, if you want to,

 drop database OldDatabaseName; 

This approach would have the advantage of doing the entire transfer on server with near zero network traffic, so it will go a lot faster than a dump/restre.

If you do have stored procedures/views/etc you might want to transfer them as well.