本文將介紹在資料庫初始化過程中,管理員需要經常面對的一個現實問題──如何把大容量的資料匯入到資料庫系統中。 在資料庫初始化過程中,管理員需要面對的一個現實問題就是如何把大容量的資料匯入到資料庫系統中。在SQL Server資料庫中提供了一些大容量資料匯入匯出的工具供資料庫管理員實用。如管理員可以透過bcp實用工具,實現大容量匯出資料和大容量匯入資料並產生格式化檔案。如可以利用bulk insert語句將大容量資料直接從資料檔案匯入資料庫表格或未分割的檢視中去等等。
雖然在SQL Server資料庫中提供了這些實用工具。不過管理員在實際工作中,仍需要謹慎對待這項工作。具體來說,在大容量資料導入匯出的過程中,需要注意以下幾方面的內容。
一、 盡量採用系統提供的工具來倒入導出大容量的數據
以上筆者提到的幾款實用工具,他們有一個共同的特點,就是在導入的過程中會對大容量的資料進行一定的最佳化。如會規範一些資料的格式、節省匯入匯出的時間等等。但是利用這些工具的話,跟其他普通的數據導入導出工具有一個差異,就是大容量導入操作不支持逗號分隔符文件中導入數據,也就是常說的文本文件。雖然此時管理員也可以透過其他的工具來導入文件文件格式的大容量數據,但是通常情況下筆者不建議這麼做。因為其他的工具不支援導入過程中的最佳化功能。為此筆者建議先用其他工具,如ACCESS等中間工具先把文字檔案中的資料轉換成普通的表格形式,然後再利用上面這些工具匯入系統。這雖然會增加一定的工作量,但卻可以確保大容量資料的品質。為此,筆者在實際工作中,如果使用者遇到這種問題筆者是強烈建議他們要採用系統提供的工具來匯入匯出大容量資料。
另外,利用格式化文件來提高大容量資料的規範化,也是不錯的選擇。上面提到的幾款大容量匯入匯出工具都支援使用專門的格式化檔案來儲存原始資料檔案中每個欄位的格式資訊。格式化文件也可以包含相應的資料庫表的有關資訊。格式化檔案可用於提供從資料庫實例大容量匯出資料和向其中大容量匯入資料時所需的所有格式資訊。通俗的講,格式化檔案提供了一種解釋匯入期間資料檔案中資料的格式以及設定匯出期間資料檔案中資料格式的靈活方式。這種靈活性使得解釋資料時無需編寫專用程式碼,也無需為滿足資料庫或外部應用程式的特殊需求而重新設定資料的格式。如果靈活利用格式化文件,那麼使用者可以直接按需要的格式匯出或匯入大容量數據,而不用事後再進行額外的格式調整。
二、 選擇合適的資料庫日誌操作模式
如大家所知道的,使用者在資料庫中所做的任何變化,都會記錄在相關的日誌中。導入導出大容量資料也不例外。可是由於大容量資料比較大,會佔用比較大的交易日誌功能。為此筆者建議,在使用者匯入大容量資料之前,最好選擇合適的資料庫日誌操作模式。筆者的做法是,如果使用者需要匯入大容量數據,那麼最好選擇大容量日誌復原模式。等到導入工作完成之後,再恢復到原來的模式。
這主要是因為在大容量日誌模式下,對於大容量資料導入工作中說,支持力道相對來說比較好。與其他日誌復原模式相比(如完全復原模式),大容量日誌復原模式只對大容量操作進行最小記錄。為此大容量日誌操作復原模式保護大容量操作不受硬體故障的危害,提供比較好的效能且佔用日誌的空間也是最小的。所以,使用大容量日誌復原有助於防止交易日誌出現空間不足的情況,因為大容量日誌復原不會插入日誌行。這個大容量日誌操作模式,非常適合使用完整復原模式的資料庫。對無索引表執行大容量操作時,大容量日誌復原模式非常有用。
不過大容量日誌操作模式也具有一定的風險。如大容量日誌復原模式會增加這些大容量複製作業遺失資料的風險。因為大容量日誌操作模式將會阻止資料庫系統擷取對每個交易逐一所做的變更。如果日誌備份包含大容量日誌操作,則無法還原到該日誌備份中的時點,而只能還原整個日誌備份。另外在大容量日誌復原模式下,如果日誌備份覆蓋了任何大容量操作,則日誌備份將包含由大容量操作所變更的日誌記錄和資料頁。這對於捕獲大容量日誌操作的結果至關重要。合併的資料區可使日誌備份變得非常龐大。再者,備份日誌需要存取包含大容量日誌交易的資料檔案。如果無法存取任何受影響的資料庫文件,則交易日誌將無法備份,並且在此日誌中提交的所有操作都會遺失。所以大容量日誌備份模式並不是安全的日誌模式。
三、 考慮是否需要先暫時刪除表的索引
引是一種特殊的文件,在資料庫中它的作用是舉足輕重的。簡單的來說,如果把資料庫比喻成一本書的話,那麼索引就好像是書的目錄。索引包含著對資料表裡所有記錄的引用指標。索引可以提高資料庫的效能,這是毋庸置疑的。但不是在任何場合索引都可以起到正面的效果。在某些特殊情況下,反而會降低一些操作的效能,如大容量資料的導入。
索引可以加快資料檢索操作,但它會使資料修改操作變慢。因為每次修改或插入資料記錄,索引就必須刷新一次。也就是說,插入一百萬筆記錄,則索引必須重新所新一百萬次。可見,當大容量資料導入的時候,索引將耗費資料庫大量的資源,從而降低資料庫的效能。如果目的表中有索引,那麼不僅會影響資料庫大容量資料匯入的速度,而且還會降低其他使用者正常存取資料庫的效能。
為此,筆者的建議是,如果要匯入的表中資料並不是很多,那麼最好先刪除索引來提高大容量資料匯入的效能。導入之後再重新啟用索引。但是,如果在需要導入的表中已經有不少的數據,而需要導入的數據可能跟已存在的數據差不多或者要少的話,那麼還是不用刪除索引。此時如果刪除索引會達到適得其反的效果。因為資料庫系統重新產生索引所需的時間可能比大容量導入作業期間所節省的時間更長。此時管理員刪除目的表的索引就有點得不償失了。
四、 資料導入後即時進行資料庫備份
同建立資料庫物件一樣,把大容量資料匯入資料庫系統後,管理員要及時對現有的資料庫進行備份。因為及時有系統大容量導入工具的幫助,這個資料導入的工作仍然是非常繁瑣、耗時的。為此當大容量資料順利匯入資料庫系統之後,管理員要及時得對資料庫進行備份。這裡筆者要提醒大家的是,不同的操作日誌模式下,其備份的方法往往是不同的。
大容量資料導入後,管理員需要對資料庫進行備份。對此筆者的建議是,如果當時管理員採用的是簡單的日誌恢復模式,則管理員在大容量導入操作完成後應該立即執行完整備份或差異備份(如果時間允許的話,最好還是完整備份) 。而如果資料庫管理員當時採用的是大容量日誌恢復模式或完整恢復模式,如果時間不是很多或怕擔心完全備份會影響當時用戶的訪問,那麼只需執行日誌備份就足夠了。如果資料庫伺服器還沒變成生產伺服器(即還有沒有使用者在用),則還是對資料庫進行完全備份保險一點。
五、 常見的錯誤
在大容量資料導入過程中,最常見的錯誤大概有兩個。
一是提供文件的格式不對。如上面所說,通常情況下資料庫提供的大容量導入工具不支援文字檔。為此管理員需要事先的轉換。二是要注意隱藏字元可能帶來問題。許多軟體和文字編輯器都會顯示隱藏字元。這些隱藏字元通常位於資料檔案末尾。在大容量匯入作業期間,資料檔案中的隱藏字元可能會導致一些難以預測的問題,例如意外空字元錯誤等等。這個錯誤很好避免。只要資料庫管理員在匯入資料之前先尋找並刪除所有隱藏字元即可。其實,不僅在大容量資料導入過程中,還是在少量資料導入過程中,都會遇到這個問題。