當我不得不應付過去關係型數據的備份(在MySQL中是不是超級不同,從你正在運行MSSQL能力方面)是創建一個備份「包」文件,它基本上是一個帶有不同文件擴展名的zip文件,這樣windows就不會讓用戶打開它。
如果您確實想要看到它,請在壓縮文件後對其進行加密並更改擴展名。我認爲你正在爲你的SaaS使用ASP,並且因爲我是一個PHP怪胎,所以我不能對代碼事物做太多的幫助,但是我之前處理這個事情的方式是用於包裝腳本整個Joomla網站和數據庫以遷移到新的服務器。
//open the MySQL connection
$dbc = mysql_connect($cfg->host,$cfg->user,$cfg->password);
//select the database
mysql_select_db($cfg->db,$dbc);
output('Getting database tables
');
//get all the tables in the database
$tables = array();
$result = mysql_query('SHOW TABLES',$dbc);
while($row = mysql_fetch_row($result)) {
$tables[] = $row[0];
}
output('Found '.count($tables).' tables to be migrated.
Exporting tables:
');
$return = "";
//cycle through the tables and get their create statements and data
foreach($tables as $table) {
$result = mysql_query('SELECT * FROM '.$table);
$num_fields = mysql_num_fields($result);
$return.= 'DROP TABLE IF EXISTS '.$table.";\n";
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$return.= $row2[1].";\n";
while($row = mysql_fetch_row($result)) {
$return.= 'INSERT INTO '.$table.' VALUES(';
for($j=0; $j<$num_fields; $j++) {
$row[$j] = mysql_escape_string($row[$j]);
$row[$j] = ereg_replace("\n","\\n",$row[$j]);
if (!empty($row[$j])) {
$return.= "'".$row[$j]."'" ;
} else {
$return.= "NULL";
}
if ($j<($num_fields-1)) {
$return.= ',';
}
}
$return.= ");\n";
}
}
這是在PHP是循環的數據庫結構和存儲在$ result中休閒的腳本,然後可以輸出到文件的代碼的相關部分。
就你而言,你不想重新創建數據庫,而是重新創建數據本身。由於您的SaaS易於發生可能需要考慮的數據結構更改,因此您已經稍微複雜一些。我的建議是:
使用與上述類似的系統從各個表中轉儲相關數據。我只是簡單地提取所有的數據,但是你可以通過使用JOIN語句和類似的東西來只抽取與個人用戶有關的部分。將每個表的insert/replace語句的內容轉儲到一個以該表命名的文件中。創建一個名爲manifest.xml的文件或類似的東西,並使用您的SaaS應用程序的當前版本,名稱/信息,唯一ID等導出數據。
將所有這些文件打包到一個ZIP文件中,將擴展名更改爲任何你想要的,如果你想加密它,等等。讓他們下載該備份文件,然後設置好。
在您的導入腳本中,您需要讀取導出數據的版本號,並將其與某些算法進行比較,該算法可以根據稍後修訂的數據重新處理數據。這樣,如果您稍後需要重新導入其中一個備份,則可以正確處理將數據從將備份拉到當前表中數據的當前結構時進行轉換。
希望幫助;)
這是僅用於嚴格備份還是恢復? – 2012-02-08 18:05:10
爲什麼不能使用ssis爲每個組織創建備份? – Phil 2012-02-08 18:06:59
@KrisIvanov如果我們公司或我們的數據發生了變化,他們只需要恢復它。它只是爲了讓他們感覺數據安全。 – 2012-02-08 18:09:39