SQL Server導(dǎo)入導(dǎo)出大容量數(shù)據(jù)要注意的事項(xiàng)
在數(shù)據(jù)庫(kù)初始化過程中,管理員需要面對(duì)的一個(gè)現(xiàn)實(shí)問題就是如何把大容量的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)系統(tǒng)中。在SQL Server數(shù)據(jù)庫(kù)中提供了一些大容量數(shù)據(jù)導(dǎo)入導(dǎo)出的工具供數(shù)據(jù)庫(kù)管理員實(shí)用。如管理員可以通過bcp實(shí)用工具,實(shí)現(xiàn)大容量導(dǎo)出數(shù)據(jù)和大容量導(dǎo)入數(shù)據(jù)并生 成格式化文件。如可以利用bulk insert語句將大容量數(shù)據(jù)直接從數(shù)據(jù)文件導(dǎo)入數(shù)據(jù)庫(kù)表或者未分區(qū)的視圖中去等等。
雖然在SQL Server數(shù)據(jù)庫(kù)中提供了這些實(shí)用工具。不過管理員在實(shí)際工作中,仍然需要謹(jǐn)慎對(duì)待這項(xiàng)工作。具體的來說,在大容量數(shù)據(jù)導(dǎo)入導(dǎo)出的過程中,需要注意如下幾方面的內(nèi)容。
1.盡量采用系統(tǒng)提供的工具來倒入導(dǎo)出大容量的數(shù)據(jù)。
以上筆者提到的幾款實(shí)用工具,他們有一個(gè)共同的特點(diǎn),即在導(dǎo)入的過程中會(huì)對(duì)大容量的數(shù)據(jù)進(jìn)行一定的優(yōu)化。如會(huì)規(guī)范一些數(shù)據(jù)的格式、節(jié)省導(dǎo)入導(dǎo)出的時(shí)間等 等。但是利用這些工具的話,跟其他普通的數(shù)據(jù)導(dǎo)入導(dǎo)出工具有一個(gè)差異,就是大容量導(dǎo)入操作不支持逗號(hào)分隔符文件中導(dǎo)入數(shù)據(jù),也就是常說的文本文件。雖然此 時(shí)管理員也可以通過其他的工具來導(dǎo)入文件文件格式的大容量數(shù)據(jù),但是通常情況下筆者不建議這么做。因?yàn)槠渌墓ぞ卟恢С謱?dǎo)入過程中的優(yōu)化功能。為此筆者建 議先用其他工具,如ACCESS等中間工具先把文本文件中的數(shù)據(jù)轉(zhuǎn)化為普通的表格形式,然后再利用上面這些工具導(dǎo)入到系統(tǒng)中。這雖然會(huì)增加一定的工作量, 但是卻可以保證大容量數(shù)據(jù)的質(zhì)量。為此,筆者在實(shí)際工作中,如果用戶遇到這種問題筆者是強(qiáng)烈建議他們要采用系統(tǒng)提供的工具來導(dǎo)入導(dǎo)出大容量數(shù)據(jù)。
另外,利用格式化文件來提高大容量數(shù)據(jù)的規(guī)范化,也是一個(gè)不錯(cuò)的選擇。上面提到的幾款大容量導(dǎo)入導(dǎo)出工具都支持使用專門的格式化文件來存儲(chǔ)原始數(shù)據(jù)文件中 每個(gè)字段的格式信息。格式化文件還可以包含相應(yīng)的數(shù)據(jù)庫(kù)表的有關(guān)信息。格式化文件可以用于提供從數(shù)據(jù)庫(kù)實(shí)例大容量導(dǎo)出數(shù)據(jù)和向其中大容量導(dǎo)入數(shù)據(jù)時(shí)所需的 所有格式信息。通俗的講,格式化文件提供了一種解釋導(dǎo)入期間數(shù)據(jù)文件中數(shù)據(jù)的格式以及設(shè)置導(dǎo)出期間數(shù)據(jù)文件中數(shù)據(jù)格式的靈活方式。這種靈活性使得解釋數(shù)據(jù) 時(shí)無需編寫專用代碼,也無需為滿足數(shù)據(jù)庫(kù)或外部應(yīng)用程序的特殊需要而重新設(shè)置數(shù)據(jù)的格式。如果靈活利用格式化文件,那么用戶可以直接按需要的格式導(dǎo)出或者 導(dǎo)入大容量數(shù)據(jù),而不用事后再進(jìn)行額外的格式調(diào)整。
2.選擇合適的數(shù)據(jù)庫(kù)日志操作模式。
正如大家所知道的,用戶在數(shù)據(jù)庫(kù)中做的任何變化,都會(huì)記錄在相關(guān)的日志中。導(dǎo)入導(dǎo)出大容量數(shù)據(jù)也不例外?墒怯捎诖笕萘繑(shù)據(jù)比較大,會(huì)占用比較大的事務(wù)日 志功能。為此筆者建議,在用戶導(dǎo)入大容量數(shù)據(jù)之前,最好選擇合適的數(shù)據(jù)庫(kù)日志操作模式。筆者的做法是,如果用戶需要導(dǎo)入大容量數(shù)據(jù),那么最好選擇大容量日 志恢復(fù)模式。等到導(dǎo)入工作完成之后,再恢復(fù)到原先的模式。
這主要是因?yàn)樵诖笕萘咳罩灸J较,?duì)于大容量數(shù)據(jù)導(dǎo)入工作中說,支持力度相對(duì)來說比較好。與其他日志恢復(fù)模式相比(如完全恢復(fù)模式),大容量日志恢復(fù)模式 只對(duì)大容量操作進(jìn)行最小記錄。為此大容量日志操作恢復(fù)模式保護(hù)大容量操作不受硬件故障的危害,提供比較好的性能并且占用日志的空間也是最小的。所以,使用 大容量日志恢復(fù)有助于防止事務(wù)日志出現(xiàn)空間不足的情況,因?yàn)榇笕萘咳罩净謴?fù)不會(huì)插入日志行。這個(gè)大容量日志操作模式,非常適用于使用完整恢復(fù)模式的數(shù)據(jù) 庫(kù)。對(duì)無索引表執(zhí)行大容量操作時(shí),大容量日志恢復(fù)模式非常有用。
不過大容量日志操作模式也具有一定的風(fēng)險(xiǎn)。如大容量日志恢復(fù)模式會(huì)增加這些大容量復(fù)制操作丟失數(shù)據(jù)的風(fēng)險(xiǎn)。因?yàn)榇笕萘咳罩静僮髂J綄?huì)阻止數(shù)據(jù)庫(kù)系統(tǒng)捕獲 對(duì)每個(gè)事務(wù)逐一所做的更改。如果日志備份包含大容量日志操作,則無法還原到該日志備份中的時(shí)點(diǎn),而只能還原整個(gè)日志備份。另外在大容量日志恢復(fù)模式下,如 果日志備份覆蓋了任何大容量操作,則日志備份將包含由大容量操作所更改的日志記錄和數(shù)據(jù)頁。這對(duì)于捕獲大容量日志操作的結(jié)果至關(guān)重要。合并的數(shù)據(jù)區(qū)可使日 志備份變得非常龐大。再者,備份日志需要訪問包含大容量日志事務(wù)的數(shù)據(jù)文件。如果無法訪問任何受影響的數(shù)據(jù)庫(kù)文件,則事務(wù)日志將無法備份,并且在此日志中 提交的所有操作都會(huì)丟失。所以大容量日志備份模式并不是安全的日志模式。
通常情況下,只有在需要大容量導(dǎo)入導(dǎo)出數(shù)據(jù)的時(shí)候才臨時(shí)啟用這種操作模式。為了大容量導(dǎo)入性能與數(shù)據(jù)庫(kù)安全考慮,筆者建議建議數(shù)據(jù)庫(kù)管理員可以在執(zhí)行大容量導(dǎo)入操作之前,先將數(shù)據(jù)庫(kù)改為使用大容量日志恢復(fù)模式。完成之后馬上將數(shù)據(jù)庫(kù)重設(shè)為完整恢復(fù)模式。
3.考慮是否需要先暫時(shí)刪除表的索引。
引是一種特殊的文件,在數(shù)據(jù)庫(kù)中它的作用是舉足輕重的。簡(jiǎn)單的來說,如果把數(shù)據(jù)庫(kù)比喻成一本書的話,那么索引就好像是書的目錄。索引包含著對(duì)數(shù)據(jù)表里所有 記錄的引用指針。索引可以提高數(shù)據(jù)庫(kù)的性能,這是毋庸置疑的。但是不是在任何場(chǎng)合索引都可以起到正面的效果。在某些特殊情況下,其反而會(huì)降低一些操作的性 能,如大容量數(shù)據(jù)的導(dǎo)入。
索引可以加快數(shù)據(jù)檢索操作,但它會(huì)使數(shù)據(jù)修改操作變慢。因?yàn)槊看涡薷幕蛘卟迦霐?shù)據(jù)記錄,索引就必須刷新一次。也就是說,插入一百萬條記錄,則索引就必須重 新所新一百萬次?梢姡(dāng)大容量數(shù)據(jù)導(dǎo)入的時(shí)候,索引將耗費(fèi)數(shù)據(jù)庫(kù)大量的資源,從而降低數(shù)據(jù)庫(kù)的性能。如果目的表中有索引,那么不僅會(huì)影響數(shù)據(jù)庫(kù)大容量數(shù) 據(jù)導(dǎo)入的速度,而且還會(huì)降低其他用戶正常訪問數(shù)據(jù)庫(kù)的性能。
為此,筆者的建議是,如果要導(dǎo)入的表中數(shù)據(jù)并不是很多,那么最好先刪除索引來提高大容量數(shù)據(jù)導(dǎo)入的性能。導(dǎo)入之后再重新啟用索引。但是,如果在需要導(dǎo)入的 表中已經(jīng)有不少的數(shù)據(jù),而需要導(dǎo)入的數(shù)據(jù)可能跟已存在的數(shù)據(jù)差不多或者要少的話,那么還是不用刪除索引。此時(shí)如果刪除索引會(huì)起到適得其反的效果。因?yàn)閿?shù)據(jù) 庫(kù)系統(tǒng)重新生成索引所需要的時(shí)間可能比大容量導(dǎo)入操作期間所節(jié)省的時(shí)間要更長(zhǎng)。此時(shí)管理員刪除目的表的索引就有點(diǎn)得不償失了。
4.數(shù)據(jù)導(dǎo)入后即時(shí)進(jìn)行數(shù)據(jù)庫(kù)備份。
同建立數(shù)據(jù)庫(kù)對(duì)象一樣,把大容量數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)系統(tǒng)后,管理員要及時(shí)對(duì)現(xiàn)有的數(shù)據(jù)庫(kù)進(jìn)行備份。因?yàn)榧皶r(shí)有系統(tǒng)大容量導(dǎo)入工具的幫助,這個(gè)數(shù)據(jù)導(dǎo)入的工作 仍然是非常繁瑣、耗時(shí)的。為此當(dāng)大容量數(shù)據(jù)順利導(dǎo)入到數(shù)據(jù)庫(kù)系統(tǒng)之后,管理員要及時(shí)得對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份。這里筆者要提醒大家的是,不同的操作日志模式下, 其備份的方法往往是不同的。
大容量數(shù)據(jù)導(dǎo)入后,管理員需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份。對(duì)此筆者的建議是,如果當(dāng)時(shí)管理員采用的是簡(jiǎn)單的日志恢復(fù)模式,則管理員在大容量導(dǎo)入操作完成后應(yīng)該立即 執(zhí)行完整備份或差異備份(如果時(shí)間允許的話,最好還是完整備份)。而如果數(shù)據(jù)庫(kù)管理員當(dāng)時(shí)采用的是大容量日志恢復(fù)模式或完整恢復(fù)模式,如果時(shí)間不是很多或 者怕?lián)耐耆珎浞輹?huì)影響當(dāng)時(shí)用戶的訪問,那么只需執(zhí)行日志備份就足夠了。如果數(shù)據(jù)庫(kù)服務(wù)器還沒有變成生產(chǎn)服務(wù)器(即還有沒有用戶在用),則還是對(duì)數(shù)據(jù)庫(kù)進(jìn) 行完全備份保險(xiǎn)一點(diǎn)。
5.常見的錯(cuò)誤。
在大容量數(shù)據(jù)導(dǎo)入過程中,最常見的錯(cuò)誤大概有兩個(gè)。
一是提供文件的格式不對(duì)。如上面所說,通常情況下數(shù)據(jù)庫(kù)提供的大容量導(dǎo)入工具不支持文本文件。為此管理員需要進(jìn)行事先的轉(zhuǎn)換。二是要注意隱藏字符可能帶來 到問題。許多軟件和文本編輯器都會(huì)顯示隱藏字符。這些隱藏字符通常位于數(shù)據(jù)文件末尾。在大容量導(dǎo)入操作期間,數(shù)據(jù)文件中的隱藏字符可能會(huì)導(dǎo)致一些難以預(yù)測(cè) 的問題,如意外空字符錯(cuò)誤等等。這個(gè)錯(cuò)誤很好避免。只要數(shù)據(jù)庫(kù)管理員在導(dǎo)入數(shù)據(jù)之前先查找并刪除所有隱藏字符即可。其實(shí),不僅在大容量數(shù)據(jù)導(dǎo)入過程中,還 是在少量數(shù)據(jù)導(dǎo)入過程中,都會(huì)遇到這個(gè)問題。
關(guān)鍵字:SQL Server、數(shù)據(jù)庫(kù)、服務(wù)器
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解