2010-07-10 54 views
7

Chúng tôi đang chạy ứng dụng PHP (khung công tác zend) tạo cơ sở dữ liệu cho mỗi người dùng (vì lý do bảo mật/sao lưu/và các lý do khác). Tất cả các cơ sở dữ liệu này đều có cấu trúc giống nhau và luôn luôn như vậy. Khi chúng tôi triển khai các tính năng mới, chúng tôi sẽ cần mở rộng tất cả các cơ sở dữ liệu với các trường/bảng mới.thay đổi nhiều cơ sở dữ liệu mysql cùng một lúc (thay đổi cơ sở dữ liệu SAAS)

Tôi đã đọc về cách sử dụng dbdeploy cho điều đó, nhưng tôi không chắc chắn rằng chúng hỗ trợ nhiều cơ sở dữ liệu cùng một lúc (không đưa ra từng cái một). Cơ sở dữ liệu được gọi là user1, user2, user3 và vv.

Có công cụ tốt nào giúp quá trình này giúp chúng tôi dễ dàng hơn và ít đau hơn không? Chúng tôi đang chạy phing để triển khai tự động và tìm thấy hướng dẫn http://www.davedevelopment.co.uk/2008/04/14/how-to-simple-database-migrations-with-phing-and-dbdeploy/ không hữu ích vì chúng không hỗ trợ nhiều cơ sở dữ liệu như chúng tôi có.

Ngoài ra, cửa sổ hoặc khách hàng mac mysql có thể làm được điều này có thể xảy ra cho chúng ta, vì vậy chúng tôi đang mở ra cho bất cứ điều gì

+1

Các cơ sở dữ liệu này có trên cùng một máy chủ không? –

+0

có, tất cả các dbase đều nằm trên cùng một máy chủ! – Jorre

Trả lời

14

Dưới đây là một kịch bản PHP mà tôi đặt lại với nhau cho bạn. Nó nhận danh sách tất cả các cơ sở dữ liệu và áp dụng các bản cập nhật nếu tên cơ sở dữ liệu bắt đầu bằng user.

Tôi cũng có nó sao lưu từng cơ sở dữ liệu trước khi áp dụng các thay đổi. Phần sao lưu dành riêng cho Linux/Unix ngay bây giờ, nhưng nó có thể được tinh chỉnh để hoạt động trên các hệ điều hành khác.

Hiện tại là khá chi tiết, vì vậy bạn có thể thay đổi nếu cần. Bạn cũng có thể thay đổi trình kết thúc dòng, tùy thuộc vào việc bạn sẽ chạy nó từ CLI hay trình duyệt. Tôi sẽ đề nghị để đặt này trong thư mục kịch bản của bạn và chạy nó từ CLI.

Hãy cho tôi biết nếu bạn cần bất kỳ điều gì khác hoặc nếu điều này không hiệu quả với bạn.

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

Tôi đang kiểm tra điều này để xem liệu nó có thể làm những gì chúng tôi đang tìm kiếm hay không. Cảm ơn bạn đã đăng một kịch bản lớn như vậy! – Jorre

+0

bạn có thể thấy trước bất kỳ vấn đề nào trên cơ sở dữ liệu bận rộn về khóa không? – Jorre

+0

hoạt động như một nét duyên dáng trên cơ sở dữ liệu mà không cần kết nối. Kinh nghiệm của bạn về một cơ sở dữ liệu trực tiếp với rất nhiều người dùng trên đó là gì? – Jorre

Các vấn đề liên quan