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