2014-03-01 64 views
0

我有一個應用程序,其中每個用戶都有自己的數據庫,其中每個數據庫具有相同的模式。多個數據庫遷移提高性能

我有一個以這種方式進行遷移的腳本:通過數據庫

  1. SHOW數據庫
  2. 迭代
  3. 執行SQL語句

這可能需要當有很長一段時間花費大量時間(3秒或更長時間)的複雜查詢

I有沒有辦法讓我可以同時從一個腳本運行每個數據庫的sql語句?這樣做是否危險/資源密集?

我想這樣做的原因是爲了儘可能地防止停機。

這是現在我的腳本:

<?php 
ini_set('display_errors', 1); 
set_time_limit(0); 
$sql = file_get_contents('../update.sql'); 
$sql_queries = explode(";", $sql); 
$exclude_dbs = array('horde','phppoint_forums','phppoint_site','roundcube', 'pos', 'bntennis_site', 'mysql', 'information_schema', 'performance_schema'); 

$conn = mysqli_connect("localhost", "root", "PASSWORD"); 
$show_db_query = mysqli_query($conn, 'SHOW databases'); 
$databases = array(); 
while ($row = mysqli_fetch_assoc($show_db_query)) 
{ 
    if (!in_array($row['Database'], $exclude_dbs)) 
    { 
     $databases[] = $row['Database']; 
    } 
} 

foreach($databases as $database) 
{ 
    mysqli_select_db($conn, $database); 
    echo "Running queries on $database\n***********************************\n"; 
    foreach($sql_queries as $query) 
    { 
     if (!empty($query)) 
     { 
      echo "$query;"; 
      if (!mysqli_query($conn, $query)) 
      { 
       echo "\n\nERROR: ".mysqli_error($conn)."\n\n"; 
      } 
     } 
    } 
    echo "\n\n"; 
} 
?> 
+0

在一個操作中爲每個數據庫運行查詢是非常危險的,並且會成爲資源管理員。最好將查詢或操作分開,然後調用每個查詢或操作。或者您可以調用一種方法將主數據複製到一個數據庫,然後針對該數據庫運行查詢,並只在需要更多信息時查詢其他數據庫。但是,在查看安全性和響應時間時,一次向多個數據庫發送複雜查詢絕不是一個好主意。 – James

回答

0

我不知道該數據庫將保持該載荷,但基本上我會用叉子叉進程或將其產卵到背景,這取決於語言。

對於php,您可以爲每個基本上並行運行遷移的數據庫分叉進程。

+0

是的,我開始認爲在200個數據庫上同時執行昂貴的查詢可能是一個壞主意。 –