2010-07-10 7 views
7

Stiamo eseguendo un'applicazione PHP (zend framework) che crea un database per utente (per sicurezza/backup/e altri motivi). Tutti questi database hanno esattamente la stessa struttura e sarà sempre così. Quando implementiamo nuove funzionalità, abbiamo bisogno di espandere tutti i database con i nuovi campi/tabelle.altera più database mysql contemporaneamente (modifiche al database SAAS)

Ho letto sull'utilizzo di dbdeploy per questo, ma non sono sicuro che supportino più database contemporaneamente (senza dare uno dei nomi uno per uno). I database sono chiamati user1, user2, user3 e così via.

Esistono buoni strumenti che renderanno questo processo un po 'più facile e meno doloroso? Stiamo eseguendo phing per la distribuzione automatica e abbiamo trovato che la guida http://www.davedevelopment.co.uk/2008/04/14/how-to-simple-database-migrations-with-phing-and-dbdeploy/ non è così utile perché non supporta più database come quelli che abbiamo.

Inoltre, le finestre oi client Mac mysql che possono fare questo sono possibili per noi, quindi siamo aperti a tutto

+1

Questi database sono tutti sullo stesso server? –

+0

sì, tutti i database dbase si trovano sullo stesso server! – Jorre

risposta

14

Ecco uno script PHP che ho messo insieme per voi. Ottiene un elenco di tutti i database e applica gli aggiornamenti se il nome del database inizia con user.

Ho anche il backup di ogni database prima che applichi le modifiche. La porzione di backup è specifica per Linux/Unix in questo momento, ma può essere ottimizzata per funzionare su altri sistemi operativi.

Al momento è piuttosto dettagliato, quindi è possibile modificarlo in base alle esigenze. È inoltre possibile modificare il terminatore di riga, a seconda che venga eseguito dalla CLI o da un browser. Suggerirei di inserirlo nella directory degli script ed eseguirlo dalla CLI.

Fatemi sapere se avete bisogno di qualcos'altro o se questo non funziona per voi.

<?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

Lo sto verificando per vedere se può fare quello che stiamo cercando. Grazie già per aver postato una sceneggiatura così grande! – Jorre

+0

puoi prevedere qualche problema su un database occupato per quanto riguarda il blocco? – Jorre

+0

funziona come un incantesimo su un database senza connessioni. Qual è la tua esperienza su un database live con molti utenti su di esso? – Jorre