#聲明臨時表
DECLARE GLOBAL TEMPORARY TABLE session.temp1
LIKE employee
ON COMMIT PRESERVE ROWS
NOT LOGGED
IN mytempspace
#ALTER
可以修改:緩沖池,表,表空間,視圖
#DROP
可以刪除:緩沖池,事件監(jiān)控程序,函數(shù),索引,模式,存儲過程,表,表空間,觸發(fā)器,視圖.
#產生數(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)
#設置概要文件注冊表
設置后實例要重新啟動
列出所有的變量: db2set -lr
設置變量:db2set variable_name=value
設置為缺省值:db2set variable_name=
顯示設置的變量:db2set -all
# 設置數(shù)據(jù)庫管理器和數(shù)據(jù)庫的參數(shù)
獲取當前參數(shù):
db2 get database manager configuration
db2 get database configuration for database_name
db2 get database manager configuration show detail
設置參數(shù):
db2 update database manager configuration using parameter new_value
db2 update database configuration for database_name using parameter new_value
#準備數(shù)據(jù)庫服務端口
db2set DB2COMM=TCPIP,NETBIOS
在services文件中包含服務和端口號,
如:db2icdb2 50000/tcp
db2 update database manager configuration using svcename db2icdb2
重新啟動數(shù)據(jù)庫.
#查看連接的應用程序
db2 list applications [for database db-name] [show detail]
#斷開應用程序
db2 force application (6,5)
db2 force application all
#設置客戶認證方式
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)復位成正常(NORMAL)
quiesce tablespaces for table <tablename> reset
#有用的目錄表
SYSCAT.COLUMNS:所包含的每一行對應于表或視圖中定義的每個列
SYSCAT.INDEXCOLUSE:列出索引中包含的所有列
SYSCAT.INDEXES:包含的每一行對應于表或視圖中定義的每個索引(包括適用的繼承索引)。
SYSCAT.TABLES:所創(chuàng)建每個表、視圖、別名(nickname)或別名(alias)都對應其中一行。所有目錄表和視圖都在 SYSCAT.TABLES 目錄視圖中擁有一項。
SYSCAT.VIEWS:所創(chuàng)建的每個視圖都對應其中一行或多行。
###監(jiān)控DB2活動
##捕獲快照
數(shù)據(jù)庫,表空間,表,緩沖池,鎖,數(shù)據(jù)庫管理器,應用程序
#拍攝快照
API,命令行
UPDATE MONITOR SWITCHES
#打開和關閉快照
1,在實例級別上設置監(jiān)視器開關(影響所有用戶和數(shù)據(jù)庫)
DFT_MON_STMT:語句監(jiān)視器(用于動態(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:跟蹤時間戳記信息
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,在應用程序級別上設置監(jiān)視器開關(只適合于特定的應用程序)
在CLP中打開只適合這個CLP
Bufferpool
Lock
Sort
Statement
Table
Timestamp
UOW
db2 get monitor switches
db2 update monitor switches using switchName [ON|OFF]
3,復位開關
db2 reset monitor [ALL|for database databaseName] [at dbpartitionnum partitionNum]
將監(jiān)視器開關的值復位成空或0.
#數(shù)據(jù)庫快照
包含如下信息:
連接
DB2 代理程序
鎖
排序
緩沖池活動總數(shù)
SQL 活動
SQL 語句數(shù)量
日志使用情況
高速緩存使用情況
散列連接
下面是獲取這種快照的命令
db2 get snapshot for database on databaseName
#數(shù)據(jù)庫管理器快照
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
計算緩沖池命中率:
Ratio = ((1-(physical index and data reads))/(logical index and data reads))*100%
#鎖快照
db2 get snapshot for locks on drew_db
#動態(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
第二個示例查找平均執(zhí)行時間最長的五條 SQL 語句:
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)控器
人們用快照來檢查某個精確時刻的DB2,并聚集性能信息。事件監(jiān)控器與此不同,人們用他在固定的時間
周期內監(jiān)控DB2性能。事件監(jiān)視器檢查數(shù)據(jù)庫中的轉換事件,并將每個事件都當成一個對象。這允許對 DB2 的行為進行非常詳細的分析。
事件監(jiān)視器捕獲的信息類似于快照捕獲的信息。同時可以運行多個監(jiān)視器,并且每個監(jiān)視器也可以捕獲多種事件類型的信息。這允許不同的管理員相互獨立地監(jiān)控不同的活動。
事件監(jiān)視器可以捕獲有關下列內容的信息:
數(shù)據(jù)庫
表
死鎖
表空間
緩沖池
連接
語句
事務
可將事件監(jiān)視器的信息寫到:
SQL 表
文件
管道
##創(chuàng)建事件監(jiān)視器
CREATE EVENT MONITOR
##打開和關閉監(jiān)視器
db2 set event monitor eventMonitorName state [0|1]
eventMonitorName 是已創(chuàng)建的事件監(jiān)視器的名稱。0 將關閉監(jiān)視器,而 1 將打開監(jiān)視器。
#獲取狀態(tài)
SELECT EVENT_MON_STATE('drewTest') FROM SYSIBM.SYSDUMMY1
SYSIBM.SYSEVENTMONITORS 表及該表的視圖 SYSCAT.EVENTMONITORS 包含有關已創(chuàng)建的事件監(jiān)視器的信息。可以對這些表運行 SQL 查詢,以確定監(jiān)視器的狀態(tài):
SELECT evmonname, target_type, target,
FROM syscat.eventmonitors
where evmonname LIKE 'drew%'
autostart 選項
用于創(chuàng)建事件監(jiān)視器的命令中的 autostart 選項表明,每當數(shù)據(jù)庫啟動時,自動啟動事件監(jiān)視器。
#清空事件監(jiān)視器
注意:事件監(jiān)控器名稱使用大寫字母,需要創(chuàng)建目錄。
還可將事件監(jiān)視器數(shù)據(jù)清空到磁盤中。如果您希望記錄這類信息,如通常僅當終止所有連接時才寫的數(shù)據(jù)庫事件,那么這非常有用。下面是一個示例命令:
db2 flush event monitor eventMonitorName
#使用事件監(jiān)視器
事件監(jiān)視器應當用于監(jiān)控非常具體的一些事件或短時間內的工作負載。它
們旨在為您提供非常具體的信息,以允許您診斷數(shù)據(jù)庫或應用程序的問題或行為。
與快照不同,事件監(jiān)視器對 DB2 的性能影響極大。這是由于為每個事件對象寫的
信息的數(shù)量造成的。語句監(jiān)視器對性能的影響極大,因為數(shù)據(jù)庫引擎必須為每個
查詢執(zhí)行所有額外的工作:不只是能夠執(zhí)行查詢,DB2 引擎還必須寫出這條查詢
的所有特征和運行時信息。該信息必須寫入文本文件,這樣會進一步降低性能。
#死鎖監(jiān)控
CREATE EVENT MONITOR DEADLOCK_DB
FOR DEADLOCKS
WRITE TO FILE 'deadlock_db'
MAXFILES 1
MAXFILESIZE NONE
AUTOSTART
注意:事件監(jiān)控器名稱使用大寫字母,需要創(chuàng)建目錄。
#SQL監(jiān)控
SQL 監(jiān)視器十分有用,因為它可以俘獲動態(tài)和靜態(tài) SQL 語句。如果應用
程序利用了無法用 SQL 快照捕獲的預編譯 SQL 語句,那么該監(jiān)視器就
很重要。
對于每條被執(zhí)行的 SQL 語句記錄一個事件。每個語句的屬性(如讀取、
選擇和刪除等等操作的行數(shù))都被記錄下來,但是不象在快照中那樣以
匯總的方式進行表示。另外還記錄執(zhí)行的時間范圍以及啟動和停止次數(shù)。這允許您對一些事務以及某個應用程序的 SQL 執(zhí)行對其它應用程序的 SQL 執(zhí)行有何影響進行詳細分析。
還可以使用 SQL 監(jiān)視器來發(fā)現(xiàn)拙劣的執(zhí)行代碼;如果將輸出放入表中,
那么通過對個別代碼的執(zhí)行次數(shù)進行搜索,可以做到這一點。由于運行
SQL 監(jiā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 通過圖形化或基于文本的方式詳細說明了 SQL 語句的每個部分是如何執(zhí)行以及何時執(zhí)行的。這包括以下一些基本信息:
正被訪問的表
正被使用的索引
何時連接數(shù)據(jù)
何時排序數(shù)據(jù)
Explain 還捕獲更復雜的信息,在細究 SQL 正在發(fā)生什么時,該信息非常有用:
表和索引基數(shù)
正連接的表和索引的順序
結果集的基數(shù)
在查詢的每部分正在選擇哪些字段
排序方法
SQL 每部分的時間范圍
要理解 Explain 信息,您需要掌握的最重要概念是 timeron。timeron 是 DB2 優(yōu)化器使
用的計量單位,用來計量完成查詢的時間和資源數(shù)量。timeron 綜合了時間、CPU 利用率、
I/O 和其它因素。由于這些參數(shù)值是變化的,因此執(zhí)行某個查詢所需的 timeron 數(shù)量是動態(tài)
的,每次執(zhí)行該查詢所需的 timeron 都不同。
#使用控制中心的EXPLAIN SQL
觀察SQL的存取方案,分析優(yōu)化參數(shù),考慮優(yōu)化的級別。
#使用字符工具
db2 set current explain mode [no|yes|explain]
db2exfmt
可以從命令行調用 db2expln 工具,以獲得查詢的存取方案。但是,該工具不返回優(yōu)化器信息。
db2expln -database drew_db -statement "select * from syscat.tables" -terminal
#SQL故障診斷
索引使用,是否使用索引,使用索引的順序
表基數(shù)和"SELECT *" 的使用
優(yōu)化級別太低。
設置優(yōu)化級別:db2 set current query optimization [0|1|2|3|5|7|9]
##使用運行狀況中心和內存可視化工具
# 選定實例使用view memory usage,可以把輸出保存到文件。
除了提供了內存可視化之外,該工具還允許您對某些參數(shù)值設置警報。警報的輸出將被寫到名為
threshold 的文件,該文件與 db2diag.log 位于同一目錄下。該目錄位于實例主目錄下。根據(jù)
您創(chuàng)建實例時所做選擇的不同,該位置也會不同。
# DB2運行狀況中心
是否有充足的資源(如可用內存、表空間容器或日志存儲器)來完成任務
資源使用是否有效
任務是否在可接受的時間周期內完成,或者任務的完成是否不會大幅度降低性能
資源或數(shù)據(jù)庫對象是否不會永遠處于不可用狀態(tài)
##DB2查詢巡視器和控制器
IBM 為 DB2 提供了兩種主要工具,它們允許您監(jiān)控和控制數(shù)據(jù)庫上 SQL 的執(zhí)行。DB2 控制器(Governor)用于控制
用戶和應用程序執(zhí)行其 SQL 的優(yōu)先級。DB2 查詢巡視器(Query Patroller)為決策支持系統(tǒng)提供了查詢和資源管理。
該工具接受通過您系統(tǒng)的所有查詢,并對其進行分析、優(yōu)先排序和調度。
DB2 查詢巡視器為決策支持系統(tǒng)提供了查詢和資源管理。該工具可以接受流經(jīng)您系統(tǒng)的所有查詢,并對其進行分析、
優(yōu)先排序和調度。一旦完成查詢,用戶也將接到通知。在大型環(huán)境(其中完成某些查詢可能要花幾個小時,或者不
同部門可能具有不同的系統(tǒng)優(yōu)先級或用途)中,該功能極其有用。
通過將工作重定向到合適的數(shù)據(jù)庫分區(qū),查詢巡視器還將執(zhí)行負載均衡,以確保某個數(shù)據(jù)庫分區(qū)的使用不會過于繁重
。該工具只能與 SMP 或 MMP 環(huán)境中 DB2 ESE 的多分區(qū)選項一起使用。
在經(jīng)過最新修訂以后,IBM 已經(jīng)對 DB2 查詢巡視器徹底進行了重新架構,從而將查詢控制功能集成進了類似 DB2 控制
中心的 DB2 查詢巡視器中心,并提供了一個易于使用的用戶界面。查詢巡視器是完全基于服務器的,不需要客戶機軟件。
#性能 監(jiān)控命令
get monitor switches 返回會話監(jiān)控開關的狀態(tài)
update monitor switches using <monitor> <on|off> 為<monitor>設置會話監(jiān)控開關的狀態(tài)
reset monitor all 復位性能監(jiān)控程序值
get snapshot for dbm
get snapshot for all on <dbname>
get snapshot for dynamic sql on <dbname> 返回動態(tài)SQL高速緩存的內容
runstats on table <tbschema>.<tbname> 收集<tbname>的統(tǒng)計信息
reorgchk on table all 確定是否需要重組 reorgchk on table <tbschema>.<tbname>
reorg table <tablename> 通過重組消除碎片
###DB2實用程序
三種實用程序:EXPORT,IMPORT,LOAD
這些實用程序支持的文件格式有:
非定界或定長 ASCII(ASC):顧名思義,這種文件類型包含定長 ASCII 數(shù)據(jù),以便與列數(shù)據(jù)對齊。每個 ASC 文件都是一個
ASCII 字符流,這個字符流由根據(jù)行和列排序的數(shù)據(jù)值組成。數(shù)據(jù)流中的行由行定界符分隔,而通常將行定界符假定為換行符。
定界 ASCII(DEL):它是各種數(shù)據(jù)庫管理器用于數(shù)據(jù)交換的最常用文件格式。這種格式包含 ASCII 數(shù)據(jù),它使用特殊字符定
界符分隔列值。數(shù)據(jù)流中的行由換行符充當行定界符進行分隔。
PC 版集成交換格式(PC version of the Integrated Exchange Format,PC/IXF):它是數(shù)據(jù)庫表的結構化描述。這種文件格式不僅
可以用于導入數(shù)據(jù),還可以用于創(chuàng)建目標數(shù)據(jù)庫中尚不存在的表。
工作表格式(Worksheet Format,WSF):以這種格式存儲的數(shù)據(jù)可以在工作表中顯示。這種格式只能用于導出和導入。
游標:游標是用查詢聲明的。它只能用作裝入操作的輸入。
#EXPORT 實用程序使用 SQL SELECT 語句將數(shù)據(jù)從數(shù)據(jù)庫表抽取到某個文件中。對于導出的數(shù)據(jù)而言,其文件格式可以是 DEL、IXF 或 WSF。建議您在
導出中包含 MESSAGES 子句,以便在導出期間捕獲錯誤、警告和信息性消息。
EXPORT TO myfile.del OF DEL
MESSAGES msg.out
SELECT staff.name, staff.dept, org.location
FROM org,staff
WHERE org.deptnumb = staff.dept;
在前一頁上的示例中,數(shù)據(jù)被抽取到一個 DEL 格式的文件中。缺省情況下,列值由逗號(,)分隔,而字符串由雙引號(")括起來。如果要抽取
的數(shù)據(jù)已經(jīng)包含逗號和雙引號,那該怎么辦呢?如果是這樣的話,導入或裝入實用程序不可能確定:哪些符號是實際的數(shù)據(jù),哪些是定界符。要定
制 EXPORT 的運作方式,可以使用 MODIFIED BY 子句并指定想用文件類型修飾符修改什么。EXPORT 命令的格式如下:
EXPORT TO file_name OF file_type
MODIFIED BY file_type_modifiers
MESSAGES message_file
select_statement
chardelx
指定 x 為新的單字符串定界符。缺省值是雙引號(")。
coldelx
指定 x 為新的單字符列定界符。缺省值是逗號(,)。
codepage=x
指定 x 這個 ASCII 字符串為輸出數(shù)據(jù)的新代碼頁。在導出操作期間,將字符數(shù)據(jù)從應用程序代碼頁轉換成這一代碼頁。
timestampformat="x"
x 是源表中時間戳記的格式。
考慮下面這個示例:
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 表導出數(shù)據(jù),其間發(fā)生了下列行為:
字符串由感嘆號(!)括起來
列由 @ 號定界
字符串被轉換成代碼頁 1208
SCHEDULE 表中用戶定義的時間戳記具有 yyyy.mm.dd hh:mm tt 這種格式
#導出大對象
#可以在控制中心導出表,并進行調度。
#IMPORT實用程序
IMPORT FROM file_name OF file_type
MESSAGES message_file
[ INSERT | INSERT_UPDATE | REPLACE | REPLACE_CREATE | CREATE ]
INTO target_table_name
INSERT 選項將導入的數(shù)據(jù)插入表中。目標表必須已經(jīng)存在。
INSERT_UPDATE 向表中插入數(shù)據(jù),或者用匹配的主鍵更新表中現(xiàn)有的行。目標表必須存在,且定義了主鍵。
REPLACE 選項刪除現(xiàn)有的全部數(shù)據(jù),然后將導入的數(shù)據(jù)插入現(xiàn)有的目標表中。
有了 REPLACE_CREATE 選項,如果目標表存在,那么實用程序刪除現(xiàn)有的數(shù)據(jù),然后插入新數(shù)據(jù),就好像指定了 REPLACE 選項一樣。如果沒有定義目標表,那么在導入數(shù)據(jù)之前將先創(chuàng)建該表及其相關索引。正如您可以想到的那樣,輸入文件必須是 PC/IXF 格式的,因為這種格式含有導出表的結構化描述。如果目標表是由外鍵引用的父表,就不能使用 REPLACE_CREATE。
CREATE 選項創(chuàng)建目標表及其索引,然后將數(shù)據(jù)導入到新表中。它唯一支持的文件格式是 PC/IXF。您也可以指定表空間的名稱,新表將創(chuàng)建于其中。
示例:
IMPORT FROM emp.ixf OF IXF
COMMITCOUNT 500
MESSAGES msg.out
CREATE INTO employee IN datatbsp INDEX IN indtbsp
如果上面的命令因為某些原因而執(zhí)行失敗,那么您可以使用消息文件確定被成功導入并提交的最后一行。然后,您可以使用
RESTARTCOUNT 選項重新啟動導入。在下面的命令中,實用程序將跳過前面的 30000 條記錄才開始 IMPORT 操作。
IMPORT FROM myfile.ixf OF IXF
COMMITCOUNT 500 RESTARTCOUNT 30000
MESSAGES msg.out
INSERT INTO newtable
compound=x
使用非原子的復合 SQL 來插入數(shù)據(jù)。每次會嘗試 x 條語句。
indexschema=schema
在創(chuàng)建索引期間對索引使用指定的模式。
striptblanks
在向變長字段裝入數(shù)據(jù)時,截斷任何尾部空格。
lobsinfile
指出要導入 LOB 數(shù)據(jù)。實用程序將檢查 LOBS FROM 子句,以獲取輸入 LOB 文件的路徑。
這里有一個實際使用這些文件類型修飾符的示例:
IMPORT FOR inputfile.asc OF ASC
LOBS FROM /u/db2load/lob1, /u/db2load/lob2
MODIFIED BY compount=5 lobinsfile
INSERT INTO newtable
使用控制中心進行import。
##LOAD實用程序概述
LOAD 實用程序是另一種用數(shù)據(jù)來填充表的方法。經(jīng)過格式化的頁被直接
寫入數(shù)據(jù)庫。這種機制允許進行比 IMPORT 實用程序更有效的數(shù)據(jù)移動。
不過,LOAD 實用程序不執(zhí)行某些操作,如引用或表約束檢查以及觸發(fā)器調用。
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。游標是從 SELECT
語句返回的結果集。使用 CURSOR 作為裝入輸入的示例顯示如下:
DECLARE mycursor CURSOR FOR SELECT col1, col2, col3 FROM tab1;
LOAD FROM mycursor OF CURSOR INSERT INTO newtab;
裝入目標必須存在,該實用程序才能啟動。這個目標可以是表、類型表或表別名。不支持向系統(tǒng)表或臨時表進行裝入。
請使用 MESSAGES 選項來捕獲裝入期間的任何錯誤、警告和信息性消息。
LOAD 可以以四種不同方式執(zhí)行:
INSERT 方式將輸入數(shù)據(jù)添加到表中,不更改現(xiàn)有表數(shù)據(jù)。
REPLACE 方式從表中刪除全部現(xiàn)有數(shù)據(jù),然后用輸入數(shù)據(jù)填充該表。
TERMINATE 方式終止裝入操作,然后回滾到裝入操作的起始點。一個例外是:如果指定了 REPLACE 方式,那么表將會被截斷。
RESTART 方式用于重新啟動以前中斷的裝入。它將自動從上一個一致性點繼續(xù)操作。要使用該方式,請指定與前面的 LOAD 命令中相同的選項,
但卻使用 RESTART 方式。它允許該實用程序找到在裝入處理期間生成的所有必需臨時文件。因此
,除非能夠確信不需要從裝入生成的臨時文件,否則就不要以手工方式除去任何這類文件,這一點十分重要。
一旦裝入不出任何錯誤地完成,臨時文件就會被自動除去。缺省情況下,臨時文件是在當前工作目錄中創(chuàng)建的。
可以使用 TEMPFILES PATH 選項指定存儲臨時文件的目錄。
#裝入過程的四個階段
完整的裝入過程分為四個不同階段。
裝入階段:
將數(shù)據(jù)裝入表中。
收集索引鍵和表統(tǒng)計信息。
記錄一致性點。
將無效數(shù)據(jù)放入轉儲文件,并在消息文件中記錄消息。當數(shù)據(jù)行與表的定義不一致時,這些數(shù)據(jù)行就被認為是無效數(shù)據(jù),
并會被拒絕(不裝入表中)。請使用 dumpfile 修飾符來指定文件的名稱和位置,以記錄任何被拒絕的行。
構建階段:
根據(jù)裝入階段所收集的鍵創(chuàng)建索引。
刪除階段:
刪除導致違反鍵唯一性的那些行,并將這些行放入異常表中。除了如上所述有些數(shù)據(jù)只是不滿足目標表的定義之外,還有
一些數(shù)據(jù)已經(jīng)通過了裝入階段,但卻違反了表中定義的唯一性約束。注:這里只將違反鍵唯一性的行作為壞數(shù)據(jù);目前不檢查其它約束。
由于這類數(shù)據(jù)已經(jīng)裝入了表中,因此 LOAD 實用程序將在此階段刪除違規(guī)行。異常表可以用來存儲被刪除的行,使您可以決定在裝入操
作完成之后如何處理它們。如果沒有指定異常表,那么就刪除違規(guī)行,而不做任何跟蹤,下面對異常表進行了更詳細的討論。
在消息文件中記錄消息。
索引復制階段:
如果 ALLOW READ ACCESS 是用 USE TABLESPACE 選項指定的,那么就會將索引數(shù)據(jù)從系統(tǒng)臨時表空間復制到
索引應該駐留的表空間。
異常表是一個用戶定義的表,它必須與要裝入的目標表具有相同的列定義。如果至少有一列沒有出現(xiàn)在異常表中,那么就
會廢棄違規(guī)行。只可以向表末尾添加兩個額外的列:記錄行插入時間的時間戳記列,以及存儲(認為行所包含的是壞數(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)顯示了輸入源文件的內容。
(2)中顯示的目標表 EMPLOYEE 是用以下列定義創(chuàng)建的:
第一列必須具有唯一性。
最后一列是不能為 NULL 的數(shù)字列。
(3)中顯示的異常表 EMPEXP 是用與 EMPLOYEE 相同的那些列以及時間戳記和消息列創(chuàng)建的。
在裝入階段,輸入文件的所有數(shù)據(jù)都被裝入了 EMPLOYEE — 但用粉紅色標記的兩行除外,
因為它們不滿足 NOT NULL 和 NUMERIC 列定義。由于指定了 DUMPFILE 修飾符,因此這兩行被記錄在文件 C:\emp.dmp 中。
在刪除階段,用黃色標記的兩行被從 EMPLOYEE 中刪除了,并且被插入異常表 EMPEXP 中。這是由于違反了 EMPLOYEE 表中第一
列的唯一性而引起的。
在裝入結束時,您應該檢查消息文件、轉儲文件和異常表,然后決定如何處理被拒絕的行。
如果裝入成功完成,那么就會除去在 D:\tmp 中生成的臨時文件。
#裝入選項
ROWCOUNT n:允許用戶指定只裝入輸入文件中的前 n 條記錄。
SAVECOUNT n:每裝入 n 條記錄之后就建立一致性點。同時會生成消息,并會將其記錄在消息文件中,以指出在保存點成功地裝入了多少輸入行。這一點在輸入文件類型為 CURSOR 時是無法做到的。
WARNINGCOUNT n:在發(fā)出 n 次警告后停止裝入。
INDEXING MODE [ REBUILD | INCREMENTAL | AUTOSELECT | DEFERRED ]:在構建階段,構建索引。這個選項指定 LOAD實用程序是重新構建索引還是增量式地擴展索引。支持四種不同方式:
REBUILD 方式強制重新構建所有索引。
INCREMENTAL 方式只用新數(shù)據(jù)擴展索引。
AUTOSELECT 方式允許實用程序在 REBUILD 和 INCREMENTAL 之間進行選擇。
DEFERRED 方式意味著在裝入期間不創(chuàng)建索引。所涉及的索引都用需要的刷新進行標記。這些索引將在重新啟動數(shù)據(jù)庫或第一次訪問這類索引時重新構建。
STATISTICS [ YES | NO ]:在執(zhí)行完裝入以后,以前的目標表統(tǒng)計信息極有可能不再有效,因為目標表中已加入了更多的數(shù)據(jù)。您可以通過指定 STATISTICS YES 來選擇收集這些統(tǒng)計信息。
#文件類型修飾符。文件類型修飾符是用 MODIFIED BY 子句指定的。下面是少數(shù)幾個您可能會覺得有用的修飾符:
fastparse:減少了對裝入數(shù)據(jù)的語法檢查以增強性能。
identityignore、identitymissing 和 identityoverride:分別用來忽略、指出丟失或覆蓋標識列數(shù)據(jù)。
indexfreespace n、pagefreespace n 和 totalfreespace n:在索引和數(shù)據(jù)頁中保留指定量的空閑頁。
norowwarnings:禁止行警告。
lobsinfile:指出將裝入 LOB 文件;并檢查 LOBS FROM 選項以獲取 LOB 路徑。
##裝入期間的表訪問
在裝入表期間,LOAD 實用程序會用互斥鎖將它鎖定。在裝入完成以前,不允許任何其它訪問。這是 ALLOW NO ACCESS 選項的缺省行為。在進行這種裝入期間,表處于 LOAD IN PROGRESS 狀態(tài)。有一個方便好用的命令可以檢查裝入操作的狀態(tài),還返回表狀態(tài):
LOAD QUERY TABLE table_name
您可能猜到了這一點,即有一個選項允許進行表訪問。ALLOW READ ACCESS 選項導致表在共享方式下被鎖定。閱讀器可以訪問表
中已經(jīng)存在的數(shù)據(jù),卻不能訪問新的數(shù)據(jù)。正在裝入的數(shù)據(jù)要等到裝入完成后才可獲得。此選項將裝入表同時置于 LOAD IN PROGRESS
狀態(tài)和 READ ACCESS ONLY 狀態(tài)。
正如在前一頁中所提到的那樣,在構建階段可以重新構建全部索引,也可以用新數(shù)據(jù)擴展索引。對于 ALLOW READ ACCESS 選項,
如果重新構建全部索引,那么會為該索引創(chuàng)建一個鏡像副本。當 LOAD 實用程序到達索引復制階段時(請參閱裝入過程的四個階段)
,目標表被置為脫機,然后將新索引復制到目標表空間。
無論指定哪個表訪問選項,裝入都需要各種鎖來進行處理。如果某一應用程序已經(jīng)鎖定了目標表,那么 LOAD 實用程序就必須等到
鎖被釋放。不想等待鎖的話,您可以在 LOAD 命令中使用 LOCK WITH FORCE 選項,以強制關閉其它持有沖突鎖的應用程序。
##檢查暫掛表狀態(tài)
至此,我們知道:不會將與目標表定義不一致的輸入數(shù)據(jù)裝入表中。在裝入階段,這樣的數(shù)據(jù)會遭到拒絕,并被記錄在消息文件中。
在刪除階段,LOAD 實用程序會刪除那些違反任何唯一性約束的行。如果指定了異常表,違規(guī)的行將插入該表。對于表可能定義的
其它約束(如引用完整性和檢查約束),怎么辦呢?LOAD
實用程序不檢查這些約束。表會被置于 CHECK PENDING 狀態(tài),這種狀態(tài)迫使您先手工檢查數(shù)據(jù)完整性,然后才能訪問表。如前一頁
中所討論的那樣,可以使用 LOAD QUERY 命令查詢表狀態(tài)。系統(tǒng)目錄表 SYSCAT.TABLES 中的列 CONST_CHECKED 也指出表中所定義的
每個約束的狀態(tài)。
狀態(tài)類型:Y,N,U,W,F
要手工為一個或多個表關閉完整性檢查,請使用 SET INTEGRITY 命令。下面給出了一些示例,以演示該命令的部分選項。要立即檢查表
EMPLOYEE 和 STAFF 追加的選項的完整性,請使用以下命令:
SET INTEGRITY FOR employee, staff IMMEDIATE CHECKED INCREMENTAL
要用 IMMEDIATE UNCHECKED 選項忽略對表 EMPLOYEE 的外鍵檢查:
SET INTEGRITY FOR employee FOREIGN KEY IMMEDIATE UNCHECKED
在裝入完成以后,有時您可能想將目標表及其具有外鍵關系的派生表置于 CHECK PENDING 狀態(tài)。這樣做確保了在對完整性進行手工
檢查之前,所有這些表的可訪問性都得到了控制。裝入選項是 CHECK PENDING CASCADE IMMEDIATE,它指出:立即將外鍵約束的檢查
暫掛狀態(tài)擴展到所有派生外鍵表。缺省情況下,只會將裝入的表置于檢查暫掛狀態(tài)。這正是裝入選項
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