#聲明臨時(shí)表
DECLARE GLOBAL TEMPORARY TABLE session.temp1
LIKE employee
ON COMMIT PRESERVE ROWS
NOT LOGGED
IN mytempspace
#ALTER
可以修改:緩沖池,表,表空間,視圖
#DROP
可以刪除:緩沖池,事件監(jiān)控程序,函數(shù),索引,模式,存儲(chǔ)過(guò)程,表,表空間,觸發(fā)器,視圖.
#產(chǎn)生數(shù)據(jù)備份
CREATE TABLE pers LIKE staff
INSERT INTO pers
SELECT id, name, dept, job, years, salary, comm
FROM staff
WHERE dept = 38
#唯一性約束
CREATE TABLE BOOKS (BOOKID INTEGER NOT NULL PRIMARY KEY,
BOOKNAME VARCHAR(100),
ISBN CHAR(10) NOT NULL CONSTRAINT BOOKSISBN UNIQUE)
ALTER TABLE BOOKS ADD CONSTRAINT UNIQUE (BOOKID)
#參照完整性約束
CREATE TABLE AUTHORS (AUTHORID INTEGER NOT NULL PRIMARY KEY,
LNAME VARCHAR(100),
FNAME VARCHAR(100))
CREATE TABLE BOOKS (BOOKID INTEGER NOT NULL PRIMARY KEY,
BOOKNAME VARCHAR(100),
ISBN CHAR(10),
AUTHORID INTEGER REFERENCES AUTHORS)
#表檢查約束
ALTER TABLE BOOKS ADD BOOKTYPE CHAR(1) CHECK (BOOKTYPE IN ('F','N') )
#創(chuàng)建索引
CREATE INDEX I2BOOKNAME ON BOOKS (AUTHOID DESC, BOOKNAME ASC)
#設(shè)置概要文件注冊(cè)表
設(shè)置后實(shí)例要重新啟動(dòng)
列出所有的變量: db2set -lr
設(shè)置變量:db2set variable_name=value
設(shè)置為缺省值:db2set variable_name=
顯示設(shè)置的變量:db2set -all
# 設(shè)置數(shù)據(jù)庫(kù)管理器和數(shù)據(jù)庫(kù)的參數(shù)
獲取當(dāng)前參數(shù):
db2 get database manager configuration
db2 get database configuration for database_name
db2 get database manager configuration show detail
設(shè)置參數(shù):
db2 update database manager configuration using parameter new_value
db2 update database configuration for database_name using parameter new_value
#準(zhǔn)備數(shù)據(jù)庫(kù)服務(wù)端口
db2set DB2COMM=TCPIP,NETBIOS
在services文件中包含服務(wù)和端口號(hào),
如:db2icdb2 50000/tcp
db2 update database manager configuration using svcename db2icdb2
重新啟動(dòng)數(shù)據(jù)庫(kù).
#查看連接的應(yīng)用程序
db2 list applications [for database db-name] [show detail]
#斷開(kāi)應(yīng)用程序
db2 force application (6,5)
db2 force application all
#設(shè)置客戶認(rèn)證方式
db2 update database manager configuration authentication auth_type
#創(chuàng)建緩沖池
create bufferpool BP2 size 25000 pagesize 8 k
CONNECT TO SCCRM;
ALTER BUFFERPOOL IBMDEFAULTBP IMMEDIATE NODE 1 SIZE 50000;
ALTER BUFFERPOOL IBMDEFAULTBP IMMEDIATE NODE 0 SIZE 50000;
CONNECT RESET;
#將表空間的狀態(tài)復(fù)位成正常(NORMAL)
quiesce tablespaces for table <tablename> reset
#有用的目錄表
SYSCAT.COLUMNS:所包含的每一行對(duì)應(yīng)于表或視圖中定義的每個(gè)列
SYSCAT.INDEXCOLUSE:列出索引中包含的所有列
SYSCAT.INDEXES:包含的每一行對(duì)應(yīng)于表或視圖中定義的每個(gè)索引(包括適用的繼承索引)。
SYSCAT.TABLES:所創(chuàng)建每個(gè)表、視圖、別名(nickname)或別名(alias)都對(duì)應(yīng)其中一行。所有目錄表和視圖都在 SYSCAT.TABLES 目錄視圖中擁有一項(xiàng)。
SYSCAT.VIEWS:所創(chuàng)建的每個(gè)視圖都對(duì)應(yīng)其中一行或多行。
###監(jiān)控DB2活動(dòng)
##捕獲快照
數(shù)據(jù)庫(kù),表空間,表,緩沖池,鎖,數(shù)據(jù)庫(kù)管理器,應(yīng)用程序
#拍攝快照
API,命令行
UPDATE MONITOR SWITCHES
#打開(kāi)和關(guān)閉快照
1,在實(shí)例級(jí)別上設(shè)置監(jiān)視器開(kāi)關(guān)(影響所有用戶和數(shù)據(jù)庫(kù))
DFT_MON_STMT:語(yǔ)句監(jiān)視器(用于動(dòng)態(tài) SQL)
DFT_MON_TABLE:表監(jiān)視器
DFT_MON_LOCK:鎖監(jiān)視器
DFT_MON_BUFPOOL:緩沖池監(jiān)視器
DFT_MON_SORT:排序監(jiān)視器
DFT_MON_UOW:工作單元信息
DFT_MON_TIMESTAMP:跟蹤時(shí)間戳記信息
db2 get dbm cfg|grep DFT_MON
db2 update dbm cfg using monitorSwitch [ON|OFF]
db2 update dbm cfg using DFT_MON_SORT ON
2,在應(yīng)用程序級(jí)別上設(shè)置監(jiān)視器開(kāi)關(guān)(只適合于特定的應(yīng)用程序)
在CLP中打開(kāi)只適合這個(gè)CLP
Bufferpool
Lock
Sort
Statement
Table
Timestamp
UOW
db2 get monitor switches
db2 update monitor switches using switchName [ON|OFF]
3,復(fù)位開(kāi)關(guān)
db2 reset monitor [ALL|for database databaseName] [at dbpartitionnum partitionNum]
將監(jiān)視器開(kāi)關(guān)的值復(fù)位成空或0.
#數(shù)據(jù)庫(kù)快照
包含如下信息:
連接
DB2 代理程序
鎖
排序
緩沖池活動(dòng)總數(shù)
SQL 活動(dòng)
SQL 語(yǔ)句數(shù)量
日志使用情況
高速緩存使用情況
散列連接
下面是獲取這種快照的命令
db2 get snapshot for database on databaseName
#數(shù)據(jù)庫(kù)管理器快照
db2 get snapshot for database manager
#表快照
db2 get snapshot for tables on drew_db
#表空間和緩沖池快照
db2 get snapshot for tablespaces on drew_db
db2 get snapshot for bufferpools on drew_db
計(jì)算緩沖池命中率:
Ratio = ((1-(physical index and data reads))/(logical index and data reads))*100%
#鎖快照
db2 get snapshot for locks on drew_db
#動(dòng)態(tài)SQL快照
#查找執(zhí)行速度較慢的SQL
SELECT stmt_text,total_exec_time,num_executions
FROM TABLE (SNAPSHOT_DYN_SQL('DREW_DB',-1)) as dynSnapTab
ORDER BY total_exec_time desc
FETCH FIRST 1 ROW ONLY
第二個(gè)示例查找平均執(zhí)行時(shí)間最長(zhǎng)的五條 SQL 語(yǔ)句:
SELECT stmt_text,
CASE WHEN num_executions = 0
THEN 0
ELSE (total_exec_time / num_executions)
END avgExecTime,
num_executions
FROM TABLE( SNAPSHOT_DYN_SQL('DREW_DB', -1)) as dynSnapTab
ORDER BY avgExecTime desc
FETCH FIRST 5 ROWS ONLY
### 事件監(jiān)控器
人們用快照來(lái)檢查某個(gè)精確時(shí)刻的DB2,并聚集性能信息。事件監(jiān)控器與此不同,人們用他在固定的時(shí)間
周期內(nèi)監(jiān)控DB2性能。事件監(jiān)視器檢查數(shù)據(jù)庫(kù)中的轉(zhuǎn)換事件,并將每個(gè)事件都當(dāng)成一個(gè)對(duì)象。這允許對(duì) DB2 的行為進(jìn)行非常詳細(xì)的分析。
事件監(jiān)視器捕獲的信息類似于快照捕獲的信息。同時(shí)可以運(yùn)行多個(gè)監(jiān)視器,并且每個(gè)監(jiān)視器也可以捕獲多種事件類型的信息。這允許不同的管理員相互獨(dú)立地監(jiān)控不同的活動(dòng)。
事件監(jiān)視器可以捕獲有關(guān)下列內(nèi)容的信息:
數(shù)據(jù)庫(kù)
表
死鎖
表空間
緩沖池
連接
語(yǔ)句
事務(wù)
可將事件監(jiān)視器的信息寫到:
SQL 表
文件
管道
##創(chuàng)建事件監(jiān)視器
CREATE EVENT MONITOR
##打開(kāi)和關(guān)閉監(jiān)視器
db2 set event monitor eventMonitorName state [0|1]
eventMonitorName 是已創(chuàng)建的事件監(jiān)視器的名稱。0 將關(guān)閉監(jiān)視器,而 1 將打開(kāi)監(jiān)視器。
#獲取狀態(tài)
SELECT EVENT_MON_STATE('drewTest') FROM SYSIBM.SYSDUMMY1
SYSIBM.SYSEVENTMONITORS 表及該表的視圖 SYSCAT.EVENTMONITORS 包含有關(guān)已創(chuàng)建的事件監(jiān)視器的信息。可以對(duì)這些表運(yùn)行 SQL 查詢,以確定監(jiān)視器的狀態(tài):
SELECT evmonname, target_type, target,
FROM syscat.eventmonitors
where evmonname LIKE 'drew%'
autostart 選項(xiàng)
用于創(chuàng)建事件監(jiān)視器的命令中的 autostart 選項(xiàng)表明,每當(dāng)數(shù)據(jù)庫(kù)啟動(dòng)時(shí),自動(dòng)啟動(dòng)事件監(jiān)視器。
#清空事件監(jiān)視器
注意:事件監(jiān)控器名稱使用大寫字母,需要?jiǎng)?chuàng)建目錄。
還可將事件監(jiān)視器數(shù)據(jù)清空到磁盤中。如果您希望記錄這類信息,如通常僅當(dāng)終止所有連接時(shí)才寫的數(shù)據(jù)庫(kù)事件,那么這非常有用。下面是一個(gè)示例命令:
db2 flush event monitor eventMonitorName
#使用事件監(jiān)視器
事件監(jiān)視器應(yīng)當(dāng)用于監(jiān)控非常具體的一些事件或短時(shí)間內(nèi)的工作負(fù)載。它
們旨在為您提供非常具體的信息,以允許您診斷數(shù)據(jù)庫(kù)或應(yīng)用程序的問(wèn)題或行為。
與快照不同,事件監(jiān)視器對(duì) DB2 的性能影響極大。這是由于為每個(gè)事件對(duì)象寫的
信息的數(shù)量造成的。語(yǔ)句監(jiān)視器對(duì)性能的影響極大,因?yàn)閿?shù)據(jù)庫(kù)引擎必須為每個(gè)
查詢執(zhí)行所有額外的工作:不只是能夠執(zhí)行查詢,DB2 引擎還必須寫出這條查詢
的所有特征和運(yùn)行時(shí)信息。該信息必須寫入文本文件,這樣會(huì)進(jìn)一步降低性能。
#死鎖監(jiān)控
CREATE EVENT MONITOR DEADLOCK_DB
FOR DEADLOCKS
WRITE TO FILE 'deadlock_db'
MAXFILES 1
MAXFILESIZE NONE
AUTOSTART
注意:事件監(jiān)控器名稱使用大寫字母,需要?jiǎng)?chuàng)建目錄。
#SQL監(jiān)控
SQL 監(jiān)視器十分有用,因?yàn)樗梢苑@動(dòng)態(tài)和靜態(tài) SQL 語(yǔ)句。如果應(yīng)用
程序利用了無(wú)法用 SQL 快照捕獲的預(yù)編譯 SQL 語(yǔ)句,那么該監(jiān)視器就
很重要。
對(duì)于每條被執(zhí)行的 SQL 語(yǔ)句記錄一個(gè)事件。每個(gè)語(yǔ)句的屬性(如讀取、
選擇和刪除等等操作的行數(shù))都被記錄下來(lái),但是不象在快照中那樣以
匯總的方式進(jìn)行表示。另外還記錄執(zhí)行的時(shí)間范圍以及啟動(dòng)和停止次數(shù)。這允許您對(duì)一些事務(wù)以及某個(gè)應(yīng)用程序的 SQL 執(zhí)行對(duì)其它應(yīng)用程序的 SQL 執(zhí)行有何影響進(jìn)行詳細(xì)分析。
還可以使用 SQL 監(jiān)視器來(lái)發(fā)現(xiàn)拙劣的執(zhí)行代碼;如果將輸出放入表中,
那么通過(guò)對(duì)個(gè)別代碼的執(zhí)行次數(shù)進(jìn)行搜索,可以做到這一點(diǎn)。由于運(yùn)行
SQL 監(jiān)視器的信息量以及性能開(kāi)銷,所以只應(yīng)在短期測(cè)試或問(wèn)題確定中
使用該技術(shù),而不應(yīng)在生產(chǎn)環(huán)境中使用它。
CREATE EVENT MONITOR BAR
FOR STATEMENTS
WRITE TO TABLE
STMT(TABLE drewkb.stmtTab)
includes(rows_read,rows_written_stmt_text)
#捕獲事件監(jiān)視器數(shù)據(jù)
db2eva [db databaseName] [evm eventMonitorName]
#利用EXPLAIN分析SQL
SQL 的 Explain 通過(guò)圖形化或基于文本的方式詳細(xì)說(shuō)明了 SQL 語(yǔ)句的每個(gè)部分是如何執(zhí)行以及何時(shí)執(zhí)行的。這包括以下一些基本信息:
正被訪問(wèn)的表
正被使用的索引
何時(shí)連接數(shù)據(jù)
何時(shí)排序數(shù)據(jù)
Explain 還捕獲更復(fù)雜的信息,在細(xì)究 SQL 正在發(fā)生什么時(shí),該信息非常有用:
表和索引基數(shù)
正連接的表和索引的順序
結(jié)果集的基數(shù)
在查詢的每部分正在選擇哪些字段
排序方法
SQL 每部分的時(shí)間范圍
要理解 Explain 信息,您需要掌握的最重要概念是 timeron。timeron 是 DB2 優(yōu)化器使
用的計(jì)量單位,用來(lái)計(jì)量完成查詢的時(shí)間和資源數(shù)量。timeron 綜合了時(shí)間、CPU 利用率、
I/O 和其它因素。由于這些參數(shù)值是變化的,因此執(zhí)行某個(gè)查詢所需的 timeron 數(shù)量是動(dòng)態(tài)
的,每次執(zhí)行該查詢所需的 timeron 都不同。
#使用控制中心的EXPLAIN SQL
觀察SQL的存取方案,分析優(yōu)化參數(shù),考慮優(yōu)化的級(jí)別。
#使用字符工具
db2 set current explain mode [no|yes|explain]
db2exfmt
可以從命令行調(diào)用 db2expln 工具,以獲得查詢的存取方案。但是,該工具不返回優(yōu)化器信息。
db2expln -database drew_db -statement "select * from syscat.tables" -terminal
#SQL故障診斷
索引使用,是否使用索引,使用索引的順序
表基數(shù)和"SELECT *" 的使用
優(yōu)化級(jí)別太低。
設(shè)置優(yōu)化級(jí)別:db2 set current query optimization [0|1|2|3|5|7|9]
##使用運(yùn)行狀況中心和內(nèi)存可視化工具
# 選定實(shí)例使用view memory usage,可以把輸出保存到文件。
除了提供了內(nèi)存可視化之外,該工具還允許您對(duì)某些參數(shù)值設(shè)置警報(bào)。警報(bào)的輸出將被寫到名為
threshold 的文件,該文件與 db2diag.log 位于同一目錄下。該目錄位于實(shí)例主目錄下。根據(jù)
您創(chuàng)建實(shí)例時(shí)所做選擇的不同,該位置也會(huì)不同。
# DB2運(yùn)行狀況中心
是否有充足的資源(如可用內(nèi)存、表空間容器或日志存儲(chǔ)器)來(lái)完成任務(wù)
資源使用是否有效
任務(wù)是否在可接受的時(shí)間周期內(nèi)完成,或者任務(wù)的完成是否不會(huì)大幅度降低性能
資源或數(shù)據(jù)庫(kù)對(duì)象是否不會(huì)永遠(yuǎn)處于不可用狀態(tài)
##DB2查詢巡視器和控制器
IBM 為 DB2 提供了兩種主要工具,它們?cè)试S您監(jiān)控和控制數(shù)據(jù)庫(kù)上 SQL 的執(zhí)行。DB2 控制器(Governor)用于控制
用戶和應(yīng)用程序執(zhí)行其 SQL 的優(yōu)先級(jí)。DB2 查詢巡視器(Query Patroller)為決策支持系統(tǒng)提供了查詢和資源管理。
該工具接受通過(guò)您系統(tǒng)的所有查詢,并對(duì)其進(jìn)行分析、優(yōu)先排序和調(diào)度。
DB2 查詢巡視器為決策支持系統(tǒng)提供了查詢和資源管理。該工具可以接受流經(jīng)您系統(tǒng)的所有查詢,并對(duì)其進(jìn)行分析、
優(yōu)先排序和調(diào)度。一旦完成查詢,用戶也將接到通知。在大型環(huán)境(其中完成某些查詢可能要花幾個(gè)小時(shí),或者不
同部門可能具有不同的系統(tǒng)優(yōu)先級(jí)或用途)中,該功能極其有用。
通過(guò)將工作重定向到合適的數(shù)據(jù)庫(kù)分區(qū),查詢巡視器還將執(zhí)行負(fù)載均衡,以確保某個(gè)數(shù)據(jù)庫(kù)分區(qū)的使用不會(huì)過(guò)于繁重
。該工具只能與 SMP 或 MMP 環(huán)境中 DB2 ESE 的多分區(qū)選項(xiàng)一起使用。
在經(jīng)過(guò)最新修訂以后,IBM 已經(jīng)對(duì) DB2 查詢巡視器徹底進(jìn)行了重新架構(gòu),從而將查詢控制功能集成進(jìn)了類似 DB2 控制
中心的 DB2 查詢巡視器中心,并提供了一個(gè)易于使用的用戶界面。查詢巡視器是完全基于服務(wù)器的,不需要客戶機(jī)軟件。
#性能 監(jiān)控命令
get monitor switches 返回會(huì)話監(jiān)控開(kāi)關(guān)的狀態(tài)
update monitor switches using <monitor> <on|off> 為<monitor>設(shè)置會(huì)話監(jiān)控開(kāi)關(guān)的狀態(tài)
reset monitor all 復(fù)位性能監(jiān)控程序值
get snapshot for dbm
get snapshot for all on <dbname>
get snapshot for dynamic sql on <dbname> 返回動(dòng)態(tài)SQL高速緩存的內(nèi)容
runstats on table <tbschema>.<tbname> 收集<tbname>的統(tǒng)計(jì)信息
reorgchk on table all 確定是否需要重組 reorgchk on table <tbschema>.<tbname>
reorg table <tablename> 通過(guò)重組消除碎片
###DB2實(shí)用程序
三種實(shí)用程序:EXPORT,IMPORT,LOAD
這些實(shí)用程序支持的文件格式有:
非定界或定長(zhǎng) ASCII(ASC):顧名思義,這種文件類型包含定長(zhǎng) ASCII 數(shù)據(jù),以便與列數(shù)據(jù)對(duì)齊。每個(gè) ASC 文件都是一個(gè)
ASCII 字符流,這個(gè)字符流由根據(jù)行和列排序的數(shù)據(jù)值組成。數(shù)據(jù)流中的行由行定界符分隔,而通常將行定界符假定為換行符。
定界 ASCII(DEL):它是各種數(shù)據(jù)庫(kù)管理器用于數(shù)據(jù)交換的最常用文件格式。這種格式包含 ASCII 數(shù)據(jù),它使用特殊字符定
界符分隔列值。數(shù)據(jù)流中的行由換行符充當(dāng)行定界符進(jìn)行分隔。
PC 版集成交換格式(PC version of the Integrated Exchange Format,PC/IXF):它是數(shù)據(jù)庫(kù)表的結(jié)構(gòu)化描述。這種文件格式不僅
可以用于導(dǎo)入數(shù)據(jù),還可以用于創(chuàng)建目標(biāo)數(shù)據(jù)庫(kù)中尚不存在的表。
工作表格式(Worksheet Format,WSF):以這種格式存儲(chǔ)的數(shù)據(jù)可以在工作表中顯示。這種格式只能用于導(dǎo)出和導(dǎo)入。
游標(biāo):游標(biāo)是用查詢聲明的。它只能用作裝入操作的輸入。
#EXPORT 實(shí)用程序使用 SQL SELECT 語(yǔ)句將數(shù)據(jù)從數(shù)據(jù)庫(kù)表抽取到某個(gè)文件中。對(duì)于導(dǎo)出的數(shù)據(jù)而言,其文件格式可以是 DEL、IXF 或 WSF。建議您在
導(dǎo)出中包含 MESSAGES 子句,以便在導(dǎo)出期間捕獲錯(cuò)誤、警告和信息性消息。
EXPORT TO myfile.del OF DEL
MESSAGES msg.out
SELECT staff.name, staff.dept, org.location
FROM org,staff
WHERE org.deptnumb = staff.dept;
在前一頁(yè)上的示例中,數(shù)據(jù)被抽取到一個(gè) DEL 格式的文件中。缺省情況下,列值由逗號(hào)(,)分隔,而字符串由雙引號(hào)(")括起來(lái)。如果要抽取
的數(shù)據(jù)已經(jīng)包含逗號(hào)和雙引號(hào),那該怎么辦呢?如果是這樣的話,導(dǎo)入或裝入實(shí)用程序不可能確定:哪些符號(hào)是實(shí)際的數(shù)據(jù),哪些是定界符。要定
制 EXPORT 的運(yùn)作方式,可以使用 MODIFIED BY 子句并指定想用文件類型修飾符修改什么。EXPORT 命令的格式如下:
EXPORT TO file_name OF file_type
MODIFIED BY file_type_modifiers
MESSAGES message_file
select_statement
chardelx
指定 x 為新的單字符串定界符。缺省值是雙引號(hào)(")。
coldelx
指定 x 為新的單字符列定界符。缺省值是逗號(hào)(,)。
codepage=x
指定 x 這個(gè) ASCII 字符串為輸出數(shù)據(jù)的新代碼頁(yè)。在導(dǎo)出操作期間,將字符數(shù)據(jù)從應(yīng)用程序代碼頁(yè)轉(zhuǎn)換成這一代碼頁(yè)。
timestampformat="x"
x 是源表中時(shí)間戳記的格式。
考慮下面這個(gè)示例:
EXPORT TO myfile.del OF DEL
MODIFIED BY chardel! coldel@ codepage=1208 timestampformat="yyyy.mm.dd hh:mm tt"
MESSAGES msg.out
SELECT * FROM schedule
面的命令以 DEL 格式從 SCHEDULE 表導(dǎo)出數(shù)據(jù),其間發(fā)生了下列行為:
字符串由感嘆號(hào)(!)括起來(lái)
列由 @ 號(hào)定界
字符串被轉(zhuǎn)換成代碼頁(yè) 1208
SCHEDULE 表中用戶定義的時(shí)間戳記具有 yyyy.mm.dd hh:mm tt 這種格式
#導(dǎo)出大對(duì)象
#可以在控制中心導(dǎo)出表,并進(jìn)行調(diào)度。
#IMPORT實(shí)用程序
IMPORT FROM file_name OF file_type
MESSAGES message_file
[ INSERT | INSERT_UPDATE | REPLACE | REPLACE_CREATE | CREATE ]
INTO target_table_name
INSERT 選項(xiàng)將導(dǎo)入的數(shù)據(jù)插入表中。目標(biāo)表必須已經(jīng)存在。
INSERT_UPDATE 向表中插入數(shù)據(jù),或者用匹配的主鍵更新表中現(xiàn)有的行。目標(biāo)表必須存在,且定義了主鍵。
REPLACE 選項(xiàng)刪除現(xiàn)有的全部數(shù)據(jù),然后將導(dǎo)入的數(shù)據(jù)插入現(xiàn)有的目標(biāo)表中。
有了 REPLACE_CREATE 選項(xiàng),如果目標(biāo)表存在,那么實(shí)用程序刪除現(xiàn)有的數(shù)據(jù),然后插入新數(shù)據(jù),就好像指定了 REPLACE 選項(xiàng)一樣。如果沒(méi)有定義目標(biāo)表,那么在導(dǎo)入數(shù)據(jù)之前將先創(chuàng)建該表及其相關(guān)索引。正如您可以想到的那樣,輸入文件必須是 PC/IXF 格式的,因?yàn)檫@種格式含有導(dǎo)出表的結(jié)構(gòu)化描述。如果目標(biāo)表是由外鍵引用的父表,就不能使用 REPLACE_CREATE。
CREATE 選項(xiàng)創(chuàng)建目標(biāo)表及其索引,然后將數(shù)據(jù)導(dǎo)入到新表中。它唯一支持的文件格式是 PC/IXF。您也可以指定表空間的名稱,新表將創(chuàng)建于其中。
示例:
IMPORT FROM emp.ixf OF IXF
COMMITCOUNT 500
MESSAGES msg.out
CREATE INTO employee IN datatbsp INDEX IN indtbsp
如果上面的命令因?yàn)槟承┰蚨鴪?zhí)行失敗,那么您可以使用消息文件確定被成功導(dǎo)入并提交的最后一行。然后,您可以使用
RESTARTCOUNT 選項(xiàng)重新啟動(dòng)導(dǎo)入。在下面的命令中,實(shí)用程序?qū)⑻^(guò)前面的 30000 條記錄才開(kāi)始 IMPORT 操作。
IMPORT FROM myfile.ixf OF IXF
COMMITCOUNT 500 RESTARTCOUNT 30000
MESSAGES msg.out
INSERT INTO newtable
compound=x
使用非原子的復(fù)合 SQL 來(lái)插入數(shù)據(jù)。每次會(huì)嘗試 x 條語(yǔ)句。
indexschema=schema
在創(chuàng)建索引期間對(duì)索引使用指定的模式。
striptblanks
在向變長(zhǎng)字段裝入數(shù)據(jù)時(shí),截?cái)嗳魏挝膊靠崭瘛?
lobsinfile
指出要導(dǎo)入 LOB 數(shù)據(jù)。實(shí)用程序?qū)z查 LOBS FROM 子句,以獲取輸入 LOB 文件的路徑。
這里有一個(gè)實(shí)際使用這些文件類型修飾符的示例:
IMPORT FOR inputfile.asc OF ASC
LOBS FROM /u/db2load/lob1, /u/db2load/lob2
MODIFIED BY compount=5 lobinsfile
INSERT INTO newtable
使用控制中心進(jìn)行import。
##LOAD實(shí)用程序概述
LOAD 實(shí)用程序是另一種用數(shù)據(jù)來(lái)填充表的方法。經(jīng)過(guò)格式化的頁(yè)被直接
寫入數(shù)據(jù)庫(kù)。這種機(jī)制允許進(jìn)行比 IMPORT 實(shí)用程序更有效的數(shù)據(jù)移動(dòng)。
不過(guò),LOAD 實(shí)用程序不執(zhí)行某些操作,如引用或表約束檢查以及觸發(fā)器調(diào)用。
LOAD FROM input_source OF input_type
MESSAGES message_file
[ INSERT | REPLACE | TERMINATE | RESTART ]
INTO target_tablename
#example,execute at partition en
date
db2 connect to sccrm user db2inst1 using db2inst1
db2 "LOAD FROM /backup1114/dw_call_cdr_20031002.txt OF DEL modified by coldel; fastparse anyorder replace into dw_call_cdr_20030801"
date
db2 "LOAD FROM /db2home/db2inst1/data/dw_newbusi_smscdr_20031026.txt OF DEL modified by coldel; terminate into dw_newbusi_smscdr_20031026_1"
LOAD 的源輸入的格式可以是 DEL、ASC、PC/IXF 或 CURSOR。游標(biāo)是從 SELECT
語(yǔ)句返回的結(jié)果集。使用 CURSOR 作為裝入輸入的示例顯示如下:
DECLARE mycursor CURSOR FOR SELECT col1, col2, col3 FROM tab1;
LOAD FROM mycursor OF CURSOR INSERT INTO newtab;
裝入目標(biāo)必須存在,該實(shí)用程序才能啟動(dòng)。這個(gè)目標(biāo)可以是表、類型表或表別名。不支持向系統(tǒng)表或臨時(shí)表進(jìn)行裝入。
請(qǐng)使用 MESSAGES 選項(xiàng)來(lái)捕獲裝入期間的任何錯(cuò)誤、警告和信息性消息。
LOAD 可以以四種不同方式執(zhí)行:
INSERT 方式將輸入數(shù)據(jù)添加到表中,不更改現(xiàn)有表數(shù)據(jù)。
REPLACE 方式從表中刪除全部現(xiàn)有數(shù)據(jù),然后用輸入數(shù)據(jù)填充該表。
TERMINATE 方式終止裝入操作,然后回滾到裝入操作的起始點(diǎn)。一個(gè)例外是:如果指定了 REPLACE 方式,那么表將會(huì)被截?cái)唷?
RESTART 方式用于重新啟動(dòng)以前中斷的裝入。它將自動(dòng)從上一個(gè)一致性點(diǎn)繼續(xù)操作。要使用該方式,請(qǐng)指定與前面的 LOAD 命令中相同的選項(xiàng),
但卻使用 RESTART 方式。它允許該實(shí)用程序找到在裝入處理期間生成的所有必需臨時(shí)文件。因此
,除非能夠確信不需要從裝入生成的臨時(shí)文件,否則就不要以手工方式除去任何這類文件,這一點(diǎn)十分重要。
一旦裝入不出任何錯(cuò)誤地完成,臨時(shí)文件就會(huì)被自動(dòng)除去。缺省情況下,臨時(shí)文件是在當(dāng)前工作目錄中創(chuàng)建的。
可以使用 TEMPFILES PATH 選項(xiàng)指定存儲(chǔ)臨時(shí)文件的目錄。
#裝入過(guò)程的四個(gè)階段
完整的裝入過(guò)程分為四個(gè)不同階段。
裝入階段:
將數(shù)據(jù)裝入表中。
收集索引鍵和表統(tǒng)計(jì)信息。
記錄一致性點(diǎn)。
將無(wú)效數(shù)據(jù)放入轉(zhuǎn)儲(chǔ)文件,并在消息文件中記錄消息。當(dāng)數(shù)據(jù)行與表的定義不一致時(shí),這些數(shù)據(jù)行就被認(rèn)為是無(wú)效數(shù)據(jù),
并會(huì)被拒絕(不裝入表中)。請(qǐng)使用 dumpfile 修飾符來(lái)指定文件的名稱和位置,以記錄任何被拒絕的行。
構(gòu)建階段:
根據(jù)裝入階段所收集的鍵創(chuàng)建索引。
刪除階段:
刪除導(dǎo)致違反鍵唯一性的那些行,并將這些行放入異常表中。除了如上所述有些數(shù)據(jù)只是不滿足目標(biāo)表的定義之外,還有
一些數(shù)據(jù)已經(jīng)通過(guò)了裝入階段,但卻違反了表中定義的唯一性約束。注:這里只將違反鍵唯一性的行作為壞數(shù)據(jù);目前不檢查其它約束。
由于這類數(shù)據(jù)已經(jīng)裝入了表中,因此 LOAD 實(shí)用程序?qū)⒃诖穗A段刪除違規(guī)行。異常表可以用來(lái)存儲(chǔ)被刪除的行,使您可以決定在裝入操
作完成之后如何處理它們。如果沒(méi)有指定異常表,那么就刪除違規(guī)行,而不做任何跟蹤,下面對(duì)異常表進(jìn)行了更詳細(xì)的討論。
在消息文件中記錄消息。
索引復(fù)制階段:
如果 ALLOW READ ACCESS 是用 USE TABLESPACE 選項(xiàng)指定的,那么就會(huì)將索引數(shù)據(jù)從系統(tǒng)臨時(shí)表空間復(fù)制到
索引應(yīng)該駐留的表空間。
異常表是一個(gè)用戶定義的表,它必須與要裝入的目標(biāo)表具有相同的列定義。如果至少有一列沒(méi)有出現(xiàn)在異常表中,那么就
會(huì)廢棄違規(guī)行。只可以向表末尾添加兩個(gè)額外的列:記錄行插入時(shí)間的時(shí)間戳記列,以及存儲(chǔ)(認(rèn)為行所包含的是壞數(shù)據(jù)的)
理由(或消息)的 CLOB 列。
LOAD FROM emp.ixf OF IXF
MODIFIED BY DUMPFILE=c:\emp.dmp
MESSAGES msg.out
TEMPFILES PATH d:\tmp
INSERT INTO employee
FOR EXCEPTION empexp
在上圖中,(1)顯示了輸入源文件的內(nèi)容。
(2)中顯示的目標(biāo)表 EMPLOYEE 是用以下列定義創(chuàng)建的:
第一列必須具有唯一性。
最后一列是不能為 NULL 的數(shù)字列。
(3)中顯示的異常表 EMPEXP 是用與 EMPLOYEE 相同的那些列以及時(shí)間戳記和消息列創(chuàng)建的。
在裝入階段,輸入文件的所有數(shù)據(jù)都被裝入了 EMPLOYEE — 但用粉紅色標(biāo)記的兩行除外,
因?yàn)樗鼈儾粷M足 NOT NULL 和 NUMERIC 列定義。由于指定了 DUMPFILE 修飾符,因此這兩行被記錄在文件 C:\emp.dmp 中。
在刪除階段,用黃色標(biāo)記的兩行被從 EMPLOYEE 中刪除了,并且被插入異常表 EMPEXP 中。這是由于違反了 EMPLOYEE 表中第一
列的唯一性而引起的。
在裝入結(jié)束時(shí),您應(yīng)該檢查消息文件、轉(zhuǎn)儲(chǔ)文件和異常表,然后決定如何處理被拒絕的行。
如果裝入成功完成,那么就會(huì)除去在 D:\tmp 中生成的臨時(shí)文件。
#裝入選項(xiàng)
ROWCOUNT n:允許用戶指定只裝入輸入文件中的前 n 條記錄。
SAVECOUNT n:每裝入 n 條記錄之后就建立一致性點(diǎn)。同時(shí)會(huì)生成消息,并會(huì)將其記錄在消息文件中,以指出在保存點(diǎn)成功地裝入了多少輸入行。這一點(diǎn)在輸入文件類型為 CURSOR 時(shí)是無(wú)法做到的。
WARNINGCOUNT n:在發(fā)出 n 次警告后停止裝入。
INDEXING MODE [ REBUILD | INCREMENTAL | AUTOSELECT | DEFERRED ]:在構(gòu)建階段,構(gòu)建索引。這個(gè)選項(xiàng)指定 LOAD實(shí)用程序是重新構(gòu)建索引還是增量式地?cái)U(kuò)展索引。支持四種不同方式:
REBUILD 方式強(qiáng)制重新構(gòu)建所有索引。
INCREMENTAL 方式只用新數(shù)據(jù)擴(kuò)展索引。
AUTOSELECT 方式允許實(shí)用程序在 REBUILD 和 INCREMENTAL 之間進(jìn)行選擇。
DEFERRED 方式意味著在裝入期間不創(chuàng)建索引。所涉及的索引都用需要的刷新進(jìn)行標(biāo)記。這些索引將在重新啟動(dòng)數(shù)據(jù)庫(kù)或第一次訪問(wèn)這類索引時(shí)重新構(gòu)建。
STATISTICS [ YES | NO ]:在執(zhí)行完裝入以后,以前的目標(biāo)表統(tǒng)計(jì)信息極有可能不再有效,因?yàn)槟繕?biāo)表中已加入了更多的數(shù)據(jù)。您可以通過(guò)指定 STATISTICS YES 來(lái)選擇收集這些統(tǒng)計(jì)信息。
#文件類型修飾符。文件類型修飾符是用 MODIFIED BY 子句指定的。下面是少數(shù)幾個(gè)您可能會(huì)覺(jué)得有用的修飾符:
fastparse:減少了對(duì)裝入數(shù)據(jù)的語(yǔ)法檢查以增強(qiáng)性能。
identityignore、identitymissing 和 identityoverride:分別用來(lái)忽略、指出丟失或覆蓋標(biāo)識(shí)列數(shù)據(jù)。
indexfreespace n、pagefreespace n 和 totalfreespace n:在索引和數(shù)據(jù)頁(yè)中保留指定量的空閑頁(yè)。
norowwarnings:禁止行警告。
lobsinfile:指出將裝入 LOB 文件;并檢查 LOBS FROM 選項(xiàng)以獲取 LOB 路徑。
##裝入期間的表訪問(wèn)
在裝入表期間,LOAD 實(shí)用程序會(huì)用互斥鎖將它鎖定。在裝入完成以前,不允許任何其它訪問(wèn)。這是 ALLOW NO ACCESS 選項(xiàng)的缺省行為。在進(jìn)行這種裝入期間,表處于 LOAD IN PROGRESS 狀態(tài)。有一個(gè)方便好用的命令可以檢查裝入操作的狀態(tài),還返回表狀態(tài):
LOAD QUERY TABLE table_name
您可能猜到了這一點(diǎn),即有一個(gè)選項(xiàng)允許進(jìn)行表訪問(wèn)。ALLOW READ ACCESS 選項(xiàng)導(dǎo)致表在共享方式下被鎖定。閱讀器可以訪問(wèn)表
中已經(jīng)存在的數(shù)據(jù),卻不能訪問(wèn)新的數(shù)據(jù)。正在裝入的數(shù)據(jù)要等到裝入完成后才可獲得。此選項(xiàng)將裝入表同時(shí)置于 LOAD IN PROGRESS
狀態(tài)和 READ ACCESS ONLY 狀態(tài)。
正如在前一頁(yè)中所提到的那樣,在構(gòu)建階段可以重新構(gòu)建全部索引,也可以用新數(shù)據(jù)擴(kuò)展索引。對(duì)于 ALLOW READ ACCESS 選項(xiàng),
如果重新構(gòu)建全部索引,那么會(huì)為該索引創(chuàng)建一個(gè)鏡像副本。當(dāng) LOAD 實(shí)用程序到達(dá)索引復(fù)制階段時(shí)(請(qǐng)參閱裝入過(guò)程的四個(gè)階段)
,目標(biāo)表被置為脫機(jī),然后將新索引復(fù)制到目標(biāo)表空間。
無(wú)論指定哪個(gè)表訪問(wèn)選項(xiàng),裝入都需要各種鎖來(lái)進(jìn)行處理。如果某一應(yīng)用程序已經(jīng)鎖定了目標(biāo)表,那么 LOAD 實(shí)用程序就必須等到
鎖被釋放。不想等待鎖的話,您可以在 LOAD 命令中使用 LOCK WITH FORCE 選項(xiàng),以強(qiáng)制關(guān)閉其它持有沖突鎖的應(yīng)用程序。
##檢查暫掛表狀態(tài)
至此,我們知道:不會(huì)將與目標(biāo)表定義不一致的輸入數(shù)據(jù)裝入表中。在裝入階段,這樣的數(shù)據(jù)會(huì)遭到拒絕,并被記錄在消息文件中。
在刪除階段,LOAD 實(shí)用程序會(huì)刪除那些違反任何唯一性約束的行。如果指定了異常表,違規(guī)的行將插入該表。對(duì)于表可能定義的
其它約束(如引用完整性和檢查約束),怎么辦呢?LOAD
實(shí)用程序不檢查這些約束。表會(huì)被置于 CHECK PENDING 狀態(tài),這種狀態(tài)迫使您先手工檢查數(shù)據(jù)完整性,然后才能訪問(wèn)表。如前一頁(yè)
中所討論的那樣,可以使用 LOAD QUERY 命令查詢表狀態(tài)。系統(tǒng)目錄表 SYSCAT.TABLES 中的列 CONST_CHECKED 也指出表中所定義的
每個(gè)約束的狀態(tài)。
狀態(tài)類型:Y,N,U,W,F
要手工為一個(gè)或多個(gè)表關(guān)閉完整性檢查,請(qǐng)使用 SET INTEGRITY 命令。下面給出了一些示例,以演示該命令的部分選項(xiàng)。要立即檢查表
EMPLOYEE 和 STAFF 追加的選項(xiàng)的完整性,請(qǐng)使用以下命令:
SET INTEGRITY FOR employee, staff IMMEDIATE CHECKED INCREMENTAL
要用 IMMEDIATE UNCHECKED 選項(xiàng)忽略對(duì)表 EMPLOYEE 的外鍵檢查:
SET INTEGRITY FOR employee FOREIGN KEY IMMEDIATE UNCHECKED
在裝入完成以后,有時(shí)您可能想將目標(biāo)表及其具有外鍵關(guān)系的派生表置于 CHECK PENDING 狀態(tài)。這樣做確保了在對(duì)完整性進(jìn)行手工
檢查之前,所有這些表的可訪問(wèn)性都得到了控制。裝入選項(xiàng)是 CHECK PENDING CASCADE IMMEDIATE,它指出:立即將外鍵約束的檢查
暫掛狀態(tài)擴(kuò)展到所有派生外鍵表。缺省情況下,只會(huì)將裝入的表置于檢查暫掛狀態(tài)。這正是裝入選項(xiàng)
CHECK PENDING CASCADE DEFERRED 的行為。
## IMPORT VS LOAD
IMPORT LOAD
SLOWER ON LARGE AMOUNTS OF DATA FASTER ON LARGE LOADS-WRITES FORMATTED PAGES
CREATION OF TABLES & INDEXES WITH IXF TABLES AND INDEXES MUST EXIST
WSF SUPPORTED WSF NOT SUPPORTED
IMPORT INTO TABLES AND VIEWS LOAD TABLES ONLY
NO SUPPORT FOR IMPORTING INTO SUPPORTED
MATERIALIZED QUERY TABLES
ALL ROWS LOGGED MINIMAL LOGGING SUPPORTED
TRIGGERS WILL BE FIRED TRIGGERS NOT SUPPORTED
TEMPORARY SPACE USED WITHIN THE DATABASE USED OUTSIDE THE DATABASE
CONSTRAINTS VALIDATED DURING IMPORT ALL UNIQUE KEY IS VERIFIED DURING LOAD
OTHER CONSTRAINTS ARE VALIDATED WITH THE
SET INTEGRITY COMMAND
IF INTERRUPTED,TABLE IS USABLE WITH IF INTERRUPTED,THE TABLE IS HELD IN LOAD PENDING
DATA UP TO THE LAST COMMIT POINT STATE,EITHER RESTART OR RESTORE TABLES EFFECTED
RUN RUNSTATS AFTER IMPORT FOR STATISICS STATISTICS CAN BE GATHERED DURING LOAD
IMPORT INTO MAINFRAM DATABASE VIA CANNOT LOAD INTO MAINFRAME DATABASE
DB2 CONNECT
NO BACK-UP IMAGE REQUIRED BACKUP CAN BE CREATED DURING LOAD