2010-07-10 2 views
7

У нас работает приложение PHP (zend framework), которое создает базу данных для каждого пользователя (для обеспечения безопасности/резервного копирования и других причин). Все эти базы данных имеют одинаковую структуру, и это всегда будет иметь место. Когда мы развертываем новые функции, нам необходимо развернуть все базы данных с новыми полями/таблицами.сразу меняет несколько баз данных mysql (изменения базы данных SAAS)

Я читал об использовании dbdeploy для этого, но я не уверен, что они поддерживают сразу несколько баз данных (без указания имен один за другим). Базы данных называются user1, user2, user3 и т. Д.

Есть ли хорошие инструменты, которые сделают этот процесс для нас более легким и менее болезненным? Мы запускаем phing для автоматического развертывания и обнаружили, что руководство http://www.davedevelopment.co.uk/2008/04/14/how-to-simple-database-migrations-with-phing-and-dbdeploy/ не так полезно, потому что они не поддерживают несколько баз данных, как у нас.

Кроме того, окно или макинтош MySQL клиенты, которые могут сделать это возможно для нас, поэтому мы открыты для чего-нибудь

+1

Являются ли эти базы данных на одном сервере? –

+0

да, все базы данных находятся на одном сервере! – Jorre

ответ

14

Вот PHP скрипт, который я собрал для вас. Он получает список всех баз данных и применяет обновления, если имя базы данных начинается с user.

У меня также есть резервная копия каждой базы данных до того, как она применит изменения. Часть резервной копии относится к Linux/Unix прямо сейчас, но ее можно настроить для работы с другими операционными системами.

В настоящий момент это довольно многословная информация, поэтому вы можете изменить ее по мере необходимости. Вы также можете изменить терминатор линии, в зависимости от того, будете ли вы запускать его из CLI или браузера. Я бы предложил поместить это в ваш каталог скриптов и запустить его из CLI.

Сообщите мне, если вам нужно что-нибудь еще, или если это не сработает для вас.

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

Я проверяю это, чтобы узнать, может ли он делать то, что мы ищем. Спасибо уже за публикацию такого большого скрипта! – Jorre

+0

Вы можете предвидеть какие-либо проблемы в загруженной базе данных относительно блокировки? – Jorre

+0

работает как шарм в базе данных без подключений. Каков ваш опыт в живой базе данных с большим количеством пользователей? – Jorre

Смежные вопросы