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


El manual de MySQL en MySQL cubre esto.

Normalmente solo vuelco la base de datos y la reimporto 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.

Author: speeday125, 2008-09-16

30 answers

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

RENAME TABLE old_db.table TO new_db.table;

Tendrá que 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 cópialos después:

mysqldump -R old_db | mysql new_db
 703
Author: Benoit Duffez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-25 14:57:12

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 E/S use lo siguiente como sugiere @Pablo Marin-Garcia:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase
 397
Author: hendrasaputra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 11:48:04

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 cambiar 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 antigua en la nueva base de datos y suelta la base de datos antigua.

Introduzca la descripción de la imagen aquí

 190
Author: raphie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 12:07:24

Puede usar SQL para generar un script SQL para transferir cada tabla de 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 desde el comando.

Puede usar cualquiera de estos dos scripts (originalmente sugerí el primero y alguien "mejoró" mi respuesta para usar GROUP_CONCAT. Elige, 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 tendrá que ejecutar.

Tenga en cuenta que GROUP_CONCAT tiene un límite de longitud predeterminado que puede ser excedido para bases de datos con un gran número de tablas. Puede alterar ese límite ejecutando SET SESSION group_concat_max_len = 100000000; (o algún otro número grande).

 93
Author: ErichBSchulz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-24 03:19:46

Tres opciones:

  1. Cree la nueva base de datos, baje 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 CREAR TABLA ... COMO declaraciones, y luego utilizar INSERT ... SELECCIONE * DE las declaraciones.

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

 24
Author: longneck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 11:45:32

El camino simple

Cambiar al directorio de la base de datos:

cd /var/lib/mysql/

Apague MySQL... Esto es importante!

/etc/init.d/mysql stop

Bien, de esta manera no funciona para InnoDB o BDB-Bases de datos.

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

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.

 23
Author: DeeCee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 11:47:18

Emulando el comando faltante RENAME DATABASE 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. Ejecute esa salida

  4. Delete old database

Fue tomado de Emulando El Comando Que Falta RENOMBRAR BASE DE DATOS en MySQL.

 21
Author: Marciano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 12:12:35

Solo recientemente me he encontrado 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 va a otra persona que no soy yo.

 20
Author: Amr Mostafa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-07 13:15:27

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;
 16
Author: eaykin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-28 15:01:12

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 suele estar en el directorio de datos bajo 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. Sin embargo, cambiar el nombre del directorio podría causar algunos problemas de permisos. Ser 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.

 14
Author: bryanpearson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 21:26:07

La forma más simple y a prueba de balas de hacer un completo cambiar el nombre (incluida la eliminación de la base de datos antigua 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 comandos (introduciendo "y" cuando se le solicite).
 14
Author: Steve Chambers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-16 09:38:22

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.

 13
Author: UnkwnTech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 21:24:15

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"

Está funcionando:

$ sh rename_database.sh oldname newname
 13
Author: Grijesh Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-09 15:59:54

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 /

 12
Author: Duke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-30 01:06:26

Bueno, hay 2 métodos:

Método 1: Un método bien conocido para cambiar el nombre del esquema de base de datos es volcando el esquema usando Mysqldump y restaurándolo en otro esquema, y luego desechando el esquema antiguo (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 un 100GB? Hay métodos donde puede canalizar los comandos anteriores juntos para ahorrar espacio, sin embargo, no ahorrará tiempo.

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

Método 2: MySQL tiene una muy buena característica para cambiar el nombre de las tablas que incluso funciona a través de 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 tarda poco tiempo en completarse, ya que cambiar el nombre de una tabla o su esquema es solo un cambio de metadatos. Aquí está procedural approach at doing the rename:

Cree el nuevo esquema de base de datos con el nombre deseado. Cambie el nombre de las tablas del esquema antiguo al nuevo esquema, utilizando el comando "RENOMBRAR TABLA" de MySQL. Suelte el esquema de base de datos antiguo. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. MySQL" RENOMBRAR TABLA " falla si hay disparadores existe en las tablas. Para remediar esto, podemos hacer las siguientes cosas :

1) Dump the triggers, events and stored routines in a separate file. Esto se hace usando-E, - R flags (además de-t-d que vuelca los disparadores) al comando mysqldump. Una vez los disparadores se descargan, tendremos que soltarlos del esquema, para que el comando CAMBIAR NOMBRE de LA TABLA funcione.

 $ 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 utilizando una consulta en la tabla information_schema.TABLES.

 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 usando una consulta en la misma tabla 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) Suelte los disparadores en las tablas actuales en el old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Restaurar el volcado anterior archivos una vez que todas las tablas "Base" encontradas en el paso #2 son renombradas.

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 de manera que coincidan con el schema_name correcto. Estos podrían arreglarse con una simple ACTUALIZACIÓN en mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.tablas de bd actualizando el nombre old_schema a new_schema y llamando a " Flush privileges;". Aunque "método 2" parece un poco más complicado que el "método 1", esto es totalmente scriptable. Un simple script bash para llevar a cabo los pasos anteriores en la secuencia adecuada, puede ayudarlo a ahorrar espacio y tiempo mientras cambia 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, se usó un esquema de ejemplo "emp", se crearon disparadores de prueba y se almacenaron rutinas en ese esquema. Intentará cambiar el nombre del esquema de base de datos utilizando el script, que tarda algunos segundos en completarse como opuesto al 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" fue renombrado 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
 11
Author: Sathish D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-29 11:14:37

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.

DROP PROCEDURE IF EXISTS mysql.rename_db;
DELIMITER ||
CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
SELECT CONCAT('CREATE DATABASE ', new_db, ';') `# create new database`;
SELECT CONCAT('RENAME TABLE `', old_db, '`.`', table_name, '` TO `', new_db, '`.`', table_name, '`;') `# alter table` FROM information_schema.tables WHERE table_schema = old_db;
SELECT CONCAT('DROP DATABASE `', old_db, '`;') `# drop old database`;
END||
DELIMITER ;

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

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

mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot
ERROR 1435 (HY000) at line 4: Trigger in wrong schema
 9
Author: TodoInTX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-19 17:16:59

La mayoría de las respuestas aquí son erróneas por una de dos razones:

  1. No puede simplemente usar CAMBIAR EL NOMBRE DE LA TABLA, porque puede haber vistas y disparadores. Si hay desencadenadores, el CAMBIO DE NOMBRE DE LA TABLA 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 entrada de blog sobre cómo hacer esto bien: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql /

Y script publicado (hecho?) por Simon R Jones que hace lo que se sugiere en ese post. Corregí un error que encontré en el script. Puedes verlo aquí:

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

Aquí hay una copia de ella:

#!/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 haga que el script sea ejecutable con chmod +x rename_db luego utilícelo como ./rename_db localhost old_db new_db

 8
Author: ryantm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-16 23:06:52

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 [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=
 7
Author: Johnny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-12 10:27:41

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

-- stored procedure rename_db: Rename a database my means of table copying.
-- Caveats: 
-- Will clobber any existing database with the same name as the 'new' database name.
-- ONLY copies tables; stored procedures and other database objects are not copied.
-- Tomer Altman ([email protected])

delimiter //
DROP PROCEDURE IF EXISTS rename_db;
CREATE PROCEDURE rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
    DECLARE current_table VARCHAR(100);
    DECLARE done INT DEFAULT 0;
    DECLARE old_tables CURSOR FOR select table_name from information_schema.tables where table_schema = old_db;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

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

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

    OPEN old_tables;
    REPEAT
        FETCH old_tables INTO current_table;
        IF NOT done THEN
        SET @output = CONCAT('alter table ', old_db, '.', current_table, ' rename ', new_db, '.', current_table, ';');
        PREPARE stmt FROM @output;
        EXECUTE stmt;

        END IF;
    UNTIL done END REPEAT;

    CLOSE old_tables;

END//
delimiter ;
 7
Author: user757945,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-17 18:24:19

I planteó 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 CAMBIAR el NOMBRE de la funcionalidad de la BASE de DATOS porque dump/import no era una opción debido al tamaño de nuestra base de datos.

Hay una funcionalidad de TABLA de CAMBIO DE NOMBRE integrada en MySQL, así que terminé escribiendo un simple script Python para hacer el trabajo por mí. He publicado en GitHub en caso de que pudiera ser de utilidad para los demás.

 6
Author: cclark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:13:47

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 necesite agregar parámetros de inicio de sesión a las líneas mysql si no usa el archivo .my.cnf en su directorio personal. Por favor, 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"
 6
Author: gerrit damen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 12:08:42

El método más simple es usar software HeidiSQL. Es gratuito y de código abierto. Se ejecuta en Windows y en cualquier Linux con Wine (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, goto 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'. A continuación, introduzca un nuevo nombre y pulse 'OK'.

Es tan simple.

 5
Author: Fathah Rehman P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 12:58:02

Aquí hay una forma rápida de generar el cambio de nombre del script sql, 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' ;
 4
Author: yantaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-11 19:00:59

Pasos:

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

introduzca la descripción de la imagen aquí

 4
Author: Shubham Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-19 08:27:42

En MySQL Administrator haga lo siguiente:

  1. En Catálogos, cree un nuevo esquema de base de datos.
  2. Ir a Copia de seguridad y crear una copia de seguridad de el viejo esquema.
  3. Ejecutar copia de seguridad.
  4. Vaya a Restaurar y abra el archivo creado en el paso 3.
  5. Seleccione 'Otro esquema' en Destino Esquema y seleccione la nueva base de datos esquema.
  6. Iniciar la restauración.
  7. Verificar nuevo esquema y, si se ve bien, borra el viejo.
 3
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-03 04:17:56

En phpmyadmin puede cambiar fácilmente el nombre de la base de datos

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

Pida soltar la tabla antigua y recargar los datos de la tabla haga clic en Aceptar en ambos

Su base de datos se renombrará

 3
Author: murtaza.webdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-21 06:17:20

Si está utilizando phpMyAdmin puede ir a la pestaña "operaciones" una vez que haya seleccionado la base de datos que desea renombrar. Luego vaya a la última sección "copiar base de datos a" (o algo por el estilo), dé un nombre y seleccione las opciones a continuación. En este caso, supongo que debes seleccionar las casillas de verificación" estructura y datos "y" crear base de datos antes de copiar "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 están en inglés.

 3
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 12:03:22

Aquí hay un fragmento de código Bash de una línea para mover todas las tablas de un esquema a otro:

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

El comando history al inicio simplemente asegura que los comandos MySQL que contienen contraseñas no se guarden en el historial de shell.

Asegúrese de que db_user tiene permisos de lectura/escritura/colocación en el esquema anterior y permisos de lectura/escritura/creación en el nuevo esquema.

 3
Author: coffeefiend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 12:11:19

ALTER DATABASE es la forma propuesta alrededor de esto por MySQL y RENAME DATABASE se elimina.

De 13.1.32 RENOMBRAR Sintaxis DE BASE DE DATOS:

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Esta declaración fue agregada en MySQL 5.1.7, pero se encontró que era peligrosa y fue eliminada en MySQL 5.1.23.

 3
Author: fancyPants,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 12:16:45

Lo hice de esta manera: Tome copia de seguridad de su base de datos existente. Te dará un db.Postal.tmp y luego en el símbolo del sistema escriba lo siguiente

"C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin \ mysql.exe " - h localhost-u root-p [contraseña] [nuevo nombre de la base de datos]

 3
Author: Samra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-26 01:03:31