Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

711
Views
Cómo duplicar un esquema en la base de datos mysql

Objetivo

Duplique un esquema en la base de datos mysql, sin volcar archivos sql y ejecútelos.

Sería genial si hubiera una manera de realizar esta tarea en unos pocos comandos.

Fondo

Hay formas de volcar una base de datos e importarla ejecutando los sqls generados por un programa de volcado.

Pero lo que me gustaría hacer es ejecutar un comando como copy schema abc to abc_bk , y listo.

Porque tengo que hacerlo a través de phpmyadmin y volcar todos los campos y volver a importarlos consume demasiado tiempo.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Hay una declaración:

 CREATE TABLE <name> LIKE <othername>;

Pero tendrías que hacer esto una tabla a la vez. No existe una declaración única que haga esto para todas las tablas en un esquema.

Puede obtener una lista de tablas de INFORMATION_SCHEMA.TABLES:

 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = <old-schema>;

Luego, para cada tabla devuelta por esa consulta, ejecute la declaración:

 CREATE TABLE <new-schema>.<table-name> LIKE <old-schema>.<table-name>;

Debe escribir algún código para realizar el bucle para hacer esto.


Re tu comentario:

Si también desea copiar datos, puede usar INSERTAR ... SELECCIONAR .

 INSERT INTO <new-schema>.<table-name> SELECT * FROM <old-schema>.<table-name>;

Esto tomará un tiempo, proporcional a la cantidad de filas y la cantidad de índices que necesita actualizar en su tabla (es decir, el costo de escribir cada fila se multiplica por la cantidad de índices).

Tenga en cuenta que esto bloquea las filas que lee de su tabla anterior mientras se ejecuta INSERT...SELECT. Si necesita continuar escribiendo en la tabla anterior mientras esto sucede, recomendaría usar pt-archiver o pt-table-sync para hacer la copia.

over 4 years ago · Santiago Trujillo Report

0

En mi caso, quería crear una base de datos nueva y fresca basada en una existente, para usar con mis pruebas de integración. Es básicamente una versión desarrollada de la respuesta anterior de Bill Karwin.

Tenga en cuenta que mi solución no copia los datos. Si necesita esa funcionalidad, no debería ser demasiado difícil agregarla al script.

Puede hacer referencia a GitHub Gist aquí .

Aquí está el código MySQL para una referencia rápida:

 -- this procedure needs to be run somewhere, so just select a database USE `existing_db`; DELIMITER $$ DROP PROCEDURE IF EXISTS `exec`$$ DROP PROCEDURE IF EXISTS `copy_schema`$$ -- simple procedure to allow statement strings to be built and executed easily -- using `concat` CREATE PROCEDURE exec(stmt_text TEXT) BEGIN SET @sql_text = stmt_text; PREPARE stmt FROM @sql_text; EXECUTE stmt; DEALLOCATE PREPARE stmt; END $$ -- Copies the database `from_db` into a new database, `to_db`. -- Be careful: This procedure DROPs `to_db` before copying data CREATE PROCEDURE copy_schema(from_db VARCHAR(64), to_db VARCHAR(64)) BEGIN -- declare variables to be used throughout the procedure DECLARE curr_table_name VARCHAR(64) DEFAULT NULL; DECLARE done TINYINT DEFAULT FALSE; -- This is a cursor that will point to every row in -- INFORMATION_SCHEMA.TABLES -- Each row corresponds to a table in `from_db`, so this will effectively -- give us a foreach loop through the table names DECLARE table_cursor CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = from_db; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- initialize `to_db` before attempting to copy data into it CALL exec(concat('DROP DATABASE IF EXISTS ', to_db)); CALL exec(concat('CREATE DATABASE ', to_db)); OPEN table_cursor; -- Loop through all table names table_loop: LOOP FETCH NEXT FROM table_cursor INTO curr_table_name; -- Break if no more results IF done THEN LEAVE table_loop; ELSE -- Call `CREATE TABLE` for each table, copying the schema from `from_db` CALL exec(concat('CREATE TABLE ', to_db, '.', curr_table_name, ' LIKE ', from_db, '.', curr_table_name)); END IF; END LOOP; CLOSE table_cursor; END $$ DELIMITER ; -- EXAMPLE USAGE: CALL copy_schema('existing_db', 'existing_db_copy');
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!