2010-07-10 6 views
7

Wir betreiben eine PHP-Anwendung (zend framework), die pro Benutzer eine Datenbank erstellt (aus Gründen der Sicherheit/Sicherung/und anderer Gründe). Alle diese Datenbanken haben genau die gleiche Struktur und das wird immer der Fall sein. Wenn wir neue Funktionen bereitstellen, müssen wir alle Datenbanken mit den neuen Feldern/Tabellen erweitern.mehrere MySQL-Datenbanken gleichzeitig ändern (Änderungen der SAAS-Datenbank)

Ich habe gelesen, über die Verwendung von dbdeploy für das, aber ich bin mir nicht sicher, dass sie mehrere Datenbanken gleichzeitig unterstützen (ohne die Namen eins nach dem anderen). Datenbanken heißen user1, user2, user3 und so weiter.

Gibt es irgendwelche guten Werkzeuge, die diesen Prozess für uns etwas einfacher und weniger schmerzhaft machen? Wir betreiben Phing für die automatisierte Bereitstellung und fanden die Anleitung http://www.davedevelopment.co.uk/2008/04/14/how-to-simple-database-migrations-with-phing-and-dbdeploy/ nicht so nützlich, weil sie nicht mehrere Datenbanken wie wir haben.

Auch Windows oder Mac mysql-Clients, die dies für uns möglich machen können, so sind wir

+1

Sind diese Datenbanken alle auf demselben Server? –

+0

Ja, alle Datenbanken befinden sich auf demselben Server! – Jorre

Antwort

14

hier offen für alles ist ein PHP-Skript, das ich für Sie zusammengestellt. Es ruft eine Liste aller Datenbanken ab und wendet die Aktualisierungen an, wenn der Datenbankname mit user beginnt.

Ich habe auch jede Datenbank sichern, bevor es die Änderungen anwendet. Der Backup-Teil ist momentan spezifisch für Linux/Unix, aber er kann optimiert werden, um auf anderen Betriebssystemen zu funktionieren.

Es ist im Moment ziemlich ausführlich, so dass Sie es bei Bedarf ändern können. Sie können den Zeilenabschluss auch ändern, je nachdem, ob Sie ihn über die CLI oder einen Browser ausführen. Ich würde vorschlagen, dies in Ihr Skriptverzeichnis zu legen und es von der CLI aus auszuführen.

Lassen Sie mich wissen, ob Sie noch etwas brauchen oder ob das nicht für Sie funktioniert.

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

Ich überprüfe diese, um zu sehen, ob sie das tun kann, wonach wir suchen. Danke schon für das Posten eines so großen Skripts! – Jorre

+0

können Sie Probleme in einer ausgelasteten Datenbank in Bezug auf Sperren vorhersehen? – Jorre

+0

funktioniert wie ein Zauber auf einer Datenbank ohne Verbindungen. Was ist Ihre Erfahrung in einer Live-Datenbank mit vielen Benutzern? – Jorre

Verwandte Themen