在SQL Server中謹慎匯入匯出大容量資料

iSQlServer發表於2009-03-31

在資料庫初始化過程中,管理員需要面對的一個現實問題就是如何把大容量的資料匯入到資料庫系統中。在SQL Server資料庫中提供了一些大容量資料匯入匯出的工具供資料庫管理員實用。如管理員可以通過bcp實用工具,實現大容量匯出資料和大容量匯入資料並生成格式化檔案。如可以利用bulk insert語句將大容量資料直接從資料檔案匯入資料庫表或者未分割槽的檢視中去等等。

雖然在SQL Server資料庫中提供了這些實用工具。不過管理員在實際工作中,仍然需要謹慎對待這項工作。具體的來說,在大容量資料匯入匯出的過程中,需要注意如下幾方面的內容。

一、 儘量採用系統提供的工具來倒入匯出大容量的資料

以上筆者提到的幾款實用工具,他們有一個共同的特點,即在匯入的過程中會對大容量的資料進行一定的優化。如會規範一些資料的格式、節省匯入匯出的時間等等。但是利用這些工具的話,跟其他普通的資料匯入匯出工具有一個差異,就是大容量匯入操作不支援逗號分隔符檔案中匯入資料,也就是常說的文字檔案。雖然此時管理員也可以通過其他的工具來匯入檔案檔案格式的大容量資料,但是通常情況下筆者不建議這麼做。因為其他的工具不支援匯入過程中的優化功能。為此筆者建議先用其他工具,如ACCESS等中間工具先把文字檔案中的資料轉化為普通的表格形式,然後再利用上面這些工具匯入到系統中。這雖然會增加一定的工作量,但是卻可以保證大容量資料的質量。為此,筆者在實際工作中,如果使用者遇到這種問題筆者是強烈建議他們要採用系統提供的工具來匯入匯出大容量資料。

另外,利用格式化檔案來提高大容量資料的規範化,也是一個不錯的選擇。上面提到的幾款大容量匯入匯出工具都支援使用專門的格式化檔案來儲存原始資料檔案中每個欄位的格式資訊。格式化檔案還可以包含相應的資料庫表的有關資訊。格式化檔案可以用於提供從資料庫例項大容量匯出資料和向其中大容量匯入資料時所需的所有格式資訊。通俗的講,格式化檔案提供了一種解釋匯入期間資料檔案中資料的格式以及設定匯出期間資料檔案中資料格式的靈活方式。這種靈活性使得解釋資料時無需編寫專用程式碼,也無需為滿足資料庫或外部應用程式的特殊需要而重新設定資料的格式。如果靈活利用格式化檔案,那麼使用者可以直接按需要的格式匯出或者匯入大容量資料,而不用事後再進行額外的格式調整。

二、 選擇合適的資料庫日誌操作模式

正如大家所知道的,使用者在資料庫中做的任何變化,都會記錄在相關的日誌中。匯入匯出大容量資料也不例外。可是由於大容量資料比較大,會佔用比較大的事務日誌功能。為此筆者建議,在使用者匯入大容量資料之前,最好選擇合適的資料庫日誌操作模式。筆者的做法是,如果使用者需要匯入大容量資料,那麼最好選擇大容量日誌恢復模式。等到匯入工作完成之後,再恢復到原先的模式。

這主要是因為在大容量日誌模式下,對於大容量資料匯入工作中說,支援力度相對來說比較好。與其他日誌恢復模式相比(如完全恢復模式),大容量日誌恢復模式只對大容量操作進行最小記錄。為此大容量日誌操作恢復模式保護大容量操作不受硬體故障的危害,提供比較好的效能並且佔用日誌的空間也是最小的。所以,使用大容量日誌恢復有助於防止事務日誌出現空間不足的情況,因為大容量日誌恢復不會插入日誌行。這個大容量日誌操作模式,非常適用於使用完整恢復模式的資料庫。對無索引表執行大容量操作時,大容量日誌恢復模式非常有用。

