納米材料,是指在三維空間中至少有一維處于納米尺度(0.1~100 nm)范圍或由它們作為基本單元構(gòu)成的材料。納米材料及其相應(yīng)的制取、組合技術(shù)已成為21世紀(jì)世界科技發(fā)展中的主流方向,也是世界各國最主要的研究熱點(diǎn)之一。當(dāng)前,我國在納米領(lǐng)域發(fā)表的SCI論文累計已經(jīng)躍居全球第一。在2018年度中國科學(xué)十大進(jìn)展公布中研制的用于腫瘤治療的智能型DNA納米機(jī)器人項目就被列在其中,這也說明納米技術(shù)的研究依然處于活躍的狀態(tài)。納米科技涉及到的研究領(lǐng)域包括新材料產(chǎn)業(yè)、環(huán)保領(lǐng)域、能源領(lǐng)域、信息領(lǐng)域、生物及醫(yī)學(xué)領(lǐng)域、航天及軍工領(lǐng)域等等。今天筆者就從近期在能源、環(huán)保領(lǐng)域的研究給大家做一個梳理
看是否有望實現(xiàn)產(chǎn)業(yè)化呢?
01
石墨烯納濾膜用于離子和分子納濾
武漢大學(xué)/湖南大學(xué)袁荃和美國加利福尼亞大學(xué)洛杉磯分校段鑲鋒等人報告了一種原子級薄納米多孔膜的設(shè)計。一種由單壁碳納米管(SWNTs)交織網(wǎng)絡(luò)支撐的單層石墨烯納米微粒(GNM)原子薄納米孔膜。這項研究首次報道了一種通過CVD制備具有高機(jī)械強(qiáng)度的厘米級石墨烯具有優(yōu)異機(jī)械性能的大面積石墨烯納米篩/碳納米管薄膜,具有高的水滲透率、離子和分子截留率以及優(yōu)異的抗污染性能。這項研究的重要之處在于,它使石墨烯基納濾膜的面積達(dá)到厘米級。在實驗室規(guī)模的膜系統(tǒng)中進(jìn)行測試,發(fā)現(xiàn)該材料可以從鹽水中剔除85%至97%的鹽??朔硕S材料在實際分離領(lǐng)域的局限性,是將二維材料推向?qū)嶋H分離應(yīng)用的關(guān)鍵一步。同時該薄膜可高效分離水中的鹽離子和有機(jī)污染物,有望用于水凈化、化工原料分離純化等領(lǐng)域。相關(guān)研究以“Large-area graphene-nanomesh/carbon-nanotube hybrid membranes for ionic and molecular nanofiltration”發(fā)表在Science上。
文章鏈接:Science 2019,364 (6445), 1057-1062.
圖1 薄納米孔膜結(jié)構(gòu)示意圖
02
納米線-尼龍柔性透明智能窗戶捕捉PM2.5
設(shè)計大面積柔性透明智能窗,高效捕捉室內(nèi)細(xì)顆粒物(PM2.5),是保證室內(nèi)環(huán)境安全的重要手段。中國科學(xué)技術(shù)大學(xué)俞書宏教授團(tuán)隊發(fā)展了大面積制作柔性透明銀尼龍網(wǎng)的方法,不僅可以將室內(nèi)光照明強(qiáng)度均勻涂上熱變色染料后作為熱變色智能窗,還可以作為高效PM2.5過濾器凈化室內(nèi)空氣。只需要花費(fèi)15.03美元,20分鐘,就可以制作7.5 m2的Ag-nylon柔性透明窗戶。具有均勻NW涂層的柔性透明可伸縮智能熱致變色智能窗,可在低電壓直接刺激下快速響應(yīng),實現(xiàn)可逆變色。更重要的是,大面積的Ag-nylon智能窗具有良好的PM2.5去除性能,其主要來自四個方面:首先,它的去除率高達(dá)99.65%,并且能夠在50 秒內(nèi)將空氣中的PM2.5的濃度從嚴(yán)重污染的程度(248 μg·m-3)降至空氣優(yōu)良狀態(tài)(32.9 μg·m-3);其次,經(jīng)PM過濾后的Ag-nylon窗戶只需浸泡乙醇20分鐘即可回收。重復(fù)使用100次后,去除效率沒有降低;三是容易擴(kuò)大PM2.5捕捉空間。例如,當(dāng)體積增加到邊長達(dá)0.5 米的立方空間中時,去除率可達(dá)99.48%。最后,這種材料表現(xiàn)出良好的機(jī)械穩(wěn)定性。即使在彎曲半徑最小為2.0 mm,彎曲試驗10000次,拉伸變形1000次,機(jī)械應(yīng)變高達(dá)10%的情況下,結(jié)構(gòu)和性能仍然保持穩(wěn)定。目前設(shè)計策略的成功為開發(fā)下一代柔性透明智能窗戶和空氣污染過濾器提供了更多的選擇。相關(guān)研究以“Mass Production of Nanowire-Nylon Flexible Transparent Smart Windows for PM 2.5 Capture”發(fā)表在iScience上 。
文章鏈接:iScience2019,12, 333–341.
2 Ag-Nylon編織結(jié)構(gòu)示意圖
03
Kevlar氣凝膠纖維超強(qiáng)隔熱保溫
氣凝膠具有密度低、孔隙率高、表面積大等優(yōu)點(diǎn),是下一代高性能隔熱纖維和紡織品的理想結(jié)構(gòu)。然而,氣凝膠纖維具有較弱的機(jī)械性能或復(fù)雜的制造工藝。中科院蘇州納米所的張學(xué)同研究員團(tuán)隊介紹了一種溶解杜邦的Kevlar纖維制備納米纖維 (KNF)氣凝膠線的簡便濕法紡絲方法,在極端環(huán)境下具有高隔熱性能。由納米纖維制成的氣凝膠纖維具有很高的比表面積(240m2/g)和寬溫?zé)岱€(wěn)定性。氣凝膠纖維具有三維互聯(lián)多孔網(wǎng)絡(luò)結(jié)構(gòu),導(dǎo)熱系數(shù)較低,其織物在極端溫度下具有優(yōu)異的保溫性能,這是大多數(shù)聚合物纖維所不能達(dá)到的。通過在紡織品中編織柔性強(qiáng)的KNF氣凝膠纖維,可在極端溫度(- 196或+300℃)和室溫下的長時間發(fā)揮隔熱保溫性能,低溫下其隔熱性能是棉布的2.8倍。COMSOL模擬結(jié)果表明,隨著納米纖維孔隙率的增加和直徑的減小,納米纖維的絕熱性能得到了改善。此外,還可以對氣凝膠纖維進(jìn)行多種功能修飾,分別得到彩色纖維、相變纖維、導(dǎo)電纖維和疏水性紡織品。實驗和仿真結(jié)果表明,氣凝膠纖維是一種很有前途的下一代絕熱纖維材料。相關(guān)研究以“Nanofibrous Kevlar Aerogel Threads for Thermal Insulation in Harsh Environments”為題目發(fā)表在ACS NANO上。
文章鏈接:ACS Nano 2019, 13, 5703-5711.
圖3 KNF氣凝膠纖維和紡織品及制備原理圖
04
摩擦電納米發(fā)電機(jī)高效收集機(jī)械能和水能
柔性電子技術(shù)的進(jìn)步對高變形能量發(fā)生器提出了新的要求,為這些電子設(shè)備提供動力。如何同時實現(xiàn)高延展性和強(qiáng)發(fā)電量,以適應(yīng)大多數(shù)能源發(fā)電機(jī)的實際柔性應(yīng)用,仍然是一個挑戰(zhàn)。西安交通大學(xué)的邵金友教授和南洋理工大學(xué)的Pooi See Lee教授團(tuán)隊首次提出了一種具有高透明性、全拉伸性和超疏水性的分級微陽極結(jié)構(gòu),用以構(gòu)建高性能的摩擦電納米發(fā)電機(jī)(TENGs),獲取機(jī)械能和水能。采用可伸縮靜電紡絲技術(shù)制備了SiO2/聚偏二乙烯-三氟乙烯(VDF-TrFE)納米級結(jié)構(gòu),研究發(fā)現(xiàn),前驅(qū)體溶液的表面張力在生成層次結(jié)構(gòu)中起著重要作用。與離子導(dǎo)體結(jié)合后,得到的TENG具有80%的高透明性,即使在300%拉伸變形時仍保持超疏水性。在相同的機(jī)械力作用下,分層結(jié)構(gòu)產(chǎn)生的輸出電壓是單層平面的3倍,通過表面電位測量進(jìn)一步驗證了分層結(jié)構(gòu)的強(qiáng)電荷生成特性。此外,制得的TENG對300%應(yīng)變的大拉伸變形具有較高的耐久性能,并在循環(huán)試驗下維持了3h的輸出,表明其在極端變形條件下的適用性。此外,超疏水性和自清潔性能提供了TENG額外的水能收集能力。水流流動的速度11毫升/秒下可以生成的電壓和電流可以達(dá)到36 v和10μA,分別成功地推動LED陣列和商業(yè)電容器充電,展示其電力電子設(shè)備的適用性。由于具有良好的透光率、高度的靈活性、延伸性、強(qiáng)大的發(fā)電能力和獲取多種能源的能力等獨(dú)特的特點(diǎn),TENG在自供電電子領(lǐng)域具有廣闊的應(yīng)用前景。相關(guān)研究以“Transparent and stretchable bimodal triboelectric nanogenerators with hierarchical micro-nanostructures for mechanical and water energy harvesting”為題目發(fā)表在Nano Energy 上。
文章鏈接:Nano Energy 64 (2019) 103904.
圖4 TENG的合成及雙功能演示
05
PtIr納米晶電催化乙醇氧化
乙醇是一種綠色、可持續(xù)、高能量密度的液體燃料,對直接液體燃料電池(DLFCs)具有廣闊的應(yīng)用前景。然而,選擇性地促進(jìn)乙醇氧化反應(yīng)(EOR) C-C鍵斷裂的電催化劑的開發(fā)仍面臨著很大的挑戰(zhàn)。加州大學(xué)圣地亞哥分校、哥倫比亞大學(xué)Jingguang G. Chen, Zheng Chen教授等人報道了以富集Ir殼層為有效EOR電催化劑的PtIr合金核殼納米晶(NCs)的快速合成。發(fā)現(xiàn)單原子厚度Ir富集殼層的Pt38Ir NCs具有空前的EOR活性、高CO2選擇性和穩(wěn)定性,而純Pt NCs和Pt17Ir NCs(雙原子厚度)活性較低,CO2選擇性較低。研究發(fā)現(xiàn)Pt38Ir NCs電催化劑的電流密度比Pt/C高4.5倍,EOR起動勢低320 mV。它的CO2電流密度為0.85 V,是工業(yè)用的14倍。提高EOR活性的主要原因是PtIr(100)晶面的Ir,它不僅通過對中間體*CxHyO/CxHy的強(qiáng)吸附促進(jìn)了C-C鍵的分裂,而且促進(jìn)了CO從PtIr表面的解吸。這項工作強(qiáng)調(diào)了表面原子層在形狀工程催化劑上的重要作用,并展示了設(shè)計高效EOR電催化劑的策略,通過構(gòu)建形貌控制的核殼納米結(jié)構(gòu),實現(xiàn)表面 Ir 富集,優(yōu)化與反應(yīng)中間產(chǎn)物的結(jié)合能來提高乙醇氧化反應(yīng)的活性和 CO2 選擇性,提升催化活性和選擇性的目標(biāo)。相關(guān)研究以“Enhancing C-C Bond Scission for Efficient Ethanol Oxidation using PtIr Nanocube Electrocatalysts”為題目發(fā)表在ACS Catalysis上。
文章鏈接:
https://pubs.acs.org/doi/10.1021/acscatal.9b02039
圖5 PtIr合金核殼NCs的結(jié)構(gòu)與成分表征
06
氯堿電解高效析氫電催化劑的合理設(shè)計
強(qiáng)堿條件下高效穩(wěn)定析氫電催化劑的合理設(shè)計是實現(xiàn)低能耗氯堿電解制氫的關(guān)鍵。蘇州大學(xué)的康振輝和東北師范大學(xué)的郎中玲、譚華橋、李陽光共同開發(fā)了一種固定在氮氧化鎢納米線的超細(xì)釕納米簇電催化劑(Ru/WNO@C)。我們將實驗技術(shù)與計算技術(shù)相結(jié)合對氫的演化(HER)反應(yīng)有了全面的了解,研究了Ru/WNO@C電催化劑的性能。該催化劑具有優(yōu)異的HER性能,僅在2 mV過電位下獲得10 mA cm-2的電流密度,質(zhì)量活性為4095.6 mA mg-1(50 mV);并且在氯堿電解條件下仍表現(xiàn)出優(yōu)異的HER性能。這主要得益于該催化劑具有更適中的氫吸附自由能(ΔGH*=- 0.21 eV),以及更低的水解離能壘(ΔGB=0.27 eV)。這種新型的Ru/WNO@C復(fù)合納米線電催化劑,通過簡單的熱解將Ru和穩(wěn)定的載體WNO結(jié)合起來。研究結(jié)果表明,Ru的加入顯著降低了水解離勢壘,其值僅為0.27 eV,并提供了合理的H吸附能力以提高析氫性能。在堿性溶液中表現(xiàn)出優(yōu)異的電催化性能,3.37%Ru負(fù)載量的Ru/WNO@C催化劑具有良好的穩(wěn)定性及近乎100%的法拉第效率,性能明顯優(yōu)于商業(yè)20%的Pt/C。其中在90 oC模擬氯堿電解液下的性能優(yōu)于工業(yè)低碳鋼,是氯堿電解的有效陰極候選材料。該工作為高效、穩(wěn)定的堿性HER催化劑的設(shè)計和制備提供了有意義的參考,同時實現(xiàn)了高效制氫和低能耗的氯堿電解。相關(guān)研究以“Cable-like Ru/WNO@C nanowires for simultaneous high-efficiency hydrogen evolution and low-energy consumption chlor-alkali electrolysis”為題目發(fā)表在Energy Environ. Sci.上。
文章鏈接:
https://pubs.rsc.org/en/content/articlelanding/2019/ee/c9ee01647c#!divAbstract
圖6 Ru/WNO@C NW電催化劑的制備路線及形貌示意圖
07
分離納米管網(wǎng)絡(luò)實現(xiàn)高區(qū)域容量的電極
提高鋰離子電池的儲能能力,必須使其面積容量最大化。這就要求厚電極在接近理論比容的情況下工作。然而,可獲得的電極厚度受機(jī)械不穩(wěn)定性及電極電導(dǎo)率差的限制。都柏林圣三一大學(xué)的Jonathan N. Coleman 和Valeria Nicolosi等研究形成一個隔離網(wǎng)絡(luò)復(fù)合碳納米管的儲鋰材料來增韌復(fù)合抑制機(jī)械不穩(wěn)定,這種材料允許制造高性能電極的厚度高達(dá)800μm。這種復(fù)合電極的電導(dǎo)率可達(dá)1×104 S m?1,低的電荷轉(zhuǎn)移電阻,允許快速的電荷傳輸,即使對于厚電極,也具有接近理論的特定容量。高厚度和比容量的結(jié)合,導(dǎo)致陽極和陰極面積容量高達(dá)45和30mAh cm - 2。雖然納米管以前被用來提高電極電導(dǎo)率,但分離網(wǎng)絡(luò)——作為現(xiàn)實電極材料更合適——并沒有充分發(fā)揮其制造厚電池電極的潛力,除了電導(dǎo)率顯著提高之外,這些網(wǎng)絡(luò)還顯著提高了機(jī)械性,從而可以生產(chǎn)出面積容量非常大的極厚電極。將隔離的基于網(wǎng)絡(luò)的陽極和陰極結(jié)合起來,可以得到比能量密度為480 Wh kg?1和體積能量密度為1600 Wh l?1的完整電池。我們考慮基于SNC的電極將成為生產(chǎn)大容量電池電極的通用解決方案。相關(guān)研究以“High areal capacity battery electrodes enabled by segregated nanotube networks”為題目發(fā)表在Nature Energy上。
文章鏈接:Nature Energy, 4 ( 2019), 560–567.
圖7 分層復(fù)合電極的制備
08
SnO2納米膠體自組裝100 cm2鈣鈦礦模組
近年來,通過控制鈣鈦礦前驅(qū)體的晶體化學(xué)性質(zhì),發(fā)展了大規(guī)模、均勻、高結(jié)晶的鈣鈦礦生產(chǎn)技術(shù)。然而,電子和空穴傳輸層的可擴(kuò)展技術(shù)(ETL和HTL)很少被研究。在可擴(kuò)展技術(shù)中,一個主要的挑戰(zhàn)是在低溫下獲得均勻的、高結(jié)晶性的超薄ETL。韓國成均館大學(xué)Hyun Suk Jung及漢陽大學(xué)Min Jea Ko團(tuán)隊采用靜電自組裝的方法制備了大面積的SnO2 ETLs。鈣鈦礦太陽能組件(PSM)的電致發(fā)光圖像證實,F(xiàn)TO上涂覆的ETLs具有很高的均勻性,沒有針孔。此外,與傳統(tǒng)的基于SnO2 ETL的并聯(lián)電阻相比,通過觀察鈣鈦礦太陽能電池(PSC)的并聯(lián)電阻隨有效面積的增加而保持不變。在這種自組裝方法的基礎(chǔ)上,為100 cm2的鈣鈦礦模塊保留了較高的并聯(lián)電阻。研究中,在沒有分流電阻損失的情況下,在25 cm2和100 cm2的面積上分別實現(xiàn)了15.3%和14.0%的高效率。這種靜電自組裝方法可用于制造高效的鈣鈦礦組件,并在有紋理的硅表面上制造柔性的鈣鈦礦組件和硅/鈣鈦礦串聯(lián)單元。相關(guān)研究以“Spin-Coating Process for 10 cm × 10 cm Perovskite Solar Modules Enabled by Self-Assembly of SnO2 Nanocolloids”為題目發(fā)表在ACS Energy Lett.上。
文章鏈接:ACS Energy Lett. 2019, 4, 1845-1851.
圖8 鈣鈦礦太陽能模組構(gòu)成及效率
納米技術(shù)作為一種最具有市場應(yīng)用潛力的新興科學(xué)技術(shù),其潛在的重要性毋庸置疑,筆者梳理的研究工作只占其中的一小部分,但可以預(yù)測未來用于集成電路的單電子晶體管、邏輯元件、分子化學(xué)組裝技術(shù)機(jī)將投入應(yīng)用;半導(dǎo)體場效應(yīng)管、納米光子晶體應(yīng)運(yùn)而生;納米機(jī)器人、集成生物化學(xué)傳感器也離我們并不遙遠(yuǎn)??傊?,打開納米新世界的大門的鑰匙,就在你的手里,不惜翻山越嶺,也要探秘納米世界一二!(如有不妥之處,留言區(qū)批評指正。)
實例
在安裝完DB2數(shù)據(jù)庫后,首先需要做的就是創(chuàng)建實例。因為要創(chuàng)建數(shù)據(jù)庫,就必須先創(chuàng)建實例,數(shù)據(jù)庫是運(yùn)行在實例之上的。
實例的概念
從DB2體系結(jié)構(gòu)的方面來看,實例實際上就是DB2的執(zhí)行代碼和數(shù)據(jù)庫對象的中間邏輯層。實例可以看成關(guān)于所有的數(shù)據(jù)庫及其對象的邏輯集合,也可以認(rèn)為是所有的數(shù)據(jù)庫及其對象和DB2代碼之間的聯(lián)系和結(jié)合。實例為數(shù)據(jù)庫運(yùn)行提供環(huán)境。這樣一來,數(shù)據(jù)庫只負(fù)責(zé)前臺正常的運(yùn)行,而一些后臺的事情由實例來進(jìn)行管理。實例對用戶和開發(fā)人員來說是透明的。實例本質(zhì)上由一組后臺進(jìn)程和共享內(nèi)存組成。實例和數(shù)據(jù)庫不一樣的地方是,數(shù)據(jù)庫是物理的,我們的表、索引存放在數(shù)據(jù)庫中是要占用物理存儲的;而實例是邏輯的,是共享內(nèi)存、進(jìn)程和一些配置文件(實例目錄)的集合。當(dāng)實例停止時,共享內(nèi)存釋放,進(jìn)程停止。實例就相當(dāng)于windows中服務(wù)的概念。
在實際生產(chǎn)系統(tǒng)中,我們可能需要創(chuàng)建多個實例來執(zhí)行下列操作:
當(dāng)然,系統(tǒng)中的實例不是越多越好,如果在系統(tǒng)中創(chuàng)建的實例過多,不僅會造成額外的資源消耗(內(nèi)存、硬盤空間等),還會增大管理開銷。過多的實例數(shù)量可能會有下面的影響:
注意:
在許多數(shù)據(jù)庫產(chǎn)品中都有類似實例的這個概念,例如在Oracle中也叫實例(instance),在Informix數(shù)據(jù)庫中有Server的概念,Sybase和SQL Server中的Server概念也和實例類似。
創(chuàng)建實例
在Linux/UNIX上,要想創(chuàng)建實例,就必須首先創(chuàng)建和實例名一樣的用戶及該用戶所屬的組。之所以需要創(chuàng)建用戶,主要是因為需要以該用戶的home目錄作為實例目錄,存放實例相關(guān)的實例目錄結(jié)構(gòu)。
實例可以在DB2向?qū)О惭b期間創(chuàng)建,但業(yè)務(wù)需求可能需要我們手工創(chuàng)建其他實例。創(chuàng)建實例需要使用db2icrt(db2 Instance Create)命令,db2icrt命令的語法如下所示:
有一點(diǎn)我們需要特別注意,在Linux和UNIX上創(chuàng)建實例時,必須有和實例同名的用戶存在。如果該用戶不存在,那么創(chuàng)建實例會報錯而無法創(chuàng)建。如果用戶存在,確保該用戶未被鎖定并且密碼未到期。
使用db2icrt命令創(chuàng)建實例的步驟如下:
用戶 | 示例用戶名 | 示例組名 |
實例所有者 | db2inst1 | db2iadm1 |
受防護(hù)的用戶 | db2fenc1 | db2fadm1 |
DB2DIR/instance/db2icrt -a AuthType -u FencedID InstName
其中,DB2DIR是db2安裝目錄。在Linux/UNIX操作系統(tǒng)上,默認(rèn)的db2安裝目錄是/opt/IBM/db2/v10.5。
-a AuthType(linux或unix)
表示實例的認(rèn)證方式。AuthType可為SERVER、CLIENT、SERVER_ENCRYPT其中之一。SERVER是默認(rèn)值。此參數(shù)是可選的,這些認(rèn)證類型和安全有關(guān)。
-u FencedID
表示將用來運(yùn)行受防護(hù)用戶定義的函數(shù)(UDF)和受防護(hù)存儲過程的用戶的名稱。這個用戶和應(yīng)用開發(fā)有關(guān),雖然通常用不到,但對于創(chuàng)建實例是必須的。
InstName
表示實例的名稱。實例的名稱必須與擁有實例的用戶的名稱相同。指定創(chuàng)建的擁有實例的用戶的名稱。在擁有實例的用戶的主目錄中創(chuàng)建該實例。
例如,如果正在使用服務(wù)器認(rèn)證,受防護(hù)用戶為db2fenc1,并且擁有實例的用戶為db2inst1,那么使用以下命令在AIX系統(tǒng)上創(chuàng)建實例:
/opt/IBM/db2/V10.5/instance/db2icrt -a server -u db2fenc1 db2inst1
db2icrt命令除了上述必需選項外,還有一些可選選項,如下所示∶
DB2_InstName baseport/tcp
DB2 InstName_1 baseport+1/tcp
DB2_InstName_2 baseport+2/tcp
DB2_InstName_END endport/tcp
2.1.3 實例目錄
實例創(chuàng)建后,會生成實例目錄,實例目錄存儲著與數(shù)據(jù)庫實例相關(guān)的所有信息。實例目錄一旦創(chuàng)建,就不能更改其位置。在Linux/UNIX中為了擁有實例目錄,必須創(chuàng)建和實例名相同的用戶,其最終目的是為了以這個用戶的 home 目錄作為實例目錄。
實例目錄包含∶
Linux/UNIX操作系統(tǒng)上,實例目錄位于INSTHOME/sqllib 目錄中,其中INSTHOME是實例所有者的主目錄,圖2-1是實例db2inst1的實例目錄。
在 Windows 操作系統(tǒng)上,實例目錄位于安裝了DB2數(shù)據(jù)庫產(chǎn)品的目錄下。實例名與服務(wù)名相同,因此應(yīng)該不會發(fā)生沖突。實例名不應(yīng)與別的服務(wù)名相同。你必須有創(chuàng)建服務(wù)所需的正確權(quán)限。可在 DB2PATH中使用 DB2INSTPROF 環(huán)境變量更改實例目錄的位置,這需要實例目錄的寫訪問權(quán)。如果想要在不同于 DB2PATH 的路徑中創(chuàng)建目錄,那么輸入db2icrt 命令之前必須設(shè)置DB2INSTPROF。
實例目錄非常重要,下面我們舉例來說明實例目錄。在講這個例子之前,我們先講解一下 db2set命令,之所以講解這個命令是因為我們特殊定制實例時,需要用到這個命令。我們都知道,在操作系統(tǒng)中可以使用 set、setenv 或 export命令來修改操作系統(tǒng)的環(huán)境變量。同樣DB2實例本身也有實例級別的注冊變量,為了修改這些默認(rèn)的變量,我們使用 db2set 命令——在 set 前加上db2 以表示設(shè)置 DB2級別的變量。這個命令使用起來很簡單。
要查看已經(jīng)設(shè)置的注冊變量,請從命令行執(zhí)行下面這個命令∶
db2set -al1
你可能會得到類似下面這樣的輸出∶
C:\>db2set -all
[e] DB2PATH=C:\Program Files\IBMySQLLIB
[i]DB2INSTPROF=C:\DOCUMENTS AND SETTINGS\ALL USERS\APPLICATION DATA\IBM\DB2cOPY1
[g] DB2ADMINSERVER=DB2DASO0
正如你可能已經(jīng)猜測到的那樣,[i]表明該變量是在實例級別定義的,而[g]表明是在全局級別為系統(tǒng)中所有實例定義的;[e]表示是操作系統(tǒng)級別的環(huán)境變量。
要查看可以在 DB2中進(jìn)行定義的所有注冊變量,請使用下面這個命令∶
db2set -1r
要在全局級設(shè)置特定變量(在下面這個示例中為 DB2INSTPROF)的值,請使用∶
db2set DB2INSTPROF="C:\INSTDIR" -g
要在實例級為實例"DB2"設(shè)置變量,請使用∶
db2set DB2INSTPROF="C:\MY FILES\SQLLIB" -i DB2
請注意上面的示例,在兩個級別(實例級和全局級)設(shè)置了同一個變量。當(dāng)同一個注冊變量在不同級別上進(jìn)行定義時,DB2總是會選擇最低級別的值;在本例中,將選擇實例級的值。
注意∶
db2set 命令的等號(=)前后不該留有空格。某些注冊變量為了使更改生效,要求停止和啟動實例(db2stop/db2start,這兩個命令后面會講解)。另一些注冊變量則沒有這個要求。為了安全起見,建議在對注冊變量作出更改后總是停止和啟動實例。
現(xiàn)在你已經(jīng)知道 db2set 命令的用法,下面首先設(shè)置 DB2INSTPROF注冊變量,然后在Windows 上創(chuàng)建一個新的實例并查看這個實例的實例目錄∶
C:\>db2set -all
[e] DB2PATH=C:\Program Files\IBM\SQLLIB
[i] DB2INSTPROF=C:\DOCUMENTS AND SETTINGS\ALL USERS\APPLICATIONDATA\IBM\DB2COPY1
......略
C:\>db2set DB2INSTPROF=C∶\INSTDIR --重新設(shè)置DB2INSTPROF注冊變量
C:\>db2icrt prod --創(chuàng)建prod實例
DB20000I DB2ICRT命令成功完成
在創(chuàng)建完prod實例后,我們發(fā)現(xiàn)在 DB2INSTPROF目錄下生成了一個和實例同名的目錄。這就是實例PROD的實例目錄,如圖2-2所示。
實例創(chuàng)建后,我們可以發(fā)現(xiàn)在windows的服務(wù)面板中,多了一項剛創(chuàng)建實例名的服務(wù)。
這是因為在windows上實例是作為服務(wù)存在的,而在Linux/UNIX上,實例是作為一組后臺進(jìn)程存在的。
在Linux/UNIX上可以通過db2_ps 或ps -ef|grep -i db2sysc 查看db2進(jìn)程的狀態(tài)。
實例的相關(guān)命令
在實例創(chuàng)建后,可以執(zhí)行實例相關(guān)的命令來管理實例。在使用實例之前,必須更新每個用戶的數(shù)據(jù)庫環(huán)境,以便該環(huán)境可以訪問實例并運(yùn)行DB2實例相關(guān)命令。在運(yùn)行這些命令之前,首先要配置好實例的運(yùn)行環(huán)境,這適用于所有用戶(包括管理用戶)。而且在執(zhí)行這些命令時一定要確保具有足夠的權(quán)限。實例相關(guān)的命令對權(quán)限要求很高,例如 db2icrt 和db2idrop需要root 權(quán)限才能執(zhí)行。而除了這兩個命令,其他實例命令需要具有SYSADM、SYSCTRL 或 SYSMAINT的權(quán)限才能運(yùn)行。
1.配置實例的運(yùn)行環(huán)境
我們都知道在 Linux/UNIX 環(huán)境中,在用戶級上強(qiáng)制實施高安全策略時,與某個用戶賬戶關(guān)聯(lián)的文件和進(jìn)程不能被其他用戶直接訪問。默認(rèn)情況下,創(chuàng)建新的實例時,會在實例目錄下生成特殊的 DB2 環(huán)境腳本 db2profile(Windows下為 db2profile.bat),每次實例所有者登錄到系統(tǒng)時都要使用該文件配置其環(huán)境。這些腳本設(shè)置對數(shù)據(jù)庫環(huán)境的訪問,允許實例所有者執(zhí)行 DB2命令。為了讓系統(tǒng)上的其他用戶訪問實例和 DB2 環(huán)境,他們也必須運(yùn)行同樣的腳本,否則將無法訪問 DB2 實例運(yùn)行環(huán)境。如下所示是由于沒有設(shè)置 DB2 實例運(yùn)行環(huán)境而導(dǎo)致無法執(zhí)行相關(guān) DB2命令的例子∶
可以通過設(shè)置DB2實例所有者的.profile 文件(或是由.profile 文件引用的db2profile 文件)來配置其他用戶的 DB2運(yùn)行環(huán)境。如果使用 Bourne 或Korn shell,那么可以編輯目標(biāo)用戶賬戶的.profile 文件,使目標(biāo)用戶登錄到系統(tǒng)時自動運(yùn)行db2profile腳本(創(chuàng)建實例時默認(rèn)會加到實例用戶的.profile 文件中)。對于C shell用戶,可以編輯.login 文件來運(yùn)行 db2cshrc 腳本文件。為了選擇要使用的實例的用戶,請在用戶的.profile 或.login 腳本文件中添加下列語句,或者在用戶需要訪問 DB2的終端窗口中執(zhí)行下列語句(注意需要句點(diǎn)(.)和空格)∶
Bourne或Korn shell∶.INSTHOME/sqllib/db2profile----注意前面的"."INSTHOME
----是實例目錄
C shell: source INSTHOME/sqllib/db2cshrc
當(dāng)成功創(chuàng)建實例后,檢查實例目錄下的.profile 是否調(diào)用db2profile,如下所示∶
# The following three lines have been added by IBM DB2 instance utilities.
if [ -f INSTHOME/sqllib/db2profile ]; then
. INSTHOME/sqllib/db2profile
fi
在配置好 DB2的運(yùn)行環(huán)境后,下面講解一些實例相關(guān)的命令。
列出實例
db2ilist命令列出機(jī)器上的 DB2 實例∶
DS8K:/db2$ db2ilist
PROD
DEV
DB2
--系統(tǒng)中存在三個實例
更新實例配置
如果通過安裝"程序臨時性修訂(PTF)"或補(bǔ)丁更新了數(shù)據(jù)庫管理器,那么應(yīng)使用db2iupdt 命令來更新所有現(xiàn)有數(shù)據(jù)庫實例。
db2iupdt 命令可在 DB2PATH\bin目錄中找到。要更新實例配置,請使用db2iupdt 命令。按如下所示使用該命令∶
db2iupdt InstName
/u:username, password
[/p:instance profile path]
[/r:baseport,endport]
[/h:hostname]
[/?]
[/q]
[/a:authType]
InstName 實例名
/u 用于指定 DB2服務(wù)的賬戶名和密碼。當(dāng)創(chuàng)建分區(qū)數(shù)據(jù)庫實例時,此選項是必需的
/p 用于指定已更新實例的新的實例概要文件路徑
/r 用于指定當(dāng)在MPP方式下運(yùn)行時,分區(qū)數(shù)據(jù)庫實例要使用的一系列TCP/IP 端口。如果指定此選項,那么本地機(jī)器的 services 文件將使用下列條目進(jìn)行更新∶ DB2_InstName baseport/tcp
DB2_InstName_END endport/tcp
/h 用于覆蓋默認(rèn) TCP/IP 主機(jī)名 (假設(shè)當(dāng)前機(jī)器有多個 TCP/IP 主機(jī)名)
/? 此用法信息
/q 安靜方式
/a authType 是實例的認(rèn)證類型(SERVER、CLIENT或 SERVER ENCRYPT))
示例∶如果在創(chuàng)建實例后安裝了DB2 工作組服務(wù)器版或 DB2 企業(yè)服務(wù)器版,可輸入以下命令來更新實例:
db2iupdt -u db2fencl db2inst1
注意∶
db2iupgrade和 db2iupdt 的區(qū)別是∶db2iupdt 通常是小版本打補(bǔ)丁,而 db2iupgrade 通常是大版本遷移。例如從DB2 V10.1到DB2 V10.5用 db2iupgrade,而從DB2 V10.5.1到DB2V10.5.2用db2iupdt。
2.自動啟動實例
在Windows 操作系統(tǒng)中,默認(rèn)情況下,安裝期間創(chuàng)建的數(shù)據(jù)庫實例設(shè)置為自動啟動,使用db2icrt創(chuàng)建的實例設(shè)置為手動啟動。要更改啟動類型,需要轉(zhuǎn)至"服務(wù)"面板并在其中更改 DB2服務(wù)的屬性(手動或自動)。
在 UNIX 或Linux 操作系統(tǒng)中,要允許實例在每次系統(tǒng)重新啟動后自動啟動,請輸入以下命令∶
db2iauto -on <instance name> --其中<instance name>是實例的登錄名
在 UNIX 或Linux操作系統(tǒng)中,要阻止實例在每次系統(tǒng)重新啟動后自動啟動,請輸入以下命令∶
db2iauto -off <instance name> --其中<instance name>是實例的登錄名
在正常業(yè)務(wù)操作期間,可能需要啟動或停止DB2數(shù)據(jù)庫。例如,必須啟動一個實例,然后才能執(zhí)行下列某些任務(wù)∶連接至該實例中的數(shù)據(jù)庫、預(yù)編譯應(yīng)用程序、將程序包綁定至數(shù)據(jù)庫或訪問主機(jī)數(shù)據(jù)庫。
在Linux或UNIX系統(tǒng)中,啟動實例之前需要以具有SYSADM、SYSCTRL或SYSMAINT 權(quán)限的用戶標(biāo)識或名稱進(jìn)行登錄;或者作為實例所有者登錄。在 Windows 中啟動實例,用戶賬戶必須具有 Windows 操作系統(tǒng)定義的、用于啟動 Windows 服務(wù)的正確特權(quán)。用戶賬戶可以是 Administrators、Server Operators 或 Power Users 組的某個成員。啟用了擴(kuò)展安全性之后,默認(rèn)情況下,只有DB2ADMNS 和 Administrators 組的成員才能啟動數(shù)據(jù)庫。
要使用命令行啟動實例,請輸入∶
db2start
在 Windows 中,db2start 命令將 DB2數(shù)據(jù)庫實例作為 Windows 服務(wù)來啟動。通過在調(diào)用db2start 時指定"/D"開關(guān),仍然可以在 Windows 中將 DB2數(shù)據(jù)庫實例作為進(jìn)程運(yùn)行。還可使用"控制面板"或 NET START命令將 DB2數(shù)據(jù)庫實例作為服務(wù)啟動。
4.連接至實例和從實例斷開
在所有平臺上,要與另一個可能是遠(yuǎn)程的數(shù)據(jù)庫管理器的實例連接,請使用 ATTACH 命令。要從實例斷開,請使用DETACH命令。
要使用命令行與實例連接,請輸入∶
db2 attach to <instance name>
例如,要連接至節(jié)點(diǎn)目錄中先前編目的稱為 testdb2的實例∶
db2 attach to testdb2
再如,在對 testdb2實例執(zhí)行維護(hù)活動后,要使用命令行從實例斷開,請輸入∶
db2 detach
或者輸入∶
db2 terminate
注意∶
這兩個命令在實際生產(chǎn)中很少用到,因為在 Linux/UNIX 環(huán)境中,每次都會通過某個用戶登錄操作系統(tǒng),這已經(jīng)隱含地連接了實例。
5.停止實例
我們有時可能需要停止數(shù)據(jù)庫管理器的當(dāng)前實例。要在Linux 或 UNIX 系統(tǒng)中停止實例,必須以具有 SYSADM、SYSCTRL 或 SYSMAINT 權(quán)限的用戶標(biāo)識或名稱登錄或連接至實例;或者作為實例所有者登錄。在 Windows 中,停止實例的用戶賬戶必須具有Windows 操作系統(tǒng)定義的正確特權(quán)。用戶賬戶可以是 Administrators、Server Operators 或 Power Users 組的某個成員。在停止實例之前,要停止與數(shù)據(jù)庫連接的所有應(yīng)用程序和用戶,要確保沒有關(guān)鍵性的或極重要的應(yīng)用程序在運(yùn)行。
要使用命令行停止實例,請輸入∶
db2stop
如果停止期間仍然有應(yīng)用連接,這時會出現(xiàn)"數(shù)據(jù)庫管理器未停止,因為數(shù)據(jù)庫仍在活動"的錯誤∶
DS8K:/db2$ db2stop
2012-08-24 10:49:19 0 0 SQL1025N The database manager was not
stopped because databases are still active.
SQL1025N The database manager was not stopped because databases are still active.
如果要強(qiáng)制所有應(yīng)用程序和用戶與數(shù)據(jù)庫斷開,那么需要輸入如下命令∶
db2stop force
這時,所有連接上數(shù)據(jù)庫且未提交的應(yīng)用被強(qiáng)制回滾。
在 Windows 中,除了使用命令行之外,還可以通過"控制面板-服務(wù)"或 NET STOP 命令停止實例。
2.1.5 DB2INSTANCE變量介紹
如果系統(tǒng)中有多個實例,那么如何在各個實例之間進(jìn)行切換以及如何同時啟動多個實例呢?這就需要使用DB2INSTANCE 環(huán)境變量。環(huán)境變量是操作系統(tǒng)層面的,是在操作系統(tǒng)級別上定義的變量。最常使用的DB2 環(huán)境變量是DB2INSTANCE,該環(huán)境變量允許指定當(dāng)前活動實例,所有命令都將應(yīng)用于該實例。例如,如果將 DB2INSTANCE設(shè)置成"PROD",那么發(fā)出命令"create database mydb"會創(chuàng)建出與實例"PROD"相關(guān)的數(shù)據(jù)庫。但是如果想創(chuàng)建與實例"DB2"相關(guān)的數(shù)據(jù)庫,那么首先必須將 DB2INSTANCE 變量的值更改成"DB2"。
可以使用控制面板(在 Windows中/db2profile(在 UNIX中)來設(shè)置環(huán)境變量的值,從而保證下次打開窗口/會話時改值不變。但是,如果想在給定的窗口/會話中臨時更改該值,那么在Windows中可以使用操作系統(tǒng)的"set"命令,在UNX中可以使用"export"或"setenv"命令。例如,在Windows 平臺上,下面這個命令∶
set DB2INSTANCE=DB2
會將環(huán)境變量DB2INSTANCE 的值設(shè)置成"DB2"。使用set 命令時常犯的錯誤是在等號(=)前后留有空格。絕對不能有空格!
要查看該變量的當(dāng)前設(shè)置,可以使用下面三個方法中的任何一個∶
echo %DB2INSTANCE%(Windows only);echo SDB2INSTANCE(Linux/UNIX)
set DB2INSTANCE
db2 get instance
示例∶假設(shè)系統(tǒng)中有多個實例,下面舉例說明如何通過設(shè)置 DB2INSTANCE 環(huán)境變量來啟動多個實例。
C:\Program Eiles\IBM\SQLLIB\BIN>db2ilist
PROD
DEV
DB2
--系統(tǒng)中存在三個實例
C:\Program Files\IBMNSQLLIB\BIN>set DB2INSTANCE
DB2INSTANCE=DB2
--當(dāng)前活動實例是DB2實例
C:\Program Files\IBM\SQLLIB\BIN>set DB2INSTANCE=PROD
C:\Program Files\IBM\SQLLIB\BIN>set DB2INSTANCE
DB2INSTANCE=PROD
C:\Program Files\IBM\SQLLIB\BIN>db2 get instance --當(dāng)前數(shù)據(jù)庫管理器實例是 PROD
--db2 get instance 命令用來判斷當(dāng)前在哪個實例下
C:\Program Files\IBM\SQLLIB\BIN>db2start --這時啟動的是prod實例
其實,DB2INSTANCE環(huán)境變量類似Oracle 中的變量ORACLE_SID、Informix中的變量INFORMIXSERVER,主要用于在多個實例間進(jìn)行切換。這個變量在 Windows中很常用,在 Linux/UNIX中由于每個實例都有同名的用戶,因此當(dāng)使用這個用戶登錄時已經(jīng)隱含地連接了這個實例。所以相對來說在Linux/UNIX中很少用到這個變量。
2.1.6 刪除實例
要刪除實例,必須具有root權(quán)限,在windows中必須具有系統(tǒng)管理員權(quán)限。刪除實例之前,確保所有的應(yīng)用已經(jīng)斷開實例并且實例已經(jīng)停止。
要使用命令行刪除實例,請輸入:
db2idrop <instance name>
db2idrop命令從實例列表中刪除實例條目,并刪除實例所有者 home 目錄下的sqllib子目錄。所以刪除實例時千萬要小心,如有必要請在刪除實例之前備份實例目錄。
注意∶
在 Linux/UNIX操作系統(tǒng)中,試圖使用 db2idrop命令刪除實例時,會生成一條消息,說明不能刪除 sqllib子目錄,并且正在 adm子目錄中生成幾個具有.nfs 擴(kuò)展名的文件。adm 子目錄是安裝了NFS的系統(tǒng),而這些文件在服務(wù)器上是受控的。必須從安裝目錄的文件服務(wù)器中刪除*.nfs 文件,然后方可刪除 sqllib子目錄。
2.1.7 配置實例
每個實例在創(chuàng)建后,都有實例配置文件(db2systm),實例配置文件控制實例的安全、通信、管理和資源的分配。可以根據(jù)需要查看、更改和復(fù)位這個配置參數(shù)。這個配置文件是二進(jìn)制的,只能通過命令來修改。
可使用db2 get dbm cfg 命令來查看當(dāng)前實例的配置參數(shù)。
要查看當(dāng)前實例配置參數(shù)的當(dāng)前值,請輸入∶
db2 get dbm cfg
這會顯示在安裝該產(chǎn)品期間指定為默認(rèn)配置參數(shù)的當(dāng)前值,或在先前更新配置參數(shù)期間指定的那些值。
可在命令行使用 update dbm config 更新實例配置文件。要更新實例配置文件中的個別條目,請輸入∶
db2 update dbm cfg using ..
要將配置參數(shù)復(fù)位為建議的默認(rèn)值,請輸入∶
db2 reset dbm cfg
在某些情況下,對實例配置文件的更改僅在將更改裝入內(nèi)存后才生效(在執(zhí)行 db2stop 之后,執(zhí)行db2start 時生效)。
關(guān)于實例配置文件,已超出了本章的討論范圍,我們會在后面的章節(jié)中為大家詳細(xì)講解如何合理地設(shè)置實例設(shè)置參數(shù)以使實例穩(wěn)定、安全、高效地運(yùn)行。
3.1 Db2數(shù)據(jù)庫的概念
在db2中,一個db2實例可以同時管理多個db2數(shù)據(jù)庫,而一個db2數(shù)據(jù)庫只能由一個db2實例管理,db2數(shù)據(jù)庫與db2實例是一種松散耦合的關(guān)系。在unix或linux中,創(chuàng)建數(shù)據(jù)庫所生成文件所屬的用戶和組都是db2實例的所有者,即創(chuàng)建實例的用戶和組。實例和數(shù)據(jù)庫的關(guān)系如圖。
DB2數(shù)據(jù)庫實際上由對象集合組成。從用戶的角度來看,數(shù)據(jù)庫是一組通常以某種方式相關(guān)聯(lián)的表。從數(shù)據(jù)庫管理員的角度來看,數(shù)據(jù)庫比這要復(fù)雜一些。實際的數(shù)據(jù)庫包含許多邏輯對象和物理對象∶
● 表、視圖、索引、模式、觸發(fā)器、存儲過程、程序包等數(shù)據(jù)庫對象
● 緩沖池、日志文件、表空間
● 物理存儲、容器、目錄、文件系統(tǒng)或裸設(shè)備
這些對象中的一部分(比如表或視圖)幫助決定如何對數(shù)據(jù)進(jìn)行組織;其他對象(比如表空間)涉及數(shù)據(jù)庫的物理實現(xiàn);最后,一些對象(比如緩沖池和其他內(nèi)存對象)處理如何管理數(shù)據(jù)庫性能;另外一些對象(比如日志文件)處理數(shù)據(jù)庫的可恢復(fù)性。數(shù)據(jù)庫的邏輯結(jié)構(gòu)如圖所示。
DBA應(yīng)該首先關(guān)注數(shù)據(jù)庫的物理設(shè)計,而不是直接研究所有可能的參數(shù)和對象組合。而數(shù)據(jù)庫的邏輯設(shè)計,比如表的字段屬性設(shè)計,則主要由應(yīng)用設(shè)計人員完成。DBA的核心工作之一就是研究如何創(chuàng)建數(shù)據(jù)庫并分配數(shù)據(jù)庫所需的磁盤存儲。要正確地解決這個問題,需要了解數(shù)據(jù)庫中的基本對象以及它們?nèi)绾斡成涞轿锢泶疟P存儲。
3.1.1 DB2數(shù)據(jù)庫存儲模型
DB2 利用邏輯存儲模型和物理存儲模型來處理數(shù)據(jù)。用戶操作的實際數(shù)據(jù)存放在表中。表由行和列組成,用戶并不知道數(shù)據(jù)的物理表示。這一事實有時候稱為數(shù)據(jù)的物理獨(dú)立性。
表本身存放在表空間中,一個表空間可以包含多個表。同時,表空間在物理上又對應(yīng)著若干個容器。容器可以由目錄名、裸設(shè)備名或文件名標(biāo)識。容器被分配給表空間。表空間可以跨許多容器,這意味著可以突破操作系統(tǒng)對于一個容器可以包含的數(shù)據(jù)量的限制。這樣一來,表空間就作為邏輯設(shè)計中的表與物理設(shè)計中的容器之間的橋梁,表通過表空間實實在在地將數(shù)據(jù)存放到容器(文件或目錄)中。圖3-3說明了所有這些對象之間的關(guān)系。
從圖 3-3 中可以看到∶數(shù)據(jù)庫中有很多表空間,可以把數(shù)據(jù)庫看作很多個表空間的集合;可以根據(jù)需要創(chuàng)建多個表空間。而用戶創(chuàng)建的表、索引等數(shù)據(jù)庫對象存放在表空間中。表直接面向應(yīng)用。而同時表空間又和底層的物理存儲對應(yīng),表空間可以有多個容器,而容器處在底層存儲之上。所以通過表空間數(shù)據(jù)庫實現(xiàn)了物理存儲和邏輯存儲的統(tǒng)一。表空間是DB2中最重要的概念之一。
下面首先講解數(shù)據(jù)庫的物理存儲。我們都知道操作系統(tǒng)的最小存儲單位是塊block),在Linux和UNIX中,最小的塊是512字節(jié);在Windows中,最小的存儲單位為1KB。而數(shù)據(jù)庫中最小的存儲單位是數(shù)據(jù)頁(datapage),它是 DB2 讀寫的最小單位。DB2數(shù)據(jù)庫中有4KB、8KB、16KB和32KB幾種數(shù)據(jù)頁??梢愿鶕?jù)業(yè)務(wù)類型(OLAP、OLTP等)和表的大小來選擇合適的數(shù)據(jù)頁。DB2數(shù)據(jù)庫在寫物理存儲時,為了保證寫的吞吐量,引入了更大的單位extent,它是整數(shù)倍的 datapage 的大小。這個可以在創(chuàng)建表空間時指定extentsize大小來確定。而容器又由很多個extent 組成,同時表空間又由很多容器組成,它們之間的關(guān)系如圖3-4所示。
在數(shù)據(jù)庫的物理存儲和邏輯存儲模型中,表空間鏈接了物理存儲模型和邏輯存儲模型,扮演了承上啟下的角色。在邏輯上,它向上面對的是數(shù)據(jù)庫,向下它是存放表的容器,面向的是表;而同時表空間又在物理上映射底層的容器——物理存儲。表空間是數(shù)據(jù)庫性能調(diào)優(yōu)的重點(diǎn),而數(shù)據(jù)庫創(chuàng)建工作的絕大部分都是圍繞著表空間進(jìn)行的。
3.1.2 表空間管理類型
Db2支持3種管理類型的表空間:
SMS表空間需要的維護(hù)非常少。但是,與DMS表空間相比,SMS表空間提供的優(yōu)化選項少且性能不好。
那么,應(yīng)該選擇哪種表空間設(shè)計呢?下面我們來看看這幾種表空間的比較。
1.DMS、SMS與 DMS自動存儲的比較
盡管下面的表 3-1并不全面,但卻包含在DMS、DMS自動存儲和 SMS表空間之間進(jìn)行選擇時要考慮的一些因素。
SMS 表空間可以簡化管理,DMS表空間可以提高性能,除此之外,這兩種存儲模型之間最顯著的差異是表空間的最大大小。在使用 SMS表空間時,DBA 最多只能在表空間中存放64GB(4KB頁大?。┑臄?shù)據(jù)。將頁面大小改為32KB,可以將這個限制擴(kuò)大到512GB,但代價是每個頁面上的可用空間可能會更少。DMS 模型會將大型表空間的限制擴(kuò)大到8TB(4KB 頁面大小的情況下)。如果將頁面大小改為 32KB,可用空間可以增長到64TB。盡管還有讓表大小突破 64GB 限制的其他方法,但是最簡單的方法可能是一開始就使用DMS的大型表空間。
2. DMS與DMS自動存儲
DBA 可以為數(shù)據(jù)庫設(shè)置存儲路徑,然后 DMS 自動存儲的表空間就會使用這些存儲路徑。DBA不必顯式地定義表空間的位置和大小,系統(tǒng)將自動地分配表空間。
啟用 DMS自動存儲的數(shù)據(jù)庫有一個或多個相關(guān)聯(lián)的存儲路徑。表空間可以定義為"由自動存儲進(jìn)行管理",容器由 DB2根據(jù)這些存儲路徑進(jìn)行分配。數(shù)據(jù)庫只能在創(chuàng)建時啟用自動存儲。未啟用自動存儲的現(xiàn)有數(shù)據(jù)庫現(xiàn)在可轉(zhuǎn)換為使用自動存儲,同樣,現(xiàn)有的DMS 表空間現(xiàn)在可轉(zhuǎn)換為使用自動存儲,可使用 ALTERDATABASE 語句來為現(xiàn)有數(shù)據(jù)庫啟用自動存儲。
下面的表3-2總結(jié)了管理DMS非自動存儲和 DMS 自動存儲之間的一些差異。
引入自動存儲模型的主要目的是簡化 DMS 表空間的管理,同時保持其性能特征。有的時候,DBA必須定義使用的表空間的所有特征,但是許多應(yīng)用程序都會從自動存儲提供的簡化管理獲益。
3. DB2存儲模型小結(jié)
經(jīng)過上面的講解,我們對數(shù)據(jù)庫、表空間、容器和數(shù)據(jù)庫對象做個總結(jié)∶
● 數(shù)據(jù)庫是對象集合,包括表、索引、視圖、大對象和觸發(fā)器等。
● 這些對象存儲在表空間中,表空間由容器組成。
● 表空間可以由操作系統(tǒng)管理(SMS),也可以由 DB2管理(DMS、自動存儲)?!?容器可以選擇使用底層存儲—文件系統(tǒng)、裸設(shè)備或操作系統(tǒng)目錄。
● 表空間由很多擴(kuò)展數(shù)據(jù)塊(extent)組成,而 extent 又由 extentsize(可自己定義)個數(shù)據(jù)頁(datapage)組成,數(shù)據(jù)頁是最小的存儲單位。
● 應(yīng)該主要根據(jù)性能和維護(hù)因素決定要使用的表空間類型、擴(kuò)展數(shù)據(jù)塊的大小、數(shù)據(jù)頁的大小和容器類型。
創(chuàng)建數(shù)據(jù)庫
從命令行創(chuàng)建 DB2數(shù)據(jù)庫是相當(dāng)簡單的。要創(chuàng)建數(shù)據(jù)庫,必須調(diào)用DB2命令行處理程序(Command Line Processor,CLP)。調(diào)用方法是在DB2程序組的Command Line Tools 文件夾中選擇 Command Line Processor,或者從操作系統(tǒng)命令行執(zhí)行命令db2cmd db2。
創(chuàng)建DB2數(shù)據(jù)庫的語法如下∶
CREATE DATABASE MYDB
你可能會問"就這么簡單?",是的,就這么簡單!CREATE DATABASE語句中唯一必需的選項就是數(shù)據(jù)庫的名稱。數(shù)據(jù)庫的命名規(guī)則是∶
● 數(shù)據(jù)庫的名稱可以由以下字符組成∶ a-z、A-Z、0-9、@、#和$。
● 名稱中的第一個字符必須是字母表字符、@、#或$;不能是數(shù)字或字母序列 SYS、DBM或IBM。注意,數(shù)據(jù)庫的名稱不能超過8個字符。
● 數(shù)據(jù)庫名稱或數(shù)據(jù)庫別名是唯一的字符串,包含前面描述的1到8個字母、數(shù)字或鍵盤字符。
當(dāng)然,有很多選項可供使用;不必只輸入名稱。下面研究一下這個命令實際上會導(dǎo)致什么情況。
DB2創(chuàng)建了什么
在發(fā)出CREATE DATABASE 命令時,db2會創(chuàng)建許多文件。這些文件包括日志文件、配置信息、歷史文件和3個默認(rèn)的表空間。這些表空間是:
在linux/unix系統(tǒng)下,這些文件默認(rèn)都放在實例用戶的home目錄下,對于簡單的應(yīng)用程序,這個默認(rèn)配置應(yīng)該可以滿足需要。但是,我們可能希望改變數(shù)據(jù)庫文件的位置,或者改變DB2管理這些對象的方式。接下來,我們將更詳細(xì)地研究 CREATE DATABASE 命令。
CREATE DATABASE 命令
DB2CREATEDATABASE命令的完整語法很復(fù)雜,下面說明了DBA感興趣的大多數(shù)選項∶
數(shù)據(jù)庫位置
CREATE DATABASE命令的參數(shù)之一是 ON path/drive 選項。這個選項告訴DB2希望在哪里創(chuàng)建數(shù)據(jù)庫。如果沒有指定路徑,就會在數(shù)據(jù)庫管理程序設(shè)置(DFTDBPATH 參數(shù))中指定的默認(rèn)數(shù)據(jù)庫路徑上創(chuàng)建數(shù)據(jù)庫。
test2:/home/db2inst4$ db2 get dbm cfg | grep -i DFTDBPATH
Default database path (DFTDBPATH)=/home/db2inst4
例如,以下 CREATE DATABASE命令將數(shù)據(jù)庫存放在UNIX操作系統(tǒng)的/db2/mydb 目錄中∶
CREATE DATABASE MYDB ON /db2/mydb
選擇自動存儲(默認(rèn)設(shè)置)將允許 DBA為數(shù)據(jù)庫設(shè)置在創(chuàng)建所有容器時可以使用的存儲路徑。DBA不必顯式地定義表空間的位置和大小,系統(tǒng)將自動地分配表空間。例如,下面的數(shù)據(jù)庫創(chuàng)建語句將為數(shù)據(jù)庫中的所有表空間設(shè)置自動存儲∶
CREATE DATABASE MYDB AUTOMATIC STORAGE YES ON /db2/mydbpath001,/db2/mydbpath002,/db2/mydbpath003
在 ON 選項后面,給出了3個文件目錄(路徑)。這3個路徑是容器的位置,數(shù)據(jù)庫路徑默認(rèn)放在第一個路徑下。當(dāng)使用 AUTOMATIC STORAGE 定義表空間時,不需要提供其他參數(shù)∶
CREATE TABLESPACE TEST MANAGED BY AUTOMATIC STORAGE;
在這個命令中,可以提供與表空間相關(guān)聯(lián)的任何參數(shù);雖然使用自動存儲可以大大簡化日常的表空間維護(hù)工作,但是與重要的大型生產(chǎn)表相關(guān)聯(lián)的表空間可能需要 DBA 更多地干預(yù)。
在沒有啟用自動存儲的數(shù)據(jù)庫中創(chuàng)建表空間時,必須指定 MANAGED BY SYSTEM或MANAGED BY DATABASE 子句。使用這些子句會分別創(chuàng)建 SMS表空間和 DMS表空間。在這兩種情況下,必須提供容器的顯式列表。
如果數(shù)據(jù)庫啟用了自動存儲,那么在定義表空間時還有另一個選擇??梢灾付∕ANAGED BYAUTOMATIC STORAGE子句,或者完全去掉 MANAGED BY子句(這意味著自動存儲)。在這種情況下,不提供容器定義,因為 DB2會自動地分配容器。
代碼頁和整理次序
所有 DB2字符數(shù)據(jù)類型(CHAR、VARCHAR、CLOB、DBCLOB)都有相關(guān)聯(lián)的字符代碼頁??梢哉J(rèn)為代碼頁是對照表,用來將字母數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換為數(shù)據(jù)庫中存儲的二進(jìn)制數(shù)據(jù)。
一個 DB2 數(shù)據(jù)庫只能使用一個代碼頁。
代碼頁是在 CREATE DATABASE 命令中使用CODESET和 TERRITORY選項設(shè)置的。代碼頁可以使用單一字節(jié)來表示字母數(shù)字字符(單一字節(jié)可以表示256個獨(dú)特元素),也可以使用多個字節(jié)。英語等語言包含的獨(dú)特字符相當(dāng)少,因此單字節(jié)代碼頁(SBCS)對于存儲數(shù)據(jù)足夠了。東亞國家語言(中文、日文、韓文等)需要超過 256 個元素才能表示所有的獨(dú)特字符,因此需要多字節(jié)代碼頁(通常是雙字節(jié)代碼頁DBCS)。
在默認(rèn)情況下,數(shù)據(jù)庫的整理次序根據(jù) CREATE DATABASE 命令中使用的代碼集進(jìn)行定義。默認(rèn)選項COLLATE USING SYSTEM,會根據(jù)為數(shù)據(jù)庫指定的TERRITORY 對數(shù)據(jù)值進(jìn)行比較。如果使用選項COLLATE USING IDENTITY,那么以逐字節(jié)的方式使用二進(jìn)制表示來比較所有值。
例如中文代碼頁為1386,代碼集為GBK,TERRITORY為CN。創(chuàng)建數(shù)據(jù)庫時要注意選擇合適的代碼頁,這些參數(shù)在數(shù)據(jù)庫創(chuàng)建好后都不能再進(jìn)行修改,務(wù)必慎重選擇。如果客戶端訪問數(shù)據(jù)庫服務(wù)器時代碼頁不一樣,將無法訪問。
對于需要使用 XML數(shù)據(jù)的應(yīng)用程序,有如下特殊的注意事項。當(dāng)前,DB2只在定義為 Unicode 數(shù)據(jù)庫才能同時存儲 XML 文檔和 SOL數(shù)據(jù)的更多傳統(tǒng)格式,比如整數(shù)、日期/時間、變長字符串等等。隨后,你將在這個數(shù)據(jù)庫中創(chuàng)建對象來管理 XML 和其他類型的數(shù)據(jù)。如果數(shù)據(jù)庫在創(chuàng)建時沒有啟用 Unicode 支持,就不能在其中創(chuàng)建 XML 數(shù)據(jù)。
假如要創(chuàng)建同時支持 XML 和 SOL 的數(shù)據(jù)庫,請執(zhí)行如下命令∶
create database xmldb using codeset UTF-8 territory us
一旦創(chuàng)建 Unicode 數(shù)據(jù)庫,就不需要發(fā)出任何專門的命令或采取任何進(jìn)一步措施來使DB2能夠以自身分層的格式存儲 XML 數(shù)據(jù)和關(guān)系數(shù)據(jù)。
表空間定義
3個表空間(SYSCATSPACE、TEMPSPACE1、USERSPACE1)都是在默認(rèn)目錄中自動創(chuàng)建的(ON 關(guān)鍵字),除非指定它們的位置。對于每個表空間,DBA 可以指定表空間應(yīng)該使用的文件系統(tǒng)的特征。
3個表空間使用以下語法進(jìn)行定義∶
如果省略任何關(guān)鍵字,db2將使用默認(rèn)值來生成表空間。表空間定義采用這些選項,語法如下:
注意,上面的語法不包括與自動存儲數(shù)據(jù)庫相關(guān)聯(lián)的選項。
我們來詳細(xì)看看這種語法。MANAGED BY 選項讓 DB2生成這些表空間并決定如何管理表空間。SMS表空間使用 SYSTEM USING關(guān)鍵字,如下所示∶
SYSTEM USING ('container string')
對于SMS 表空間,容器字符串(container string)標(biāo)識一個或多個將屬于這個表空間的容器,表空間數(shù)據(jù)將存儲在這些容器中。每個容器字符串可以是絕對的或相對的目錄名。如果目錄名不是絕對的,就相對于數(shù)據(jù)庫目錄。如果目錄的任何部分不存在,數(shù)據(jù)庫管理程序就會創(chuàng)建這個目錄。容器字符串的格式取決于操作系統(tǒng)。
使用DATABASE USING關(guān)鍵字定義 DMS表空間∶
DATABASE USING ( FILE/DEVICE 'container string' number of pages|K|M|G )
對于DMS表空間,容器字符串標(biāo)識一個或多個將屬于這個表空間的容器,表空間數(shù)據(jù)將存儲在這些容器中。指定容器的類型(FILE 或 DEVICE)和大小(按照 PAGESIZE 大小的頁面)。大小還可以指定為整數(shù),后面跟著 K(表示千字節(jié))、M(表示兆字節(jié))或G(表示千兆字節(jié))??梢曰旌现付?FILE 和 DEVICE容器。
對干 FILE 容器,容器字符串必須是絕對或相對的文件名。如果文件名不是絕對的,就相對于數(shù)據(jù)庫目錄。如果目錄名的任何部分不存在,數(shù)據(jù)庫管理程序就會創(chuàng)建這個目錄。如果文件不存在,數(shù)據(jù)庫管理程序就會創(chuàng)建這個文件并初始化為指定的大小。
對于DEVICE 容器,容器字符串必須是設(shè)備名而且這個設(shè)備必須已經(jīng)存在;并且對于DEVICE容器,通常需要使用操作系統(tǒng) root 權(quán)限創(chuàng)建邏輯卷并且賦予 DB2 實例使用的權(quán)限,一般通過UNIX/Linux的chown命令來實現(xiàn)這一點(diǎn)。
重要提示∶所有容器必須在所有數(shù)據(jù)庫中唯一;一個容器只能屬于一個表空間。
EXTENTSIZE number of pages
EXTENTSIZE 指定數(shù)據(jù)庫可以寫到容器中的 PAGESIZE 頁面數(shù)量,達(dá)到這個數(shù)量之后將跳到下一個容器。對于含有多個容器的表空間,DB2 以循環(huán)方式使用這些容器,以EXTENTSIZE 為切換容器的單位,即先寫滿第一個容器的EXTENT,再寫第二個容器的一個EXTENT,依次執(zhí)行。EXTENTSIZE的值還可以指定為整數(shù),后面跟著K或M,如果用這種方式,EXTENTSIZE 的值必須是 PAGESIZE 的整數(shù)倍。EXTENTSIZE 的大小是在表空間級定義的。一旦為表空間指定擴(kuò)展數(shù)據(jù)塊大小,就不能改變了。數(shù)據(jù)庫配置參數(shù)DFT_EXTENT_SZ指定數(shù)據(jù)庫中所有表空間的默認(rèn)擴(kuò)展數(shù)據(jù)塊大小。這個值的范圍是2到256個頁面;因此,絕對大小是從 8KB 到 1024KB(對于 4KB 頁面),或者從 16 KB 到2048KB(對于8KB 頁面)。可以在 CREATE TABLESPACE 語句中使用EXTENTSIZE 參數(shù)覆蓋這個數(shù)字。
PREFETCHSIZE number of pages
PREFETCHSIZE 指定在執(zhí)行數(shù)據(jù)預(yù)獲取時將從表空間中讀取的 PAGESIZE 頁面數(shù)量。連續(xù)的預(yù)讀取是指數(shù)據(jù)庫管理程序能夠提前預(yù)測查詢,在實際引用頁面之前讀取這些頁面。這樣查詢就不需要等待底層操作系統(tǒng)執(zhí)行 I/O操作。這種異步的檢索可以顯著減少執(zhí)行時間??梢酝ㄟ^修改 CREATE TABLESPACE 語句中的 PREFETCHSIZE參數(shù)來控制執(zhí)行預(yù)獲取的大小。在默認(rèn)情況下,這個值設(shè)置為 DFT PREFETCH SZ數(shù)據(jù)庫配置參數(shù),這個值代表在 DB2觸發(fā)預(yù)讀取請求時每次讀取多少個頁面。通過將這個值設(shè)置為擴(kuò)展數(shù)據(jù)塊大小的倍數(shù), 可以并行地讀取多個擴(kuò)展數(shù)據(jù)塊。當(dāng)表空間的容器在不同的硬盤上時,這個功能甚至效率更高。預(yù)讀取大小還可以指定為整數(shù),后面跟著K、M或G。
關(guān)于PREFETCHSIZE 的設(shè)置,我們在后面介紹表空間性能時還會詳細(xì)講解。
CREATE DATABASE命令示例
下面是CREATE DATABASE 命令示例,這里使用了前面討論的許多選項∶
CREATE DATABASE MYDB
DET_EXTENT_SZ 4
CATALOG TABLESPACE MANAGED BY DATABASE USTNG
(FILE '/datal/CATALOG.DAT' 20000,FILE '/data2/CATALOG.DAT' 20000)
EXTENTSIZE 8
PREFETCHSIZE 16
TEMPORARY TABLESPACE MANAGED BY SYSTEM USING
('/datal/TEMPTS1','/data2/TEMPTS2')
USER TABLESPACE MANAGED BY DATABASE USING
(FILE '/datal/USERTS.DAT' 1200)
EXTENTSIZE 24
PREFETCHSIZE 48
我們來詳細(xì)地看看每一行∶
● CREATE DATABASE∶這條語句定義要創(chuàng)建的數(shù)據(jù)庫的名稱。
● DFT_EXTENT_SZ 4∶這個參數(shù)告訴 DB2默認(rèn)的擴(kuò)展數(shù)據(jù)塊大小是4個頁面,除非
在創(chuàng)建表空間時顯式地聲明,否則默認(rèn)使用這個值。
● CATALOG TABLEPSACE MANAGED BY DATABASE USING∶DB2編目空間將由數(shù)據(jù)庫管理。
● FILE '/data...'∶數(shù)據(jù)庫編目表空間的位置將跨兩個文件,每個文件有20000個頁面的空間。
● EXTENTSIZE 8∶EXTENTSIZE是8個頁面。這個設(shè)置會覆蓋 DFT_EXTENT _SZ。
● PREFETCHSIZE 16∶在查詢處理期間,同時預(yù)讀取 16個頁面。
● TEMPORARY TABLESPACE MANAGED BY SYSTEM USING∶DB2使用的臨時空間將由操作系統(tǒng)處理。
● 'TEMPTS...'...∶臨時空間將跨兩個文件,文件的大小在 DB2執(zhí)行期間自動地調(diào)整。
● USER TABLESPACE MANAGED BY DATABASE USING∶用戶表空間(放置真正的表的地方)將由 DB2直接管理。
● EXTENTSIZE 24∶ USER表空間的 EXTENTSIZE 是24個頁面。
● PREFETCHSIZE 48∶查詢處理期間,同時預(yù)讀取 48個頁面。
上面介紹了關(guān)于如何創(chuàng)建DB2數(shù)據(jù)庫的背景知識。在大多數(shù)情況下,CREATEDATABASE 命令的默認(rèn)值提供了可以滿足開發(fā)和測試需要的數(shù)據(jù)庫。一旦決定將數(shù)據(jù)庫轉(zhuǎn)入生產(chǎn)環(huán)境,就需要對DB2使用的數(shù)據(jù)布局和表空間定義付出更大的努力。盡管這需要做更多的規(guī)劃工作,但是產(chǎn)生的數(shù)據(jù)庫更容易管理,性能也可能更好。
3.1.4 數(shù)據(jù)庫目錄
我們在第2章創(chuàng)建實例時講過,當(dāng)創(chuàng)建實例時,就會生成實例目錄。同樣,當(dāng)創(chuàng)建數(shù)據(jù)庫時,關(guān)于數(shù)據(jù)庫的信息(包括默認(rèn)信息)會存儲在目錄層次結(jié)構(gòu)中,這就是數(shù)據(jù)庫目錄。此分層目錄結(jié)構(gòu)的創(chuàng)建位置取決于你在CREATE DATABASE 命令中提供的路徑信息。如果在創(chuàng)建數(shù)據(jù)庫時未指定目錄路徑或驅(qū)動器的位置,那么將使用默認(rèn)位置。建議創(chuàng)建數(shù)據(jù)庫時明確數(shù)據(jù)庫路徑。數(shù)據(jù)庫目錄中存放的是數(shù)據(jù)庫表空間、表、索引、容器等信息,這個目錄至關(guān)重要,一定要注意它的安全性。
在CREATE DATABASE 命令中,在指定為數(shù)據(jù)庫路徑的目錄中,將創(chuàng)建使用實例名的子目錄。這個子目錄確保在同一目錄下的不同實例中創(chuàng)建的數(shù)據(jù)庫不會使用相同的路徑。在實例名子目錄下面,將創(chuàng)建名為NODE0000的子目錄。這個子目錄可以區(qū)分邏輯分區(qū)數(shù)據(jù)庫環(huán)境中的數(shù)據(jù)庫分區(qū)。在節(jié)點(diǎn)名目錄下面,將創(chuàng)建名為SQL00001的子目錄。此子目錄的名稱使用了數(shù)據(jù)庫標(biāo)記并表示正在創(chuàng)建的數(shù)據(jù)庫。SQL00001包含與第一個創(chuàng)建的數(shù)據(jù)庫以及隨后創(chuàng)建的具有更高編號(SQL00002等)的數(shù)據(jù)庫相關(guān)聯(lián)的對象。這些子目錄可以區(qū)分在CREATEDATABASE命令中,在指定目錄的實例中創(chuàng)建的數(shù)據(jù)庫。
目錄結(jié)構(gòu)如下所示
<your_database_path>/<your_instance>/NODE0000/SQL0001/
詳細(xì)的信息如圖3-7所示。
數(shù)據(jù)庫目錄中包含下列作為CREATE DATABASE命令一部分進(jìn)行創(chuàng)建的文件:
● 文件 SQLBP.1和 SQLBP.2中包含緩沖池信息。這兩個文件互為副本以實現(xiàn)備份。
● SQLSPCS.1 和 SQLSPCS.2 文件中包含表空間信息。這兩個文件互為副本以實現(xiàn)備份。
● 文件 SQLSGF.1和 SQLSGF.2包含與數(shù)據(jù)庫自動存儲有關(guān)的存儲路徑信息。這兩個文件互為副本以實現(xiàn)備份。
● SQLDBCONF 文件中包含數(shù)據(jù)庫配置信息。切勿編輯此文件。
注意∶
SQLDBCON文件在先前發(fā)行版中使用,并且包含在 SOLDBCONF損壞時可以使用的類似信息。
要更改配置參數(shù),請使用UPDATE DATABASE CONFIGURATION 和RESET DATABASE CONFIGURATION 語句。
● DB2RHIST.ASC歷史記錄文件及其備份 DB2RHIST.BAK中包含關(guān)于備份、復(fù)原、表裝入、表重組、表空間改變和其他數(shù)據(jù)庫更改的歷史記錄信息。
DB2TSCHG.HIS 文件中包含日志文件級別的表空間更改的歷史記錄。對于每個日志文件,DB2TSCHG.HIS 中包含有助于標(biāo)識日志文件影響哪些表空間的信息。表空間恢復(fù)使用此文件中的信息來確定在進(jìn)行表空間恢復(fù)期間要處理哪些日志文件。可以在文本編輯器中檢查這兩個歷史記錄文件中的內(nèi)容。
● 日志控制文件SQLOGCTL.LFH.1及其鏡像副本SQLOGCTL.LFH.2和SQLOGMIR.LFH中包含有關(guān)活動日志的信息。崩潰恢復(fù)處理過程使用這些文件中的信息來確定要在日志中后退多遠(yuǎn)來開始崩潰恢復(fù)。SQLOGDIR子目錄包含實際的日志文件。
注意∶
應(yīng)確保不要將日志子目錄映射到用于存儲數(shù)據(jù)的磁盤。這樣一來,在磁盤發(fā)生問題時,只會影響到數(shù)據(jù)或日志,而不會同時影響這兩者。由于日志文件與數(shù)據(jù)庫容器不會爭用同一磁盤磁頭的移動,因此這可提供很多性能方面的好處。要更改日志子目錄的位置,請更改 newlogpath 數(shù)據(jù)庫配置參數(shù)。
● SQLINSLK文件用于確保數(shù)據(jù)庫只能由數(shù)據(jù)庫管理器的單個實例使用。
● 在創(chuàng)建數(shù)據(jù)庫的同時,還創(chuàng)建了詳細(xì)的死鎖事件監(jiān)視器。詳細(xì)的死鎖事件監(jiān)視器文件存儲在目錄節(jié)點(diǎn)的數(shù)據(jù)庫目錄中,名為db2detaildeadlock。
在非自動存儲數(shù)據(jù)庫中,SMS數(shù)據(jù)庫目錄的其他信息
在非自動存儲數(shù)據(jù)庫中,SQLT*子目錄包含運(yùn)作數(shù)據(jù)庫所需的默認(rèn)“系統(tǒng)管理的空間”(SMS)表空間。創(chuàng)建數(shù)據(jù)庫時會生成3個默認(rèn)表空間∶
● SQLT0000.0子目錄中包含帶有系統(tǒng)目錄表的目錄表空間
● SQLT0001.0子目錄中包含默認(rèn)臨時表空間
● SQLT0002.0子目錄中包含默認(rèn)用戶數(shù)據(jù)表空間
每個子目錄或容器中都會創(chuàng)建名為SQLTAG.NAM的文件。這個文件可以標(biāo)記正在使用中的子目錄,因此在以后創(chuàng)建其他表空間時,不會嘗試使用這些子目錄。
此外,名為SQL*.DAT的文件中還存儲有關(guān)子目錄或容器包含的每個表的信息。星號(*)將被唯一的一組數(shù)字取代,用來識別每個表。對于每個SQL*.DAT文件,可能有一個或多個下列文件,這取決于表類型、表的重組狀態(tài)或者表是否存在索引、LOB或LONG 字段
● SQL*.BKM(如果是MDC表,那么包含塊分配信息)
● SQL*LF(包含LONG VARCHAR或LONG VARGRAPHIC數(shù)據(jù))
● SQL*LB(包含BLOB、CLOB或DBCLOB數(shù)據(jù))
● SQL*.XDA(包含 XML 數(shù)據(jù))
● SQL*LBA(包含關(guān)于SQL*LB文件的分配和可用空間信息)
● SQL*.INX(包含索引表數(shù)據(jù))● SQL*.IN1(包含索引表數(shù)據(jù))
● SQL*DTR(包含用于重組SQL*DAT文件的臨時數(shù)據(jù))
● SQL*.LFR(包含用于重組SQL*.LF文件的臨時數(shù)據(jù))
● SQL*.RLB(包含用于重組SQL*.LB文件的臨時數(shù)據(jù))
● SQL*.RBA(包含用于重組SQL*.LBA文件的臨時數(shù)據(jù))
如果創(chuàng)建了多個數(shù)據(jù)庫,那么可以通過 db2 list db directory on dbpath 查看每個數(shù)據(jù)庫的目錄。
數(shù)據(jù)庫目錄對于應(yīng)用和數(shù)據(jù)庫用戶來說是透明的,他們看到的是數(shù)據(jù)庫邏輯層面的表、索引等對象。而數(shù)據(jù)庫目錄是面向DBA的,所以DBA了解數(shù)據(jù)庫的物理存儲模型和邏輯存儲模型。邏輯模型和物理模型是用系統(tǒng)編目表來統(tǒng)一的。
3.2 設(shè)計表空間
3.2.1 創(chuàng)建表空間
表空間建立數(shù)據(jù)庫系統(tǒng)使用的物理存儲設(shè)備與用來存儲數(shù)據(jù)的邏輯對象或表之間的關(guān)系。我們在前面創(chuàng)建數(shù)據(jù)庫部分講解了表空間的類型,對于非自動存儲表空間,在創(chuàng)建表空間時,必須知道將引用的容器的設(shè)備名或文件名。另外,必須知道要分配給表空間的每個設(shè)備名或文件名及分配空間大小。對于自動存儲表空間,數(shù)據(jù)庫管理器將根據(jù)與數(shù)據(jù)庫關(guān)聯(lián)的存儲路徑將容器指定給表空間。
在數(shù)據(jù)庫內(nèi)創(chuàng)建表空間,會將容器分配到表空間,并在數(shù)據(jù)庫系統(tǒng)目錄表中記錄定義和屬性,然后就可以在此表空間內(nèi)創(chuàng)建表。當(dāng)創(chuàng)建數(shù)據(jù)庫時,會創(chuàng)建3個初始表空間。這3個初始表空間的頁大小基于使用CREATE DATABASE命令時建立或接受的默認(rèn)值。此默認(rèn)值還表示所有將來 CREATE BUFFERPOOL 和 CREATE TABLESPACE 語句的默認(rèn)頁大小。如果在創(chuàng)建數(shù)據(jù)庫時不指定頁大小,那么默認(rèn)頁大小是4KB。如果在創(chuàng)建表空間時不指定頁大小,那么默認(rèn)頁大小是創(chuàng)建數(shù)據(jù)庫時設(shè)置的頁大小。
1.創(chuàng)建用戶表空間
要使用命令行創(chuàng)建 SMS表空間,請輸入∶
CREATE TABLESPACE <NAME> MANAGED BY SYSTEM USING ('<path>')
要使用命令行創(chuàng)建 DMS表空間,請輸入∶
CREATE TABLESPACE <NAME> MANAGED BY DATABASE USING (DEVICE |FILE '<path>' <size>)
要使用命令行創(chuàng)建自動存儲表空間,請輸入下列任一語句∶
CREATE TABLESPACE <NAME>
CREATE TABLESPACE <NAME> MANAGED BY AUTOMATIC STORAGE
通過使用3個不同的驅(qū)動器上的3個目錄,下列SQL語句在UNIX中創(chuàng)建了一個SMS 表空間∶
CREATE TABLESPACE TS1 MANAGED BY SYSTEM USING('/datal/nxz _tbsp','/data2/nxz_tbsp','/datal/nxz_tbsp')
以下SQL語句使用各自有5000頁的兩個文件容器創(chuàng)建一個DMS表空間:
CREATE TABLESPACE TS2 MANAGED BY DATABASE
USING(FILE '/datal/acc_tbsp' 5000,FILE '/data2/acc_tbsp' 5000)
注意在創(chuàng)建 DMS表空間時,表空間文件容器不需要創(chuàng)建,DB2會自動創(chuàng)建(裸設(shè)備容器無法自動創(chuàng)建,需要 root 用戶參與)。
在前面兩個示例中,為容器提供了顯式的名稱。但是,如果指定相對容器名,那么將在為數(shù)據(jù)庫創(chuàng)建的子目錄中創(chuàng)建容器。
在創(chuàng)建容器時,數(shù)據(jù)庫管理器會創(chuàng)建任何不存在的目錄和文件。例如,如果將容器指定為/prod/user_data/containerl,而目錄/prod 不存在,那么數(shù)據(jù)庫管理器會創(chuàng)建目錄 /prod 和/prod/user_data。
在 Linux/UNIX 中,數(shù)據(jù)庫管理器創(chuàng)建的任何目錄都是使用權(quán)限位711 創(chuàng)建的,這意味著只有實例所有者才擁有讀寫訪問權(quán)和執(zhí)行訪問權(quán)。因為只有實例所有者具有這種訪問權(quán),所以當(dāng)正在創(chuàng)建多個實例時,可能會出現(xiàn)下列情況∶
● 使用與上面描述的相同的目錄結(jié)構(gòu),假定目錄級別/prod/user_data 不存在。 ● userl創(chuàng)建實例(默認(rèn)情況下命名為 user1),接著創(chuàng)建數(shù)據(jù)庫,然后創(chuàng)建表空間,并且/prod/user data/container1將作為表空間的容器。
● user2創(chuàng)建實例(默認(rèn)情況下命名為 user2),接著創(chuàng)建數(shù)據(jù)庫,然后嘗試創(chuàng)建表空間,并且/prod/user_data/container2將作為表空間的容器。
因為數(shù)據(jù)庫管理器根據(jù)第一個請求使用權(quán)限位700 創(chuàng)建了目錄級別/prod/user_data,所以 user2沒有對這些目錄級別的訪問權(quán),因此不能在這些目錄中創(chuàng)建container2。在這種情況下,CREATE TABLESPACE 操作將失敗。
解決此沖突有兩種方法∶
● 在創(chuàng)建表空間之前創(chuàng)建目錄/prod/user_data,并將許可權(quán)設(shè)置為userl和 user2創(chuàng)建表空間所需的任何訪問權(quán)。如果所有級別的表空間目錄都存在,那么數(shù)據(jù)庫管理器不會修改訪問權(quán)。
● 在 userl創(chuàng)建/prod/user_data/container1之后,將/prod/user data 的許可權(quán)設(shè)置為 user2創(chuàng)建表空間所需的任何訪問權(quán)。
如果數(shù)據(jù)庫管理器創(chuàng)建了子目錄,那么在刪除表空間時,數(shù)據(jù)庫管理器也可能將子目錄刪除。
下列SQL語句在AIX系統(tǒng)中創(chuàng)建了使用具有10000頁的3個裸設(shè)備作為容器的DMS 表空間,并指定它們的I/O特征∶
CREATE TABLESPACE TS1 MANAGED BY DATABASE
USING (DEVICE '/dev/rdblv6' 10000,DEVICE '/dev/rdblv7' 10000,DEVICE
'/dev/rdblv8' 10000) OVERHEAD 7.5 TRANSFERRATE 0.06
在此 SQL語句中提到的裸設(shè)備必須已經(jīng)存在,并且實例所有者和SYSADM組必須能夠?qū)懭脒@些設(shè)備。
還可以創(chuàng)建表空間,使用的頁大小比默認(rèn)的4KB更大。下列SOL語句在Linux和UNIX 系統(tǒng)中創(chuàng)建具有8KB頁大小的SMS表空間∶
CREATE TABLESPACE SMS8K PAGESIZE 8192 MANAGED BY SYSTEM
USING ('FSMS 8K 1') BUFFERPOOI BUFFPOOL8K
注意,相關(guān)聯(lián)的緩沖池也必須具有相同的8KB頁大小,而且只有在激活了由創(chuàng)建的表空間引用的緩沖池之后才能使用該表空間。
2.創(chuàng)建系統(tǒng)臨時表空間
系統(tǒng)臨時表空間用來存儲分組、排序、連接、重組、創(chuàng)建索引操作等中間結(jié)果。數(shù)據(jù)庫必須始終至少有一個這樣的表空間。創(chuàng)建數(shù)據(jù)庫時,定義的3個默認(rèn)表空間之一便是名為"TEMPSPACE1"的系統(tǒng)臨時表空間。
要創(chuàng)建另一個系統(tǒng)臨時表空間,可使用CREATE TABLESPACE 語句。例如∶
CREATE SYSTEM TEMPORARY TABLESPACE tmp_tbsp
MANAGED BY SYSTEM USING('/datal/tmp_tbsp','/data2/tmp_tbsp')
對于每個頁大小,至少應(yīng)具有一個和該頁大小匹配的系統(tǒng)臨時表空間。
3.創(chuàng)建用戶臨時表空間
用戶臨時表空間不是在創(chuàng)建數(shù)據(jù)庫時默認(rèn)創(chuàng)建的。如果應(yīng)用程序需要使用臨時表,那么需要創(chuàng)建將駐留臨時表的用戶臨時表空間。用戶臨時表空間通常用來批量插入、批量更新和批量刪除以加快速度。
使用DECLARE GLOBAL TEMPORARY TABLE 語句聲明臨時表時,必須要求用戶臨時表空間存在。
要創(chuàng)建用戶臨時表空間,可使用 CREATE TABLESPACE 語句∶
CREATE USER TEMPORARY TABLESPACE usr_tbsp MANAGED BY DATABASE USING (FILE '/datal/user tbsp' 5000,FILE '/data2/user_tbsp' 5000)
3.2.2 維護(hù)表空間
1.查看表空間
可以使用DB2 LIST TABLESPACES [SHOW DETAIL]來查看表空間的詳細(xì)信息。
LIST TABLESPACES 命令的輸出信息如下:
上面所示的這3個表空間是通過 CREATE DATABASE 命令自動創(chuàng)建的。用戶可以通過在該命令中定制表空間選項來覆蓋默認(rèn)的表空間創(chuàng)建選項。但是在創(chuàng)建數(shù)據(jù)庫時必須創(chuàng)建系統(tǒng)編目表空間和至少一個常規(guī)表空間,以及至少一個系統(tǒng)臨時表空間。通過使用CREATE DATABASE 命令或以后使用CREATE TABLESPACE命令,可以創(chuàng)建更多的所有類型的表空間(系統(tǒng)表空間除外)。在上述 3 個表空間中,系統(tǒng)編目表空間和系統(tǒng)臨時表空間都是只讀的,用戶不可以在上面創(chuàng)建用戶表,如下所示。
查看表空間及容器的屬性
指定LIST TABLESPACES命令的SHOW DETAIL選項將顯示其他信息:
LIST TABLESPACES SHOW DETAIL
默認(rèn)情況下,將列出創(chuàng)建數(shù)據(jù)庫時創(chuàng)建的那3個表空間。LIST TABLESPACES SHOW DETAIL命令的輸出信息如下:
要列出容器,需要使用以上輸出中的Tablespace ID:
LIST TABLESPACE CONTAINERS FOR 2
為了查看容器的情況,可以使用LIST TABLESPACE CONTAINERS命令:
該命令將列出指定表空間中的所有容器。如上所示的路徑指向容器物理上的位置。
表空間狀態(tài)
為了查看數(shù)據(jù)庫中表空間的狀態(tài),可以使用命令:
List tablespaces show detail
表空間可以有多種不同的狀態(tài),如下所示:
0x0 Normal
0x1 Quiesced: SHARE
0x2 Quiesced: UPDATE
Ox4 Quiesced:EXCLUSIVE
0x8 Load pending
Ox10 Delete pending
0x20 Backup pending
O0x40 Rollforward in progress
Ox80 Rollforward pending
0x100 Restore pending
0x100 Recovery pending(not used)
0x200 Disable pending
0x400 Reorg in progress
0x800 Backup in progress
0x1000 Storage must be defined
0x2000 Restore in progress
0x4000 Offline and not accessible
0x8000 Drop pending
0x2000000 Storage may be defined
0x4000000 StorDef is in 'final'state
Ox8000000 StorDef was changed prior to rllforward
0x10000000 DMS rebalancer is active
0x20000000 TBS deletion in progress
0x40000000 TBS creation in progress
0x8 For service use only
2.修改表空間
可使用 ALTER TABLESPACE 語句。可以改變 SMS、DMS和自動存儲容器,還可以重命名表空間,并將表空間從脫機(jī)方式切換至聯(lián)機(jī)方式。
對于 SMS表空間,我們只能增加容器;對于DMS表空間,可以添加、擴(kuò)展、重新平衡、刪除或減少容器,或者調(diào)整容器大小。我們重點(diǎn)講解 DMS表空間的修改。
添加或擴(kuò)展 DMS容器
通過將一個或多個容器添加至 DMS表空間(即使用MANAGED BY DATABASE 子句創(chuàng)建的表空間),可以增大 DMS表空間的大小。
當(dāng)將新容器添加到表空間或擴(kuò)展現(xiàn)有容器時,可能會發(fā)生表空間重新平衡(rebanlance)。重新平衡過程涉及將表空間擴(kuò)展數(shù)據(jù)塊從一個位置移至另一位置。在此過程中,將嘗試在表空間內(nèi)分割數(shù)據(jù)。重新平衡不必在所有容器上進(jìn)行,但這取決于許多因素,例如現(xiàn)有容器的配置、新容器的大小和表空間滿的程度。
在重新平衡期間,不限制對表空間的訪問。如果需要添加多個容器,那么應(yīng)該同時添加這些容器以減少重新平衡的次數(shù)。雖然重新平衡期間表空間仍然可以訪問,但我們還是盡量避免在業(yè)務(wù)高峰期間增加容器,因為數(shù)據(jù)重新平衡期間系統(tǒng)中有很多的I/O活動。關(guān)于表空間重新平衡,其實DB2還有一些高級選項,但這部分內(nèi)容超出了本書講解范圍。如果讀者感興趣,可以參考《高級進(jìn)階DB2(第2版)》一書。
要使用命令行將容器添加到DMS表空間,請輸入以下內(nèi)容∶
ALTER TABLESPACE <name> ADD (DEVICE '<path>' <size>,FILE '<filename>' <size>)
以下示例說明如何將兩個新設(shè)備容器(各含10000頁)添加到Linux和UNIX系統(tǒng)的表空間中:
ALTER TABLESPACE TS1 ADD (DEVICE '/dev/rhd9’ 10000, DEVICE '/dev/rhd10' 10000)
添加容器會涉及容器的重新平衡,如果不想這樣,可以使用表空間擴(kuò)展來修改容器大小,因為extend不會重新平衡表空間數(shù)據(jù)。
以下示例說明如何將所有容器擴(kuò)展10000頁(各含10000頁)后添加到Linux和UNIX 系統(tǒng)的表空間中∶
ALTER TABLESPACE TSI EXTEND (ALL 10000)
調(diào)整DMS容器的大小
不能手動調(diào)用自動存儲表空間中容器的大小,否則將報錯,如下所示 test2:/Sdb2 "alter tablespace userspacel extend (all 20)"
DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQI processing it returned:
SQL20318N Table space "USERSPACE1" of type "AUTOMATIC STORAGE" cannot be altered using the "EXTEND" operation. SQLSTATE=42858
只能將每個操作系統(tǒng)裸設(shè)備用作容器。創(chuàng)建裸設(shè)備之后,其大小是固定的。當(dāng)考慮使用調(diào)整大小或擴(kuò)展選項來增大裸設(shè)備容器時,應(yīng)先用操作系統(tǒng)命令檢查裸設(shè)備大小以確保使用ALTER TABLESPACE命令并未將裸設(shè)備容器大小增大到大于裸設(shè)備大小。
要縮小現(xiàn)有容器的大小,可使用RESIZE或REDUCE選項。使用RESIZE選項時,作為語句一部分列示的所有容器都必須增大或減小大小。不能在同一條語句中增大某些容器而縮小其他容器。如果知道容器大小的新下限,應(yīng)考慮調(diào)整大小方法。如果不知道(或不關(guān)心)容器的當(dāng)前大小,那么應(yīng)該考慮縮小方法。
要使用命令行來縮小DMS表空間中一個或多個容器的大小,請輸入
ALTER TABLESPACE <name> REDUCE(FILE '<filename>' <size>)
以下示例說明如何在 UNIX系統(tǒng)的表空間中縮小文件容器(原來為1000 頁)∶
ALTER TABLESPACE PAYROLL REDUCE (FILE '/data/finance' 200)
在完成此操作之后,文件大小就從1000 頁減少至800 頁。
要使用命令行來增大DMS表空間中一個或多個容器的大小,請輸入∶
ALTER TABLESPACE <name> RESIZE (DEVICE '<path>' <size>)
以下示例說明如何在 Linux 和 UNIX 系統(tǒng)的表空間中增大兩個設(shè)備容器(原來大小為1000 頁)∶
ALTER TABLESPACE HISTORYR ESIZE(DEVICE '/dev/rhd7' 2000, DEVICE '/dev/rhd8' 2000)
在完成此操作之后,兩個設(shè)備的大小都從1000頁增加至 2000頁。要使用命令行來擴(kuò)展 DMS表空間中一個或多個容器的大小,請輸入∶
ALTER TABLESPACE <name> EXTEND (FILE1 '<filename>' <size>)
以下示例說明如何在 Windows系統(tǒng)的表空間中增大文件容器(原來大小為1000頁)∶
ALTER TABLESPACE PERSNEL EXTEND(FILE '/datal/wrkhist1' 200, FILE '/data2/wrkhist2' 200)
在完成此操作之后,兩個文件的大小都從 1000頁增大至1200頁。
刪除或減少 DMS容器
對于DMS表空間,可以使用ALTER TABLESPACE 語句從表空間中刪除容器或縮小容器的大小。要縮小容器,可以在 ALTER TABLESPACE語句中使用 REDUCE或 RESIZE 選項。要刪除容器,可以在 ALTER TABLESPACE 語句中使用DROP選項。
僅當(dāng)正在刪除或縮小其大小的擴(kuò)展數(shù)據(jù)塊數(shù)目小于或等于表空間中"高水位標(biāo)記"之上的可用數(shù)據(jù)塊數(shù)目時,才允許刪除現(xiàn)有容器以及縮小現(xiàn)有容器的大小。高水位標(biāo)記是表空間中分配的最高頁的頁數(shù)。此標(biāo)記與表空間中已使用的頁的數(shù)目不同,高水位標(biāo)記下的某些擴(kuò)展數(shù)據(jù)塊可能可供復(fù)用。
表空間中高水位標(biāo)記之上的可用擴(kuò)展數(shù)據(jù)塊數(shù)非常重要,原因是直至高水位標(biāo)記(包括高水位標(biāo)記)的所有擴(kuò)展數(shù)據(jù)塊必須位于表空間內(nèi)的同一邏輯位置。結(jié)果表空間必須有足夠的空間才能容納所有數(shù)據(jù)。如果沒有足夠的可用空間,那么會產(chǎn)生一條錯誤消息(SQL20170N或 SQLSTATE 57059)。
要刪除容器,可在ALTER TABLESPACE 語句中使用 DROP選項。例如∶
ALTER TABLESPACE TS1 DROP (FILE 'filel',DEVICE'/dev/rdisk1')
改變自動存儲表空間
對于自動存儲表空間,不能手動調(diào)整自動存儲表空間的大小,數(shù)據(jù)庫管理器將在需要時自動調(diào)整容器大小。
3.重命名表空間
可以使用RENAME TABLESPACE 語句來重命名表空間。不能重命名 SYSCATSPACE 表空間。不能重命名處于"前滾暫掛"或"正在前滾"狀態(tài)的表空間。
可以給予現(xiàn)有表空間新名稱,而無須關(guān)心表空間中的個別對象。重命名表空間時,將更改引用表空間的所有目錄記錄。例如∶
RENAME TABLESPACE TS1 TO TS2
注意∶
當(dāng)復(fù)原在備份后已被重命名的表空間時,必須在RESTORE DATABASE命令中使用新的表空間名。如果使用先前的表空間名,那么將找不到該名稱。同樣,如果使用ROLLFORWARD DATABASE命令前滾表空間,也需要確保使用新名稱。如果使用先前的表空間名,那么將找不到該名稱。
4.將表空間從脫機(jī)狀態(tài)切換至聯(lián)機(jī)狀態(tài)
如果與表空間相關(guān)的容器不可訪問,這時表空間處于 OFFLINE 狀態(tài)。要使用命令行從表空間中除去OFFLINE 狀態(tài),請輸入∶
ALTER TABLESPACE <name> SWITCH ONLINE
什么情況下會處于OFFLINE 狀態(tài)呢?下面舉一個實際生產(chǎn)中的例子。在雙機(jī)熱備 HA 的環(huán)境中,客戶在主機(jī)上重新創(chuàng)建了使用裸設(shè)備的表空間后,未同步HA 環(huán)境,結(jié)果導(dǎo)致主機(jī)故障切換到備機(jī)時,由于裸設(shè)備權(quán)限不正確而導(dǎo)致表空間處于 OFFLINE 狀態(tài)。
5.刪除表空間
當(dāng)刪除表空間時,也會刪除表空間中的所有數(shù)據(jù),釋放容器,除去目錄條目,并導(dǎo)致表空間中定義的所有對象都被刪除或標(biāo)記為無效??梢酝ㄟ^刪除表空間來重用空表空間中的容器,但是在試圖重用這些容器之前,必須落實 DROP TABLESPACE 語句。
刪除用戶表空間
可刪除包含所有表數(shù)據(jù)的用戶表空間,包括在單個用戶表空間中的索引和LOB數(shù)據(jù)。也可刪除其中包含的表跨幾個表空間的用戶表空間。也就是說,可能表數(shù)據(jù)在一個表空間,索引在另一個表空間且任何LOB數(shù)據(jù)在第3個表空間。必須在一條語句中同時刪除所有3 個表空間。包含跨越的表的所有表空間必須全部納入此單條語句中,否則該刪除請求將失敗。例如創(chuàng)建表的定義如下:
create table xinzhuang pic(picno int, pic clob(1g))in data_space index in index_space long in lob_space
只能同時刪除3個表空間
DROP TABLESPACE DATA_SPACE,INDEX_SPACE,LOB_SPACE
刪除用戶臨時表空間
僅當(dāng)用戶臨時表空間中當(dāng)前未定義已聲明臨時表時,才能刪除用戶臨時表空間。當(dāng)刪除表空間時,不會嘗試刪除表空間中的所有已聲明臨時表。
注意:
已聲明臨時表是在說明應(yīng)用程序與數(shù)據(jù)庫斷開連接時隱式刪除的。
刪除系統(tǒng)臨時表空間
對于默認(rèn)4KB頁大小的數(shù)據(jù)庫,如果不首先創(chuàng)建另一系統(tǒng)臨時表空間,那么不能刪除頁大小為4KB的默認(rèn)系統(tǒng)臨時表空間。新的系統(tǒng)臨時表空間必須具有4KB頁大小,原因是數(shù)據(jù)庫必須始終存在至少一個具有 4KB 頁大小的系統(tǒng)臨時表空間。對于默認(rèn) 8KB、16KB、32KB 頁大小的數(shù)據(jù)庫,同樣也必須存在一個相應(yīng)頁大小的系統(tǒng)臨時表空間。例如,如果具有頁大小為 4KB 的單個系統(tǒng)臨時表空間,并且想要將一個容器添加到該表空間(為SMS表空間)中,那么必須首先添加一個具有適當(dāng)數(shù)目容器的新4KB頁大小的系統(tǒng)臨時表空間,然后刪除舊的系統(tǒng)臨時表空間(如果正在使用 DMS,那么可以添加容器而不必刪除并重新創(chuàng)建表空間)。
默認(rèn)系統(tǒng)臨時表空間的頁大小是創(chuàng)建數(shù)據(jù)庫時使用的頁大?。J(rèn)情況下為4KB),但也可以為8KB、16KB或32KB。
下面是用來創(chuàng)建系統(tǒng)臨時表空間的語句∶
CREATE SYSTEM TEMPORARY TABLESPACE <name> MANAGED BY SYSTEM USING ('<directories>')
創(chuàng)建之后,要使用命令行刪除系統(tǒng)表空間,請輸入
DROP TABLESPACE <name>
以下SQL語句創(chuàng)建名為TEMPSPACE2的新的系統(tǒng)臨時表空間∶
CREATE SYSTEM TEMPORARY TABLESPACE TEMPSPACE2
MANAGED BY SYSTEM USING ('/data/systemp2')
一旦創(chuàng)建TEMPSPACE2,就可使用以下命令刪除原來的系統(tǒng)臨時表空間TEMPSPACE1∶
DROP TABLESPACE TEMPSPACE1
3.2.3 表空間設(shè)計注意事項
1. 表空間類型的選擇
在確定應(yīng)使用哪種類型的表空間來存儲數(shù)據(jù)時,需要考慮一些問題。
SMS表空間的優(yōu)點(diǎn)
● 根據(jù)需要,系統(tǒng)按需分配空間
● 由于不必預(yù)定義容器,因此創(chuàng)建表空間需要的初始工作較少
DMS表空間的優(yōu)點(diǎn)∶
● 通過使用ALTER TABLESPACE語句,可添加或擴(kuò)展容器來增加表空間的大小。現(xiàn)有數(shù)據(jù)可以自動在新的容器集合中重新平衡以保持最佳I/O效率
● 根據(jù)存儲的數(shù)據(jù)的類型,可以把表長字段(LF)和大對象(LOB)數(shù)據(jù)、索引和常規(guī)表數(shù)據(jù)分割存放在多個表空間中以提高性能和空間存儲容量。通過分隔表數(shù)據(jù),可以提高性能和增加每個表存儲的數(shù)據(jù)量。例如,如果要使用4KB頁大小的大型表空間,那么可以有一個包含8TB正規(guī)表數(shù)據(jù)的表、一個包含8TB索引數(shù)據(jù)的單獨(dú)表空間和另一個包含8TB長型數(shù)據(jù)的單獨(dú)表空間。如果這3種類型的數(shù)據(jù)存儲在一個表空間中,那么總空間將限制為8TB。使用較大的頁大小將允許存儲更多數(shù)據(jù)
● 對范圍分區(qū)數(shù)據(jù)創(chuàng)建的索引可以與表數(shù)據(jù)存儲在不同的表空間中
● 可控制數(shù)據(jù)在磁盤上的位置(如果操作系統(tǒng)允許的話)
● 通常,精心設(shè)計的一組DMS表空間的性能將優(yōu)于SMS表空間
注意:
對于性能要求很高的應(yīng)用程序,特別是涉及大量DML操作的應(yīng)用程序,建議使用DMS 表空間。
其實 DMS的優(yōu)勢,就是數(shù)據(jù)在物理磁盤上的連續(xù)性。SMS使用操作系統(tǒng)來管理空間,雖然從邏輯上看,看似所有的文件都是連續(xù)的,但是在物理磁盤上,每次文件的增大都必須分配新的空間。所以從操作系統(tǒng)的角度來看,所謂的“分配”不過是在 inode 節(jié)點(diǎn)中增加一個指向頁的偏移,這個頁是操作系統(tǒng)尋找出來沒有被使用的,因此從磁盤的角度來看,文件可以被切分成很多塊存儲在不同的地方——盡管邏輯上它們是連續(xù)的。這也就是能夠動態(tài)增加大小的 SMS 文件的致命傷。不像DMS,分配完成之后一般不會隨意增加或減少大小,SMS的大小增加有時可能非常頻繁,因此每個文件在物理磁盤上的存儲會被劃分成一個個小塊。這樣的話,盡管在邏輯上它們的條帶化還是連續(xù)的,但是從物理磁盤的角度來看,它們的每個extent 之間可能并非連續(xù),無法使用 range prefetch直接從磁盤上讀取幾個連續(xù)的 extent。
而且在這兩種類型的表空間中,數(shù)據(jù)的放置也會有所不同。例如,進(jìn)行高效表掃描要求擴(kuò)展數(shù)據(jù)塊中的頁在物理上是連續(xù)的。對于 SMS,操作系統(tǒng)的文件系統(tǒng)決定了每個邏輯文件頁的物理放置位置。根據(jù)文件系統(tǒng)中其他活動的級別以及用來確定放置位置的算法的不同,可能會連續(xù)分配這些頁,也可能不會。但是對于DMS,因為數(shù)據(jù)庫管理器直接與磁盤打交道,所以可以確保這些頁在物理上是連續(xù)的。
通常,小型個人數(shù)據(jù)庫用 SMS 表空間管理最容易。另一方面,對于不斷增長的大型數(shù)據(jù)庫,建議將 SMS表空間當(dāng)成臨時表空間和系統(tǒng)編目表空間使用,而將具有多個容器的單獨(dú)的DMS表空間用于每個表。另外,建議將長字段(LF)數(shù)據(jù)和索引存儲在它們自己的表空間中。
在深刻理解上述兩種表空間的優(yōu)缺點(diǎn)后,選擇表空間時要綜合考慮如下因素:
表中的數(shù)據(jù)量
如果計劃在一個表空間中存儲許多小表,那么考慮使用SMS 充當(dāng)表空間。對于小表,DMS 表現(xiàn)在 I/O 和空間管理效率方面的優(yōu)點(diǎn)就沒有那么重要。SMS 的優(yōu)點(diǎn)(僅在需要時使用)卻對小表更具吸引力。如果表較大或者需要更快地訪問表中的數(shù)據(jù),應(yīng)考慮具有較小擴(kuò)展數(shù)據(jù)塊大小的 DMS表空間。
設(shè)計數(shù)據(jù)庫時,可以考慮對每個非常大的表都使用單獨(dú)的 DMS表空間,而將所有的小表組合在單個SMS 表空間中。這種分隔還允許根據(jù)表空間的使用選擇適當(dāng)?shù)臄U(kuò)展數(shù)據(jù)塊大小。
表數(shù)據(jù)的類型
例如,有的表可能包含不經(jīng)常使用的歷史記錄數(shù)據(jù);最終用戶可能愿意接受較長的響應(yīng)時間,等待對此數(shù)據(jù)執(zhí)行的查詢。在這種情況下,可以為歷史記錄表使用單獨(dú)的表空間,并將此表空間分配給訪問速率較低的較便宜的物理設(shè)備。
此外,對于某些表,數(shù)據(jù)的快速響應(yīng)時間是非常必要的,需要將這些表分配給快速物理設(shè)備的表空間中,這樣將有助于支持這些重要的數(shù)據(jù)需要。如果可以的話,可以使用固態(tài)硬盤來存放訪問最頻繁的表。
通過使用 DMS 表空間,還可以將表數(shù)據(jù)分發(fā)在 3個不同的表空間中∶一個存儲索引數(shù)據(jù);一個存儲大對象(LOB)和長字段 LF)數(shù)據(jù);一個存儲常規(guī)表數(shù)據(jù)。這允許選擇表空間特征和支持最適合該數(shù)據(jù)的那些表空間的物理設(shè)備。例如,可能會將索引數(shù)據(jù)置于可找到的最快的設(shè)備上,這樣性能可顯著提高。如果將表分布在各個DMS表空間中,那么在啟用表空間級備份恢復(fù)時,應(yīng)考慮一起備份和復(fù)原那些表空間。SMS表空間不支持以此方式將數(shù)據(jù)分發(fā)在所有表空間中。
管理問題
某些管理功能可以在表空間級執(zhí)行,但不能在數(shù)據(jù)庫或表級執(zhí)行。例如, 備份表空間(而不是數(shù)據(jù)庫)可以幫助更好地利用時間和資源,允許頻繁地備份帶有大量更改的表空間,同時僅偶爾地備份帶有少量更改的表空間。
可以復(fù)原數(shù)據(jù)庫或表空間。如果不相關(guān)的表在同一個表空間中,就可以選擇僅復(fù)原數(shù)據(jù)庫中較小的部分以降低成本。一種好方法是將相關(guān)的表存放在表空間中。這些表可以通過參考約束相關(guān),也可以通過定義的其他業(yè)務(wù)約束相關(guān)。
如果需要經(jīng)常刪除并重新創(chuàng)建特定表,那么應(yīng)給這樣的表單獨(dú)創(chuàng)建 DMS 表空間,因為刪除 DMS表空間比刪除表更有效率。
2.選擇合適的數(shù)據(jù)頁大小
創(chuàng)建表空間時,需要考慮頁大小。可以使用 4KB、8KB、16KB 或 32KB頁大小。在選擇數(shù)據(jù)頁大小時需要綜合考慮空間需求和業(yè)務(wù)類型(性能需求)以做出選擇。
空間需求
因為DB2中每個頁大小限定了可存儲行的最大長度和可存儲表空間的最大值,所以選擇數(shù)據(jù)頁大小時需要考慮這些。對于4KB數(shù)據(jù)頁來說,最多可以存放的行的長度是 4005 字節(jié)(4096-91 頭部;8KB為 8192-91;依此類推),所以首先要根據(jù)行的長度來選擇數(shù)據(jù)頁大小。表 3-3 列出了每種數(shù)據(jù)頁大小的空間使用限制,以及不同類型的表空間的數(shù)據(jù)庫和索引頁大小限制。
如果數(shù)據(jù)頁大小選擇不當(dāng),還可能造成空間浪費(fèi)。例如,如果要使用32KB頁大小的常規(guī)表空間來存儲平均大小為100字節(jié)的行,那么32KB的頁只能存儲100*255=25500 字節(jié)(24.9KB)。這意味著每32KB中就有大約7KB要浪費(fèi)掉。所以建議創(chuàng)建表空間時,盡量創(chuàng)建大型表空間,大型表空間的數(shù)據(jù)頁可以存放更多的容量和行數(shù)。
業(yè)務(wù)類型
建議根據(jù)業(yè)務(wù)類型選擇合適的數(shù)據(jù)頁大小。通常的業(yè)務(wù)類型有 OLTP、OLAP、批處理、報表,以及這幾種業(yè)務(wù)的混合類型。下面介紹主要業(yè)務(wù)類型的特點(diǎn)。
聯(lián)機(jī)事務(wù)處理(OLTP)工作負(fù)載的特征是∶事務(wù)需要對數(shù)據(jù)進(jìn)行隨機(jī)訪問,通常涉及頻繁插入或更新活動和返回一小組數(shù)據(jù)的查詢。通常訪問是隨機(jī)的,并且是訪問一頁或幾頁,一般不太可能發(fā)生預(yù)存?。╬refetch)。這里順便講一下,其實對于性能要求很高的 OLTP 應(yīng)用,可以考慮把一些頻繁訪問的表創(chuàng)建在固態(tài)硬盤上。
使用裸設(shè)備容器的 DMS表空間在這種情況下表現(xiàn)得最好。請注意,在 FILE SYSTEM CACHING 關(guān)閉的情況下,將 DMS 表空間與文件容器配合使用在某種程度上相當(dāng)于DMS裸設(shè)備容器。如果業(yè)務(wù)邏輯存在大量的隨機(jī)讀,那么 CREATE TABLESPACE 語句中的 EXTENTSIZE 和PREFETCHSIZE 參數(shù)的設(shè)置對于I/O 的效率就顯得不是那么重要。
OLAP 查詢工作負(fù)載的特征是∶ 事務(wù)需要對數(shù)據(jù)進(jìn)行順序訪問或部分順序訪問,并常常返回大的數(shù)據(jù)集。使用多個設(shè)備容器且每個容器都在單獨(dú)磁盤上的 DMS 表空間最有可能提供有效的并行預(yù)存取。應(yīng)該將 CREATE TABLESPACE 語句中的 PREFETCHSIZE 參數(shù)的值設(shè)置為 EXTENTSIZE 參數(shù)的值乘以容器設(shè)備數(shù)之積。此外,可以將預(yù)取大小指定為-1,此時數(shù)據(jù)庫管理器將自動(automatic)選擇合適的預(yù)取大小。這允許數(shù)據(jù)庫管理器以并行方式從所有容器中預(yù)取。如果容器的數(shù)目發(fā)生更改,或者需要使預(yù)取更多或更少,那么可以使用 ALTER TABLESPACE語句相應(yīng)地更改 PREFETCHSIZE 值;如果把 PREFETCHSIZE 設(shè)置為 AUTOMATIC,添加容器后,數(shù)據(jù)庫會自動調(diào)整 PREFETCHSIZE 的大小,所以強(qiáng)烈建議把 PREFETCHSIZE 設(shè)置為 AUTOMATIC或-1。
混合工作負(fù)載的目標(biāo)是∶對于OLTP 工作負(fù)載,使單個 I/O請求盡可能有效率;而對于查詢工作負(fù)載,最大程度地提高并行I/O的效率。
選擇表空間頁大小的注意事項如下所示∶
● 對于執(zhí)行隨機(jī)行讀寫操作的 OLTP 應(yīng)用程序,通常最好使用較小的頁大小(4KB、8KB),這樣一來,不需要的行就不會浪費(fèi)緩沖池空間。
● 對于一次訪問大量連續(xù)行的決策支持系統(tǒng)(DSS)和OLAP應(yīng)用程序,頁大小大一些(16KB、32KB)會比較好,這樣就能減少讀取特定數(shù)目的行所需的 I/O 請求數(shù)。較大的頁大小還允許減少索引中的層數(shù),因為在一頁中可以保留更多的行指針。
● 越大的頁,支持的行越長。應(yīng)根據(jù)業(yè)務(wù)需求選擇合適的數(shù)據(jù)頁。
● 在默認(rèn)的4KB頁上,表只能有500列,而更大的頁大?。?KB、16KB和32KB)支持1012列。
● 表空間的最大大小與表空間的頁大小成正比,見表3-3。
3.擴(kuò)展數(shù)據(jù)塊在進(jìn)行大小選擇時的注意事項
EXTENTSIZE指定在跳到下一個容器之前,可以寫入容器中的PAGESIZE頁面的數(shù)量。存儲數(shù)據(jù)時數(shù)據(jù)庫管理器反復(fù)均衡使用所有容器。該參數(shù)只有在表空間中有多個容器時才起作用。選擇合理的EXTENTSIZE 會對表空間的性能產(chǎn)生重大影響。因為這個參數(shù)是在創(chuàng)建表空間時定義的,之后不能修改,所以在創(chuàng)建時必須選擇合理的EXTENTSIZE。
表空間的大小和類型
DMS表空間中的空間一次分配給表一個擴(kuò)展數(shù)據(jù)塊。當(dāng)插入該表而一個擴(kuò)展數(shù)據(jù)塊變滿時,會分配新的擴(kuò)展數(shù)據(jù)塊,直到徹底用完容器為止。
將 SMS 表空間中的空間一次分配給表一個擴(kuò)展數(shù)據(jù)塊或者一次分配給表一頁。當(dāng)插入該表而一個擴(kuò)展數(shù)據(jù)塊或頁變滿時,會分配新的擴(kuò)展數(shù)據(jù)塊或頁,直到使用了文件系統(tǒng)中的所有擴(kuò)展數(shù)據(jù)塊或頁為止。當(dāng)使用SMS表空間時,允許進(jìn)行多頁文件分配,多頁文件分配允許分配擴(kuò)展數(shù)據(jù)塊而不是一次分配一頁。
每個表對象都是單獨(dú)存儲的,每個對象按需要分配新的擴(kuò)展數(shù)據(jù)塊。每個 DMS 表對象還與稱為擴(kuò)展數(shù)據(jù)塊映像的元數(shù)據(jù)對象配成一對,該元數(shù)據(jù)對象描述表空間中屬于表對象的所有擴(kuò)展數(shù)據(jù)塊。用于擴(kuò)展數(shù)據(jù)塊映像的空間也是以一次一個擴(kuò)展數(shù)據(jù)塊的方式分配。因此,DMS表空間中對象的初始空間分配是兩個擴(kuò)展數(shù)據(jù)塊(SMS表空間中對象的初始空間分配是一頁)。
如果在 DMS 表空間中有多個較小的表,那么可能要分配相對大的空間來存儲相對少量的數(shù)據(jù)。在這種情況下,應(yīng)該指定小的擴(kuò)展數(shù)據(jù)塊大小。另一方面,如果有一個增長速率較高的、非常大的表,并且使用具有較小擴(kuò)展數(shù)據(jù)塊大小的 DMS 表空間,那么可能會產(chǎn)生與其他擴(kuò)展數(shù)據(jù)塊的頻繁分配相關(guān)的不需要的開銷。
下面的經(jīng)驗法則建立在表空間中每個表的平均大小的基礎(chǔ)上∶
● 如果小于50 MB,EXTENTSIZE 為8
● 如果介于50MB 到 500MB之間,EXTENTSIZE 為16
● 如果介于500 MB到5GB之間,EXTENTSIZE 為32
● 如果大于5GB,EXTENTSIZE 為64
針對這些表的訪問類型
OLAP 數(shù)據(jù)庫和大部分對表的訪問包括許多查詢或處理大量數(shù)據(jù)的事務(wù)(僅限于查詢)的表,或者增長速度很快的表,從表中預(yù)取數(shù)據(jù)可以顯著改善性能,應(yīng)使用較大的 extent。反之,對于較小的頻繁更改、頻繁隨機(jī)讀取的小的配置表,建議使用較小的 extent。
如果打算在表的設(shè)計中使用多維聚簇(MDC),擴(kuò)展數(shù)據(jù)塊就是重要的設(shè)計決定之一。MDC 表將為創(chuàng)建的每個新的維集分配擴(kuò)展數(shù)據(jù)塊。如果擴(kuò)展數(shù)據(jù)塊太大,那么擴(kuò)展數(shù)據(jù)塊的很大一部分有可能是空的(對于包含很少記錄的維集),這會造成非常大的空間浪費(fèi)。關(guān)于MDC及其對 EXTENTSIZE 影響的更多信息,請參見《高級進(jìn)階DB2(第2版)》一書。
3.2.4 prefechsize 大小選擇
為了提高數(shù)據(jù)庫緩沖池的命中率,數(shù)據(jù)庫通過預(yù)取操作在查詢使用所需的數(shù)據(jù)之前讀入這些數(shù)據(jù),因為數(shù)據(jù)已經(jīng)存在于內(nèi)存中了,這樣一來,查詢在使用這些數(shù)據(jù)的時候就不必等待執(zhí)行 I/O了。當(dāng)數(shù)據(jù)庫管理器確定順序 I/O是適當(dāng)?shù)模⑶掖_定預(yù)取操作可能有助于提高性能時,就選擇預(yù)取操作。
通過使用 ALTER TABLESPACE 可以輕易地修改預(yù)取大小。最優(yōu)設(shè)置差不多是下面這樣的∶
Prefetch Size=(# Containers of the table space on different physical disks)* Extent Size
如果表空間駐留在某個磁盤陣列上,那么進(jìn)行如下設(shè)置∶
PREFETCH SIZE=EXTENT SIZE *(# of non-parity disks in array)
注意∶
在DB2 V9版本以后,可以在創(chuàng)建表空間的時候自動預(yù)取大小。
在添加或刪除容器后,可能忘記更新表空間的預(yù)取大小,此時應(yīng)考慮允許數(shù)據(jù)庫管理器自動確定預(yù)取大小。如果忘記更新預(yù)取大小,那么數(shù)據(jù)庫性能可能會明顯降低。所以可以在創(chuàng)建表空間時指定 PREFETCHSIZE 為 AUTOMATIC,這樣就可以設(shè)置自動預(yù)取大小,并可以通過下面的快照監(jiān)控來查看是否設(shè)置自動預(yù)取:
當(dāng)然,PREFETCHSIZE的大小設(shè)置還和EXTENTSIZE的設(shè)置有關(guān),所以首先要合理地設(shè)置EXTENTSIZE的大小,然后再根據(jù)EXTENTSIZE的大小設(shè)置PREFETCHSIZE。比較好的建議是創(chuàng)建數(shù)據(jù)庫時采用自動存儲。這樣可由數(shù)據(jù)庫管理器自動設(shè)置EXTENTSIZE 和PREFETCHSIZE的大小。
3.2.5 文件系統(tǒng)(CIO/DIO)和裸設(shè)備
在創(chuàng)建 DMS 容器時可以選擇使用裸設(shè)備或文件系統(tǒng),下面來看看兩者的區(qū)別。我們知道,內(nèi)存的讀寫效率比磁盤高近萬倍,因此數(shù)據(jù)庫通常會在內(nèi)存中開辟一片區(qū)域,稱為Buffer Pool,使數(shù)據(jù)的讀寫盡量在這部分內(nèi)存中完成。同樣,在文件系統(tǒng)中,操作系統(tǒng)為了提高讀寫效率,也會為文件系統(tǒng)開辟一塊Buffer用于讀寫數(shù)據(jù)的緩存。這樣,數(shù)據(jù)庫中的數(shù)據(jù)會被緩存兩次。為了避免操作系統(tǒng)的這次緩存,可以采用裸設(shè)備作為數(shù)據(jù)文件的存儲設(shè)備。裸設(shè)備也稱為裸分區(qū)(Raw Partition),是沒有被加載(mount)到操作系統(tǒng)的文件系統(tǒng)中的磁盤分區(qū),通過字符設(shè)備驅(qū)動來訪問。裸設(shè)備的I/O讀寫不由操作系統(tǒng)控制,而是由應(yīng)用程序(如數(shù)據(jù)庫)直接控制。
裸設(shè)備的優(yōu)點(diǎn)
● 由于屏蔽了文件系統(tǒng)緩沖區(qū)而進(jìn)行直接讀寫,因此具有更好的性能。對硬盤的直接讀寫就意味著取消了硬盤與文件系統(tǒng)的同步需求。這一點(diǎn)對于純OLTP系統(tǒng)非常有用,因為在這種系統(tǒng)中。讀寫的隨機(jī)性非黨大,以至于一旦數(shù)據(jù)被讀寫之后,它們在今后較長的一段時間內(nèi)不會得到再次使用。除了OLTP,裸設(shè)備還能夠從以下幾個方面改善DSS(決策支持系統(tǒng))應(yīng)用程序的性能∶
● 直接讀寫,不需要經(jīng)過操作系統(tǒng)級的緩存。節(jié)約了內(nèi)存資源,在一定程度上避免了內(nèi)存的競爭。
● 避免了操作系統(tǒng)的cache預(yù)讀功能,減少了I/O。
● 采用裸設(shè)備避免了文件系統(tǒng)的開銷,比如維護(hù)i-node、空閑塊等。
裸設(shè)備的缺點(diǎn)
● 裸設(shè)備的空間大小管理不靈活。在放置裸設(shè)備的時候,需要預(yù)先規(guī)劃好裸設(shè)備的空間使用。還應(yīng)當(dāng)保留一部分裸設(shè)備以應(yīng)付突發(fā)情況,這也是對空間的浪費(fèi)。● 需要操作系統(tǒng)root用戶干預(yù),因為裸設(shè)備的創(chuàng)建、更改權(quán)限、擴(kuò)展大小等都需要由root用戶完成,這增加了管理的成本。
文件系統(tǒng)的優(yōu)點(diǎn)
文件系統(tǒng)易于管理和維護(hù),比如文件的基本管理以及安全和備份等。
文件系統(tǒng)的缺點(diǎn)∶
性能比不上裸設(shè)備。
我們在選擇容器時,從性能上考慮盡量采用裸設(shè)備,但是如果使用自動存儲方式創(chuàng)建數(shù)據(jù)庫和表空間,這種方式不支持裸設(shè)備?;蛘邽榱吮阌诠芾矶捎梦募到y(tǒng)方式,這時候需要合理設(shè)置文件系統(tǒng)相關(guān)選項和表空間相關(guān)選項。下面講解文件系統(tǒng)方面應(yīng)該注意的事項。
CIO/DIO
直接 I/O(DIO)由于可以繞過在文件系統(tǒng)級別進(jìn)行高速緩存,因此能改進(jìn)內(nèi)存性能。此過程可減少CPU開銷并使得更多的內(nèi)存可用于數(shù)據(jù)庫實例。并發(fā)I/O(CIO)具有DIO的優(yōu)點(diǎn),并且還可以消除串行化寫訪問權(quán)。與使用文件系統(tǒng)緩沖I/O相比,在具有大量事務(wù)處理工作負(fù)載和回滾時,CIO/DIO機(jī)制可增大吞吐量。
DIO和CIO在HP-UX、Solaris、Linux和Windows操作系統(tǒng)的最新版本中都受支持,具體的支持列表請查看最新的DB2信息中心。
關(guān)鍵字NO FILE SYSTEM CACHING和FILE SYSTEM CACHING是CREATE和ALTER TABLESPACESQL語句的一部分,允許指定將對每個表空間使用DIO還是CIO。當(dāng) NO FILE SYSTEM CACHING有效時,只要可能,數(shù)據(jù)庫管理器都會嘗試使用“并發(fā)I/O"。在不支持CIO的情況下(例如,當(dāng)使用了JFS時),將取而代之使用DIO。
建議在表空間級別啟用或禁用UNIX、Linux和Windows中的非緩沖I/O。這將允許在特定表空間上啟用或禁用非緩沖 I/O,同時避免數(shù)據(jù)庫物理布局中的任何依賴性。另外還允許數(shù)據(jù)庫管理器確定每個文件最適合使用哪種I/O,緩沖的還是非緩沖的。
NO FILE SYSTEM CACHING子句用于啟用非緩沖I/O,從而禁用特定表空間的文件高速緩存。一旦啟用非緩沖I/O,數(shù)據(jù)庫管理器就會根據(jù)平臺自動確定將使用直接I/O還是并發(fā)I/O。由于使用CIO可以提高性能,因此CIO只要受支持,數(shù)據(jù)庫管理器就會使用。
FILE SYSTEM CACHING選項并不是總沒有好處,例如當(dāng)應(yīng)用程序檢索LOB或LONG 數(shù)據(jù)時,這些大對象數(shù)據(jù)不能經(jīng)過數(shù)據(jù)庫緩沖池,每次應(yīng)用程序需要其中一個頁時,數(shù)據(jù)庫管理器必須從磁盤對之進(jìn)行直接讀取。但是,如果LOB或LONG數(shù)據(jù)存儲在SMS或DMS文件容器中,文件系統(tǒng)的高速緩存可提供緩沖,因此也就改善了性能。
未在CREATE TABLESPACE 語句或CREATE DATABASE 命令中指定此屬性時,數(shù)據(jù)庫管理器將使用基于平臺和文件系統(tǒng)類型的默認(rèn)行為處理請求。為了查看是否啟用FILE SYSTEM CACHING 屬性,可以使用
● GET SNAPSHOT FOR TABLESPACES 命令
例如,以下是DB2 GET SNAPSHOT FOR TABLEPSACES ON SAPMPLE命令的輸出∶
● db2pd -d <dbname> -tablespaces命令
● db2pd -d <dbname> l 命令
下面舉幾個關(guān)于文件緩存的例子。
例3-1 假定數(shù)據(jù)庫和所有相關(guān)容器位于AIXJFS文件系統(tǒng)中,并且發(fā)出了以下語句∶
DB2 "CREATE TABLESPACE DATA_SPACE MANAGED BY DATABASE USING(file '/data/db2data' 800M)"
在先前版本中,如果未指定該屬性,那么數(shù)據(jù)庫管理器將使用緩沖I/O(FILE SYSTEM CACHING)作為I/O機(jī)制;對于DB2 V9.5及后續(xù)版本,數(shù)據(jù)庫管理器使用NO FILE SYSTEM CACHING。
例3-2 在以下語句中,NO FILE SYSTEM CACHING子句指示對于此特定表空間,文件系統(tǒng)的高速緩存將OFF∶
CREATE TABLESPACE table space name ...NO FILE SYSTEM CACHING
例3-3 以下語句對現(xiàn)有表空間禁用文件系統(tǒng)的高速緩存∶
ALTER TABLESPACE table space name...NO FILE SYSTEM CACHING
例3-4 以下語句對現(xiàn)有表空間啟用文件系統(tǒng)的高速緩存∶
ALTER TABLESPACE table space name..FILE SYSTEM CACHING
經(jīng)過上面的講解,建議創(chuàng)建表空間時,表空間的容器采用裸設(shè)備或支持并發(fā) I/O或直接I/O的文件系統(tǒng)。
3.2.6 設(shè)置OVERHEAD和 TRANSFERRATE
這兩個參數(shù)用于確定查詢優(yōu)化期間的 I/O 成本。這兩個值的測量單位都是毫秒,而且它們應(yīng)當(dāng)分別是所有容器開銷和傳送速率的平均值。開銷是與I/O 控制器活動、磁盤尋道時間和旋轉(zhuǎn)延遲時間相關(guān)聯(lián)的時間。傳送速率是將一頁讀入內(nèi)存所必需的時間量。它們的默認(rèn)值分別是 24.1和0.9??梢愿鶕?jù)硬件規(guī)格計算這些值。
Transrate=(1/傳送速率)*1000/1024000*4096(假設(shè)用4KB頁大?。?/p>
Overhead=平均尋道時間+(((1/磁盤轉(zhuǎn)速)*60*1000)/2)
而平均尋道時間、磁盤旋轉(zhuǎn)速度和傳送速率是由硬盤本身決定的(可以使用操作系統(tǒng)命令或從硬盤廠商獲得底層硬盤的物理特性)。
所以我們必須合理地設(shè)置這兩個值,以便讓優(yōu)化器了解底層存儲的物理特性,從而制訂最優(yōu)的執(zhí)行計劃。
3.2.7 優(yōu)化RAID設(shè)備上表空間的性能
3.2.8 合理設(shè)置系統(tǒng)臨時表空間
系統(tǒng)臨時表空間主要用于分組、排序、連接、重組和創(chuàng)建索引等。要確保系統(tǒng)臨時表空間的最大頁大小對于查詢或定位更新來說足夠大。
DB2 中大記錄標(biāo)識符(RID)的使用增加了來自查詢或定位更新的結(jié)果集的行大小。如果結(jié)果集中的行大小接近于現(xiàn)有系統(tǒng)臨時表空間的最大行長度限制,那么可能需要創(chuàng)建具有更大頁大小的系統(tǒng)臨時表空間。下面舉個例子∶
假如表T1具有20個字段,T2具有18個字段,每行最大長度分別為3500字節(jié)和3000 字節(jié),它們能正常地存放在4KB表空間中。但是如果發(fā)出如下這條 SQL 語句∶
select T1.*,2.* from T1,T2 where T1.id=T2.id
對于上面這條 SQL語句,在臨時表空間中一行的長度已經(jīng)達(dá)到6500(3500+3000)字節(jié)大小,這時原來 4KB的臨時表空間已經(jīng)不能存放,必須使用更大頁大小的臨時表空間。
所以要確保系統(tǒng)臨時表空間的最大頁大小對于查詢或定位更新足夠大,否則會顯著影響性能??梢允褂萌缦路椒ā?/p>
● 確定來自查詢或定位更新的結(jié)果集的最大行大小。使用曾用來創(chuàng)建表的 DDL 語句監(jiān)控查詢或者計算最大行大小。
● 檢查結(jié)果集中的最大行大小是否適合系統(tǒng)臨時表空間的頁大小∶
maximum_row_size>maximum_row_length-8字節(jié)(單分區(qū)結(jié)構(gòu)開銷)
其中,maximum row size 是結(jié)果集的最大行大小,maximum row length 是基于所有系統(tǒng)臨時表空間的最大頁大小所允許的最大長度,應(yīng)根據(jù)表空間頁大小確定最大行長度。
● 創(chuàng)建系統(tǒng)臨時表空間,其大小應(yīng)至少比創(chuàng)建了表的表空間頁大小大一頁大?。僭O(shè)還沒有這樣大小的系統(tǒng)臨時表)。例如,在 UNIX操作系統(tǒng)中,如果在具有4KB頁大小的表空間中創(chuàng)建了表,那么使用 8KB頁大小創(chuàng)建額外系統(tǒng)臨時表空間以備需要的時候使用∶
CREATE SYSTEM TEMPORARY TABLESPACE tmp_tbsp PAGESIZE 8K
MANAGED BY SYSTEM USING ('/datal/tmp tbsp','/data2/tmp_tbsp')
如果表空間頁大小是 32KB,那么可以減少在查詢中選擇的信息或者分開這些查詢以適合系統(tǒng)臨時表空間頁。例如,如果選擇了表的所有列,那么可以改為僅選擇真正需要的列或者選擇某些列的子串來避免超出頁大小限制。
3.3 緩沖池
緩沖池指的是從磁盤讀取表和索引數(shù)據(jù)時,數(shù)據(jù)庫管理器分配的用于高速緩存這些表或索引數(shù)據(jù)的內(nèi)存區(qū)域。每個DB2數(shù)據(jù)庫都必須具有至少一個緩沖池。數(shù)據(jù)庫中的數(shù)據(jù)訪問都需要經(jīng)過緩沖池∶讀的數(shù)據(jù)需要先讀到緩沖池才能提交給應(yīng)用,寫的數(shù)據(jù)也是要先寫到緩沖池才能進(jìn)行 I/O。緩沖池是影響數(shù)據(jù)庫性能的最大參數(shù),所以必須合理地設(shè)計緩沖池。
創(chuàng)建數(shù)據(jù)庫時,DB2會自動地創(chuàng)建名為IBMDEFAULTBP 的默認(rèn)緩沖池,所有的表空間都共享該緩沖池。可以使用CREATE BUFFERPOOL、DROP BUFFERPOOL 和 ALTER BUFFERPOOL 語句來創(chuàng)建、刪除和修改緩沖池。SYSCAT.BUFFERPOOLS 目錄視圖記錄數(shù)據(jù)庫中定義的緩沖池的信息。從 DB2 V9開始,緩沖池的默認(rèn)大小都是自動調(diào)整,如果想取消自動調(diào)整,可以通過在 CREATE BUFFERPOOL 命令中指定 SIZE 關(guān)鍵字來設(shè)置固定值。足夠的緩沖池大小是數(shù)據(jù)庫擁有良好性能的關(guān)鍵所在,因為這可以減少磁盤 I/O 這一最耗時操作。大型緩沖池還會對查詢優(yōu)化產(chǎn)生影響,因為更多的工作可在內(nèi)存中完成,而無須進(jìn)行I/O。
3.3.1 緩沖池的使用方法
首次訪問表中的數(shù)據(jù)行時,數(shù)據(jù)庫管理器會將包含數(shù)據(jù)的頁放入緩沖池中。這些頁將一直保留在緩沖池中,直到關(guān)閉數(shù)據(jù)庫或者其他頁需要使用某一頁占用的空間為止上。緩沖池中的頁可能正在使用,也可能沒有使用,它們可能是臟頁,也可能是干凈頁。
● 正在使用的頁就是當(dāng)前正在讀取或更新的頁。為了保持?jǐn)?shù)據(jù)的一致性,數(shù)據(jù)庫管理器只允許一次只有一個代理程序更新緩沖池中的給定頁。如果正在更新某頁,那么只能允許一個代理程序互斥地訪問。如果正在讀取頁,那么多個代理程序可以同時讀取該頁。
● "臟"頁包含已更改但尚未寫入磁盤的數(shù)據(jù)。
● 將已更改的頁寫入磁盤之后,該頁就是"干凈"頁,并且可能仍然保留在緩沖池中。
大多數(shù)情況下,調(diào)整數(shù)據(jù)庫涉及設(shè)置用于控制將數(shù)據(jù)移入緩沖池以及等待將數(shù)據(jù)從緩沖池寫入磁盤的配置參數(shù)。如果最近的代理程序不需要頁空間,那么可以將頁空間用于新應(yīng)用程序中的新頁請求。額外的磁盤 I/O會使數(shù)據(jù)庫管理器性能下降。
可使用數(shù)據(jù)庫監(jiān)控工具來計算緩沖池的命中率,緩沖池的命中率可幫助你調(diào)整緩沖池。
3.3.2 緩沖池和表空間之間的關(guān)系
設(shè)計緩沖池時,需要了解表空間與緩沖池之間的關(guān)系。每個表空間都與特定的緩沖池相關(guān)。IBMDEFAULTBP 是默認(rèn)緩沖池。數(shù)據(jù)庫管理器還會分配下列系統(tǒng)緩沖池∶IBMSYSTEMBP4K、IBMSYSTEMBP8K、IBMSYSTEMBP16K 和 IBMSYSTEMBP32K(以前稱為"隱藏緩沖池")。要使另一個緩沖池與表空間相關(guān),該緩沖池必須存在并且它們具有相同的頁大小。關(guān)聯(lián)是在使用CREATE TABLESPACE語句創(chuàng)建表空間時定義的,但以后可使用 ALTER TABLESPACE 語句更改關(guān)聯(lián)。
如果擁有多個緩沖池,那么可以配置數(shù)據(jù)庫使用更多的內(nèi)存以改善整體性能。例如,對于OLAP類型的應(yīng)用,我們建議采用大的緩沖池以利于大塊順序讀取;用于聯(lián)機(jī)事務(wù)應(yīng)用程序的表空間可以根據(jù)業(yè)務(wù)特點(diǎn)使用多個小的緩沖池,以便可以更長時間地高速緩存應(yīng)用程序使用的數(shù)據(jù)頁,使響應(yīng)時間更快。
圖3-9是一個表空間和緩沖池設(shè)計示例。
該數(shù)據(jù)庫有6個表空間∶數(shù)據(jù)庫創(chuàng)建時默認(rèn)生成的3個表空間——系統(tǒng)編目表空間、系統(tǒng)臨時表空間和 USERSPACE1(使用默認(rèn)的緩沖池 IBMDEFAULTBP);用戶定義的常規(guī)表空間 MYREGSPACE(使用 MYBUFF1 緩沖池)、MYTEMPSPACE(使用MYBUFF2緩沖池);最后一個表空間用于放置一些頻繁隨機(jī)讀寫的比較重要的靜態(tài)配置表(使用MYBUFF3緩沖池)。在圖 3-9 中。我們沒有看到為LONG表空間設(shè)置的緩沖池,這是因為大對象的讀取不能經(jīng)過內(nèi)存,從磁盤直接讀取。
3.3.3 維護(hù)緩沖池
緩沖池的頁大小
默認(rèn)緩沖池的頁大小是在使用CREATE DATABASE 命令時設(shè)置的,此默認(rèn)值表示所有將來 CREATE BUFFERPOOL和 CREATE TABLESPACE 語句的默認(rèn)頁大小。如果在創(chuàng)建數(shù)據(jù)庫時不指定頁大小,那么默認(rèn)頁大小是 4KB。
注意∶
如果確定數(shù)據(jù)庫需要8KB、16 KB或32KB的頁大小,那么必須至少定義一個具有相匹配的頁大小并且與數(shù)據(jù)庫中表空間相關(guān)聯(lián)的緩沖池。選擇用于緩沖池的頁大小是很重要的,這是因為創(chuàng)建緩沖池之后就不能改變頁大小了。
基于塊(block)的緩沖池
DB2 允許留出緩沖池的一部分(最高可達(dá) 98%)用于基于塊的預(yù)取操作。基于塊的 I/O 可以通過將塊讀入相鄰的內(nèi)存區(qū)而不是將塊分散裝入單獨(dú)的頁,從而提高預(yù)取操作的效率。每個緩沖池的塊大小必須相同,并且由 BLOCKSIZE 參數(shù)進(jìn)行控制。該值等于塊的大小(單位為頁),取值范圍從2到256,默認(rèn)值為 32。
注意∶
基于塊的緩沖池主要用于數(shù)據(jù)倉庫、DSS之類的連續(xù)大塊讀寫的應(yīng)用中。
在創(chuàng)建新的緩沖池之前,應(yīng)解決下列問題∶
● 想要使用什么緩沖池名稱?
● 是立即創(chuàng)建緩沖池,還是在下一次取消激活,然后重新激活數(shù)據(jù)庫之后創(chuàng)建緩沖池?
● 希望緩沖池的頁大小是多大?
● 是將緩沖池設(shè)為固定大小,還是由數(shù)據(jù)庫管理器自動調(diào)整緩沖池大小以對工作負(fù)載做出響應(yīng)?建議在創(chuàng)建緩沖池期間不指定 SIZE 參數(shù),從而允許數(shù)據(jù)庫管理器自動調(diào)整緩沖池。
● 是否想保留一部分緩沖池用于基于塊的I/O?
● 設(shè)計緩沖池時,還應(yīng)根據(jù)機(jī)器上已安裝的內(nèi)存量以及與數(shù)據(jù)庫管理器在同一機(jī)器上同時運(yùn)行的其他應(yīng)用程序所需要的內(nèi)存來考慮內(nèi)存要求。當(dāng)沒有足夠內(nèi)存來保存所訪問的所有數(shù)據(jù)時,操作系統(tǒng)就會進(jìn)行數(shù)據(jù)交換。將某些數(shù)據(jù)寫入或交換到臨時磁盤存儲器中以為其他數(shù)據(jù)騰出空間時,就會進(jìn)行數(shù)據(jù)交換。當(dāng)需要臨時磁盤存儲器上的數(shù)據(jù)時,又會將數(shù)據(jù)交換回內(nèi)存中。
創(chuàng)建緩沖池
恰當(dāng)?shù)囟x緩沖池是擁有運(yùn)行良好的系統(tǒng)的關(guān)鍵之一。對于 32 位操作系統(tǒng),知道內(nèi)存的尋址空間十分重要(AIX是1.75 GB;Linux是1.75 GB;Sun Solaris是3.35 GB;HP-UX 是大約 800MB;Windows 是2GB~3GB)。64 位系統(tǒng)沒有這樣的界限。
使用CREATE BUFFERPOOL 語句定義數(shù)據(jù)庫管理器要使用的新緩沖池。以下是基本CREATE BUFFERPOOL 語句的示例∶
CREATE BUFFERPOOL BP3 SIZE 2000 PAGESIZE 8K
創(chuàng)建緩沖池的兩個關(guān)鍵參數(shù)是 IMMEDIATE 和 DEFERRED。當(dāng)使用 IMIMEDIATE 參數(shù)時,將立即更改緩沖池大小,而不必等到下一次激活數(shù)據(jù)庫時才生效。默認(rèn)情況下,新的緩沖池是使用IMIMEDIATE 關(guān)鍵字創(chuàng)建的。對于立即請求,不需要重新啟動數(shù)據(jù)庫,將立即激活緩沖池。如果數(shù)據(jù)庫共享內(nèi)存不足以分配新空間,那么會延遲(DEFERRED)運(yùn)行該語句。
如果發(fā)出 CREATE BUFFERPOOL DEFERRED,那么不會立即激活緩沖池;將在下一次啟動數(shù)據(jù)庫時創(chuàng)建緩沖池。在重新啟動數(shù)據(jù)庫之前,任何新的表空間都將使用現(xiàn)有緩沖池,即使創(chuàng)建表空間時顯式使用延遲緩沖池也是如此。
創(chuàng)建緩沖池時,應(yīng)查看機(jī)器上是否有足夠的內(nèi)存用于已創(chuàng)建的所有緩沖池。要綜合考慮操作系統(tǒng)中別的應(yīng)用和操作系統(tǒng)本身的內(nèi)存需求。
修改緩沖池
有許多理由要修改緩沖池,例如,為了啟用自調(diào)整內(nèi)存功能。為此,可以使用ALTER BUFFERPOOL 語句??梢孕薷木彌_池的如下屬性∶
● 啟用緩沖池自調(diào)整功能,從而允許數(shù)據(jù)庫管理器根據(jù)工作負(fù)載調(diào)整緩沖池大小。
● 修改基于塊的I/O的緩沖池的塊區(qū)域。
● 修改部分緩沖池的大小。
使用 ALTER BUFFERPOOL 語句改變緩沖池對象的單個屬性。例如∶
ALTER BUFFERPOOL buffer pool name SIZE number of pages
buffer pool name 是緩沖池名稱,number of pages 是要分配給特定緩沖池的新頁數(shù)。也可以使用值-1,用于指示緩沖池大小應(yīng)該是在 BUFFPAGE數(shù)據(jù)庫配置參數(shù)中設(shè)置的值。
查看緩沖池屬性
通過查詢 SYSCAT.BUFFERPOOLS系統(tǒng)視圖可以列出緩沖池信息∶
要找出哪個緩沖池被分配給了表空間,請運(yùn)行下面這個查詢∶
可以在上一個查詢中找到 BUFFERPOOLID,該查詢使你能夠看到每個表空間與哪個緩沖池相關(guān)聯(lián)。
刪除緩沖池
刪除緩沖池時,應(yīng)確保沒有任何表空間已指定給這些緩沖池。不能刪除 IBMDEFAULTBP 緩沖池。
可以使用 DROP BUFFERPOOL語句刪除緩沖池,如下所示∶
DROP BUFFERPOOL <buffer pool name>
3.3.4 緩沖池的設(shè)計原則
緩沖池的命中率
使用多個用戶表空間的最重要原因是管理緩沖池的命中率。一個表空間只能與一個緩沖池相關(guān)聯(lián),而一個緩沖池則可用于多個表空間。
緩沖池調(diào)優(yōu)的目標(biāo)是幫助 DB2盡可能好地利用可用于緩沖池的內(nèi)存。整個緩沖池大小對 DB2性能有巨大影響,這是因為緩存大量的頁可以顯著地減少I/O這一最耗時操作。但是,如果總的緩沖池設(shè)置太大,并且沒有足夠的物理內(nèi)存來分配給它們,那么系統(tǒng)將會使用隱藏緩沖池,性能就會急劇下降。要計算最大的緩沖池大小,需要綜合考慮DB2、操作系統(tǒng)以及其他任何應(yīng)用程序內(nèi)存的使用率。一旦確定db2總的可用內(nèi)存大小,就可以將這個區(qū)域劃分成不同的緩沖池以提高命中率。如果有一些具有不同頁大小的表空間,那么每種頁大小必須至少有一個緩沖池。
擁有多個緩沖池可以最大限度地將數(shù)據(jù)保存在緩沖池中。例如,假設(shè)數(shù)據(jù)庫有許多頻繁使用的小型表,這些表通常都位于緩沖池中,因此訪問起來就非??臁,F(xiàn)在假設(shè)有針對非常大的表運(yùn)行的查詢,使用同一緩沖池并且需要讀取比總的緩存池大小還多的頁。當(dāng)查詢運(yùn)行時,之前來自這些頻繁使用的小型表的頁將會丟失,這使得再次需要這些數(shù)據(jù)時就必須重新讀取它們。
如果小型表擁有自己的緩沖池,那么它們就必須擁有自己的表空間,在這種情況下其他的查詢就不能覆蓋它們的頁。這有可能產(chǎn)生更好的整體系統(tǒng)性能,雖然這會對大型查詢造成一些小的負(fù)面影響。經(jīng)常性地進(jìn)行調(diào)優(yōu)是為了實現(xiàn)整體性能的提高,而且時常需要在不同的系統(tǒng)功能之間做出權(quán)衡。區(qū)分功能的優(yōu)先級并記住總吞吐量和使用情況,同時對系統(tǒng)性能進(jìn)行調(diào)整,這是非常重要的。
DB2能夠在不關(guān)閉數(shù)據(jù)庫的情況下更改緩沖池大小。帶有IMIMEDIATE選項的 ALTER BUFFERPOOL 語句會立刻生效,只要數(shù)據(jù)庫共享的內(nèi)存中有足夠的保留空間可以分配給新空間。可以使用這個功能,根據(jù)使用過程中的周期變化(例如從白天的交互式使用轉(zhuǎn)換到夜間的批處理工作)來調(diào)優(yōu)數(shù)據(jù)庫性能。
確定有多少緩沖池
對于由數(shù)據(jù)庫中表空間使用的每一種頁面大小,都需要至少一個緩沖池。通常,默認(rèn)的IBMDEFAULTBP緩沖池是留給系統(tǒng)編目的。為處理表空間的不同頁面大小和行為,需要創(chuàng)建新的緩沖池。
建議為每種頁面大小使用緩沖池,對于 OLAP/DSS類型的工作負(fù)載更是如此。DB2在緩沖池的自我調(diào)優(yōu)方面十分擅長,并且會將經(jīng)常被訪問的行放入內(nèi)存,因此多數(shù)情況下對于每一種頁的大小創(chuàng)建一個緩沖池就足夠了(這一選擇也避免了管理多個緩沖池的復(fù)雜性)。
如果時間允許,并且需要進(jìn)行改進(jìn),那么可能希望使用多個緩沖池。其思想是將訪問最頻繁的行放入緩沖池中。在那些隨機(jī)訪問或者很少訪問的表之間共享緩沖池可能會給緩沖池帶來"污染",因為有時候要為本來可能不會再去訪問的行消耗空間,甚至可能將經(jīng)常訪問的行擠出到磁盤上。如果將索引保留在它們自己的緩沖池中,那么在索引使用頻繁的時候(例如索引掃描),還可以顯著地提高性能。
這與我們對表空間的討論是緊密聯(lián)系的,因為要根據(jù)表空間中表的行為來分配緩沖池。如果采用多緩沖池的方法,對于初學(xué)者來說使用4個緩沖池比較合適∶
● 一個中等大小的緩沖池,用于臨時表空間。
● 一個大型的緩沖池,用于索引表空間。
● 一個大型的緩沖池,用于那些包含經(jīng)常要訪問的表的表空間。
● 一個小型的緩沖池,用于那些包含訪問不多的表、隨機(jī)訪問的表或順序訪問的表的表空間。
對于只包含LOB 數(shù)據(jù)的 DMS 表空間,可以為其分配任何緩沖池,因為LOB不占用緩沖池空間。
確定為緩沖池分配的內(nèi)存
干萬不要為緩沖池分配多于所能提供的內(nèi)存,否則就會招致代價不菲的操作系統(tǒng)內(nèi)存分頁(memory paging)。通常來講,如果沒有進(jìn)行監(jiān)控,要想知道一開始為每個緩沖池分配多少內(nèi)存是十分困難的。
對于OLTP類型的工作負(fù)載,一開始將25%(僅為參考,實際大小請參考自己操作系統(tǒng)中的內(nèi)存資源和運(yùn)行在操作系統(tǒng)中的應(yīng)用情況)的可用內(nèi)存分配給緩沖池比較合適。
對于OLAP/DSS,經(jīng)驗法則告訴我們,應(yīng)該將40%(僅為參考,實際大小請參考自己操作系統(tǒng)中的內(nèi)存資源和運(yùn)行在操作系統(tǒng)中的應(yīng)用情況)的可用內(nèi)存分配給緩沖池(假設(shè)只有一種頁面大小),同時監(jiān)控排序情況,并對 SHEAPTHRES _SHR 和 SORTHEAP進(jìn)行相應(yīng)調(diào)整。
使用基于塊(block-based)的緩沖池
連續(xù)讀寫頻繁的OLAP查詢可以得益于基于塊的緩沖池。默認(rèn)情況下,所有緩沖池都是基于頁的,這意味著預(yù)取操作將把磁盤上相鄰的頁放入不相鄰的內(nèi)存中。而如果采用基于塊的緩沖池,DB2將使用塊 I/O 一次將多個頁讀入緩沖池中,這樣可以顯著提高順序預(yù)取的性能。
基于塊的緩沖池由數(shù)據(jù)頁和擴(kuò)展數(shù)據(jù)塊同時組成。CREATE 和 ALTER BUFFERPOOLSQL 語句的 NUMBLOCKPAGES 參數(shù)用于定義塊內(nèi)存的大小,而 BLOCKSIZE 參數(shù)則指定每個塊的大小,即在一次塊I/O中從磁盤讀取的頁的數(shù)量。
共享相同擴(kuò)展數(shù)據(jù)塊大小的表空間應(yīng)該成為特定的基于塊的緩沖池的專門用戶。將BLOCKSIZE 設(shè)置為等于正在使用緩沖池的表空間的 EXTENTSIZE 的整數(shù)倍。下面舉一個創(chuàng)建基于塊的緩沖池的例子∶
test2:/home/db2inst4$db2 create bufferpool block_bp size 40960 numblockpages
20480 blocksize 128
DB20000I The SQL command completed successfully.
確定分配多少內(nèi)存給緩沖池內(nèi)的塊區(qū)要更為復(fù)雜一些。如果碰到大量的順序預(yù)取操作,那么很可能會想要更多基于塊的緩沖池。NUMBLOCKPAGES 應(yīng)該是 BLOCKSIZE 的倍數(shù),并且不能大于緩沖池頁面數(shù)量的 98%。建議開始時先將其設(shè)小一點(diǎn)(不大于緩沖池總共大小的 15%或剛好 15%),在后面還可以根據(jù)快照監(jiān)視(snapshot monitor)對其進(jìn)行調(diào)整。
3.4 多溫度存儲器
多溫度存儲器是 DB2V10中新增加的特性之一,可以將不同訪問頻率的數(shù)據(jù)放置到不同的存儲空間中。相對于以前的自動存儲表空間和 DMS 表空間,這一特性增加了STORAGE GROUP 的概念,更加方便DBA對不同熱度的數(shù)據(jù)進(jìn)行管理,降低了維護(hù)成本和硬件成本。
在數(shù)據(jù)大爆炸的今天,每天都會產(chǎn)生數(shù)以萬計的數(shù)據(jù),但是只有一小部分?jǐn)?shù)據(jù)是需要頻繁被訪問的,大部分歷史數(shù)據(jù)在數(shù)據(jù)庫里是很難被訪問檢索到的,我們稱頻繁被訪問的數(shù)據(jù)為熱數(shù)據(jù),不經(jīng)常被訪問的數(shù)據(jù)為冷數(shù)據(jù)。我們通常希望將熱數(shù)據(jù)放到快速的存儲上,而將冷數(shù)據(jù)放到更加廉價的存儲上,但是隨著時間的推移,冷熱數(shù)據(jù)有可能經(jīng)常發(fā)生變化,如何將冷熱數(shù)據(jù)在不同類型的存儲上進(jìn)行迅速調(diào)整,對于 DBA 來說是巨大挑戰(zhàn)。在DB2V9.7中,通常做法是選擇合適的存儲來創(chuàng)建新的表空間,使用ADMIN_MOVE_TABLE 存儲過程將原表空間所有的表都移動到新的表空間中,期間涉及大量的參數(shù)配置、存儲過程的調(diào)用,難以監(jiān)控和診斷,是一項非常艱巨的任務(wù)。但是在DB2 V10里面,只需要通過ALTER TABLESPACE改變 STORAGE GROUP即可。那么,STORAGE GROUP到底是什么東西呢?
3.4.1 存儲器組
存儲器組(STORAGE GROUP)是可存儲數(shù)據(jù)的存儲器路徑的指定集合。存儲器組配置為表示可供數(shù)據(jù)庫系統(tǒng)使用的不同存儲器類??蓪Υ鎯ζ鹘M指定最適合于數(shù)據(jù)的表空間。只有自動存儲表空間才使用存儲器組。
一個表空間只能與一個存儲器組相關(guān)聯(lián),但一個存儲器組可與多個表空間關(guān)聯(lián)。要管理存儲器組對象,可使用 CREATE STOGROUP、ALTER STOGROUP、RENAME STOGROUP、DROP和 COMMENT 語句。
可以采用db2pd工具來查看STORAGE GROUP的詳細(xì)信息,后面加-storagegroup參數(shù):
也可以通過SYSCAT.STOGROUPS的系統(tǒng)視圖來查看:
還可以通過系統(tǒng)函數(shù)ADMIN_GET_STORAGE_PATHS來查看STORAGE GROUP中包含的存儲信息:
為了創(chuàng)建存儲器組,可以使用CREATE STOGROUP命令來完成,基本語法如下:
在下面這個例子中,我們創(chuàng)建了名為sg_cold的存儲器組,將/db2/mydb/data_cold文件系統(tǒng)放到這個存儲器組下:
為了修改存儲器組,可以使用ALTER STOGROUP命令來完成,基本語法如下:
比如,要增加某個容器的路徑到sg_cold存儲器組里,可以采用下面的命令:
查看新增加的存儲路徑:
已存在的存儲器組可以使用DROP STOGROUP命令來刪除,在刪除存儲器組之前,必須確定是否有任何表空間使用該存儲器組。如果有這樣的表空間,那么在刪除原始存儲器組之前,必須更換這些表空間使用的存儲器組并完成重新平衡操作。不能刪除當(dāng)前默認(rèn)的存儲器組。
PNBDBB:/home/db2test$db2 "drop stogroup sg_cold"
DB20000I The SQL command completed successfully.
創(chuàng)建數(shù)據(jù)庫時,會自動創(chuàng)建名為IBMSTOGROUP的默認(rèn)存儲器組。但是,使用AUTOMATIC STORAGE NO子句創(chuàng)建的數(shù)據(jù)庫沒有默認(rèn)存儲器組。使用CREATE STOGROUP 語句創(chuàng)建的第一個存儲器組變?yōu)橹付ǖ哪J(rèn)存儲器組。只有一個存儲器組被指定為默認(rèn)存儲器組。如果數(shù)據(jù)庫有存儲器組,那么在未顯式指定存儲器組的情況下創(chuàng)建自動存儲管理的表空間時會使用默認(rèn)存儲器組。
可以使用CREATE STOGROUP或 ALTER STOGROUP語句來指定默認(rèn)存儲器組。如果指定另一存儲器組作為默認(rèn)存儲器組,那么對使用舊的默認(rèn)存儲器組的現(xiàn)有表空間沒有影響。要改變與表空間相關(guān)聯(lián)的存儲器組,請使用 ALTER TABLESPACE 語句。
可以使用 SYSCAT.STOGROUPS目錄視圖來確定哪個存儲器組是默認(rèn)存儲器組∶
3.4.2 表空間與存儲器組
創(chuàng)建表空間時,可以通過 CREATE TABLESPACE 語句指定表空間使用的存儲器組。如果創(chuàng)建表空間時未指定存儲器組,那么會使用默認(rèn)存儲器組∶
對于已經(jīng)存在的表空間,可以使用 ALTER TABLESPACE 語句修改存儲器組,但是如果更改表空間使用的存儲器組,那么落實 ALTER TABLESPACE 語句時會發(fā)出隱式REBALANCE操作。這會將數(shù)據(jù)從源存儲器組移至目標(biāo)存儲器組。可使用表監(jiān)視函數(shù)MON_GET_REBALANCE_STATUS監(jiān)視REBALANCE操作的進(jìn)度:
4.3 配置DB2服務(wù)器的TCP/IP通信
客戶端要想訪問db2數(shù)據(jù)庫服務(wù)器,就必須先配置db2服務(wù)器的通信協(xié)議,db2服務(wù)器才會接受來自遠(yuǎn)程db2客戶機(jī)的連接建立請求。
在配置db2實例的TCP/IP通信之前,必須檢查以下內(nèi)容:
● 如果 DB2 服務(wù)器正在使用 TCP/IP,那么 DB2客戶機(jī)也必須正在使用TCP/IP 才能建立連接。
● 標(biāo)識"連接服務(wù)名稱"和"連接端口",,或僅標(biāo)識"連接端口"。
連接服務(wù)名稱和連接端口
連接服務(wù)名稱用于更新服務(wù)器上數(shù)據(jù)庫管理器配置文件中的"服務(wù)名稱"(svcename)參數(shù)。當(dāng)指定"連接服務(wù)名稱"時,必須以相同的"服務(wù)名稱"、端口號和協(xié)議更新 services 文件,services 文件包含在服務(wù)器上定義的服務(wù)及其端口號。"服務(wù)名稱"是任意的,但是在 services 文件內(nèi)必須唯一。服務(wù)名稱的樣本值可以是 serverl。"連接端口"在 services 文件中也必須唯一。端口號和協(xié)議的樣本值可以是 50000/tcp。
連接端口
可以選擇不使用"連接服務(wù)名稱"而只是使用"連接端口號"更新服務(wù)器上數(shù)據(jù)庫管理器配置文件中的"服務(wù)名稱"(svcename)參數(shù)。這時就不會用到 services 文件,自然也不必更新 services 文件。如果正在使用分區(qū)格式的"DB2 企業(yè)服務(wù)器版",那么必須確保端口號與"快速通信管理器"(FCM)或系統(tǒng)中的任何其他應(yīng)用程序使用的端口號沒有沖突。端口號的樣本值可以是 50000。
要配置DB2實例的TCP/IP服務(wù)器通信,需要以下幾個步驟。
4.3.1 在服務(wù)器上更新 services 文件
TCP/IP services 文件指定服務(wù)器應(yīng)用程序偵聽客戶機(jī)請求的端口。如果在 DBM 配置文件的 svcename字段中指定了服務(wù)名稱,那么必須在 services 文件中添加一行,寫入服務(wù)名稱與端口號/協(xié)議的映射關(guān)系。如果在 DBM 配置文件的 svcename 字段中指定的不是服務(wù)名稱而直接是端口號,那么不需要更新 services 文件。
在這里需要指出,services 文件的默認(rèn)位置取決于操作系統(tǒng),參考表4-2。
使用文本編輯器將"連接"條目添加至 services 文件。例如∶
db2c_db2inst1 50000/tcp #DB2連接服務(wù)端口
其中∶
● db2c_db2inst1表示連接服務(wù)名稱。
●50000表示連接端口號(#50000是 DB2實例的默認(rèn)端口),讀者可以根據(jù)自己需要更改。
● tcp表示使用的通信協(xié)議。
注意∶
這個步驟在創(chuàng)建數(shù)據(jù)庫實例的時候會自動更新services文件,在Windows平臺上,5000 是DB2實例的默認(rèn)端口,而在Linux/UNIX平臺上,60000是DB2實例的默認(rèn)端口,可以根據(jù)自己的需要更改成其他的端口號。
在UNIX平臺上,在對應(yīng)的/etc/services 文件中,默認(rèn)配置為∶
4.3.2 在服務(wù)器上更新數(shù)據(jù)庫管理器配置文件
更新數(shù)據(jù)庫管理器配置文件在配置DB2實例的TCP/IP通信過程中是必不可少的一環(huán)。必須使用服務(wù)名稱(svcename)參數(shù)更新數(shù)據(jù)庫管理器配置文件。
要更新數(shù)據(jù)庫管理器配置文件,必須完成以下操作∶
db2 update database manager configuration using svcename [service name|port_number]
db2stop
db2start
其中∶
這里需要注意,svcename不能聯(lián)機(jī)配置,必須停啟實例后才能生效。
在停止并再次啟動數(shù)據(jù)庫管理器之后,查看數(shù)據(jù)庫管理器配置文件以確保這些更改已經(jīng)生效。通過輸入下列命令,查看數(shù)據(jù)庫管理器配置文件∶
db2 get database manager configuration |find /i "svcename"
4.3.3 設(shè)置 DB2服務(wù)器的通信協(xié)議
要執(zhí)行此任務(wù),需要 sysadm 權(quán)限。為 DB2 實例設(shè)置通信協(xié)議是為 DB2 實例配置TCP/IP或SSL 通信的主要任務(wù)的一部分。
DB2COMM注冊變量允許設(shè)置當(dāng)前 DB2 實例的通信協(xié)議。如果 DB2COMM注冊變量未定義或設(shè)置為空,那么啟動數(shù)據(jù)庫管理器時不會啟動任何協(xié)議連接管理器。
可以使用下列其中一個關(guān)鍵字來設(shè)置 DB2COMM注冊變量∶tcpip 啟動TCP/IP支持,ssl啟動SSL支持。
要為實例設(shè)置通信協(xié)議,可從 DB2命令窗口輸入db2set DB2COMM命令∶
db2set DB2COMM=tcpip
例如,要將數(shù)據(jù)庫管理器設(shè)置為對TCP/IP通信協(xié)議啟動連接管理器,輸入以下命令∶
db2set DB2COMM=tcpip
db2stop
db2start
4.3.4 查看服務(wù)器通信端口的狀態(tài)
在執(zhí)行完上面 3個步驟后,在系統(tǒng)中輸入 netstat來查看通信端口的狀態(tài),如圖 4-16 所示。通信端口必須處于"LISTENING"狀態(tài)才能偵聽來自客戶端的TCP 請求。
4.4 配置客戶機(jī)至服務(wù)器通信
4.4.1 客戶機(jī)至服務(wù)器通信概述
要想配置客戶機(jī)至服務(wù)器通信,必須先了解客戶機(jī)至服務(wù)器通信有關(guān)的基本組件∶
● 客戶機(jī)—指的是通信的發(fā)起方。
● 服務(wù)器—指的是來自客戶機(jī)的通信請求的接收方。
● 通信協(xié)議——指的是用來在客戶機(jī)和服務(wù)器之間發(fā)送數(shù)據(jù)的協(xié)議。DB2 產(chǎn)品支持以下幾個協(xié)議∶
客戶機(jī)至服務(wù)器通信∶連接類型
通常,提到設(shè)置客戶機(jī)至服務(wù)器通信時指的是遠(yuǎn)程連接,而不是本地連接。
本地連接是數(shù)據(jù)庫管理器實例與由那個實例管理的數(shù)據(jù)庫之間的連接。換句話說,CONNECT語句從數(shù)據(jù)庫管理器實例發(fā)出給自己。本地連接是獨(dú)特的,因為不需要設(shè)置通信并且使用了IPC。
遠(yuǎn)程連接是在其中發(fā)出 CONNECT語句到數(shù)據(jù)庫的客戶機(jī)和數(shù)據(jù)庫服務(wù)器處于不同位置的連接。通常,客戶機(jī)和服務(wù)器在不同的機(jī)器上。然而,如果客戶機(jī)和服務(wù)器在不同的實例中,那么遠(yuǎn)程連接可能存在于同一臺機(jī)器上。
另一個較不常用的連接類型是回送連接((loopback)。這是一種遠(yuǎn)程連接類型,該連接配置為從某個 DB2實例(客戶機(jī))到相同的 DB2實例(服務(wù)器)。
可以通過 CLP來配置客戶機(jī)到服務(wù)器通信,下面講解這種配置方式。
4.4.2 深入了解DB2節(jié)點(diǎn)目錄、數(shù)據(jù)庫目錄
下面講解如何使用命令行來配置客戶機(jī)到服務(wù)器通信。在講解客戶機(jī)到服務(wù)器通信時,我們必須先弄清楚節(jié)點(diǎn)目錄、系統(tǒng)數(shù)據(jù)庫目錄、本地數(shù)據(jù)庫目錄這幾個概念。記得在剛開始學(xué)習(xí) DB2 時,在成功地安裝完之后,在配置客戶機(jī)通信時,筆者被文檔中的"cataloging nodes and databases"(編目節(jié)點(diǎn)和數(shù)據(jù)庫)這件事給弄糊涂了。catalog 這個詞與過去惹人喜愛的 SYSCAT和 SYSIBM目錄相比有著動詞化的意味。有時候,我會對著DB2 大聲埋怨∶"我不想編目任何東西,我只是想在遠(yuǎn)程客戶端通過運(yùn)行一條 SELECT 語句來確保已正確地安裝了 DB2。"經(jīng)過對節(jié)點(diǎn)目錄和數(shù)據(jù)庫目錄概念的仔細(xì)研究,我了解到只有在創(chuàng)建數(shù)據(jù)庫之后DB2才會有數(shù)據(jù)庫目錄;不需要在本地機(jī)器上將節(jié)點(diǎn)和數(shù)據(jù)庫編目—只有在連接到服務(wù)器的客戶機(jī)上才需要編目。
在 DB2中,目錄是存儲有關(guān)系統(tǒng)、數(shù)據(jù)庫及其連接信息的二進(jìn)制文件。DB2中有以下幾種目錄∶
1.節(jié)點(diǎn)目錄
節(jié)點(diǎn)目錄用于存儲遠(yuǎn)程數(shù)據(jù)庫的所有連通性信息。下面只介紹 TCP/IP 協(xié)議。在節(jié)點(diǎn)目錄中,大多數(shù)項將和TCP/IP信息有關(guān),比如機(jī)器(其中包含了想連接的數(shù)據(jù)庫)的主機(jī)名或IP 地址,還有相關(guān)的DB2實例的端口號。下面是一些與節(jié)點(diǎn)目錄相關(guān)的命令∶
要列示本地節(jié)點(diǎn)目錄的內(nèi)容,可使用LIST NODE DIRECTORY命令。請從CLP發(fā)出下面這個命令∶
db2 list node directory
要將信息輸入節(jié)點(diǎn)目錄進(jìn)行編目,請從CLP發(fā)出catalog命令∶
db2 catalog TCPIP node <node name> remote <hostname or IP address>
server <port_name or port number>
例如∶
db2 catalog TCPIP node nl remote 9.26.138.35 server 50000
要除去節(jié)點(diǎn)目錄,請從 CLP發(fā)出uncatalog 命令∶
db2 uncatalog node n1
為了得到想要連接的遠(yuǎn)程實例的端口號,可以通過查看遠(yuǎn)程實例的dbm cfg中的svcename 參數(shù)來實現(xiàn)。該值通常對應(yīng)于TCP/IP services 文件中的某一項。
在每個數(shù)據(jù)庫客戶機(jī)上都創(chuàng)建并維護(hù)節(jié)點(diǎn)目錄。對于具有客戶機(jī)可以訪問的一個或多個數(shù)據(jù)庫的每個遠(yuǎn)程客戶端,該目錄都包含一個條目。無論何時請求數(shù)據(jù)庫連接或?qū)嵗B接,DB2客戶機(jī)都會使用該節(jié)點(diǎn)目錄中的通信信息。該節(jié)點(diǎn)目錄中的條目還包含客戶機(jī)與遠(yuǎn)程實例通信時要使用的通信協(xié)議的類型信息。在圖4-17中,如果想在Workstationl的instl 實例下訪問同一臺機(jī)器上的inst2實例和遠(yuǎn)程Workstations2上的inst3實例,那么必須在instl 下創(chuàng)建本地實例 inst2 和遠(yuǎn)程實例 inst3的節(jié)點(diǎn)目錄。
可以這樣理解, 要讀取某個表,就必須先訪問數(shù)據(jù)庫; 可是要想訪問數(shù)據(jù)庫,就必須先訪問實例,因為數(shù)據(jù)庫是包含在實例中的。但是我們無法直接訪問實例,因為實例不是"物理"的,而是邏輯的,實例是一組后端進(jìn)程和共享內(nèi)存的結(jié)合。所以在這種情況下,就需要為實例建立物理"映射",這就是節(jié)點(diǎn)目錄的由來,所以節(jié)點(diǎn)目錄是和實例對應(yīng)的。如果實例就在本地,那么在創(chuàng)建實例的時候,默認(rèn)會創(chuàng)建和實例同名的本地目錄。這是隱式的,反正本地訪問也用不到這個節(jié)點(diǎn)目錄。但是如果在客戶機(jī)上需要訪問遠(yuǎn)程實例,就必須為該實例建立和實例對應(yīng)的節(jié)點(diǎn)目錄。這個節(jié)點(diǎn)目錄告訴我們該實例駐留在哪個機(jī)器上(IP 地址,主機(jī)名),使用什么通信協(xié)議(設(shè)置 DB2COMM變量)和使用的通信端口(SVCENAME)。
節(jié)點(diǎn)目錄默認(rèn)在實例目錄下,有兩個文件∶SQLNODIR和 SQLNOBAK。其中,SQLNOBAK 是 SQLNODIR 的備份,當(dāng) SQLNODIR 被損壞時,把 SQLNOBAK 改名為 SQLNODIR 即可。這個文件是二進(jìn)制的,不過在 Windows 中通過編輯器可以看到其中一些可讀信息。
2.系統(tǒng)數(shù)據(jù)庫目錄(或系統(tǒng) db 目錄)
系統(tǒng)數(shù)據(jù)庫目錄包含本地數(shù)據(jù)庫目錄以及從遠(yuǎn)程映射到本地的數(shù)據(jù)庫目錄,是我們訪問數(shù)據(jù)庫的入口之一,連接數(shù)據(jù)庫時首先去系統(tǒng)數(shù)據(jù)庫目錄中判斷這個數(shù)據(jù)庫是否存在,然后再判斷這個數(shù)據(jù)庫是本地數(shù)據(jù)庫還是遠(yuǎn)程數(shù)據(jù)庫。如果是本地數(shù)據(jù)庫,就直接到本地物理目錄上訪問;如果是遠(yuǎn)程數(shù)據(jù)庫,那么還要尋找這個遠(yuǎn)程數(shù)據(jù)庫位于哪個節(jié)點(diǎn)上,然后再到節(jié)點(diǎn)目錄中找到這個節(jié)點(diǎn)的通信信息。系統(tǒng) db目錄是在實例級上進(jìn)行存儲的;對于數(shù)據(jù)庫管理器的每個實例,都存在系統(tǒng)數(shù)據(jù)庫目錄文件,該文件對于針對此實例編目的每個數(shù)據(jù)庫都包含條目。因此,如果打算刪除實例,那么應(yīng)當(dāng)考慮備份其中的內(nèi)容。
要列出系統(tǒng)db目錄的內(nèi)容,請從 CLP發(fā)出下面這個命令∶
在上述命令輸出中,任何包含單詞"indirect"的項都意味著∶該項適用于本地數(shù)據(jù)庫(也就是駐留在當(dāng)前正在使用的機(jī)器上的數(shù)據(jù)庫)。該項還會指向由"Database drive"項(在Windows 中)或"Local database directory"項(在 UNIX中)指示的本地數(shù)據(jù)庫目錄。
任何包含單詞"Remote"的項都意味著∶該項適用于遠(yuǎn)程數(shù)據(jù)庫(也就是駐留在其他機(jī)器上而非當(dāng)前正在使用的機(jī)器上的數(shù)據(jù)庫)。該項還會指向由"Node name"項指示的節(jié)點(diǎn)目錄。
要將信息輸入系統(tǒng) db目錄,需要使用 catalog 命令∶
db2 catalog db <db name> as <alias> at node <nodename>
例如∶
db2 catalog db mydb as yourdb at node mynode
節(jié)點(diǎn)名是指向節(jié)點(diǎn)目錄中某一項的指針。在發(fā)出這條命令之前該項必須已經(jīng)存在。要除去數(shù)據(jù)庫目錄,請從CLP發(fā)出 uncatalog 命令∶
db2 uncatalog db samplel
通常只有在將信息添加到遠(yuǎn)程數(shù)據(jù)庫的系統(tǒng) db 目錄時才使用 catalog 命令。對于本地數(shù)據(jù)庫來說,當(dāng)發(fā)出 CREATE DATABASE命令創(chuàng)建數(shù)據(jù)庫之后就自動創(chuàng)建 Catalog 項,將隱式地對數(shù)據(jù)庫進(jìn)行編目。
系統(tǒng)數(shù)據(jù)庫目錄中包含以下內(nèi)容∶
●數(shù)據(jù)庫名稱、別名和注釋
●本地數(shù)據(jù)庫目錄的位置
● 目錄條目類型remote 表示數(shù)據(jù)庫在遠(yuǎn)程數(shù)據(jù)庫,indirect表示是本地數(shù)據(jù)庫)
● 節(jié)點(diǎn)名(此節(jié)點(diǎn)名和節(jié)點(diǎn)目錄中的節(jié)點(diǎn)名匹配)
系統(tǒng)數(shù)據(jù)庫目錄默認(rèn)在實例目錄下,有 3 個文件∶SQLDBDIR、SQLDBBAK 和SQLDBINS。其中,SQLDBBAK 是 SQLDBDIR 的備份,當(dāng) SQLDBDIR 被損壞時,把SQLDBBAK改名為SQLDBDIR即可。文件sqldbins只有分區(qū)數(shù)據(jù)庫才會用到,是指向共享文件系統(tǒng)中另一個文件的符號鏈接。這些文件是二進(jìn)制的,不過在windows中,通過編輯器可以看到其中一些可讀信息。
本地數(shù)據(jù)庫目錄(或本地 db 目錄)
本地數(shù)據(jù)庫目錄包含了有關(guān)本地數(shù)據(jù)庫(也就是駐留在目前正在使用的機(jī)庫)的信息。本地數(shù)據(jù)庫目錄駐留在數(shù)據(jù)庫內(nèi)部。當(dāng)使用create database命令創(chuàng)建數(shù)據(jù)庫時,將隱式地對數(shù)據(jù)庫進(jìn)行編目。在該目錄中會添加一項。
要列出本地數(shù)據(jù)庫目錄的內(nèi)容,請發(fā)出以下命令∶
其中,可以從系統(tǒng)db目錄相應(yīng)項中的"Database drive"項(Windows中)或"Lo directory"項(UNIX 中)獲取<path>。
節(jié)點(diǎn)目錄、系統(tǒng)數(shù)據(jù)庫目錄和本地數(shù)據(jù)庫目錄之間的關(guān)系,如圖4-18所示
如果在workstation2連接inst3實例:
如果在workstation1連接遠(yuǎn)程實例和遠(yuǎn)程數(shù)據(jù)庫:
圖4-19完整地總結(jié)了節(jié)點(diǎn)目錄、系統(tǒng)數(shù)據(jù)庫目錄和本地數(shù)據(jù)庫目錄之間的關(guān)系。
4.4.3 使用CLP配置客戶機(jī)到服務(wù)器通信的案例
在了解了節(jié)點(diǎn)目錄、系統(tǒng)數(shù)據(jù)庫目錄和本地數(shù)據(jù)庫目錄之后,如果想配置客戶端到端的通信,那么可以參考下面的圖4-20,其中歸納了客戶端到服務(wù)器端通信的所有數(shù),讀者可以根據(jù)自己的實際情況填寫這張表。
總的來說,要想配置客戶端到服務(wù)器通信,需要經(jīng)過下面幾個步驟:
(1)更新 TCP/IP連接的 hosts 和 services 文件。
如果要建立到遠(yuǎn)程數(shù)據(jù)庫服務(wù)器的連接(通過使用主機(jī)名),但是網(wǎng)絡(luò)沒有包含 DNS(均名服務(wù)器,用來解析主機(jī)名到IP 地址),那么必須更新 hosts 文件。如果要通過 IP 地址問遠(yuǎn)程數(shù)據(jù)庫服務(wù)器,那么不需要此步驟。如果要在建立與遠(yuǎn)程數(shù)據(jù)庫服務(wù)器的連接時指定連接服務(wù)名稱,那么需要更新 services 文件。連接服務(wù)是表示連接端口號的任意名稱。如果要訪問遠(yuǎn)程數(shù)據(jù)庫服務(wù)器的端口號,那么不需要此步驟。
要更新客戶機(jī)上的hosts 文件以將遠(yuǎn)程服務(wù)器的主機(jī)名解析為IP地址,可以使用文本編輯器在hosts文件中添加條目,作為服務(wù)器的IP地址。例如:
其中,11.21.15.235表示ip_address,myserver表示hostname。
要更新客戶機(jī)上的services文件以將服務(wù)名稱解析為遠(yuǎn)程服務(wù)器的端口號,可以使用文本編輯器將"連接服務(wù)名稱"和端口號添加到 services 文件中。例如∶
server1 50000/tcp #DB2connection service port
其中,server1 表示連接服務(wù)名稱,50000表示連接端口號(50000為默認(rèn)值)。 (2)使用CLP從客戶機(jī)編目TCP/IP節(jié)點(diǎn)。
編目TCP/IP 節(jié)點(diǎn)會在數(shù)據(jù)在服務(wù)器的客戶機(jī)節(jié)點(diǎn)目錄中添加用于描述遠(yuǎn)程節(jié)點(diǎn)的條目。此條目指定客戶機(jī)訪問遠(yuǎn)程主機(jī)時選擇的別名(node name)、hostname((或 ip address)和svcename(或 port_number)。catalog 命令如下∶
要編目端口號為50000、主機(jī)名為 serverl、節(jié)點(diǎn)名為db2node 的節(jié)點(diǎn),應(yīng)從 DB2提示符處輸入以下內(nèi)容∶
(3)使用CLP從客戶機(jī)編目數(shù)據(jù)庫。
必須先在客戶機(jī)上編目數(shù)據(jù)庫,客戶機(jī)應(yīng)用程序才能訪問遠(yuǎn)程數(shù)據(jù)庫。創(chuàng)建數(shù)據(jù)庫時,除非指定不同的數(shù)據(jù)庫別名,否則將自動在服務(wù)器上以與數(shù)據(jù)庫名稱相同的數(shù)據(jù)庫別名編目數(shù)據(jù)庫。在數(shù)據(jù)服務(wù)器客戶機(jī)上使用數(shù)據(jù)庫目錄中的信息和節(jié)點(diǎn)目錄中的信息(除非要編目不需要節(jié)點(diǎn)的本地數(shù)據(jù)庫)來建立與遠(yuǎn)程數(shù)據(jù)庫的連接。在編目遠(yuǎn)程數(shù)據(jù)庫時需要數(shù)據(jù)庫名稱、數(shù)據(jù)庫別名、節(jié)點(diǎn)名、認(rèn)證類型(可選)、注釋(可選)等信息。catalog db 命令如下∶
db2 catalog database database name as database_alias at node node_name [authentication auth_value]
要在使用認(rèn)證 serverl的節(jié)點(diǎn) db2node 上編目名為 sample 的遠(yuǎn)程數(shù)據(jù)庫,以便具有本地數(shù)據(jù)庫別名 mysample,可輸入下列命令∶
db2 catalog database sample as mysample at node db2node authentication server
db2 terminate
(4)用于編目數(shù)據(jù)庫的參數(shù)表。
使用表 4-3記錄編目數(shù)據(jù)庫所需的參數(shù)值。
(5)使用 CLP測試客戶機(jī)至服務(wù)器的連接。
在編目節(jié)點(diǎn)和數(shù)據(jù)庫之后,應(yīng)連接至數(shù)據(jù)庫以測試連接。在測試連接之前∶
● 數(shù)據(jù)庫節(jié)點(diǎn)和數(shù)據(jù)庫必須編目
● userid和 password 的值對于認(rèn)證它們所在的系統(tǒng)必須有效
要測試客戶機(jī)與服務(wù)器的連接,可在客戶機(jī)的命令行輸入以下命令以連接至遠(yuǎn)程數(shù)據(jù)庫∶
db2=> connect to database alias user userid
例如∶
db2=> connect to sample user informix using informix
如果連接成功,會接收到一條消息,顯示已連接數(shù)據(jù)庫的名稱。將給出類似圖 4-21所示的消息。
現(xiàn)在就可以使用數(shù)據(jù)庫了。例如,要檢索系統(tǒng)目錄表中所有表名的列表,可輸入以下SQL語句∶
db2 SELECT tabname from syscat.tables
當(dāng)結(jié)束使用數(shù)據(jù)庫連接時,輸入 connect reset 命令以結(jié)束數(shù)據(jù)庫連接。
(6)客戶機(jī)至服務(wù)器的連接配置總結(jié)。
圖4-22所示的這個檢查列表總結(jié)了配置客戶機(jī)到服務(wù)器通信時的主要檢查項。
上面演示了配置客戶機(jī)到服務(wù)器 TCP 通信的過程,其實在實際生產(chǎn)中,除了TCP 通信,還有 APPC、APPN 和 NETBIOS等很多通信協(xié)議。但是這些通信協(xié)議我們都不常用到,在這里就不講解了。而且在某些環(huán)境中,我們還會遇到一些其他組件∶
● DB2 Connect 網(wǎng)關(guān)。這里指的是DB2 Connect 服務(wù)器產(chǎn)品,該產(chǎn)品提供了一個網(wǎng)關(guān),IBM 數(shù)據(jù)服務(wù)器客戶機(jī)可通過該網(wǎng)關(guān)連接到中型機(jī)和大型機(jī)產(chǎn)品上的 DB2 服務(wù)器。
● LDAP(輕量級目錄訪問協(xié)議)。在啟用了LDAP的環(huán)境中,不必配置客戶機(jī)至服務(wù)器通信。當(dāng)客戶機(jī)試圖連接至數(shù)據(jù)庫時,如果本地機(jī)器的數(shù)據(jù)庫目錄中不存在該數(shù)據(jù)庫,那么在 LDAP目錄中搜索連接數(shù)據(jù)庫必需的信息。
當(dāng)服務(wù)器設(shè)置為使用開發(fā)環(huán)境時(例如 IBM Data Studio),可能會在初始 DB2連接時遇到錯誤信息SQL30081N。可能的根本原因是遠(yuǎn)程數(shù)據(jù)庫服務(wù)器的防火墻阻止建立連接。在這種情況下,請驗證是否正確配置了防火墻來接受客戶機(jī)的連接請求。
4.6 案例:數(shù)據(jù)庫連接問題診斷
下面以實際生產(chǎn)中遇到的數(shù)據(jù)庫連接問題為例來說明針對該類問題的解決思路,供讀者參考。
現(xiàn)象∶
某項目組向 DBA組報數(shù)據(jù)庫故障,197.3.135.62上的數(shù)據(jù)庫通過遠(yuǎn)程方式無法連接,而197.3.135.62本機(jī)卻可以連接。并且昨天還好好的,今天就突然不行了。
解決思路∶
首先,先了解問題并重現(xiàn)問題。
在197.3.135.62上可以連接本地數(shù)據(jù)庫∶
檢查必要的參數(shù)配置,均正確無誤∶
重現(xiàn)遠(yuǎn)程連接數(shù)據(jù)庫失敗的問題∶在另外一臺服務(wù)器 197.3.137.200 上,catalog 197.3.135.62上的數(shù)據(jù)庫PESDB∶
連接PESDB,報錯SQL30081N,說明通信存在錯誤:
為了測試通信情況,我們直接telnet 197.3.135.62的60000端口,發(fā)現(xiàn)建立的連接會被瞬間關(guān)閉,說明數(shù)據(jù)庫的60000端口的連接存在問題:
然后,對問題進(jìn)行分析。
通過上面的現(xiàn)象,基本可以初步定位為數(shù)據(jù)庫服務(wù)器的60000端口連接有問題。
于是,在197.3.135.62上分析60000端口的占用情況:
端口60000處于偵聽狀態(tài),那么是哪個程序占用了60000端口并且在偵聽呢?
我們看到如下奇怪的現(xiàn)象:除了數(shù)據(jù)庫進(jìn)程db2sys在60000端口偵聽之外,WSH程序也占用了60000端口,是昨天晚上21:05啟動的,如下所示:
WSH是 tuxedo 的進(jìn)程,WSH用的端口是隨機(jī)分配的,-p指定了最小端口,-P指定了最大端口。針對上面的情況,可以分配 2048~65535 之間的隨機(jī)端口,因為分配了 60000 端口,所以與數(shù)據(jù)庫端口發(fā)生沖突。
最后,解決問題。在將WSH進(jìn)程重啟后,為之隨機(jī)分配了其他端口57982和57983,釋放對60000端口的占用,數(shù)據(jù)庫可以正常連接了。當(dāng)然,基本解決辦法是規(guī)范 tuxedo 程序占用的端口范圍,避開數(shù)據(jù)庫端口。
創(chuàng)建表空間
創(chuàng)建存儲器
創(chuàng)建緩沖池
模式
表
索引
視圖
序列
表表達(dá)式
觸發(fā)器
遷移
備份
恢復(fù)