2010-07-10 19 views
7

Estamos ejecutando una aplicación PHP (zend framework) que crea una base de datos por usuario (por razones de seguridad/copia de seguridad/y otras). Todas estas bases de datos tienen exactamente la misma estructura y ese siempre será el caso. Cuando implementamos nuevas funciones, tendremos que expandir todas las bases de datos con los nuevos campos/tablas.alterar múltiples bases de datos mysql a la vez (cambios en la base de datos SAAS)

He leído sobre el uso de dbdeploy para eso, pero no estoy seguro de que admitan varias bases de datos a la vez (sin dar los nombres uno por uno). Las bases de datos se llaman usuario1, usuario2, usuario3, etc.

¿Existen buenas herramientas que hagan que este proceso sea más fácil y menos doloroso para nosotros? Estamos ejecutando phing para la implementación automática y encontramos que la guía http://www.davedevelopment.co.uk/2008/04/14/how-to-simple-database-migrations-with-phing-and-dbdeploy/ no es tan útil porque no admite varias bases de datos como las que tenemos.

También, ventanas o clientes mac mysql que pueden hacer esto son posibles para nosotros, así que están abiertos para cualquier cosa

+1

¿Están todas estas bases de datos en el mismo servidor? –

+0

sí, todas las bases de datos están en el mismo servidor. – Jorre

Respuesta

14

Aquí es un script PHP que he creado para ti. Obtiene una lista de todas las bases de datos y aplica las actualizaciones si el nombre de la base de datos comienza con user.

También lo tengo copia de seguridad de cada base de datos antes de aplicar los cambios. La parte de la copia de seguridad es específica de Linux/Unix en este momento, pero puede ajustarse para funcionar en otros sistemas operativos.

Es muy detallado en este momento, por lo que puede cambiarlo según sea necesario. También puede cambiar el terminador de línea, dependiendo de si lo ejecutará desde la CLI o un navegador. Sugeriría poner esto en su directorio de scripts y ejecutarlo desde la CLI.

Avíseme si necesita algo más o si esto no funciona para usted.

<?php 
// Configure these as needed 
$db_host = 'localhost'; 
$db_user = 'user'; 
$db_pass = 'password'; 

$datetime_pattern  = date('Ymd.His'); 
$backup_file_path  = "/path/to/db_backups/$datetime_pattern/"; 
$backup_file_format  = "db_backup.%s.sql"; 
$backup_syntax_pattern = "/usr/bin/mysqldump --host=%s --user=%s --password=%s --opt %s > $backup_file_path/db_backup.%s.sql"; 
// !!!!!!!!!!!!!!!!!!!!!!!!!!!! 
// CHANGE THE PERMISSIONS!!!!!! 
// !!!!!!!!!!!!!!!!!!!!!!!!!!!! 
$backup_file_permission = 0777; 

// Choose how to terminate your lines 
$line_end = "\n";  // Use for CLI 
//$line_end = "<br/>"; // Use for browser 

// Match words that begin with 'user', case-insensitive 
$pattern = '/^user/i'; 

// What changes will we be applying? 
$db_update_syntax = array("ALTER TABLE foo ADD baz1 VARCHAR(30) AFTER bar1", 
          "ALTER TABLE foo ADD baz2 VARCHAR(30) AFTER bar2", 
          "ALTER TABLE foo ADD baz3 VARCHAR(30) AFTER bar3", 
         ); 

// END OF CONFIGURATION 
///////////////////////////////////////////////////////////// 


// Create the database backup directory 
if (!mkdir($backup_file_path, $backup_file_permission, true)) { 
    die('Failed to create backup directory...'); 
} 

// Connecting to MySQL. 
$conn = @mysql_connect($db_host, $db_user, $db_pass) 
     or die('Not connected : ' . mysql_errno() . ': ' . mysql_error()); 

$db_list = mysql_list_dbs($conn); 

echo "{$line_end}Starting Database Update.{$line_end}"; 
while ($row = mysql_fetch_assoc($db_list)) { 
    $db_name = $row['Database']; 
    if (preg_match($pattern, $db_name)) { 
     echo "{$line_end}A match was found: [$db_name]{$line_end}"; 
     echo "Backing up the database{$line_end}"; 
     // Backup the database 
     $backup_syntax = sprintf($backup_syntax_pattern, $db_host, $db_user, $db_pass, $db_name, $db_name); 
     exec($backup_syntax); 
     $db_selected = mysql_select_db($db_name, $conn) 
         or die("Can't use [$db_name] : " . mysql_error()); 

     foreach ($db_update_syntax as $each_update_syntax) { 
      echo "Altering using: [$alter_syntax]{$line_end}"; 
      $update_status = mysql_query($alter_syntax); 
      if ($update_status) { 
       echo "Success!{$line_end}{$line_end}"; 
      } else { 
       echo "Unable to update [$db_name] : " . mysql_error() . "{$line_end}{$line_end}"; 
      } 
     } 
    } else { 
     echo "Ignoring: [$db_name]{$line_end}"; 
    } 
} 
echo "Finished!{$line_end}"; 
// Free resources/Close MySQL Connection 
mysql_free_result($db_list); 
mysql_close($conn); 
+0

Estoy revisando este para ver si puede hacer lo que estamos buscando. ¡Gracias por publicar un script tan grande! – Jorre

+0

¿puede prever algún problema en una base de datos ocupada con respecto al bloqueo? – Jorre

+0

funciona como un encanto en una base de datos sin conexiones. ¿Cuál es su experiencia en una base de datos en vivo con muchos usuarios en ella? – Jorre

Cuestiones relacionadas