2009-05-05 7 views
21

Tengo una aplicación en PHP/MySQL. Estoy buscando una manera automática de actualizar la base de datos detrás de la aplicación. No es necesario que tenga la compatibilidad con versiones anteriores una vez que se haya actualizado.Cómo automatizar la migración (esquema y datos) para la aplicación PHP/MySQL

He leído jeff's y K. Scott Allen's artículos sobre esto.

Todavía no estoy seguro de cómo implementar esto para una aplicación PHP/MySQL.

¿Hay algún proceso simple y bueno para esto?

Respuesta

16

Tengo un objeto "esquema" que utilizo - pero usted podría hacer lo mismo sin clases ..

Lo que se quiere hacer es crear un 'db_schema_versions' tabla:

CREATE TABLE db_schema_versions (
    `table` varchar(255) NOT NULL PRIMARY KEY, 
    `version` INT NOT NULL 
) 

Después su base de datos puede rastrear en qué versión está: puede hacer actualizaciones de SQL automáticamente.

Debe bloquear su tabla de esquema mientras actualiza el esquema. De esta manera, no tendrás dos solicitudes en el mismo momento tratando de actualizar tu esquema.

Por lo tanto - un seguimiento de la versión que está actualizando desde - construir un gran cambio - algo como esto:

class SNTrack_Db_Schema extends MW_Db_Schema_Abstract { 
    protected $table = "sntrack_db_schema"; 
    protected $version = 5; 

    protected function upgrade($fromVersion) { 
    // don't break 
    switch($fromVersion) { 
     case 0: 
     $this->db->query('CREATE TABLE sntrack_inbound_shipment (
      `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
      `from` VARCHAR(255) NOT NULL, 
      `date` DATE NOT NULL, 
      `invoice` VARCHAR(255) NOT NULL, 
      `notes` TEXT 
     )'); 
     $this->setVersion(1); 
     case 1: 
     $this->db->query('ALTER TABLE sntrack_details ADD `shipment_id` INT'); 
     $this->db->query('ALTER TABLE sntrack_product ADD `inventory` INT NOT NULL DEFAULT 0'); 
     $this->db->query('CREATE TABLE sntrack_inventory_shipment (
      `shipment_id` INT NOT NULL, 
      `product_id` INT NOT NULL, 
      `qty` INT NOT NULL, 
      PRIMARY KEY (`shipment_id`, `product_id`) 
     )'); 
     $this->setVersion(2); 
...etc 
+0

si el usuario se está actualizando de la versión 2 a la versión 6. ¿Podría iterar sobre cada versión 2-6 y ejecutar cada SQL en el conmutador 2,3,4,5 y 6 para que cada actualización en el conmutador sea solo la sql para actualizar desde la versión anterior? – JasonDavis

0

Una manera de hacerlo es volcar la base de datos en un gran archivo sql usando mysqldump. Solo toma ese archivo y compáralo en la nueva instalación.

4

similar a la de gnarf sugerencia que haría funcionar con lo siguiente:

  • Para cada cambio al esquema crea un archivo SQL que cuando se ejecuta lo llevará de la versión anterior a la nueva (esto podría ser un archivo por versión principal o muchos cambios más pequeños).
  • Cree un archivo separado que enumere cada uno de los nombres de archivo SQL en el orden en que se deben aplicar (más antiguo en la parte superior, más reciente en la parte inferior)
  • Cree una tabla simple de "control de versiones" (todo lo que necesita es un único VARCHAR) en su base de datos

Ahora tiene que escribir un script simple que funciona de la siguiente manera:

  • consultar la tabla de versiones para el nombre del archivo de actualización última SQL aplica
  • Sí hay son nuevos archivos de alteración SQL para ejecutar ejecutarlos en secuencia
  • registro del nombre del archivo más reciente de SQL aplica

espero que tenga sentido

+0

+1 para una buena lógica. Pero, ¿cómo se ejecutan los archivos sql de PHP? SOURCE file.sql no funciona con mysqli_real_query! ¿O cómo lo hace? – Sabya

+0

Quizás tendrías que explotar; para encontrar declaraciones (pero esto sería fácil de romper). Algún tipo de implementación no muy buena de 'cat /some/deployment-file.sql | mysql ... 'podría usarse –

0

No se puede. O lo

  1. archivos de actualización de escribir con todas las de SQL que se ejecutan en entorno de origen y luego ejecutarlos (mencionado anteriormente), SVN-similares.Necesita script php para ejecución y trabajo manual para escritura sql

  2. Analice ambos entornos y sugiera al usuario qué actualizaciones se deben migrar. Básicamente es lo mismo que el primero, excepto que tienes un gran paso para la migración, no muchos trozos pequeños. SQLyog puede analizar las diferencias tanto para el esquema como para los datos.

3

intentar usar esta herramienta para la migración de esquemas: https://github.com/idler/MMP/

+0

He fusionado sus cuentas registradas y no registradas para que tenga un control total sobre sus publicaciones. –

2

he creado un pequeño script de migración de MySQL en PHP. Es bueno para los proyectos en etapa inicial y para aquellos que no necesitan (todavía) las secuencias de comandos de migración más complejas. https://github.com/kennberg/php-mysql-migrate

0

También es posible usar una API libre SqlQuerySync

o crear por sí mismo una tabla de base de la gestión de CREATE/ALTER/consultas de eliminación.

0

software de banco de MySQL (se pudo encontrar en el sitio web de MySQL) hace eso. Sin embargo, implica pasos de clicky repetitivos.

0

Tengo el mismo objetivo: migrar una gran base de datos (más de un millón de líneas en algunas tablas). Estoy considerando usar https://phinx.org que parece bueno para tratar con la migración de esquema, además viene con la opción de reversión por seguridad.

0

Puede probar esta biblioteca: mysql-version-control.

Me gusta porque distingue entre el esquema, los datos principales y los datos de prueba. Pero lo hace de una manera que todavía es realmente fácil de usar.

Cuestiones relacionadas