不過大容量日誌操作模式也具有一定的風險。如大容量日誌恢復模式會增加這些大容量複製操作丟失資料的風險。因為大容量日誌操作模式將會阻止資料庫系統捕獲對每個事務逐一所做的更改。如果日誌備份包含大容量日誌操作,則無法還原到該日誌備份中的時點,而只能還原整個日誌備份。另外在大容量日誌恢復模式下,如果日誌備份覆蓋了任何大容量操作,則日誌備份將包含由大容量操作所更改的日誌記錄和資料頁。這對於捕獲大容量日誌操作的結果至關重要。合併的資料區可使日誌備份變得非常龐大。再者,備份日誌需要訪問包含大容量日誌事務的資料檔案。如果無法訪問任何受影響的資料庫檔案,則事務日誌將無法備份,並且在此日誌中提交的所有操作都會丟失。所以大容量日誌備份模式並不是安全的日誌模式。

三、 考慮是否需要先暫時刪除表的索引

引是一種特殊的檔案,在資料庫中它的作用是舉足輕重的。簡單的來說,如果把資料庫比喻成一本書的話,那麼索引就好像是書的目錄。索引包含著對資料表裡所有記錄的引用指標。索引可以提高資料庫的效能,這是毋庸置疑的。但是不是在任何場合索引都可以起到正面的效果。在某些特殊情況下,其反而會降低一些操作的效能,如大容量資料的匯入。

索引可以加快資料檢索操作,但它會使資料修改操作變慢。因為每次修改或者插入資料記錄,索引就必須重新整理一次。也就是說,插入一百萬條記錄,則索引就必須重新所新一百萬次。可見,當大容量資料匯入的時候,索引將耗費資料庫大量的資源,從而降低資料庫的效能。如果目的表中有索引,那麼不僅會影響資料庫大容量資料匯入的速度,而且還會降低其他使用者正常訪問資料庫的效能。

為此,筆者的建議是,如果要匯入的表中資料並不是很多,那麼最好先刪除索引來提高大容量資料匯入的效能。匯入之後再重新啟用索引。但是,如果在需要匯入的表中已經有不少的資料,而需要匯入的資料可能跟已存在的資料差不多或者要少的話,那麼還是不用刪除索引。此時如果刪除索引會起到適得其反的效果。因為資料庫系統重新生成索引所需要的時間可能比大容量匯入操作期間所節省的時間要更長。此時管理員刪除目的表的索引就有點得不償失了。

四、 資料匯入後即時進行資料庫備份

同建立資料庫物件一樣,把大容量資料匯入到資料庫系統後,管理員要及時對現有的資料庫進行備份。因為及時有系統大容量匯入工具的幫助,這個資料匯入的工作仍然是非常繁瑣、耗時的。為此當大容量資料順利匯入到資料庫系統之後,管理員要及時得對資料庫進行備份。這裡筆者要提醒大家的是,不同的操作日誌模式下,其備份的方法往往是不同的。

大容量資料匯入後,管理員需要對資料庫進行備份。對此筆者的建議是,如果當時管理員採用的是簡單的日誌恢復模式,則管理員在大容量匯入操作完成後應該立即執行完整備份或差異備份(如果時間允許的話,最好還是完整備份)。而如果資料庫管理員當時採用的是大容量日誌恢復模式或完整恢復模式,如果時間不是很多或者怕擔心完全備份會影響當時使用者的訪問,那麼只需執行日誌備份就足夠了。如果資料庫伺服器還沒有變成生產伺服器(即還有沒有使用者在用),則還是對資料庫進行完全備份保險一點。

五、 常見的錯誤

在大容量資料匯入過程中,最常見的錯誤大概有兩個。

一是提供檔案的格式不對。如上面所說,通常情況下資料庫提供的大容量匯入工具不支援文字檔案。為此管理員需要進行事先的轉換。二是要注意隱藏字元可能帶來到問題。許多軟體和文字編輯器都會顯示隱藏字元。這些隱藏字元通常位於資料檔案末尾。在大容量匯入操作期間,資料檔案中的隱藏字元可能會導致一些難以預測的問題,如意外空字元錯誤等等。這個錯誤很好避免。只要資料庫管理員在匯入資料之前先查詢並刪除所有隱藏字元即可。其實,不僅在大容量資料匯入過程中,還是在少量資料匯入過程中,都會遇到這個問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-582424/,如需轉載,請註明出處,否則將追究法律責任。

相關文章