Me gustaría escribir un script que copie mi base sitedb1
de datos actual sitedb2
en la misma instancia de base de datos mysql. Sé que puedo volcar el sitedb1 a un script sql:
mysqldump -u root -p sitedb1 >~/db_name.sql
y luego importarlo a sitedb2
. ¿Hay una manera más fácil, sin volcar la primera base de datos en un archivo sql?
Respuestas:
Como dice el manual en Copiar bases de datos , puede canalizar el volcado directamente en el cliente mysql:
Si está utilizando MyISAM, podría copiar los archivos, pero no lo recomendaría. Es un poco dudoso.
Integrado de varias buenas otras respuestas
Ambos
mysqldump
y losmysql
comandos aceptan opciones para configurar detalles de conexión (y mucho más), como:Además, si la nueva base de datos aún no existe, debe crearla de antemano (por ejemplo, con
echo "create database new_db_name" | mysql -u <dbuser> -p
).fuente
mysqldump -uroot -p database1 | mysql -uroot -p database2
. Me solicitan ambas pws pero solo puedo poner una. Las miradas rápidas como esto:Enter password: Enter password:
. Después de dar la primera pw, el proceso espera para siempre.Usando utilidades MySQL
Las utilidades MySQL contienen la buena herramienta
mysqldbcopy
que, de forma predeterminada, copia una base de datos que incluye todos los objetos relacionados ("tablas, vistas, disparadores, eventos, procedimientos, funciones y concesiones a nivel de base de datos") y datos de un servidor de base de datos a la misma o a otra Servidor de base de datos. Hay muchas opciones disponibles para personalizar lo que realmente se copia.Entonces, para responder la pregunta del OP:
fuente
mysqldump
solución basada estaba fallando.sudo apt-get install mysql-utilities
, pero esto es muy bueno. ¿Puedo omitir la contraseña y se me solicitará que la ingrese?mysqldbcopy
que te pida la contraseña; al menos no pude encontrar algo así en la documentación. Sin embargo, podría construir esta funcionalidad usted mismo. En Bash eso podría verse más o menos así:mysqldbcopy --source=root:"$(read -sp 'Source password: ' && echo $REPLY)"@localhost --destination=root:"$(read -sp 'Destination password: ' && echo $REPLY)"@localhost sitedb1:sitedb2
--force
almysqldbcopy
comando porque ya había creado la base de datos de destino. ¡Gracias!fuente
Necesita ejecutar el comando desde el terminal / símbolo del sistema.
p.ej:
mysqldump -u root test_db1 | mysql -u root test_db2
Esto copia test_db1 a test_db2 y otorga el acceso a 'root' @ 'localhost'
fuente
La mejor manera es ingresar estos comandos en su terminal y establecer permisos para el usuario root. Funciona para mi..!
fuente
mysqldump -u <user> -p <pwd> db_name | mysql -u <user> -p <pwd> new_db_name
puede ser problemática con grandes bases de datos.Puede usar (en pseudocódigo):
La razón por la que no estoy usando la sintaxis CREATE TABLE ... SELECT ... es para preservar los índices. Por supuesto, esto solo copia tablas. Las vistas y los procedimientos no se copian, aunque se puede hacer de la misma manera.
Ver CREAR TABLA .
fuente
Primero cree la base de datos duplicada:
Asegúrese de que todos los permisos, etc. estén en su lugar y:
fuente
Puedes hacer algo como lo siguiente:
fuente
Esta declaración se agregó en MySQL 5.1.7, pero se descubrió que era peligrosa y se eliminó en MySQL 5.1.23. Estaba destinado a permitir la actualización de bases de datos anteriores a 5.1 para usar la codificación implementada en 5.1 para asignar nombres de bases de datos a nombres de directorios de bases de datos. Sin embargo, el uso de esta declaración podría provocar la pérdida del contenido de la base de datos, por lo que se eliminó. No utilice RENAME DATABASE en versiones anteriores en las que está presente.
Para realizar la tarea de actualizar los nombres de las bases de datos con la nueva codificación, use ALTER DATABASE db_name UPGRADE DATA DIRECTORIO DE NOMBRES en su lugar: http://dev.mysql.com/doc/refman/5.1/en/alter-database.html
fuente
Una manera simple de hacerlo si instaló phpmyadmin :
Vaya a su base de datos, seleccione la pestaña "operación" y podrá ver el bloque "copiar base de datos a". Úselo y puede copiar la base de datos.
fuente
Como se menciona en la respuesta de Greg ,
mysqldump db_name | mysql new_db_name
es la forma gratuita, segura y fácil de transferir datos entre bases de datos. Sin embargo, también es muy lento .Si está buscando hacer una copia de seguridad de los datos, no puede permitirse el lujo de perder datos (en esta u otras bases de datos), o está usando tablas diferentes
innodb
, entonces debe usarlasmysqldump
.Si está buscando algo para el desarrollo, haga una copia de seguridad de todas sus bases de datos en otro lugar y se sienta cómodo purgando y reinstalando
mysql
(posiblemente manualmente) cuando todo sale mal, entonces podría tener la solución para usted.No pude encontrar una buena alternativa, así que construí un script para hacerlo yo mismo. Gasté mucho tiempo haciendo que esto funcione la primera vez y, sinceramente, me aterra un poco hacer cambios ahora. Las bases de datos Innodb no estaban destinadas a copiarse y pegarse de esta manera. Pequeños cambios hacen que esto falle de maneras magníficas. No he tenido ningún problema desde que finalicé el código, pero eso no significa que no lo harás.
Sistemas probados (pero aún pueden fallar):
Que hace
sudo
privilegios y verifica que tenga suficiente espacio de almacenamiento para clonar la base de datosCómo se compara con
mysqldump
En una base de datos de 3 gb, usar
mysqldump
ymysql
tomaría 40-50 minutos en mi máquina. Usando este método, el mismo proceso solo tomaría ~ 8 minutos.Como lo usamos
Tenemos nuestros cambios de SQL guardados junto con nuestro código y el proceso de actualización está automatizado tanto en producción como en desarrollo, con cada conjunto de cambios haciendo una copia de seguridad de la base de datos para restaurar si hay errores. Un problema con el que nos encontramos fue cuando estábamos trabajando en un proyecto a largo plazo con cambios en la base de datos, y tuvimos que cambiar ramas en el medio para corregir un error o tres.
En el pasado, utilizamos una única base de datos para todas las sucursales, y tendríamos que reconstruir la base de datos cada vez que cambiamos a una sucursal que no era compatible con los nuevos cambios en la base de datos. Y cuando volviéramos, tendríamos que ejecutar las actualizaciones nuevamente.
Intentamos
mysqldump
duplicar la base de datos para diferentes sucursales, pero el tiempo de espera fue demasiado largo (40-50 minutos) y, mientras tanto, no pudimos hacer nada más.Esta solución acortó el tiempo de clonación de la base de datos a 1/5 del tiempo (piense en el café y el baño en lugar de un almuerzo largo).
Tareas comunes y su tiempo
Cambiar entre sucursales con cambios incompatibles en la base de datos lleva más de 50 minutos en una sola base de datos, pero no hay tiempo después del tiempo de configuración inicial con
mysqldump
este código. Este código resulta ser ~ 5 veces más rápido quemysqldump
.Aquí hay algunas tareas comunes y aproximadamente cuánto tiempo tomarían con cada método:
Cree una rama de características con cambios en la base de datos y fusione de inmediato:
mysqldump
: 50-60 minutosCree una rama de características con cambios en la base de datos, cambie a
master
una corrección de errores, realice una edición en la rama de características y fusione:mysqldump
: 50-60 minutosCree una rama de características con cambios en la base de datos, cambie a
master
una corrección de errores 5 veces mientras realiza ediciones en la rama de características intermedias y combine:mysqldump
: 50-60 minutosEl código
No use esto a menos que haya leído y entendido todo lo anterior.
Si todo va bien, debería ver algo como:
fuente
Además de la respuesta de Greg , esta es la forma más fácil y rápida si
new_db_name
aún no existe:fuente
Si tiene activadores en su base de datos original, puede evitar el error "El activador ya existe" colocando un reemplazo antes de la importación:
fuente
No creo que haya un método para hacer esto. Cuando PHPMyAdmin hace esto, volca la base de datos y luego la vuelve a insertar con el nuevo nombre.
fuente