nombre - rename mysql
Cambiar el nombre de la base de datos MySQL (12)
Esta pregunta ya tiene una respuesta aquí:
hrms
una base de datos con el nombre de hrms
. Ahora necesito cambiar el nombre de la base de datos a sunhrm
. Pero, está deshabilitado en MySQL workbench. ¿Puedo hacer eso en el servidor Linux?
Bueno, hay 2 métodos:
Método 1 : un método bien conocido para cambiar el nombre del esquema de la base de datos es volcar el esquema utilizando Mysqldump y restaurarlo en otro esquema, y luego descartar el esquema anterior (si es necesario).
De Shell
mysqldump emp > emp.out
mysql -e "CREATE DATABASE employees;"
mysql employees < emp.out
mysql -e "DROP DATABASE emp;"
Aunque el método anterior es fácil, consume tiempo y espacio. ¿Qué pasa si el esquema es más de 100 GB? Existen métodos donde puede canalizar los comandos anteriores para ahorrar espacio, sin embargo, no ahorrará tiempo.
Para remediar tales situaciones, hay otro método rápido para cambiar el nombre de los esquemas, sin embargo, se debe tener cuidado al hacerlo.
Método 2 : MySQL tiene una muy buena característica para cambiar el nombre de las tablas que incluso funciona en diferentes esquemas. Esta operación de cambio de nombre es atómica y nadie más puede acceder a la tabla mientras se renombra. Esto lleva un corto tiempo para completarse, ya que cambiar el nombre de una tabla o su esquema es solo un cambio de metadatos. Aquí hay un enfoque de procedimiento para hacer el cambio de nombre:
- Cree el nuevo esquema de base de datos con el nombre deseado.
- Cambie el nombre de las tablas del esquema anterior al nuevo esquema, utilizando el comando "RENOMBRE DE LA TABLA" de MySQL.
- Suelta el viejo esquema de la base de datos.
Si hay views, triggers, functions, stored procedures
en el esquema, también habrá que volver a crearlos. "RENAME TABLE" de MySQL falla si existen desencadenantes en las tablas. Para remediar esto, podemos hacer lo siguiente:
1) Dump the triggers, events and stored routines in a separate file.
Esto se hace usando indicadores -E, -R (además de -t -d que descarga los disparadores) al comando mysqldump. Una vez que los activadores se vuelquen, tendremos que soltarlos del esquema, para que funcione el comando RENOMBRAR TABLA.
$ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out
2) Genere una lista de solo tablas "BASE". 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) Vuelca las vistas en un archivo de salida. Las vistas se pueden encontrar usando una consulta en la misma tabla information_schema.TABLES.
mysql> select TABLE_NAME from information_schema.tables where
table_schema=''<old_schema_name>'' and TABLE_TYPE=''VIEW'';
$ mysqldump <database> <view1> <view2> … > views.out
4) Coloque los desencadenantes en las tablas actuales en el old_schema.
mysql> DROP TRIGGER <trigger_name>;
...
5) Restaure los archivos de volcado antes una vez que todas las tablas "Base" encontradas en el paso # 2 sean 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 GRANTS
para los usuarios de forma que coincidan con el nombre_esquema correcto. Estos podrían mysql.columns_priv
con una simple UPDATE
en las mysql.columns_priv
, mysql.columns_priv
, mysql.procs_priv
, mysql.tables_priv
, actualizando el old_schema name
new_schema
a new_schema
y llamando a "Flush privileges;". Aunque el " method 2
" parece un poco más complicado que el " method 1
", esto es totalmente guionizable. Un script bash simple para llevar a cabo los pasos anteriores en la secuencia adecuada puede ayudarlo a ahorrar espacio y tiempo al renombrar los esquemas de la base de datos la próxima vez.
El equipo Percona Remote DBA ha escrito un script llamado "rename_db" que funciona de la siguiente manera:
[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>
Para demostrar el uso de esta secuencia de comandos, se utilizó un esquema de muestra "emp", se crearon activadores de prueba y se guardaron las rutinas en ese esquema. Intentará cambiar el nombre del esquema de la base de datos utilizando la secuencia de comandos, que tarda unos segundos en completarse en lugar del método de restauración / volcado que consume tiempo.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| emp |
| mysql |
| performance_schema |
| test |
+--------------------+
[root@dba ~]# time /tmp/rename_db localhost emp emp_test
create database emp_test DEFAULT CHARACTER SET latin1
drop trigger salary_trigger
rename table emp.__emp_new to emp_test.__emp_new
rename table emp._emp_new to emp_test._emp_new
rename table emp.departments to emp_test.departments
rename table emp.dept to emp_test.dept
rename table emp.dept_emp to emp_test.dept_emp
rename table emp.dept_manager to emp_test.dept_manager
rename table emp.emp to emp_test.emp
rename table emp.employees to emp_test.employees
rename table emp.salaries_temp to emp_test.salaries_temp
rename table emp.titles to emp_test.titles
loading views
loading triggers, routines and events
Dropping database emp
real 0m0.643s
user 0m0.053s
sys 0m0.131s
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| emp_test |
| mysql |
| performance_schema |
| test |
+--------------------+
Como puede ver en el resultado anterior, el esquema de la base de datos "emp" se renombró a "emp_test" en menos de un segundo. Por último, esta es la secuencia de comandos de Percona que se utiliza arriba para el " method 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
En caso de que necesite hacer eso desde la línea de comando, solo copie, adapte y pegue este fragmento:
mysql -e "CREATE DATABASE /`new_database/`;"
for table in `mysql -B -N -e "SHOW TABLES;" old_database`
do
mysql -e "RENAME TABLE /`old_database/`./`$table/` to /`new_database/`./`$table/`"
done
mysql -e "DROP DATABASE /`old_database/`;"
En resumen, no. En general, se piensa que es demasiado peligroso cambiar el nombre de una base de datos. MySQL tuvo esa característica por un tiempo, pero fue eliminada. Sería mejor utilizar el banco de trabajo para exportar tanto el esquema como los datos a SQL y luego cambiar el nombre CREATE DATABASE allí antes de ejecutarlo / importarlo.
Es posible copiar la base de datos a través del comando mysqldump sin almacenar el volcado en el archivo:
-
mysql -u root -p -e "create database my_new_database"
-
mysqldump -u root -p original_database | mysql -u root -p my_new_database
-
mysql -u root -p -e "drop database original_database"
No creo que puedas hacer esto. Creo que tendrás que volcar esa base de datos, crear la nueva y luego importar el volcado.
Si se trata de un sistema en vivo, deberá quitarlo. Si no puede, tendrá que configurar la replicación desde esta base de datos a la nueva.
Si desea ver los comandos para hacer esto, @jan tiene los detalles .
Otra forma de cambiar el nombre de la base de datos o tomar una imagen de la base de datos es mediante el uso de la opción de ingeniería inversa en la pestaña de la base de datos. Creará un diagrama ERR para la base de datos. Cambie el nombre del esquema allí.
después de eso ve al menú de archivo y ve a exportar y reenviar la base de datos.
Entonces puedes importar la base de datos.
Para usuarios impacientes de mysql (como yo), la solución es:
/etc/init.d/mysql stop
mv /var/lib/mysql/old_database /var/lib/mysql/new_database
/etc/init.d/mysql start
Primero haga una copia de seguridad de la base de datos anterior llamada HRMS y edite el archivo de script con la palabra HRMS reemplazada por SUNHRM. Después de este paso, importe el archivo de base de datos a mysql
Puede crear una nueva base de datos exactamente como existía la base de datos anterior y luego descartar la base de datos anterior cuando haya terminado. Use la herramienta mysqldump para crear una copia de seguridad .sql de la base de datos a través de mysqldump orig_db > orig_db.sql
o si necesita usar un nombre de usuario y contraseña, ejecute mysqldump -u root -p orig_db > orig_db.sql
. orig_db es el nombre de la base de datos a la que desea "cambiar el nombre", root es el usuario que está iniciando sesión y orig_db.sql sería el archivo creado que contiene la copia de seguridad. Ahora crea una nueva base de datos vacía con el nombre que deseas para la base de datos. Por ejemplo, mysql -u root -p -e "create database new_db"
. Una vez hecho esto, ejecute mysql -u root -p new_db < orig_db.sql
. new_db ahora existe como una copia perfecta de orig_db. A continuación, puede descartar la base de datos original, ya que ahora la tiene existente en la nueva base de datos con el nombre de la base de datos que desea.
Los pasos cortos y rápidos sin toda la explicación anterior son:
-
mysqldump -u root -p original_database > original_database.sql
-
mysql -u root -p -e "create database my_new_database"
-
mysql -u root -p my_new_database < original_database.sql
-
mysql -u root -p -e drop database originl_database
Espero que esto ayude y este es un medio confiable para lograrlo sin utilizar algún método ad-hoc que corrompará sus datos y creará inconsistencias.
Puede hacerlo mediante la instrucción RENAME para cada tabla en su "current_db" después de crear el nuevo esquema "other_db"
RENAME TABLE current_db.tbl_name TO other_db.tbl_name
Si su base de datos contiene solo tablas MyISAM ( no use este método si tiene tablas InnoDB):
- apagar el servidor MySQL
- vaya al directorio de
data
mysql y cambie el nombre del directorio de la base de datos (Nota: los caracteres no alfa deben codificarse de una manera especial) - reiniciar el servidor
- ajustar privilegios si es necesario (otorgar acceso al nuevo nombre de base de datos)
Puede crear una secuencia de comandos en un solo comando para que el tiempo de inactividad sea de uno o dos segundos.
Utilicé el siguiente método para cambiar el nombre de la base de datos
haga una copia de seguridad del archivo usando mysqldump o cualquier herramienta de base de datos, por ejemplo, heidiSQL, administrador de mysql, etc.
Abra el archivo de respaldo (por ejemplo, backupfile.sql) en algún editor de texto.
Busque y reemplace el nombre de la base de datos y guarde el archivo.
Restaurar el archivo SQL editado