實驗一:DB2實驗環境設置(2學時)
實驗任務:
A. 安裝DB2數據庫系統。
B. 建立擁有系統管理權限(SYSADM)的新用戶(inst1)和組(adm1)。
C. 建立新的DB2實例(inst1)。
D. 增加一些新的系統變量,並且更新 數據庫管理器配置文件(DBM CFG)以反映剛剛創建的新的系統管理用戶組。
一. 安裝DB2數據庫系統
將DB2 數據庫系統安裝在本地機器上。
二. 建立新用戶
1. 在控制面板中雙擊“用戶帳戶”選項,按以下要求創建新用戶:
用戶名:inst1
全名:inst1 Instance SysAdmin
描述:System Administrator for inst1 Instance
密碼:inst1
用戶組:Administrators
2. 退出用戶當前登陸的系統,然後以用戶inst1的管理員身份登陸到操作系統。在以後的實驗中,當要求登陸到系統中時,除特別說明外都是要求以inst1身份登陸。
三. 創建實例
1. 用db2ilist命令查看實例。
在DB2的Windows版本安裝完成後,系統會自動建立一個默認名為DB2的實例。可以打開DB2命令窗口並輸入db2ilist命令,來查看該實例是否存在。
選擇開始菜單—>程序—>IBM DB2—>命令行工具—>命令窗口;輸入db2ilist。該命令會顯示DB2是該主機的一個實例。
2. 新建inst1實例
在命令窗口中輸入如下命令,並回車,可完成該實例的創建。
db2icrt inst1
3. 再次輸入db2ilist命令,將會發現inst1實例已成功創建。
4. 輸入exit退出DB2命令窗口。
三. 建立DB2系統管理員用戶組adm1
要求:
組名:adm1 (adm1應小寫)
描述:inst1 Instance SysAdmin Group
成員:db2admin;inst1
四. 設置環境
1. 檢查當前DB2環境變量,並將建立的實例inst1設置為系統默認實例。
打開控制面板的“系統屬性”窗口,選擇“高級”標簽頁,然後點擊“環境變量”按鈕;彈出的環境變量窗口被分為上下兩部分,上半部分所定義的用戶變量只影響當前用戶,而系統變量則影響每一個用戶。查看系統變量中DB2INSTANCE所對應的值,默認情況下為DB2,現將其改為inst1(雙擊系統變量列表框中“DB2INSTANCE DB2”,在編輯系統變量窗口的變量值一欄中輸入inst1,然後點擊“確定”按鈕)。
2. 啟動DB2-inst1和DB2DAS - DB2DAS00服務,並將其啟動類型設置為自動。
雙擊“控制面板”à“管理工具”à“服務”窗口。在服務列表中分別右鍵單擊“DB2 - inst1”,和“DB2DAS - DB2DAS00”,在彈出菜單中選擇“屬性”,並在“屬性”窗口中,將“常規”標簽頁中的“啟動類型”設為自動;然後單擊啟動按鈕,啟動相應服務。(DAS也可以通過db2admin start和db2admin stop來啟動和關閉)。
3. 檢查DB2環境變量
在Windows操作系統的命令提示符窗口中,輸入set | more命令,檢查DB2環境變量是否設置正確。假如不對重復上面必要的步驟予以糾正。
4. 檢查DB2注冊表變量
在DB2命令窗口輸入db2set -all命令來檢查DB2注冊表變量。DB2ADMINSERVER的值應為DB2DAS00,DB2SYSTEM的值與主機名相同。
(注:使用帶-all 選項的db2set命令可以查看系統中設置的所有配置文件注冊表變量。)
5. 設置DB2COMM變量
為了對實例inst1和全局注冊表變量提供tcp/ip協議的支持,輸入如下命令設置DB2COMM變量:
db2set DB2COMM=TCPIP –i inst1
db2set DB2COMM=TCPIP -g
注:
要設置當前實例的一個參數時輸入格式為db2set parameter=value
要為特定實例設置參數值時輸入格式為db2set parameter=value –i instance_name
要設置一個全局級的注冊表變量時輸入格式為db2set parameter=value –g
要查看能夠被設置的所有配置文件注冊表變量,可輸入db2set -lr
6. 再次查看注冊表變量。
在DB2命令窗口中輸入db2set –all,注意在輸出列表中實例級的注冊表變量旁邊標以“[i]”,全局級的注冊表變量旁邊標以“[g]”。
7. 重啟操作系統,並以用戶inst1登陸(用戶密碼按照先前所設都為inst1)。
五. 使用DB2控制中心來查看和設置數據庫管理器配置參數
選擇開始菜單à程序àIBM DB2à一般管理工具à控制中心,打開“控制中心”窗口。
1. 查找inst1實例
在控制中心窗口中選擇主機名左邊的“+”號;選擇“實例”左邊的“+”號,如果“實例”下沒有列出inst1,則右鍵單擊“實例”,在彈出菜單中選擇“添加”,在“添加實例”窗口中的“遠程實例名”欄輸入“inst1”,點擊“應用”按扭,再點擊“取消”按扭。
2. 查看數據庫管理器配置文件。
右鍵單擊控制中心裡的“inst1”實例,在彈出菜單中選擇“配置參數”,則打開“DBM配置”窗口,在該窗口下,可以查看或更改數據庫管理器配置文件。
(1) “管理”下的AUTHENTICATION 參數。選擇該參數所對應的值,並點擊值右邊的省略號按扭,在彈出的“更改DBM 配置參數-AUTHENTICATION”窗口中列出5個值:“服務器”、 “客戶機”、“服務器加密”、“Kerberos”和“Kerberos加密”。其中“服務器”選項是指驗證過程將在服務器上進行,這是DB2默認的身份鑒別方式。點擊“取消”按鈕關閉“更改DBM 配置參數-AUTHENTICATION”窗口。
(2) “管理”下的SYSADM_GROUP參數。該參數為實例定義具有系統管理SYSADM權限的組名,值必須是一個由用戶管理器創建的組名。默認情況下SYSADM_GROUP並沒有值,這意味著Windows的管理員用戶將會繼承DB2的SYSADM權限。要想更改這種默認的設置,可以先建立一個用戶組,該組擁有一些特定成員,然後將該組名設置為SYSADM_GROUP參數值,只有該組的成員才擁有SYSADM權限。
(3) “環境”下的NODETYPE參數。該參數值為“帶有本地和遠程客戶機的數據庫分區服務器”,該值由DB2設置的,且不能被更改。
3. 將SYSADM_GROUP參數更新為adm1
在“DBM 配置”窗口中選擇SYSADM_GROUP的值,然後點擊該值右邊的省略號按鈕,在系統管理權限組下輸入“adm1”,點擊“確定”按鈕。然後點擊“DBM 配置”窗口中“確定”按鈕,再點擊彈出的“DB2 消息”窗口的“關閉”按鈕。
為使新設置的數據庫管理器配置參數生效,需要重新啟動inst1實例。方法:右鍵單擊inst1,並在彈出菜單中選擇“停止”,點擊“確定”按鈕,再點擊“關閉”按鈕。右鍵單擊inst1,並在彈出菜單中選擇“啟動”。如果系統顯示錯誤的消息,請閱讀相關的錯誤信息,並在下一步修正該錯誤。
4. 更新TCP/IP服務名(SVCENAME參數),設置它的值為55000。
上一步如果收到一個SQL5043N錯誤信息,表示未能成功啟動對一個或多個通信協議的支持(盡管核心數據庫管理器功能啟動成功)。
在本實驗第四部分的第5步中,曾將db2comm參數值設為tcpip。當inst1實例啟動時,DB2會試著啟動該通信協議,但是卻未能找到一個服務端口來使用。因此在數據庫管理器配置文件中,需要設置參數SVCENAME,來指定一個端口號或者一個服務文件入口名,來為前來訪問的TCP/IP客戶端服務。
在控制中心中右鍵單擊inst1,並在彈出菜單中選擇“設置通信”,在“設置通信-inst1”窗口中令TCP/IP復選框選中,並且單擊該復選框右邊的“屬性”按鈕,在“配置TCP/IP –inst1”窗口中的服務名一欄輸入inst1(或者其他名),再在端口號一欄中輸入55000 ,連續單擊“確定”按鈕關閉這些配置窗口。
5. 重新啟動實例。
方法同4中所述。
實驗二:創建數據庫/表空間(2學時)
實驗任務:
A. 建立數據庫;
B. 建立表空間;
C. 執行腳本文件來建立多個表空間;
D. 訪問那些包含表空間信息的SYSCAT視圖;
E. 列出表空間相關信息;
F. 列出容器相關信息。
一. 創建數據庫
1. 查看create database指令語法
創建數據庫可以通過DB2命令create database來完成。通過在線幫助工具可以查看create database指令語法。
(1) 選擇菜單“工具”à“命令中心”,或相應的圖標來啟動“命令中心”;
(2) 在“命令中心”中選擇“交互式”標簽頁,並且在“命令”下的文本框中輸入“? create database”;
(3) 選擇菜單“交互式—>執行”(或ctrl+enter,或點擊左上角工具欄的齒輪圖標)。
(4) 從Create database命令語法可以看出,該命令可以指定:數據庫名﹑數據庫位置(控制文件﹑設定文件﹑事務日志文件以及默認的表格空間要建立在什麼位置)﹑數據庫別名﹑國別區碼﹑排序集﹑默認數據塊大小,該語句也可為編目表空間﹑臨時表空間﹑用戶表空間指定特定值。
此外,也可以通過“創建數據庫向導”來創建一個新數據(本實驗采用該方法)。
2. 通過“創建數據庫向導”創建數據庫。
(1) 在“控制中心”中,右鍵單擊inst1下的“數據庫”,在彈出菜單中選擇“創建—>使用向導創建數據庫”;
(2) 在向導的“名稱”頁面中,數據庫名一欄輸入MUSICDB,其它值均按默認設置,點擊“下一步”按鈕;
(3) 分別選擇向導左邊的“用戶表”﹑“目錄表”﹑“臨時表”標簽頁,並點擊相應頁面的“下一步”按鈕完成相關設置。“用戶表”﹑“目錄表”﹑“臨時表”默認使用的表空間類型為SMS,即各頁面中的“低維護-自動增加(系統管理的表空間)(L)”選項。
(4) 在向導的“性能”頁面中,因為MUSICDB的表空間均按照系統缺省設置,所以此時不能修改數據塊大小或者預取大小。(如果為用戶表﹑目錄表﹑臨時表設置了特定的容器,則可以通過“性能”頁面設置數據塊或預取大小)。點擊“下一步”按鈕開始數據庫“區域”的設置。
(5) 向導的“區域”頁面可以設置數據庫的語言環境和整理順序,系統已自動設置完成這些選項,直接點擊“下一步”按鈕。
(6) 在向導“總結”頁面中,會顯示前幾步所設的創建數據庫的參數。點擊“顯示命令”按鈕即可查看創建該數據庫的全部命令。單擊“上一步”則回到前面步驟修改創建參數。點擊“總結”頁面的“完成”按鈕,則生成數據庫。
等待一小段時間,系統就會彈出“DB2消息”窗口提示數據庫已經創建完畢,並且詢問是否啟動“配置顧問程序”來調整數據庫。點擊“否”按鈕關閉該窗口。這時,所創建的MUSIC數據庫會出現在控制中心對象樹中“數據庫”節點下。
3. 查看數據庫信息。
系統數據庫目錄包含了當前實例下所有數據庫的條目信息,可以在“命令中心”輸入命令“list db directory”來查看系統數據庫目錄中MUSICDB的信息。
(1) 數據庫建立時如果未設置別名,系統會自動為它設置一個與數據庫名相同的別名。MUSICDB的別名為MUSICDB。
(2) 目錄條目類型的“間接”是指該數據庫為本地數據庫(運行在同一主機),而“遠程”是指數據庫運行在另一個遠程系統中。本實驗中MUSICDB的目錄條目類型為“間接”。
4. 查看數據庫的連接狀態。
(1) 在“命令中心”輸入如下命令來檢查現在的連接狀態:get connection state
執行該命令後,輸出窗口顯示連接狀態為“可連接而未連接”。
(2) 輸入如下命令連接到MUSICDB:
connect to MUSICDB
(3) 再次輸入命令“get connection state”檢查連接狀態,輸出窗口顯示連接狀態為“可連接並已連接”,並列出相應的“SQL授權標識”及“本地數據庫別名”等信息。
5. 修改數據庫配置文件
每一個數據庫都有它自己的數據庫配置文件,該文件包含了該數據庫的相關信息和配置參數。要查看MUSICDB數據庫配置文件,可在控制中心的對象樹中右鍵單擊“MUSICDB”,並在彈出菜單中選擇“配置參數”。借助彈出的“數據庫配置—MUSICDB”窗口,可以看查或更改相應的參數值。
(1) 在“命令中心”中輸入命令“update db cfg for MUSICDB using maxlocks 20 num_freqvalues 12”,該命令將每個應用程序的最大鎖列表的百分比設為20,並指定當RUNSTAS命令上指定了With Distribution 選項時,將收集的最高頻出現的值的數目設為12。
(2) 查看MAXLOCKS和NUM_FREQVALUES的當前值與延遲值是否相同。
connect to MUSICDB
get db cfg for MUSICDB show detail
通過輸出窗口可見這兩個參數的當前值和延遲值是一致的。
6. 查看表空間及表空間容器等信息
(1) 數據庫創建時,三個表空間也同時被創建,在命令中心中輸入命令list tablespaces,可查看這些表空間的相關信息。結果如下:
SYSCATSPACE——ID 0
TEMPSPACE1——ID 1
USERSPACE1——ID 2
(2) 表空間容器信息可以通過命令list tablespace containers獲取。
要查看MUSICDB中標識為0的表空間容器信息,可輸入命令:list tablespace containers for 0。該容器類型為路徑/目錄,此目錄為X:/inst1/NODE0000/SQL00001/SQLT0000.0。
(3) 要查看臨時表空間(ID=1)和默認用戶表空間(ID=2)的容器信息,可用下列語句實現:
list tablespace containers for 1
list tablespace containers for 2
臨時表空間的默認路徑為X:/inst1/NODE0000/SQL00001/SQLT0001.0
用戶表空間的默認路徑為X:/inst1/NODE0000/SQL00001/SQLT0002.0
7. 查看系統目錄表和視圖
在命令中心中輸入命令list tables for system列出系統目錄表和視圖,這些表和視圖存儲在SYSCATSPACE表空間中。
SYSCAT模式擁有所有建立在系統目錄表上的視圖,可通過該模式的這些視圖來訪問系統目錄表。例如在命令中心中輸入如下命令查看所有模式為“SYSIBM”(即系統目錄表)的表名和表標識號:
select tabname,tableid from syscat.tables where tabschema='SYSIBM' and type='T'
二. 建立表空間
數據庫MUSICDB需要額外的幾個表空間,本節先通過“控制中心”來創建其中一個表空間。其余表空間通過的腳本命令文件來創建。
1. 通過向導建立表空間dms01
(1) 在控制中心的左邊的對象樹上,右鍵單擊數據庫“MUSICDB”下的“表空間”,在彈出菜單中選擇“創建”;
(2) 在“創建表空間向導”的第一頁中,指定新表空間的名稱為dms01,並點擊“下一步”;
(3) 在向導的“類型”頁面,選擇表空間的類型為常規,並點擊“下一步”;
(4) 在“空間管理”頁面,選擇該表空間為“數據庫管理表空間”,並在下一步的“容器”頁面中,點擊“添加”按鈕,彈出“定義容器”窗口。
(5) 選擇容器大小的計算單位為4KB頁,並在大小一欄輸入160,選擇驅動器為X:,在容器一欄輸入dms/dms01,然後點擊“確定”按鈕。繼續點擊“下一步”按鈕;
(6) 在向導的“讀/寫”頁面,將數據塊大小設置為4 個4KB頁面;
(7) 設置完該表空間的所有性質後,單擊“總結”頁面的“顯示SQL”按鈕查看剛才所作的設定,SQL語句應為:CREATE REGULAR TABLESPACE DMS01 PAGESIZE 4 K MANAGED BY DATABASE USING ( FILE 'X:/dms01' 106 ) EXTENTSIZE 4 OVERHEAD 10.5 PREFETCHSIZE 4 TRANSFERRATE 0.33 BUFFERPOOL "IBMDEFAULTBP" DROPPED TABLE RECOVERY OFF,點擊“關閉”按鈕關閉“顯示SQL”窗口;
(8) 點擊向導的完成按鈕。
在命令中心中輸入命令list tablespaces show detail檢查新創建的表空間。(應先執行connect to MUSICDB)
2. 執行腳本命令文件來創建其它表空間。
(1) 在加載並執行腳本之前,首先要檢查命令中心的選項和工具設置,並完成下面設置:
在命令中心中,選擇“命令中心—>選項”菜單,選擇“命令中心選項”窗口的“執行”標簽頁,確保“自動落實SQL語句”和“若發生錯誤則停止執行”兩選項都被選中,選擇“結果”標簽頁,確保“詳細(將命令文本回送執輸出)”選項被選中,然後點擊“確定”按鈕。
選擇“工具—>工具設置”菜單,選擇“工具設置”窗口的“一般”標簽頁,確保該頁面的“使用語句終止符;”選項被選中。關閉“工具設置”窗口。
(2) 通過執行腳本文件CRTBLSP創建其余表空間。
在命令中心中,選擇“腳本”標簽頁,選擇菜單“腳本—>導入”;
確保“導入”窗口中的系統名一欄與Windows系統名一致。選擇目錄和文件列表框找到CRTBLSP腳本,單擊“確定”按鈕。該腳本將創建dms02,dms03,dms04,dms05,dms06和sms01六個表空間,執行該腳本。
3. 查看表空間信息。
(1) 在控制中心對象樹中右鍵單擊MUSICDB下的表空間,並在彈出菜單中選擇“刷新”。在控制中心裡並不能查看到表空間的標識號,但可通過在命令中心中輸入list tablespace看到。
表空間及其關聯的標識號如下:
SYSCATSPACE—ID 0
TEMPSPACE1—ID 1
USERSPACE1—ID 2
DMS01—ID 3
DMS02—ID 4
DMS03—ID 5
DMS04—ID 6
DMS05—ID 7
DMS06—ID 8
SMS01—ID 9
在命令中心中輸入命令:list tablespaces show detail,查看表空間的詳細信息。
(2) SMS表空間並不使用預先格式好的容器,因此SMS的目錄容器所在的文件系統中可用空間的變動會直接影響到SMS表格空間的容量,而DMS表空間則要設置預留空間的大小。
查看標識號為3的表空間的容器的詳細信息:
list tablespace containers for 3 show detail
容器類型為文件,且該文件為X:/dms/dms01。
查看標識號為9的表空間的容器的詳細信息:
list tablespace containers for 9 show detail
容器類型為路徑/目錄,且路徑為x:/sms/sms01和x:/sms/sms02
(3) 表空間的信息也可通過視圖SYSCAT.TABLESPACES來訪問,該視圖中包含表空間信息的列有:
TBSPACE-表空間名
DEFINER-表空間創建者的用戶名
TBSPACEID-表空間的內部標識號
TBSPACETYPE-表空間類型,D代表DMS,S代表SMS
DATATYPE-表空間可存儲的數據的類型。L代表只能存儲大對象數據對象,A代表所有永久對象,T代表只能存儲臨時表。
在命令中心中輸入下列SQL語句,可實現上述信息的查詢:
select tbspace, definer, tbspaceid, tbspacetype, datatype from syscat.tablespaces
(4) 特定的表所相關的表空間信息可以通過SYSCAT.TABLES視圖來訪問,該視圖中包含表空間信息的列有:
TBSPACEID-該表所在的主表空間內部標識號;
TBSPACE-該表所在的主表空間名稱;
INDEX_TBSPACE-包含該表索引的表空間;
LONG_TBSPACE-包含該表大對象數據的表空間。
為列出表SYSIBM.SYSTABLES所在表空間的信息,可在命令中心輸入如下SQL語句:
select tabname, tbspaceid, tbspace, index_tbspace, long_tbspace
from syscat.tables
where tabname=’SYSTABLES’
在命令中心中輸入命令connect reset斷開與MUSICDB的連接。
實驗三:創建數據庫對象(2學時)
實驗任務:
A. 建立表;
B. 建立索引;
C. 建立視圖;
D. 建立別名;
E. 對其中一表添加參照完整性約束;
F. 對其中一表添加檢查約束;
G. 對其中一表添加觸發器;
H. 訪問這些對象相關的系統編目信息。
一. 創建表
1. 利用向導創建表artists。
(1) 在控制中心刷新表空間,並確保在開始創建表之前,能看到所有的表空間。
(2) 在控制中心的MUSICDB數據庫對象列表中,右鍵單擊“表”,並在彈出菜單中選擇“創建”,則彈出“創建表向導”對話框。
(3) 在“創建表向導”中,在“表名”處輸入artists,然後單擊“下一步”定義列。
ü 在列定義窗口中,點擊“添加”按鈕,在“添加列”對話框中,輸入列名artno,在數據類型中,選擇SMALLINT,去掉“可空”前面的選擇(該列不能為空),點擊“應用”按鈕,繼續定義其它列。
ü 定義列name,選擇數據類型為VARCHAR,長度為50,允許為空;
ü 定義classification列,數據類型為CHARACTER,長度為1,不允許為空;
ü 定義bio列,數據類型CLOB,LOB單位選擇KBytes,長度為100。LOB選項的“記錄”和“壓縮”均選上,並選擇“可空”;
ü 定義picture列。數據類型為BLOB,LOB單位為Kbytes,長度為500。選擇LOB選項的“壓縮”選項,選擇“可空”。
(4) 在繼續下面操作前,要確保上述定義的列具有下列的性質。如果沒有,則用“更改”按鈕進行更改(此處定義錯誤,可能會使後續結果不正確)。
Column name Data type Length Nullable LOB option
----------- --------- ---------- -------- ----------
artno smallint No
name varchar 50 Yes
classification character 1 No
bio clob 100KBytes Yes Logged,Compact
picture blob 500 KBytes Yes Compact
(5) 按“下一步”進入表空間窗體,為artists表定義表空間。
在表空間處,選擇DMS01表空間;選擇“使用單獨的索引空間”,並選擇DMS02表空間;選擇“使用獨立的長空間”並選擇DMS03表空間。然後單擊“下一步”,在新表上定義鍵。
(6) 按“添加主鍵”,在可用列中,選擇ARTNO列,並按下> 按鈕,將ARTNO加入到“選擇的列”中(只有非空列才被選擇,所以,主鍵必須被定義為非空)。
(7) 在“總結”窗口,按下“顯示SQL”,則會出現如下的SQL語句。其中,約束名會有所不同。
CREATE TABLE INST1.ARTISTS ( ARTNO SMALLINT NOT NULL , NAME VARCHAR (50) , CLASSIFICATION CHARACTER (1) NOT NULL , BIO CLOB (100 K ) LOGGED COMPACT ,
PICTURE BLOB (500 K ) NOT LOGGED COMPACT ,
CONSTRAINT CC1044760857306 PRIMARY KEY ( ARTNO) ) IN "DMS01" INDEX IN
"DMS02" LONG IN "DMS03" ;
(8) 按“完成”創建該表。
2. 利用Create Table語句創建表albums。
在“命令中心”中輸入下列語句,創建數據表stock(需要先連接到數據庫,即connect to musicdb)。
create table albums
(title varchar (50),
artno smallint not null,
itemno smallint not null)
in dms04
index in dms05;
在控制中心左邊的對象樹中右鍵單擊MUSICDB下的“表”,在彈出菜單中選擇“刷新”,再在右邊的內容面板中找到artists表和albums表,查看這兩個表。如果表不符合要求,則將其刪除,然後再返回上面步驟重新建立。
3. 導入腳本文件創建其余表。
在“命令中心”的腳本模式下導入CRTABLES的腳本文件創建其余表,在執行它之前,先查看腳本內容,注意表STOCK、CONCERTS、REORDER將分別把表數據和索引放在哪些表空間。
按Ctrl+Enter執行腳本文件。
4. 查看所建表的信息。
在控制中心左邊的對象樹中右鍵單擊MUSICDB下的“表”,在彈出菜單中選擇“刷新”,然後再在右邊內容面板中查看腳本所創建的表,確保這些表都建立得正確。
要查看表的詳細信息,可以在內容面板中右鍵單擊所要查看的表,在彈出菜單中選擇“改變”。使用此方法查看albums表。
5. 通過在命令中心中導入執行GRANTS腳本,將inst1模式下所有表的select權限授予public,並在腳本執行完畢後檢查權限授予是否成功。
注意查看該腳本的具體內容,以及相應的SQL語句的寫法。
6. 查看模式inst1所有表的列信息(選做)。
(1) 表的列信息可以通過SYSCAT.COLUMNS視圖查詢到。在DB2命令行處理器輸入如下指令執行X:/cf23下的tabchk.sql腳本,並將輸出結果重定向到tabchk.file中。
打開“開始菜單—>程序—>IBM DB2—>命令行工具—>命令窗口”,輸入:
X:
Cd /cf23(數據文件所在目錄)
db2 connect to musicdb
db2 –tf tabchk.sql > tabchk.file
more tabchk.file
或者輸入db2 select tabname,colname,typename from syscat.columns where tabschema = 'inst1' order by 1, 2 > tabchk.file
(2) 檢查輸出文件tabchk.file與tabchk.master內容上的差別(須確保兩文件的內容沒有任何差別)。首先在命令提示符下輸入指令:
fc /w tabchk.file tabchk.master | more
如果輸出消息顯示“FC:找不到相異處”,tabchk.file與tabchk.master相一致。如果輸出顯示兩個文件某些行不相同,則應仔細檢查相應錯誤,刪除建立不當的表,並返回到上步重新建立。
7. 查看模式inst1表空間的信息(選做)。
(1) 某個表所相關的表空間信息可以通過SYSCAT.TABLES視圖來獲得。輸入一條SQL語句來從SYSCAT.TABLES獲取模式inst1下所有表的表名(TABNAME)、存儲該表數據的表空間(TBSPACE)、存儲該表索引的表空間(INDEX_TBSPACE)信息,並將結果集按表名排序。完整的SQL語句為:
select tabname,tbspace,index_tbspace from syscat.tables where tabschema= 'inst1' order by tabname
X:/cf23下的腳本文件tbschk.sql包含該SQL語句,在DB2命令窗口中進入x:/cf23目錄下,輸入:
db2 –tf tbschk.sql > tbschk.file
more tbschk.file
(2) 檢查輸出文件tbschk.file與tbschk.master內容上的差別。
fc /w tbschk.file tbschk.master | more
如果輸出消息顯示“FC:找不到相異處”,tbschk.file與tbschk.master相一致。如果輸出顯示兩個文件某些行不相同,則應仔細檢查相應錯誤,刪除建立不當的表,並返回到上步重新建立。
二. 創建索引
1. 在stock表的itemno列上建立名為item的索引。
控制中心的對象列表中右鍵單擊MUSICDB下的“索引”,並在彈出菜單中選擇“創建”,在“創建索引”窗口中按下列要求填入相關信息。其中,索引模式為inst1;索引名為item;表模式為inst1;表名為stock。
在“可用的列”中選擇itemno並單擊“>”按鈕將該列加入到“選擇的列”中,然後點擊“確定”按鈕。
2. 為albums表的itemno列建立唯一索引。其中,索引模式為inst1;索引名為itemno;表模式為inst1;表名為albums;
在“可用的列”中選擇itemno並單擊“>”按鈕將該列加入到“選擇的列”中,並且選中“唯一”復選框,然後點擊“確定”按鈕。
有關索引的信息可以通過SYSCAT.INDEXES視圖獲取。
三. 建立視圖
1. 在控制中心中建立一名為music的視圖。
控制中心的對象列表中右鍵單擊MUSICDB下的“視圖”,在彈出菜單中選擇“創建”;
選擇視圖的模式為inst1;
視圖名一欄中輸入music;
點擊SQL語句框右邊的“清除”按鈕,並輸入:
as select title, classification, name from inst1.albums, inst1.artists where inst1.artists.artno= inst1.albums.artno ;
點擊“確定”按鈕。
2. 利用Create View語句創建視圖inventory。
在“命令中心”中,輸入下列語句,建立視圖inventory。
connect to musicdb;
create view inventory (type, itemno, totcost, totqty)
as select type, itemno, sum (price * qty), sum(qty)
from stock group by type, itemno;
3. 查看視圖信息
(1) 在控制中心的對象樹中右鍵單擊MUSICDB下的“視圖”,並在彈出菜單中選擇“刷新”,然後可見在右邊的內容面板中列出了新建立的視圖。
(2) 視圖的相關信息可以通過SYSCAT.VIEWS和SYSCAT.TABLES來獲取。List tables同樣可以列出數據庫中的視圖(類型為V)。
在“命令中心”中輸入如下命令,查看新建立的視圖是否列出:
connect to MUSICDB;
list tables for user;
或者connect to MUSICDB;
select viewschema, viewname from syscat.views where definer=user;
四. 建立別名
1. 在控制中心中為artists表建立別名singers,為reorder表建立別名emptystock。
2. 別名的相關信息可以通過視圖SYSCAT.TABLES來獲取,此外list tables命令也能獲取當前連接的用戶下的別名列表。
輸入如下命令列出別名列表:
connect to MUSICDB;
list tables for user;
或者select tabname, type from syscat.tables where tabschema=user;
五. 添加參照完整性約束條件
本部分實驗在表artists與albums之間以及albums與stock之間添加參照完整性約束。
1. 修改albums表,並且為它定義與表artists的參照完整性約束。
(1) 在該表itemno列上建立主鍵。
在控制中心中右鍵點擊albums表並在彈出菜單中選擇“改變”,再在“改變表—albums”窗口中選擇“鍵”標簽頁,點擊“添加主鍵”按鈕,在“定義主鍵”窗口“可用的列”中選擇itemno,然後點擊“>”按鈕,並點擊“確定”按鈕。
(2) 為該表定以外鍵。
點擊“添加外鍵”按鈕,在“添加外鍵”窗口中,表模式一欄選擇inst1,表名一欄選擇artists,注意這時主鍵框內顯示該表主鍵為artno,再選擇“可用的”列中artno,點擊“>”按鈕使該列成為外鍵,選擇“刪除時”一欄為CASCADE,約束名為fkartno,點擊“確定”按鈕。
2. 在命令中心腳本模式下執行CRRI腳本,該腳本修改STOCK表並為其定義參照完整性約束。(在運行腳本前,請仔細查看相關SQL語句的書寫方法。)
3. 通過SYSCAT.REFERENCES視圖查看參照完整性約束的相關信息(選做)。
在命令中心中輸入如下SQL語句獲取inst1模式下所有參照完整性約束的名稱、所在表名、參照表的模式、參照表名、刪除規則、外鍵所在列名、主鍵所在列名:
select constname, tabname, reftabschema, reftabname, deleterule, fk_colnames, pk_colnames
from syscat.references
where tabschema='inst1'
4. 通過SYSCAT.TABLES視圖查看參照完整性約束的相關信息(選做)。
在命令中心中輸入如下SQL語句,其中CHILDREN為參照該表的所有表的個數,PARENTS為該表所要參照的表的個數:
select tabname, parents, children
from syscat.tables
where tabschema='inst1' and (parents>0 or children>0) order by 2,3 desc
5. 參照完整性約束定義結果檢查(選做)
在DB2命令窗口中執行腳本richk.sql,通過SYSCAT.TABLES視圖獲得當前連接的用戶模式參照完整性約束的相關信息,richk.sql的內容為:
select substr(tabname, 1, 18), parents, children
from syscat.tables
where tabschema = user order by tabname
db2 –tf richk.sql > richk.file
more richk.file
然後檢查該輸出文件的內容與richk.master有無差別:
fc /w richk.file richk.master | more
如果輸出顯示兩文件內容存在差異,則應仔細檢查相關信息後重新修改表。
六. 為stock表添加檢查約束
1. 修改stock表並為該表添加檢查約束cctype。
該約束確保stock表type字段的取值必須是字符'D'、'C'、'R'之一。
在控制中心中右鍵單擊stock表,在彈出菜單中選擇“改變”,在“改變表—stock”窗口中選擇“檢查約束”標簽頁,點擊“添加”按鈕,再在檢查條件框中輸入:
type in ('D', 'C', 'R')
約束名一欄輸入cctype,點擊“確定”按鈕關閉“添加檢查約束”窗口,再點擊“確定”按鈕關閉“改變表—stock”窗口。
2. 檢查約束的相關信息可通過SYSCAT.CHECKS、SYSCAT.COLCHECKS、SYSCAT.TABCONST和SYSCAT.TABLES這些視圖獲取。
在命令中心中輸入:
select constname, tabname, colname from syscat.colchecks
3. 在命令中心中輸入如下SQL語句,列出的約束中,TYPE為K表示是一個檢查約束,TYPE為P表示是一主鍵,TYPE為F表示是一外鍵
select constname, tabname, type from syscat.tabconst
4. DB2命令窗口中輸入如下命令執行腳本ckchk.sql,並將輸出結果重定向到ckchk.file:
Db2 –tf ckchk.sql > ckchk.file
More ckchk.file
然後檢查該輸出文件的內容與ckchk.master有無差別:
fc /w ckchk.file ckchk.master | more
七. 為reorder表創建觸發器,當stock表某一存貨少於6時,reorder表中將會插入一條新記錄(選做)
1. 將要建立的觸發器應具備下列性質:
ü 觸發器名為reorder;
ü 觸發時機為更新stock表某些記錄的qty字段值後該字段值小於或等於5;
ü 新記錄變量new通過n來引用;
ü 該觸發器將新記錄變量的itemno值和當前時間截插入到reorder表;
ü 應為for each row mode db2sql觸發器。
右鍵單擊控制中心MUSICDB下的“觸發器”,在彈出菜單中選擇“創建”,在創建觸發器窗口中,輸入觸發器模式選為inst1,表或視圖模式選為inst1,觸發器名為reorder,表或視圖名稱選為stock,觸發操作的時間選為“之後”,導致執行觸發器的操作設為“更新列”並選擇qty列,然後選擇“觸發操作”標簽頁,在“新行的相關名”中輸入n,在觸發操作框內填入如下SQL語句:
when (n.qty<=5)
insert into reorder values (n.itemno, current timestamp)
點擊“顯示SQL”按鈕查看完整的SQL語句。
點擊“確定”按鈕,然後在控制中心查看該觸發器是否列出。
2. 觸發器的相關信息可以通過SYSCAT.TRIGGERS和SYSCAT.TRIGDEP獲取。
在命令中心中輸入如下SQL語句:
select trigname,tabname,trigevent from syscat.triggers
其中trigevent為I表示觸發操作為insert,D表示觸發操作為delete,U表示觸發操作為update。
在命令中心中輸入下列SQL語句:
select trigname, btype, bschema, bname from syscat.trigdep
實驗四:移動與操縱數據(4學時)
實驗任務:
A. 學習Insert、Select和Update等SQL語句的應用;
B. 使用import工具從一文件讀取數據寫入表格;
C. 使用load工具從一文件讀取數據快速寫入表格;
D. 建立異常表;
E. 管理檢查約束,觸發器以及檢查暫掛狀態。
一. 數據插入、刪除
1. 利用SQL語句插入數據,並查看結果。
(1) 將下列數據插入到表albums中(一次插入一行)
TITLE ARTNO ITEMNO
Greatest Hits 1 1
Voice in the Wind 2 5
在“控制中心”,右鍵單擊表albums,選擇“內容采樣”,查看表中結果。
(2) 將下列數據插入到表artists中
ARTNO NAME CLASSIFICATION BIO PICTURE
99 Double Dare R
Patti & Cartwheels S
1 Alabama C
2 Bogguss, Suzy S
3 Black, Clint C
Brooks, Garth C
5 Chapin-Carpenter, Mary R
6 Gill, Vince C
7 Jackson, Alan C
8 Judds C
在“控制中心”,右鍵單擊表artists,選擇“內容采樣”,查看表中結果。
(3) 重新進行⑴的插入操作,並查看albums表中的插入結果。
(4) 將下列數據一次插入到表albums中
TITLE ARTNO ITEMNO
American Pride 1
Something Up My Sleeve 2 4
Put Yourself in My Shoes 5 7
在“控制中心”,右鍵單擊表albums,選擇“內容采樣”,查看表中結果。
2. 刪除數據
(1) 刪除表artists中ARTNO為99的記錄信息。
(2) 將表albums中TITLE為Voice in the Wind的記錄刪除。
(3) 將CLASSIFICATION為R的演員的唱片集從albums表中刪除。
二. 使用import工具導入數據到artists表,稍後執行腳本文件導入數據到albums和stock表。首先用用戶名inst1登陸。
1. 使用import工具導入數據到artists表。
(1) 導入數據
在控制中心中右鍵單擊artists表,在彈出菜單中選擇“導入”。在“導入表—artists”窗口中,按要求輸入下列信息:
ü “導入文件”一欄輸入X:/....../artists.exp;
ü “導入文件類型”設為集成交換格式(IXF);
ü “導入方式”設為INSERT;
ü “消息文件”一欄輸入X:/cf23/art.msg,單擊“確定”按鈕。
(2) Windows命令提示符窗口中輸入more < art.msg,查看消息文件中的警告或錯誤信息,並注意有多少行數據成功插入表中。
2. 在“命令中心”的腳本模式下分別運行腳本imp_albu和imp_sto,該腳本將數據導入到albums表和stock表中。腳本執行完畢後查看消息文件albums.msg和sto.msg是否有任何附加信息,並注意分別有多少行數據成功插入表中。
三. 創建異常表—artists,albums,stock
所有的異常表將存儲在SMSEXP表空間,注意異常表的定義與原表非常相似,前N列的列名和數據類型與原表精確匹配。第N+1列為可選列,數據類型為timestamp。第N+2列也為可選列,且只有在第N+1列存在時才能被創建,該列必須定義成32KB或更大的CLOB類型,用來存放導致該行被拒的特定約束信息。
在命令中心腳本模式下導入並執行腳本crexptab,該腳本分別為artists、albums、stock創建異常表artexp、albexp、stoexp。
四. 備份數據庫
後面的實驗將使用Load Replace 命令裝入數據,要使該操作可恢復,需要先將現有的數據進行備份。數據庫備份與恢復的細節將會在以後的實驗有所涉及。
在db2命令窗口中輸入如下命令實現數據庫備份操作:
X:
Cd /
Md X:/backup
Db2 force application all
Db2 backup db MUSICDB to X:/backup
五. 使用load插入模式載入數據到concerts表
右鍵單擊concerts表,在彈出菜單中選擇“裝入(L)”;在“類型”頁,選擇“將數據附加到表中”,在“文件”頁,輸入下列信息:
ü 要載入文件為concerts.exp;
ü 文件格式為ixf格式;
ü 載入數據使用插入模式;
ü 載入過程中所有消息重定向到concerts.msg文件當中。
ü 在“調度任務執行”中,選擇“立即執行而不保存歷史任務”
在“總結”頁面,查看相應的SQL語句,並點擊“完成”。
查看消息文件concerts.msg,注意有多少行成功載入並插入到表中:
more < concerts.msg
六. 使用load工具的替換模式載入數據到表artists中
在命令中心運行腳本load_art,將數據裝入到artists表中。
ü 本次載入使用了與前次import不同的IXF輸入文件,且使用了替換選項將先前導入的行替換掉。,在帶有異常選項的載入過程中,所有違反唯一限制(主鍵或唯一索引)的數據行將會放入artists的異常表artexp中。
ü 查看artexp表中是否存有那些違反artists上唯一鍵索引的數據行,在命令中新腳本模式下導入並執行selexp。
ü 查看消息文件X:/cf23/load_art.msg內容:
more < load_art.msg
七. 使用SET INTEGRITY命令管理檢查暫掛狀態
1. 用Set Integrity 管理檢查暫掛狀態
(1) 在命令中心導入並執行腳本seltab,該腳本將對表artists、stock、albums執行查詢操作,查看執行結果。
(2) 上述腳本執行後返回SQL0668原因代碼1,命令中心中輸入:
? SQL0668
因為這些表處於檢查暫掛狀態,所有對這些表的數據操作都不能執行,輸出信息同時提示用戶執行SET INTEGRITY語句以消除表的檢查暫掛狀態。
(3) 在命令中心中執行腳本listtbst查看這些表上檢查約束的狀態。Artists表處於檢查暫掛狀態。
(4) SET INTEGRITY語句可被用來檢查數據是否違反參照完整性約束,處於檢查暫掛狀態的表(artists表)應被指定一個與它對應的異常表。在命令中心中導入並執行setcsts_arts腳本來檢查artists表中參照完整性約束。
(5) 警告“sql3601”。在命令中心中輸入? Sql3601,由幫助信息可知set integrity語句導致一個或多個表處於檢查暫掛狀態。
(6) 命令中心中導入並執行listtbst腳本,執行後可見albums和stock表處於檢查暫掛狀態。
(7) 命令中心中輸入並執行腳本setcsts_2,為albums和stock表設置完整性,檢查它們上的參照完整性,並指定它們的異常表。
(8) 對artists、stock、albums表執行查詢操作以確認這些表已消除檢查暫掛狀態,在命令中心中導入並執行腳本listtbst和seltab,執行結果表明檢查暫掛狀態都以消除。
2. 將異常表中的數據放回原來表中
(1) 為解除檢查暫掛狀態,那些違反約束的行被移動到異常表中。在命令中心中導入並執行腳本selexp察看異常表中的數據。
(2) 從stock移動到Stoexp的數據以及從albums移動到albexp的數據,這些數據的外鍵值都無法與artists表中的主鍵相匹配。執行下列SQL語句在artists表中插入一行數據:
insert into artists (artno, name, classification) values (100, 'Patti & Cart Wheels', 'S')
(3) 現在要將stoexp和albexp表中的行分別插入到表stock和albums中,首先執行腳本selexp查看兩異常表中數據,檢查兩異常表的MSG列,注意並不需要將N+1和N+2列數據插入到stock和albums表。
(4) 在命令中心中導入並執行腳本insexp將stoexp和albexp中的數據插入到表stock和albums,insexp腳本也會對stock和albums執行查詢操作以檢查異常表中數據是否成功插入到原表。
八. 理解檢查約束的強制執行
上節實驗中為stock表的TYPE列添加的檢查約束cctype,要查看該約束的內容,可以在“命令中心”中右鍵單擊表stock並在彈出菜單中選擇“改變”,再在“改變表—stock”窗口中選擇“檢查約束”標簽頁,選擇cctype約束然後單擊“更改”按鈕,查看該約束的定義。
在命令中心中輸入並執行如下SQL語句:
insert into stock values (302,'V',100.00,20)
輸出結果返回SQL0545,該錯誤代碼表明因為插入的數據不滿足檢查約束inst1.stock.cctype,所以要請求的操作不被允許。
在命令中心中輸入並執行如下SQL語句:
insert into stock values (302,'C',100.00,20)
因為'C'滿足檢查約束cctype,所以該SQL語句成功執行。
九. 理解觸發器的強制執行
回顧上節實驗中在表stock的QTY列上創建的觸發器reorder。選擇命令中心的“腳本”標簽頁,然後輸入並執行下列SQL語句:
select substr(text,1,200) from syscat.triggers where tabname='stock'
在命令中心中輸入並執行下列SQL語句來修改stock表中itemno等於302的元組的qty字段值:
update stock set qty=3 where item=302
注意執行該語句後沒有消息顯示觸發器是否被觸發。
查看reorder表,檢查在更新stock表qty列後觸發器reorder是否被觸發。在“命令中心”中輸入:
terminate
connect to musicdb
select * from reorder
上節實驗為表reorder建立了別名emptystock,在命令中心中輸入並執行下列SQL語句:
select * from emptystock
輸出結果表明對別名emptystock執行的查詢操作會直接轉化成對reorder表的操作。
實驗五:數據查詢(2學時)
實驗任務:
A. 簡單查詢和連接查詢;
B. 子查詢;
C. 列函數和標量函數應用;
D. 分組;
E. 排序。
一. 利用SQL語句實現數據查詢
打開“命令中心”,在“交互式”頁面中,輸入Connect to MUSICDB,連接到數據庫。然後針對下列內容,寫出相應的SQL查詢語句。
各SQL語句,包括Select、Insert、Update和Delete等,也可以通過“命令中心”中的“SQL助手”完成。
1. 從artists表中,查詢CLASSIFICTION為C或B的演員的信息。
2. 查詢名(NAME)為Beatles的演員的唱片集的名稱,並將結果按唱片集名稱的升序排列。
3. 查詢所有音樂會的信息,包括時間、地點以及演員的名稱。
4. 查詢CLASSIFICTION為C的演員所舉辦的音樂會的信息,包括時間、地點。
5. 查詢在Paris舉辦的音樂會的演員名字,及這些演員所出版的唱片集名稱。
6. 查詢CLASSIFICTION為B的演員的唱片集的名稱、庫存數量,並按庫存數量的升序排列結果。
7. 查詢所有albums表中,有唱片集的演員的數量。
8. 按唱片類型(TYPE)分別統計唱片的數量、平均價格、最高價格及最低價格。
9. 按唱片類型(TYPE)分別統計唱片最低價格不小於10.00元的唱片的數量。
實驗六:數據庫恢復(2學時)
實驗任務:
A. 為數據庫和表空間創建備份鏡像;
B. 從備份鏡像恢復數據庫;
C. 對數據庫或表空間進行完全的前滾恢復;
D. 在異常狀態下重新激活數據庫。
一. 決定DB2目前的日志配置參數
1. 本實驗開始之前應先在命令中心中執行腳本recovrst,將數據庫的配置參數設置成本實驗所需的值。
2. 在命令中心中輸入並執行connect to musicdb,激活MUSICDB數據庫。
3. 控制中心中右鍵單擊MUSICDB數據庫,在彈出菜單中選擇“配置參數”,再在“數據庫配置—MUSICDB”窗口中查看“日志”下的LOGFILSIZ的值,該參數的值被設置為6,遠小於Windows平台下它的默認值250。
4. 查看主日志文件的數目,DB2將於什麼時候分配這些主日志文件?
在“數據庫配置—MUSICDB”窗口中的“日志”下可查看到LOGPRIMARY參數值為3,當我們發出ACTIVE DATABASE命令或者第一個應用程序連接到數據庫時,DB2將會分配這三個主日志文件,且其中每個日志文件的大小為LOGFILSIZ+2個4KB頁,因此所有主日志文件將占據3*(6+2)*4KB,即96KB空間。
5. 查看輔助日志文件的數目,DB2將於何時分配這些輔助日志文件?
輔助日志文件會在事務未提交但主日志文件寫滿的時候根據需要一次分配一個(直到數據庫配置參數LOGSECOND規定的數目),本實驗中LOGSECOND為默認值2,因此系統最多允許兩個輔助日志文件。輔助日志文件的大小同樣由參數LOGFILSIZ指定。
6. 查看當前系統所使用的日志類型(循環日志還是歸檔日志),哪些參數可以提供日志類型的相關信息。
LOGRETAIN和USEREXIT可被用來設置系統采用何種日志類型,本實驗中這兩個參數均被設為默認值否,因此系統采用循環日志方式。如果LOGRETAIN被設為Recovery或者USEREXIT被設為Yes,那麼系統將采用歸檔日志方式。
7. 考慮循環日志能夠支持崩潰恢復、版本恢復、前滾恢復中的哪些類型?
循環日志只能支持崩潰恢復和版本恢復,但還不能支持前滾恢復!
8. 考慮日志文件保存在哪裡?
配置參數中的LOGPATH指定日志文件的保存路徑,因此本實驗的日志文件保存在X:/inst1/NODE0000/SQL00001/SQLOGIR下。
9. 數據庫的工作單元可能被意外地中斷,假如部分工作單元的所有變更完成和提交之前發生了電源故障,那麼系統就需要執行崩潰恢復再次回到一致狀態。命令restart database可以實現這個功能。如果AUTORESTART被設置成開(默認方式),那麼崩潰發生後,應用程序首次連接到數據庫時將會自動啟動崩潰恢復機制。本實驗AUTORESTART參數被設置為開。
10. Windows命令提示符下,進入目錄X:/inst1/NODE0000/SQL00001。
11. 輸入命令:dir /w,查看該路徑下有哪些文件和目錄。
12. 輸入命令cd SQLOGDIR和dir /w可以查看到該目錄下有三個日志文件,這與參數設置相符。
13. 選擇命令中心的“交互式”標簽頁,再選擇“命令中心—>選項”菜單,在“命令中心選項”窗口中選擇“執行”標簽頁,確保“自動落實SQL語句”未被選中。點擊“確定”按鈕。
執行connect to musicdb
執行update stock set qty=qty+1
14. 如果上步執行後系統顯示錯誤則跳到下一步,如果沒有顯示錯誤信息,則繼續執行:
update stock set qty=qty-1,這時系統會返回SQL0964C。
15. 為查看詳細的錯誤信息,輸入並執行? SQL0964。回答為什麼更新操作會失敗。
16. 選擇命令中心的“交互式”標簽頁,再選擇“命令中心—>選項”菜單,在“命令中心選項”窗口中選擇“執行”標簽頁,選中“自動落實SQL語句”,點擊“確定”按鈕。
17. 本實驗中日志文件故意被設置得很小,所以上面的更新操作未能成功完成,在命令中心中輸入並執行如下命令:
rollback
18. 進入日志保存目錄,查看該目錄下的文件有幾個:
cd X:/inst1/NODE0000/SQL00001/SQLOGIR
dir /w
可查看到該目錄下現在多了兩個文件,當采用循環日志且主日志文件已滿時,DB2就會分配這兩個多出來的文件作為輔助日志文件。
輸入cd / ,進入根目錄下。
二. 循環日志條件下的數據庫恢復
1. 在Windows命令提示符下輸入md /restore 在X驅動器下建立一個目錄用來保存數據庫備份。
2. 試圖對MUSICDB數據庫進行聯機備份。
在控制中心中右鍵單擊MUSICDB數據庫,在彈出菜單中選擇“備份”。
在“備份向導”窗口中,選擇“映象”標簽頁,選擇“介質類型”為文件系統,點擊“添加”按鈕,路徑一欄輸入x:/restore
點擊向導的“選項”標簽頁,這時注意“可用性”下的“聯機”選項為灰色不可選,只能進行脫機備份。
3. 對MUSICDB數據庫進行脫機備份,
在上步的“備份向導”窗口中“選項”標簽頁中選擇可用性為“脫機”,不要選中“在啟動脫機操作之前停頓數據庫”選項;
點擊備份向導的“調度”標簽頁,選擇“立即運行而不保存歷史任務”,然後點擊“完成”按鈕。
4. 系統返回SQL01035表明備份失敗,根據提示消息可知目前正有另一個程序在連接並使用要脫機備份的數據庫,點擊“DB2 消息”窗口的“關閉”按鈕。
5. 為了確保所要備份的數據庫的完整性,脫機備份要求獨占該數據庫。因為剛才我們通過命令中心連接到數據庫且該連接一直保持到現在,所以脫機備份不能成功。在命令中心中輸入如下命令強制所有用戶或應用程序切斷與該數據庫的連接:
force application all
terminate
6. 按照第三步重新脫機備份數據庫MUSICDB,這次備份成功。
7. 記錄這次備份的時間截。
在控制中心中選擇“工具—>日志”菜單,在“日志”窗口中選擇“數據庫歷史”標簽頁,點擊“數據庫”一欄右邊的“…”省略號按鈕,選擇相應的系統名、實例名、數據庫名,然後點擊“確定”按鈕;
按“開始日期”排序MUSICDB所有事件列表,那麼本次備份應在列表最上端,記錄下該備份的開始日期及時間;
關閉“日志”窗口,然後回到控制中心來。
8. 如果要使用restore命令而不是控制中心來恢復數據庫,且備份目錄下存在數據庫的多個備份鏡象,那麼,為了指定用哪一份(何時產生的)備份文件,備份的時間截信息就是必須的。
如果使用磁盤備份數據庫,那麼備份鏡象的文件名就包含著時間截信息,如果使用磁帶或者Tivoli Storage Manager管理的設備作為備份的存儲介質,那麼備份鏡像的頭部也包含著相關的時間信息。
9. 另外一種查看備份相關信息的方法是使用list backup命令,回顧上節實驗我們使用load工具之前也備份了數據庫MUSICD。命令中心中輸入如下命令:
terminate ;
list backup all for musicdb ;
10.查看上步命令的輸出列表,注意所有的時間截及表空間信息。
11.在list backup命令中可以不使用ALL 關鍵字,可以指定一個特定的時間截或對象名來限制輸出結果,例如要查看某時間以後對MUSICDB進行的所有備份,可以輸入:
12.list backup since yyyymmddhh for MUSICDB
13.數據庫管理器所維護的有關備份的歷史信息如果從不刪除會變得非常多,通過prune history命令可以整理那些備份的相關信息。命令行處理器或命令中心中輸入命令查看的prune的在線幫助信息:? Prune
14.在Windows命令提示符下輸入如下命令,可以發現備份的目錄結構及文件名與備份的數據庫名、實例名、時間截之間的對應關系:
x:
cd restore
dir
cd MUSICDB.0
dir
cd inst1
dir
cd NODE0000
dir
cd CATN0000
dir
cd yyyymmdd
dir
可見備份文件名的格式都為“hhmmss.001”。
15.本實驗中數據庫MUSICDB備份後其中數據還未經過任何改動,現在的數據與備份中的數據完全相同。首先執行下面SQL語句選擇出編號為77的藝術家的名字和他的專輯名:
select name,title from artists a,albums b where a.artno =77 and a.artno= b.artno;
16.將編號為77的藝術家的名字改為“Melanie and the Mechanics”,並且將編號為261的專輯名改為“Unmaterial Girl”:
update artists set name='Melanie and the Mechanics' where artno=77;
update albums set title ='Unmaterial Girl' where itemno=261;
17.執行下列連接查詢查看上步的修改結果:
select name,title from artists a,albums b where a.artno =77 and a.artno= b.artno;
可見這次的輸出與前面的查詢結果不同。
18.假如現在MUSICDB所在的磁盤出現故障,我們將使用剛剛創建的備份鏡像對MUSICDB進行恢復。輸入“?restore”命令獲得恢復命令的幫助信息。
19.恢復前為確保當前沒有用戶或應用程序連接到MUSICDB數據庫,命令中心中輸入並執行如下命令:
force application all;
terminate;
20.從X:/restore目錄下讀取備份文件對MUSICDB進行恢復。
在控制中心中右鍵單擊MUSICDB數據庫,在彈出菜單中選擇“復原”;
選擇“復原數據向導”窗口的“介紹”頁面,選擇“復原到現有數據庫”;
選擇向導的“復原對象”頁面,選擇“復原整個數據庫”;
選擇向導的“可用的映象”頁面,選擇剛剛備份的映象,然後點擊“>”按鈕;
選擇向導的“調度”頁面,選擇“立即運行而不保存歷史任務”;
選擇向導的“總結”頁面,點擊“顯示命令”按鈕查看全部restore命令;
點擊向導的“完成”按鈕,等待一段時間後系統彈出“DB2 消息”窗口顯示命令成功完成,點擊“確定”按鈕關閉該消息窗口。
21.重新連接到數據庫,輸入並執行下列連接查詢語句:
connect to MUSICDB;
select name,title from artists a,albums b where a.artno =77 and a.artno= b.artno;
可見這次查詢的輸出結果反映的是更新前的原數據,所以恢復操作成功完成。
22.上面的恢復操作雖然復原了更新前的數據,但是因為DB2使用了循環日志方式,無法前滾,所以無法救回備份後對數據庫所作的更新。
三. 歸檔日志條件下的數據庫恢復
1. 在Windows命令提示符下輸入如下命令創建數據庫的備份目錄(X:/RESTORE):
MD /RESTORE
2. 更改數據庫配置文件以采用歸檔日志方式。
在命令中心中輸入並執行下列命令:
update db cfg for musicdb using logretain recovery
四. 重新設置實驗環境
完成下列任務以確保剩余實驗的環境設置正確:
1. 在命令中心中導入並執行X:/cf23/clrec腳本。
2. 檢查數據庫配置文件,確保目前數據庫采用循環日志方式。
命令中心中輸入並執行下列語句:
connect to musicdb
get db cfg for musicdb
可見輸出結果中“恢復狀態的日志保留”為NO。
實驗七:管理權限(2學時)
實驗任務:
A. 熟悉DB2 UDB中PUBLIC組的默認特權;
B. 學會管理DB2權限(SYSADM,SYSCYRL,SYSMAINT和DBADM),熟悉各種權限的操作能力;
C. 能夠對單個用戶和組授予特權;
D. 清楚何時組特權可用和何時需要個人特權等。
一. 默認的PUBLIC特權
1. 建立新用戶user1
(1) 使用Windows控制面板中的用戶管理程序按下列要求創建一個新用戶:
用戶名:user1
密碼:user1
全名:USER1
描述:DB2 User
(2) 在命令中心中輸入如下命令確保沒有應用程序或用戶連接到INST1實例:
force application all;
terminate;
(3) 將stock表的更新權限授予user1用戶:
connect to musicdb;
grant update on stock to user1;
2. 從DB2的控制中心,確定當前數據庫的所有用戶的默認權限。
從DB2控制中心,選擇MUSICDB數據庫,右鍵選擇”權限”,然後分別選擇“組”和“用戶”頁,查看有哪些組和用戶,分別具有什麼樣的權限?
(1) 具有授權的任一個ID用戶可以對MUSICDB進行的操作包括:創建數據庫、添加新的PACKAGES,連接到數據,以及隱式地創建模式等。
(2) NOFENCE列包含一個“not”符號,這表示PUBLIC組不具有創建NOT FENCED用戶自定義函數的特權,該工作需要授予某個用戶,和創建用戶自定義函數相關的另一個命令CREATE EXTERNAL ROUTINE也不缺省地授予PUBLIC的特權。
(3) 在LOAD列上也具有“not”符號,表示PUBLIC組不能夠進行LOAD操作,只有SYSADM,DBADM,或在數據庫上具有LOAD及與LOAD操作相關的其他操作特權的用戶,可以進行LOAD操作。
(4) 要查看所有的授權信息,可以通過SYSCAT.DBAUTH視圖來進行。
3. 建立一個以不同用戶連接到數據庫MUSICDB的對話。
打開DB2命令窗口,輸入“title user1”。以user1用戶連接到數據MUSICDB
db2 connect to musicdb user user1 using user1
輸入下列SQL語句:
db2 “select substr(tbspace,1,18) from syscat.tablespaces”
由於PUBLIC組中,SELECT是默認的特權,自然user1用戶也能夠執行查詢操作。
4. 驗證建表權限
(1) 輸入下列SQL語句:
db2 "create table test1 (partno integer,subpart integer) in DMS04"
該語句不能夠成功執行,因為user1用戶在DMS04表空間上沒有USE特權。
(2) user1用戶要想實現上述操作,可以通過其他用戶對其授權實現,假設corp_spy用戶具有相應的權限,可以實現對user1用戶的授權。在DB2的命令窗口中輸入下列命令即可:
title corp_spy
db2 connect to musicdb
db2 grant use of tablespace dms04 to user user1
(3) user1用戶可以重新輸入下列命令來實現上述操作:
db2 "create table test1 (partno integer,subpart integer) in DMS04"
此時,該語句就會成功執行。
5. 在命令中心,列出表空間DMS04中的所創建的所有表。
(1) user1可以通過下列方法可查看MDS04表空間的ID:
在控制中心,在MUSICDB數據庫下選擇Views,然後選擇TABLESPACES視圖,並用右鍵查看其內容,可以看到DMS04的ID為6。
(2) 在命令中心的交互頁面,輸入下列命令:
minate
connect to musicdb
select tabschema, name from syscat.tables where tbspaceid = 6
6. 以用戶inst1身份,通過GUI將表user1.test1從數據庫中刪除。這裡需要清楚的是,inst1之所以能夠刪除該表,是因為該用戶具有系統管理員權限。
7. 撤銷PUBLIC的默認權限。
在控制中心,在MUSICDB數據庫的用戶和組左側單擊+號,選擇DB Group,然後在內容部分選擇PUBLIC,右鍵選擇change,然後去掉其連接數據庫、創建表、創建包等選項。
8. 再以user1用戶創建表test1:
db2 create table test1 (partno integer,subpart integer) in DMS04
由於CREATETAB特權被撤銷,所以用戶user1不能夠再創建該數據表。但是此時user1與數據庫的連接仍然處於活動狀態。
二. DB2的權限
1. Inst1既是Windows的管理員,又是DB2的系統管理員。用inst1的Windows管理權限創建四個新的用戶:usersys,userctl,usermnt和userdba,密碼與用戶名相同。在DB2的命令窗口,輸入下列命令:
net user usersys usersys /add
net user userctl userctl /add
net user usermnt usermnt /add
net user userdba userdba /add
然後輸入下列命令:
net localgroup STAFF /add
net localgroup STAFF userdba /add
下面以usersys來作數據庫系統管理員。首先通過inst1實例的數據庫管理器配置參數,查看一下當前的系統管理員組是否是AMD1。
2. 在DB2命令窗口中輸入下列命令,可以查看ADM1組中的用戶。
net localgroup ADM1
這些用戶具有數據庫管理員權限。要是其他用戶也要具有該權限,需要將其加入到ADM1組中。
3. 在DB2命令窗口中輸入下列命令,將usersys添加到ADM1組中,並可通過net localgroup ADM1命令查看加入usersys用戶後ADM1組中用戶的變化。
net localgroup ADM1 usersys /add
4. 在DB2命令窗口中輸入title usersys。
5. 從usersys對話,可以確認usersys已經具有了相應的權限。
db2 connect to musicdb user usersys using usersys
db2 select name from inst1.artists
db2 grant delete on inst1.artists to public
db2 revoke delete on inst1.artists from public
db2 get snapshot for locks on musicdb |more
雖然在第一部分中的Revoke已經撤銷了部分public特權,但這些語句全部能夠成功執行,因為數據庫系統管理員可以完成任何工作。
6. 作為具有sysadm權限的用戶,usersys可以更新數據庫管理器配置文件。如:
db2 update dbm cfg using sysctrl_group ctrl1 sysmaint_group maint1
該更改生效,需要執行下列語句:
db2 force application all
db2 terminate
db2stop
db2start
從控制中心,可以查看到更改後配置參數。
7. 在DB2命令窗口,創建一個名為CTRL1的組,並為之添加一個成員userctl,然後創建一個MAINT1組,並添加一個用戶usermnt。
net localgroup CTRL1 /add
net localgroup MAINT1 /add
net localgroup CTRL1 userctl /add
net localgroup MAINT1 usermnt /add
8. 通過title命令分別為userctl和usermnt兩個標題分別為userct和usermn命令提示窗口。
9. 在userctl的命令窗口中,輸入下列語句以查看該用戶具有的權限:
db2 connect to musicdb user userctl using userctl
db2 get authorizations
我們會發現該用戶具有SYSCTRL權限,即系統控制權限。
10. 在usermntl的命令窗口中,輸入下列語句以查看該用戶具有的權限:
db2 connect to musicdb user usermnt using usermnt
db2 get authorizations
usermnt用戶具有SYSMAINT權限,即系統維護權限。
11. 在userctl的命令窗口中,輸入下列語句(此時不要做其他任何授權操作):
db2 create table test1 (col1 char(1))
db2 drop table inst1.reorder
db2 select * from inst1.music
這三個語句均不能夠成功執行,都會遇到權限錯誤。因為SYSCTRL權限不能夠訪問數據庫對象,而SYSMAINT權限是SYSCTRL的子集,對SYSCTRL不能完成的操作,SYSMAINT也不能實現。
12. 在userctl的命令窗口中,執行下列SQL語句:
db2 select name from inst1.artists
該語句會成功執行,因為從表artists中查詢數據的特權被授予了PUBLIC,該特權可以通過控制中心,在用戶和組的查看。需要清楚,和SYSCTRL權限相關的特權不是對特定表的,而是面向實例的。
13. 在userctl的命令窗口中,為MUSICDB數據庫指定一個新的別名:
db2 catalog db musicdb as ctrlsdb
14. 在userctl和usermnt的命令窗口中輸入db2 terminate命令。
15. 將userdba添加為數據庫管理員。在控制中心,右鍵點擊MUSICDB數據庫,選擇Authorities,然後單擊ADD命令,在用戶頁面,選擇用戶userdba,並為其添加DBADM權限。添加後可以通過控制中心,在DBAUTH視圖中查看到該用戶的權限。
16. 將userctl的的命令窗口標題改為userdba。
Title userdba
17. 在userdba的命令窗口中,輸入下列命令,連接到MUSICDB數據,並執行如下操作:
db2 connect to musicdb user userdba using userdba
db2 select name from inst1.artists
db2 create table test1 (col1 char(1))
db2 create table inst1.dlc (col1 char(1))
db2 drop table inst1.dlc
三. DB2用戶和組特權
1. 以userdba用戶身份,將下列內容插入到inst1.artists表中。
db2 insert into inst1.albums values('DB2 Connect is My Life',99,310)
db2 insert into inst1.albums values('Rustle Up',99,311)
2. 系統維護權限用戶usermnt沒有SQL特權,從userdba的命令窗口對其授予delete特權:
db2 grant delete on inst1.albums to usermnt
3. 從usermnt的命令窗口,連接到數據庫MUSICDB,並執行表inst1.albums的刪除行操作:
db2 connect to musicdb user usermnt using usermnt
db2 delete from inst1.albums where itemno = 310
4. 如果上述刪除操作被inst1發現,並且inst1通過與授權相似的方式,將userdba的DBADM權限收回。同時,userdba想將刪除的內容重新插入:
db2 insert into inst1.albums values('DB2 Connect is My Life',99,310)
但是該操作是被禁止的,因為userdba不再具有數據庫管理權限,不能再對其他用戶模式下創建的數據進行操縱。
5. 如果userdba是數據對象的創建者,當被撤銷數據庫管理權限時,仍可執行如上的操作。如對userdba創建的表test1,仍可進行下列操作:
db2 select * from test1
db2 drop table test1
6. 通過db2 terminate和exit命令分別關閉用戶userdba、usermnt、usersys等對話窗口。
實驗八:應用程序開發(選做)
實驗任務:
練習並掌握常用的數據開發方法,實現和數據庫的連接,並完成數據的讀取等操作,主要內容包括:
A. 嵌入式SQL應用程序開發;
B. 基於OLE DB/ADO技術的DB2應用程序開發;
C. 基於JDBC技術的DB2應用程序開發;
D. 基於SQLJ的DB2應用程序開發。
該實驗主要由學生課下完成。
一. 建立與數據庫的連接,實現數據插入、刪除和查詢等操作。
1. 分別應用嵌入式SQL、OLE DB/ADO、JDBC和SQLJ實現數據庫的連接,並實現數據插入、刪除和查詢等操作,所查詢的結果,需要以適當的形式呈現給用戶。具體實現方法,請參閱電子書的相關內容,或其他應用開發技術文檔。
需要實現內容如下:
(1) 連接到MUSICDB數據庫
(2) 將下列數據插入到表artists中
ARTNO NAME CLASSIFICATION BIO PICTURE
200 Wang Fei R
201 Zhou Jielun S
202 Na Ying C
204 Zheng Zhihua S
(3) 將artists表中ARTNO為200的演員的名字(NAME)更改為Zhang Xueyou; 將名字(NAME)為Zheng Zhihua的演員的CLASSIFICTION 改為C 。
(4) 刪除表artists中名字為Zhou Jielun的演員的信息;將artists中編號大於200的演員的信息刪除。
(5) 實現實驗五中的一之1、2、3、7、8的查詢內容。
說明:
本實驗指導書的主要內容是在IBM培訓教材(CF23)實驗指導書的基礎上翻譯而來,並根據教學大綱對其中部分內容進行了修訂。
參考文獻:
1. IBM DB2 Universal Database Administration Workshop for Windows (Course Code CF231) —Instructor Exercises Guide
2. 楊鑫華,趙慧敏,丁傳華等. 《數據庫原理與DB2應用教程》.清華大學出版社. 2007.8
本文出自 “弓建朋的博客” 博客