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

StackOverflow https://stackoverflow.com/questions/67093

  •  09-06-2019
  •  | 
  •  

Pregunta

El manual de MySQL en mysql cubre esto.

Por lo general, simplemente descarto 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 unas pocas versiones y es una mala idea en general.

Esto necesita trabajar con InnoDB, que almacena cosas de manera muy diferente a MiISAM.

¿Fue útil?

Solución

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

RENAME TABLE old_db.table TO new_db.table;

Después de eso, deberás ajustar los permisos.

Para realizar secuencias de comandos 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

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 -u username -ppassword parte.
  • Si alguna tabla tiene un activador, no se puede mover a otra base de datos usando el método anterior (dará como resultado Trigger in wrong schema error).Si ese es el caso, utilice 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 después:

    mysqldump -R old_db | mysql new_db

Otros consejos

Utilice 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, utilice lo siguiente sugerido por @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 sencilla 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 que se llama Operaciones, ve 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 elimina la base de datos anterior.

Enter image description here

Puede utilizar 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 a partir del comando.

Puede utilizar cualquiera de estos dos scripts (originalmente sugerí el primero y alguien "mejoró" mi respuesta para usar GROUP_CONCAT.Elige tu opció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 origen y destino respectivamente)

Esto generará un comando SQL que luego deberás 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 ejecutando SET SESSION group_concat_max_len = 100000000; (o algún otro número grande).

Emulando a los desaparecidos 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. Ejecute esa salida

  4. Eliminar base de datos antigua

fue tomado de Emulando el comando RENAME DATABASE que falta en MySQL.

Tres opciones:

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

  2. Cree la nueva base de datos, use CREATE TABLE...declaraciones LIKE y luego use INSERT...SELECCIONAR * DE declaraciones.

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

la manera sencilla

Cambie al directorio de la base de datos:

cd /var/lib/mysql/

Apagar MySQL...¡Esto es importante!

/etc/init.d/mysql stop

Bien, 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

Reiniciar MySQL

/etc/init.d/mysql start

Hecho...

Bien, esta forma no funciona con bases de datos InnoDB o BDB.En este caso hay que volcar la base de datos y volver a importarla.

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

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

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

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;

La forma más sencilla y a prueba de tontos de hacer un completo rebautizar (incluido eliminar 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).

MySQL no admite el cambio de nombre de una base de datos a través de su interfaz de comandos por el 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 debajo del directorio donde se instaló MySQL.Localice el nombre de la base de datos cuyo nombre desea cambiar en el directorio de Datos y cámbiele el nombre.Sin embargo, cambiar el nombre del directorio podría causar algunos problemas de permisos.Tenga en cuenta.

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.

Cuando cambia el nombre de una base de datos en PHPMyAdmin, crea un volcado, luego descarta y vuelve a crear la base de datos con el nuevo nombre.

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/

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 usando Mysqldump y restaurarlo en otro esquema, y ​​luego descartar el esquema anterior (si es necesario).

De concha

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

Aunque el método anterior es sencillo, requiere tiempo y espacio.¿Qué pasa si el esquema es más que un ¿100 GB? Existen métodos en los que puede agrupar los comandos anteriores para ahorrar espacio, sin embargo, no ahorrará tiempo.

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

Método 2: MySQL tiene una característica muy buena para cambiar el nombre de 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 cambia el nombre.Esto lleva poco tiempo 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 cambiar el nombre:

Cree el nuevo esquema de base de datos con el nombre deseado.Cambie el nombre de las tablas del esquema antiguo al esquema nuevo, utilizando 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 activadores 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 los indicadores -E, -R (además de -t -d que descarga los activadores) en el comando mysqldump.Una vez que se descartan 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 solo de 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) Vuelque 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) Suelte los activadores 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" encontradas 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 GRANTS para los usuarios de modo que coincidan con el nombre de 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 del esquema antiguo a nuevo_esquema y llamando a "Vaciar privilegios".Aunque el "método 2" parece un poco más complicado que el "método 1", 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, se utilizó un esquema de muestra "emp", se crearon activadores de prueba y se almacenaron rutinas en ese esquema.Intentará cambiar el nombre del esquema de la base de datos utilizando el script, lo que tarda algunos segundos en completarse, a diferencia del método de volcado/restauración que requiere 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 el resultado anterior, el nombre del esquema de la base de datos "emp" pasó a ser "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

Es posible cambiar el nombre de todas las tablas dentro de una base de datos para que estén en otra base de datos sin tener que realizar un volcado y restauración completos.

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 desencadenante en la base de datos de destino no será satisfactorio.Primero deberá eliminarlos 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

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 activadores.Si hay desencadenantes, RENAME TABLE falla
  2. No puede utilizar mysqldump si desea cambiar "rápidamente" (como se solicita en la pregunta) 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 (¿realizado?) 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árdalo en un archivo llamado rename_db y hacer el script ejecutable con chmod +x rename_db entonces úsalo como ./rename_db localhost old_db new_db

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 base de datos nuevabase de datos -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=

El procedimiento almacenado de TodoInTX no me funcionó del todo.Aquí está mi intento:

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

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

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

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

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

        END IF;
    UNTIL done END REPEAT;

    CLOSE old_tables;

END//
delimiter ;

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 nombre de la base de datos a".Agregue un nuevo nombre y marque Ajustar privilegios.
  5. Haga clic en Ir.

enter image description here

I planteó una pregunta sobre la falla del servidor intentando evitar el tiempo de inactividad al restaurar bases de datos muy grandes mediante 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 integrada en MySQL, así que terminé escribiendo un script Python simple para hacer el trabajo por mí.He lo publicó en GitHub por si pudiera ser de utilidad para otros.

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

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

El método más sencillo es utilizar el software HeidiSQL.Es gratuito 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 'Aceptar'.

Es tan simple.

Aquí hay una forma rápida de generar un script SQL para cambiar el 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' ;

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

create database NewDatabaseName like OldDatabaseName;

luego para cada tabla haz:

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 toda la transferencia en el servidor con un 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 desee transferirlos también.

Para usuarios de Mac, puede utilizar Sequel Pro (gratis), que solo brinda la opción de cambiar el nombre de las bases de datos.Aunque no elimina la base de datos anterior.

una vez abierta la base de datos correspondiente simplemente haga clic en: Database --> Rename database...

En MySQL Administrator haga lo siguiente:

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

en phpmyadmin puedes 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

solicite eliminar la tabla anterior y recargar los datos de la tabla, haga clic en Aceptar en ambos

Se cambia el nombre de su base de datos

Si estas usando phpMyAdmin puede ir a la pestaña "operaciones" una vez que haya seleccionado la base de datos cuyo nombre desea cambiar.Luego vaya a la última sección "copiar base de datos a" (o algo así), dé un nombre y seleccione las opciones a continuación.En este caso, supongo que debes seleccionar las casillas de "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 en inglés.

Aquí hay un fragmento de 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 de historial al principio simplemente garantiza que los comandos de MySQL que contienen contraseñas no se guarden en el historial del shell.

Asegúrate de eso db_user tiene permisos de lectura/escritura/eliminación en el esquema anterior y permisos de lectura/escritura/creación en el nuevo esquema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top