tabla - ¿Cómo puedo cambiar rápidamente el nombre de una base de datos MySQL(cambiar el nombre del esquema)?
rename database mysql (30)
El manual de MySQL en MySQL cubre esto.
Por lo general, simplemente 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;
RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
MySQL .
Esto debe funcionar con InnoDB , que almacena las cosas de manera muy diferente a MyISAM .
La forma sencilla
Cambie al directorio de la base de datos:
cd /var/lib/mysql/
Apaga MySQL ... ¡Esto es importante!
/etc/init.d/mysql stop
Bien, esta manera no funciona para InnoDB o BDB-Databases.
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.
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 newdatabase -u [usuario] -p [contraseña]
:: ***************************************************************************
:: FILE: RENAME_MYSQLDB.BAT
:: ***************************************************************************
:: DESCRIPTION
:: This is a Windows /MS-DOS batch file that automates renaming a MySQL database
:: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks.
:: The MySQL/bin folder needs to be in your environment path or the working directory.
::
:: WARNING: The script will delete the original database, but only if it successfully
:: created the new copy. However, read the disclaimer below before using.
::
:: DISCLAIMER
:: This script is provided without any express or implied warranties whatsoever.
:: The user must assume the risk of using the script.
::
:: You are free to use, modify, and distribute this script without exception.
:: ***************************************************************************
:INITIALIZE
@ECHO OFF
IF [%2]==[] GOTO HELP
IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)
SET RDB_OLDDB=%1
SET RDB_NEWDB=%2
SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql
GOTO START
:START
SET RDB_STEP=1
ECHO Dumping "%RDB_OLDDB%"...
mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=2
ECHO Creating database "%RDB_NEWDB%"...
mysqladmin %RDB_ARGS% create %RDB_NEWDB%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=3
ECHO Loading dump into "%RDB_NEWDB%"...
mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=4
ECHO Dropping database "%RDB_OLDDB%"...
mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=5
ECHO Deleting dump...
DEL %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END
:ERROR_ABORT
IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force
IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%
ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END
:HELP
ECHO Renames a MySQL database.
ECHO Usage: %0 database new_database [OPTIONS]
ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump.
ECHO --user=root is used if no options are specified.
GOTO END
:END
SET RDB_OLDDB=
SET RDB_NEWDB=
SET RDB_ARGS=
SET RDB_DUMP=
SET RDB_STEP=
Bueno, hay 2 métodos:
Método 1: un método conocido para cambiar el nombre del esquema de la base de datos es volcar el esquema utilizando Mysqldump y restaurarlo en otro esquema, y luego eliminar el esquema antiguo (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 fácil, consume tiempo y espacio. ¿Qué pasa si el esquema es más de 100 GB? Existen métodos en los que puede agrupar los comandos anteriores para ahorrar espacio, sin embargo, no ahorrará tiempo.
Para remediar tales situaciones, existe otro método rápido para cambiar el nombre de los esquemas, sin embargo, se debe tener cuidado al hacerlo.
Método 2: MySQL tiene una 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 le cambia el nombre. Esto toma poco tiempo para completarse, ya que cambiar el nombre de una tabla o su esquema es solo un cambio de metadatos. Aquí está el 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 antiguo al esquema nuevo, usando el comando "RENAME TABLE" de MySQL. Suelte 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 hay 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 con los indicadores -E, -R (además de -t -d que vuelca los desencadenantes) en el comando mysqldump. Una vez que se descarguen los desencadenantes, tendremos que eliminarlos del esquema para que funcione el comando RENAME TABLE.
$ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out
2) Genere una lista de solo tablas "BASE". Estos se pueden encontrar utilizando una consulta en information_schema.TABLES
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 utilizando 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) Soltar los disparadores en las tablas actuales en el antiguo_schema.
mysql> DROP TRIGGER <trigger_name>;
...
5) Restaure los archivos de volcado anteriores una vez que todas las tablas "Base" que se encuentran en el paso # 2 cambian de nombre.
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
Intrincaciones con los métodos anteriores: es posible que tengamos que actualizar los GRANTS para los usuarios para que coincidan con el nombre de esquema correcto. Estos podrían solucionarse con una ACTUALIZACIÓN simple en mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db actualizando el nombre old_schema a new_schema y llamando a "Flush privileges;". Aunque el "método 2" parece un poco más complicado que el "método 1", esto es totalmente programable. Una secuencia de comandos 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 DBA de Percona Remote 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, se almacenaron rutinas en ese esquema. Intentará cambiar el nombre del esquema de la base de datos mediante la secuencia de comandos, que tarda unos segundos en completarse en lugar de llevar a cabo el método de volcado / restauración.
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 se puede ver en la salida anterior, el esquema de la base de datos "emp" cambió su nombre a "emp_test" en menos de un segundo. Por último, este es el script de Percona que se usa 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
Creo que la solución es más simple y fue sugerida por algunos desarrolladores. phpMyAdmin tiene una operación para esto.
Desde phpMyAdmin, seleccione la base de datos que desea seleccionar. En las pestañas hay una llamada Operaciones, vaya a la sección de cambio de nombre. Eso es todo.
Como muchos sugieren, crea una nueva base de datos con el nuevo nombre, vuelca todas las tablas de la antigua base de datos en la nueva base de datos y elimina la antigua.
Cuando cambia el nombre de una base de datos en PHPMyAdmin, crea un volcado, luego cae y vuelve a crear la base de datos con el nuevo nombre.
Emulando el comando faltante RENAME DATABASE
en MySQL:
- Crear una nueva base de datos
Crea 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'';
Ejecutar esa salida
- Eliminar base de datos antigua
Se tomó de Emular el comando de RENAME DATABASE que falta en MySQL .
Es posible cambiar el nombre de todas las tablas dentro de una base de datos para que estén debajo de 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 desencadenante en la base de datos de destino no será feliz. Deberá 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
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 simple a prueba de balas y tontos de hacer un cambio de nombre completo (incluida la eliminación de la base de datos antigua 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:
- Copia las líneas en el Bloc de notas.
- Reemplace todas las referencias a "olddbname", "newdbname", "mypassword" (+ opcionalmente "root") con sus equivalentes.
- Ejecute uno por uno en la línea de comandos (ingrese "y" cuando se le solicite).
La mayoría de las respuestas aquí son incorrectas por una de dos razones:
- No puedes usar RENAME TABLE, porque puede haber vistas y disparadores. Si hay desencadenantes, RENAME TABLE falla
- No puede usar mysqldump si desea "rápidamente" (como se solicita en la pregunta) cambiar el nombre de una gran base de datos
Percona tiene una publicación en el blog sobre cómo hacer esto bien: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
y el script publicado (hecho?) por Simon R Jones que hace lo que se sugiere en ese post. He arreglado un error que encontré en el script. Puedes verlo aqui:
https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d
Aquí está 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
rename_db
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
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 de MySQL predeterminadas, esto generalmente se encuentra en el directorio de datos debajo del directorio donde se instaló MySQL. Busque el nombre de la base de datos que desea cambiar de 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. Estar atentos
Nota: debe detener MySQL antes de poder cambiar el nombre de la base de datos
Recomendaría crear una nueva base de datos (con el nombre que desee) y exportar / importar los datos que necesita de lo antiguo a lo nuevo. Bastante simple.
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 las 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 parte -u username -ppassword
.
Además, si tiene procedimientos almacenados, puede copiarlos después:
mysqldump -R old_db | mysql new_db
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/
Puede usar SQL para generar un script SQL para transferir cada tabla en su base de datos de origen a la base de datos de destino.
Debe crear la base de datos de destino antes de ejecutar el script generado a partir del comando.
Puede usar cualquiera de estos dos scripts (originalmente sugerí el primero y alguien "mejoró" mi respuesta para usar GROUP_CONCAT
. Elija su 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 fuente y destino respectivamente)
Esto generará un comando SQL que tendrás que 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 número grande).
Puedes usar este script de shell:
Referencia: ¿Cómo renombrar 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
Recientemente, encontré 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.
Tres opciones:
Cree la nueva base de datos, desactive 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.
Cree la nueva base de datos, use las sentencias CREATE TABLE ... LIKE y luego use las sentencias INSERT ... SELECT * FROM.
Usa mysqldump y vuelve a cargar con ese archivo.
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, 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
ALTER DATABASE
Es la forma propuesta alrededor de esto por MySQL y RENAME DATABASE
se elimina.
Desde documentation :
RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
Esta declaración se agregó en MySQL 5.1.7, pero se encontró que era peligrosa y se eliminó en MySQL 5.1.23.
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 histórico al principio simplemente garantiza que los comandos MySQL que contienen contraseñas no se guardan en el historial del shell.
Asegúrese de que db_user
tenga permisos de lectura / escritura / caída en el esquema anterior, y permisos de lectura / escritura / creación en el nuevo esquema.
En MySQL Administrator haga lo siguiente:
- En Catálogos, crea un nuevo esquema de base de datos.
- Vaya a Copia de seguridad y cree una copia de seguridad del esquema anterior.
- Ejecutar copia de seguridad.
- Vaya a Restaurar y abra el archivo creado en el paso 3.
- Seleccione ''Otro esquema'' en Esquema de destino y seleccione el nuevo esquema de base de datos.
- Iniciar la restauración.
- Verifique el nuevo esquema y, si se ve bien, elimine el anterior.
Esta es una forma rápida de generar un script de cambio de nombre de 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'' ;
Para su comodidad, a continuación hay un pequeño shellscript que debe ejecutarse con dos parámetros: db-name y new db-name.
Es posible que deba agregar parámetros de inicio de sesión a las líneas mysql si no usa el archivo .my.cnf en su directorio de inicio. 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"
Pasos
- Pulse http://localhost/phpmyadmin/
- Seleccione su DB
- Haga clic en la pestaña Operaciones
- Habrá una pestaña como "Cambiar el nombre de la base de datos a". Agregar nuevo nombre y verificar Ajustar privilegios.
- Haga clic en Ir.
El método más simple es usar el software HeidiSQL. Es gratis y de código abierto. Se ejecuta en Windows y en cualquier Linux con Wine (ejecuta aplicaciones de Windows en Linux, BSD, Solaris y Mac OS X).
Para descargar HeidiSQL, vaya a http://www.heidisql.com/download.php .
Para descargar Wine, vaya a http://www.winehq.org/ .
Para cambiar el nombre de una base de datos en HeidiSQL, simplemente haga clic derecho en el nombre de la base de datos y seleccione ''Editar''. Luego ingrese un nuevo nombre y presione ''OK''.
Es tan simple.
El procedimiento almacenado de TodoInTX no me funcionó del todo. 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 ;
Hice una pregunta sobre Server Fault intentando evitar el tiempo de inactividad al restaurar bases de datos muy grandes mediante el uso del proxy de MySQL. No tuve ningún éxito, pero al final me di cuenta de que lo que quería era la funcionalidad RENAME DATABASE porque dump / import no era una opción debido al tamaño de nuestra base de datos.
Hay una funcionalidad de RENAME TABLE incorporada en MySQL, por lo que terminé de escribir un simple script de Python para hacer el trabajo por mí. Lo he publicado en GitHub en caso de que pueda ser de utilidad para otros.
Lo hice de esta manera: haga una copia de seguridad de su base de datos existente. Le dará un db.zip.tmp y luego en la línea de comandos escriba a continuación
"C: / Archivos de programa (x86) / MySQL / MySQL Server 5.6 / bin / mysql.exe" -h localhost -u root -p [contraseña] [nuevo nombre de la base de datos] <"C: / Backups / db.zip.tmp "
Si está usando phpMyAdmin , puede ir a la pestaña "operaciones" una vez que haya seleccionado la base de datos que desea cambiar de nombre. 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 debe seleccionar "estructura y datos" y "crear base de datos antes de copiar" las casillas de verificación y, finalmente, presionar el botón "ir" en esa sección.
Por cierto, estoy usando phpMyAdmin en español, así que no estoy seguro de cuáles son los nombres de las secciones en inglés.
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
pedir que se descarte la tabla antigua y que se vuelvan a cargar los datos de la tabla, haga clic en Aceptar en ambos
Su base de datos ha cambiado de nombre