2010-07-10 5 views
7

Nous courons une application PHP (zend framework) qui crée une base de données par utilisateur (pour la sécurité/sauvegarde/et des raisons autres). Toutes ces bases de données ont exactement la même structure et ce sera toujours le cas. Lorsque nous déployons de nouvelles fonctionnalités, nous devons développer toutes les bases de données avec les nouveaux champs/tables.alter plusieurs bases de données MySQL à la fois (base de données change pbsl)

J'ai lu sur l'utilisation dbdeploy pour cela, mais je ne suis pas sûr qu'ils prennent en charge plusieurs bases de données à la fois (sans donner les noms un par un). Les bases de données sont appelées user1, user2, user3 et ainsi de suite.

Y a-t-il des bons outils qui feront de ce processus pour nous un peu plus facile et moins douloureux? Nous exécutons phing pour le déploiement automatisé et trouvé le guide http://www.davedevelopment.co.uk/2008/04/14/how-to-simple-database-migrations-with-phing-and-dbdeploy/ pas si utile, car ils ne supportent pas plusieurs bases de données comme nous avons.

En outre, les fenêtres ou les clients de MySQL mac qui peuvent le faire sont possibles pour nous, donc nous sommes ouverts à tout

+1

Ces bases de données sont-elles toutes sur le même serveur? –

+0

oui, tous les dbases sont sur le même serveur! – Jorre

Répondre

14

Voici un script PHP que je mis en place pour vous. Il obtient une liste de toutes les bases de données et applique les mises à jour si le nom de la base de données commence par user. Je l'ai également sauvegarder chaque base de données avant d'appliquer les modifications. La partie de sauvegarde est spécifique à Linux/Unix en ce moment, mais elle peut être modifiée pour fonctionner sur d'autres systèmes d'exploitation.

Il est assez bavard au moment, donc vous pouvez changer au besoin. Vous pouvez également modifier la terminaison de ligne, en fonction de si vous l'exécutez à partir de la CLI ou d'un navigateur. Je suggère de mettre cela dans votre répertoire de scripts et exécutez-le à partir de la CLI.

Laissez-moi savoir si vous avez besoin d'autre chose ou si cela ne fonctionne pas pour vous.

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

Je vérifie celle-ci pour voir si elle peut faire ce que nous cherchons. Merci déjà d'avoir posté un tel script! – Jorre

+0

pouvez-vous prévoir des problèmes sur une base de données occupée concernant le verrouillage? – Jorre

+0

fonctionne comme un charme sur une base de données sans connexion. Quelle est votre expérience sur une base de données en ligne avec beaucoup d'utilisateurs? – Jorre

Questions connexes