<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ##db2move

    db2move 是一個數據移動工具,可以用來在 DB2 數據庫之間移動大量的表。該命令中支持的操作有 EXPORT、IMPORT 和 LOAD。
    db2move 的語法可以象下面那樣簡單:
    db2move database_name action options

    該工具先從系統目錄表中抽取用戶表列表,接著以 PC/IXF 格式導出每個表。然后,可以將這些 PC/IXF 文件導入或裝入到另一個
    DB2 數據庫。
    以下是一些示例。下面這條命令用指定的用戶標識和密碼以 REPLACE 方式導入 sample 數據庫中的所有表:

    db2move sample import -io replace -u userid -p password
    而下面這條命令則以 REPLACE 方式裝入 db2admin 和 db2user 模式下的所有表:

    db2move sample load -sn db2admin, db2user -lo REPLACE
       ##db2look 是一個方便的工具,可以從命令提示符或控制中心對其進行調用。該工具可以:

    從數據庫對象抽取數據庫定義語言(DDL)語句
    生成 UPDATE 語句來更新數據庫管理器和數據庫配置參數
    生成 db2set 命令來設置 DB2 概要文件注冊表
    抽取和生成數據庫統計報告
    生成 UPDATE 語句來復制有關數據庫對象的統計信息
    類似 LOAD 的實用程序都要求存在目標表。您可以使用 db2look 來抽取表的 DDL,對目標數據庫運行該 DLL,然后調用裝入操作。如同下面
    的示例所演示的那樣,db2look 使用起來非常方便。下面這條命令為(來自數據庫 department 的)peter 所創建的所有對象生成 DDL 語句,
    同時將輸出存儲在 alltables.sql 中。


    db2look -d department -u peter -e -o alltables.sql


    接下來這條命令生成:

    數據庫 department 中所有對象的 DLL(由選項 -d、-a 和 -e 指定)。
    復制數據庫中所有表和索引的統計信息的 UPDATE 語句(由選項 -m 指定)。
    GRANT 授權語句(由選項 -x 指定)。
    用于數據庫管理器和數據庫配置參數的 UPDATE 語句,以及用于概要文件注冊表的 db2set 命令(由選項 -f 指定)。

    db2look -d department -a -e -m -x -f -o db2look.sql

    ##RUNSTATS 實用程序

    DB2 利用一個完善的、基于成本的優化器來確定如何訪問數據。其決策在很大程度上受到了一些統計信息的影響,這些統計信息是關于數據庫
    表和索引的大小的。因此,要時刻使數據庫統計信息保持最新狀態,以便能夠選擇有效的數據存取方案,這一點十分重要。RUNSTATS 實用程
    序用于更新表的物理特征及其相關索引的統計信息。這些特征包括記錄數(基數)、頁數和平均記錄長度等。
    讓我們用一些示例來演示此實用程序的用法。下面的命令收集表 db2user.employee 的統計信息。在計算統計信息期間允許閱讀器和記錄器訪
    問該表:

    RUNSTATS ON TABLE db2user.employee ALLOW WRITE ACCESS

    以下命令用分布式統計收集表 db2user.employee 以及列 empid 和 empname 的統計信息。在此命令運行期間,該表只能用于只讀請求。

    RUNSTATS ON TABLE db2user.employee WITH DISTRIBUTION ON COLUMNS ( empid, empname )
        ALLOW READ ACCESS
    以下命令收集表 db2user.employee 的統計信息及其全部索引的詳細統計信息:

    RUNSTATS ON TABLE db2user.employee AND DETAILED INDEXES ALL

    ##REORG 和 REORGCHK 實用程序

    從數據庫增刪的數據在物理上可能并不是按順序放置的。在這種情況下,DB2 必須執行額外的讀操作來訪問數據。通常,這意味著需要更多的
    磁盤 I/O 操作,而我們都知道進行這類操作的代價是昂貴的。在這種情況下,您應該考慮根據索引對表進行物理上的重組,以便相關數據相
    互之間靠得更近一些,從而盡可能地減少 I/O 操作。
    REORG 是一個為表和/或索引重組數據的實用程序。雖然在物理上對數據進行了重新安排,但 DB2 卻提供了聯機或脫機執行該操作的選項。
    在缺省情況下,脫機 REORG 允許其他用戶讀取該表。您可以通過指定 ALLOW NO ACCESS 選項來限制表訪問。聯機 REORG(也稱為現場 REORG)
    不支持對表的讀訪問或寫訪問。由于重新安排了數據頁,因此并發應用程序可能必須等待 REORG 完成當前頁。您可以使用適當的選項來輕松
    地停止、暫停或重新開始重組過程:
    下面的示例都是非常容易看懂的:

    REORG TABLE db2user.employee INDEX db2user.idxemp INPLACE ALLOW WRITE ACCESS
    REORG TABLE db2user.employee INDEX db2user.idxemp INPLACE PAUSE

    REORGCHK 是另一個數據維護實用程序,它有一個選項可以用來檢索當前的數據庫統計信息或更新數據庫統計信息。它還會生成帶有 REORG
    指示符的統計信息報告。REORGCHK 根據統計規則在需要 REORG 的地方用星號(*)標記表或索引。
    讓我們考慮一些示例。下面這條命令生成當前(關于運行時授權標識擁有的全部表的)統計信息的報告:
    REORGCHK CURRENT STATISTICS ON TABLE USER

    下面的命令更新統計信息,然后生成在模式 smith 下創建的全部表的報告:

    REORGCHK UPDATE STATISTICS ON SCHEMA smith

    ##REBIND 實用程序和 FLUSH PACKAGE CACHE 命令

    在執行數據庫應用程序或任何 SQL 語句之前,必須先由 DB2 對它們進行預編譯,并生成一個包。包是一種數據庫對象,其中含有應用程序
    源文件中所使用的已編譯 SQL 語句。DB2 使用該包來訪問 SQL 語句中引用的數據。DB2 優化器如何為這些包選擇數據存取方案呢?它依靠
    包創建時的數據庫統計信息。
    對于靜態 SQL 語句,包在編譯時創建,并且被綁定到數據庫上。如果對統計信息進行了更新,以反映物理數據庫特征,那么也應該更新現有
    的包。REBIND 實用程序允許您重新創建包,以便可以利用當前的數據庫統計信息。命令十分簡單:

    REBIND PACKAGE package_name


    不過,如果您要更改應用程序源代碼,那么就得顯式地刪除現有的相關包,然后重新創建包。REBIND 實用程序不用于這一目的。這里,
    我們之所以就此對您加以提醒,是因為 DBA 經常誤解了 REBIND 的用法。
    對于動態 SQL 語句,它們是在運行時預編譯的,而且被存儲在包高速緩存中。如果更新了統計信息,那么您可能會刷新高速緩存,以便
    重新編譯動態 SQL 語句,從而獲取更新的統計信息。命令類似下面的樣子:

    FLUSH PACKAGE CACHE DYNAMIC

    ##數據庫維護過程
    RUNSTATS -- REORGCHK--YES--REORG
                  |      |
                  |      |
                  NO   |----- RUNSTATS
                  |----|---------|
                  REBIND      FLUSH PACKAGE CACHE
                     |      |
                     APPLICATION EXECUTION
                    
    ##DB2性能顧問程序
    1,圖形化工具CONFIGURATION ADVISOR
    2,CLP AUTOCONFIGURE USING mem_percent 60 workload_type complex num_stmts 20 APPLY DB AND DBM

    ##DB2 設計顧問程序

    設計顧問程序可以幫您找到 SQL 語句的最佳索引。它使用 DB2 優化器、數據庫統計信息和解釋(Explain)
    機制來為特定查詢或一組 SQL 語句(也稱為工作負載)生成推薦索引。您可以從命令行用 db2advis 加上必要的輸入啟動該顧問程序。
    下面的示例使用輸入文件
    input.sql 對 sample 數據庫執行設計顧問程序,該輸入文件含有一組 SQL 語句。然后將輸出存儲在 output.out 中。
    db2advis -d sample -i input.sql -o output.out

    圖形化工具:desigen Advisor

    ### 備份與恢復

    ##數據庫恢復概念
      系統故障,事務故障,介質故障,災難。
      #恢復策略
        問題:可以再次從另一個來源裝入數據嗎?能夠承受丟失多少數據?
              能化多少時間來恢復數據庫?哪些存儲資源可用于存儲備份和日志?
      #恢復類型
        崩潰恢復(系統崩潰,DB2重新啟動執行回滾),版本恢復(使用從BACKUP命令
        獲取的備份中恢復先前的數據庫版本),前滾恢復(通過使用完全數據庫備份,結合
        日志文件來擴展版本恢復,要求使用歸檔日志記錄)
        db2采用先寫日志后寫磁盤數據庫的方式。
      #主日志文件和輔助日志文件
        主日志文件是在首次數據庫連接時或數據庫激活時直接分配的。輔助日志文件需要時每次動態地分配一個。

    有幾個與日志記錄相關的數據庫配置參數。其中一些參數是:

    LOGPRIMARY:該參數確定要分配的主日志文件數。
    LOGSECOND:該參數確定可分配的輔助日志文件的最大數目。(最大254)
    LOGFILSIZ:該參數用于指定日志文件的大小(用 4 KB 頁為單位)。
    讓我們考慮一個示例。假設數據庫配置文件中有下列值:

    Log file size (4 KB)                        (LOGFILSIZ) = 250
    Number of primary log files                (LOGPRIMARY) = 3
    Number of secondary log files               (LOGSECOND) = 2
    Path to log files                                       = C:\mylogs\

    一旦首次建立與數據庫的連接,就分配三個主日志文件,它們均由 250 個 4 KB 頁組成。
    DB2 將填滿第一個日志,然后繼續填滿第二個和第三個日志。填滿第三個日志文件后,沒有更多的主
    (預分配的)日志文件,因此 DB2 將動態地分配第一個輔助日志文件,因為 LOGSECOND 大于零。一旦
    這個日志文件被填滿,DB2 將繼續分配另一個輔助日志文件,并將重復該過程,直到達到 LOGSECOND 日
    志文件數目的最大值為止。對于該示例,當 DB2 嘗試分配第三個輔助日志文件時,它將返回一個錯誤,
    指出已經達到事務滿條件。此時,將回滾該事務。

    #無限日志記錄
    要允許無限的活動日志記錄:

    將 USEREXIT 數據庫配置參數設置為 ON。
    將 LOGSECOND 設置為值 -1。
    #日志類型
    活動日志。如果滿足下面兩個條件中的任何一個,則認為該日志是活動的:
    它包含有關還未提交或回滾的事務的信息。
    它包含有關已經提交但其更改還未被寫入數據庫磁盤(外部化)的事務的信息。
    聯機歸檔日志。這種類型的日志包含已提交的且已外部化的事務的信息。這種日志被保存在與活動日志相同的目錄中。
    脫機歸檔日志。是指已經從活動日志目錄移動到另一個目錄或介質的歸檔日志。可以手工或使用用戶出口(userexit)
    的自動過程來完成這個移動。

       ##日志記錄類型
       循環日志類型:循環日志記錄是 DB2 的缺省日志記錄方式。從其名稱可以知道,這種類型的日志記錄以循環方式重用日志。例如,如果
    有四個主日志文件
       ,那么 DB2 將以如下順序使用它們:Log #1,Log #2,Log #3,Log #4,Log #1,Log #2 等。
    只要日志僅包含有關已經提交的且被外部化到數據庫磁盤的事務的信息,就可以用循環日志記錄方式重用它。換言之,如果日志仍
    是一個活動日志,則不能重用它。
    采用上面的示例,如果一個長期運行的事務使用五個日志,那么將發生什么情況呢?
    在這種情況下,DB2 將分配另一個日志文件 — 輔助日志文件,

      歸檔日志記錄。同樣,可以從其名稱知道,當使用歸檔日志記錄時,將歸檔(保留)日志。在循環日志記錄中,要覆蓋已提交且已外部化的
    事務,而在歸檔日志記錄中,將保存它們。
      例如,如果有四個主日志,DB2 可能以如下順序使用它們:Log #1,Log #2,Log #3,Log #4,(如果 Log #1 的所有事務都已被提
    交且外部化,則將其歸檔),Log #5,
      (如果 Log #2 的所有事務都已被提交且外部化,則將其歸檔),Log #6 等。
    正如您從上面的示例所看到的那樣,DB2 將使四個主日志文件保持可用,并且將不重用那些已經用某些事務填滿的日志文件,這些
    事務已經被提交且外部化。換言之,
    它不會覆蓋已變成歸檔日志的日志。
    注:在使用歸檔日志記錄之前,需要啟用它。要啟用它,必須同時打開下列參數或打開其中的任意一個:

    LOGRETAIN (db2 update db cfg for database_name using LOGRETAIN ON)
    USEREXIT  (db2 update db cfg for database_name using USEREXIT ON)
    循環日志記錄僅支持崩潰和版本恢復,而歸檔日志記錄支持所有類型的恢復:崩潰恢復、版本恢復和前滾恢復。

    用戶出口

    我們在前幾章中多次提到用戶出口。用戶出口是允許將聯機歸檔日志移到另一個目錄(非活動日志目錄)或另一個介質的程序。當為完全數據庫
    恢復進行 ROLLFORWARD 操作期間需要脫機歸檔日志時,用戶出口還會將它們檢索到活動日志目錄中。要啟用用戶出口,將 USEREXIT 數據庫配置參
    數設置為 ON。一旦啟用,DB2 將根據需要自動調用用戶出口程序。需要將該程序命名為 db2uext2,在 Windows 中,應該將它存儲在 sqllib\bin
    目錄中,在 UNIX 中,應該將它存儲在 sqllib/bin 目錄中。

    ## 數據庫和表空間備份

    #數據庫備份 第 2 頁(共6 頁)




    數據庫備份是數據庫的完整副本。除了數據外,備份副本還會包含有關表空間、容器、數據庫配置、日志控制文件以及恢復歷史記錄文件的信息。注:備份將不存儲數據庫管理器配置文件或注冊表變量。只備份數據庫配置文件。

    要執行備份,需要 SYSADM、SYSCTRL 或 SYSMAINT 權限。

    下面是用于這種備份的 BACKUP 命令實用程序的語法:


    BACKUP DATABASE database-alias [USER username [USING password]]
          [TABLESPACE (tblspace-name [ {,tblspace-name} ... ])] [ONLINE]
          [INCREMENTAL [DELTA]] [USE {TSM | XBSA} [OPEN num-sess SESSIONS]] |
       TO dir/dev [ {,dir/dev} ... ] | LOAD lib-name [OPEN num-sess SESSIONS]]
          [WITH num-buff BUFFERS] [BUFFER buffer-size] [PARALLELISM n]
          [WITHOUT PROMPTING]


    要使用其它備份選項來執行數據庫“sample”的完全脫機備份,可以使用以下命令:


    (1) BACKUP DATABASE sample                     
    (2)   TO /db2backup/dir1, /db2backup/dir2    
    (3)   WITH 4 BUFFERS                         
    (4)   BUFFER 4096                            
    (5)   PARALLELISM 2                          


    讓我們更仔細地研究該命令:

    指明要備份的數據庫的名稱(或別名)。
    指定用來存儲備份的一個或多個位置。
    確定在備份操作期間可以使用內存中的多少緩沖區。使用多個緩沖區可以改善性能。
    確定每個緩沖區的大小。
    確定使用多少個介質閱讀器/記錄器進程/線程來執行備份。
    注:語法中沒有關鍵字 OFFLINE,因為這是缺省方式。要執行 sample 數據庫的完全聯機備份,必須指定關鍵字 ONLINE,如下所示:


    BACKUP DATABASE sample                  
      ONLINE                              
      TO /dev/rdir1, /dev/rdir2           


    我們先前提到過:聯機備份允許其他用戶在備份數據庫時對它進行訪問。這些用戶所做的一些更改很可能在備份時沒有存儲在備份副本中。
    因此,恢復時需要聯機備份和一組完整的歸檔日志。此外,聯機備份一完成,DB2 就強制當前的活動日志關閉;結果,將歸檔該日志。

    注:聯機備份要求為數據庫啟用歸檔日志記錄。 DB CFG: LOGHEAD指向活動的最低編號的日志,小于LOGHEAD的日志
    是歸檔日志且可以移動。可以使用ARCHIVE LOG 命令來對日志進行歸檔。



    #表空間備份
       在只有一些表空間有相當大更改的數據庫中,可以選擇不備份整個數據庫,而只備份特定表空間。
    要執行表空間備份,請使用以下語法:

    (1) BACKUP DATABASE sample
    (2) TABLESPACE ( syscatspace, userspace1, userspace2 )
    (3) ONLINE
    (4) TO /db2tbsp/backup1, /db2tbsp/backup2
    通常,您想要將相關的表空間備份在一起,如數據,索引,LOB
      或定義了表間引用約束的表的表空間
     
      注意:此備份方式只能用于ARCHIVAL LOGGIN 環境中。

      #增量備份
      有兩種類型的增量備份:

    增量:DB2 備份自上次完全數據庫備份以來所更改的所有數據。
    delta:DB2 將只備份自上一次成功的完全、增量或差異備份以來所更改的數據。

    注意:要執行增量備份,DB CFG中的TRACKMOD必須設置為 YES(跟蹤表空間中發生變化的頁面).
      在控制中心執行備份。
     
      #備份文件
      磁盤上的 DB2 備份文件的命名約定包含下列幾項:

    數據庫別名
    表示備份類型的數字(0 表示完全數據庫備份,3 表示表空間備份,4 表示來自 LOAD 的副本)
    實例名
    數據庫節點(對于單一分區數據庫始終是 NODE0000)
    目錄節點號(對于單一分區數據庫始終是 CATN0000)
    備份的時間戳記
    映像序列號

    分區數據庫的備份:
    In the following example, the database WSDB is defined on all 4 partitions,
    numbered 0 through 3. The path /dev3/backup is accessible from all
    partitions. Partition 0 is the catalog partition, and needs to be backed-up
    separately since this is an offline backup. To perform an offline backup of all
    the WSDB database partitions to /dev3/backup, issue the following
    commands from one of the database partitions:

    db2_all ’<<+0< db2 BACKUP DATABASE wsdb TO /dev3/backup’
    db2_all ’|<<-0< db2 BACKUP DATABASE wsdb TO /dev3/backup’
    posted @ 2005-06-08 19:08 小馬歌 閱讀(976) | 評論 (0)編輯 收藏
     
    #聲明臨時表
    DECLARE GLOBAL TEMPORARY TABLE session.temp1
      LIKE employee
      ON COMMIT PRESERVE ROWS
      NOT LOGGED
    IN mytempspace

    #ALTER
      可以修改:緩沖池,表,表空間,視圖

    #DROP
      可以刪除:緩沖池,事件監控程序,函數,索引,模式,存儲過程,表,表空間,觸發器,視圖.
    #產生數據備份
    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') )


    #創建索引
    CREATE INDEX I2BOOKNAME ON BOOKS (AUTHOID DESC, BOOKNAME ASC)


    #設置概要文件注冊表
      設置后實例要重新啟動
      列出所有的變量: db2set -lr
      設置變量:db2set variable_name=value
      設置為缺省值:db2set variable_name=
      顯示設置的變量:db2set -all
    # 設置數據庫管理器和數據庫的參數
      獲取當前參數:
        db2 get database manager configuration
    db2 get database configuration for database_name
    db2 get database manager configuration show detail
      設置參數:
       db2 update database manager configuration using parameter new_value
    db2 update database configuration for database_name using parameter new_value
    #準備數據庫服務端口
      db2set DB2COMM=TCPIP,NETBIOS
      在services文件中包含服務和端口號,
       如:db2icdb2    50000/tcp
      db2 update database manager configuration using svcename db2icdb2
      重新啟動數據庫.
     
    #查看連接的應用程序
      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
    #創建緩沖池
      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;

    #將表空間的狀態復位成正常(NORMAL)
      quiesce tablespaces for table <tablename> reset
     
    #有用的目錄表
      SYSCAT.COLUMNS:所包含的每一行對應于表或視圖中定義的每個列
      SYSCAT.INDEXCOLUSE:列出索引中包含的所有列
      SYSCAT.INDEXES:包含的每一行對應于表或視圖中定義的每個索引(包括適用的繼承索引)。
      SYSCAT.TABLES:所創建每個表、視圖、別名(nickname)或別名(alias)都對應其中一行。所有目錄表和視圖都在 SYSCAT.TABLES 目錄視圖中擁有一項。
      SYSCAT.VIEWS:所創建的每個視圖都對應其中一行或多行。
     

    ###監控DB2活動
      ##捕獲快照
        數據庫,表空間,表,緩沖池,鎖,數據庫管理器,應用程序
      #拍攝快照
       API,命令行
      UPDATE MONITOR SWITCHES
      #打開和關閉快照
       1,在實例級別上設置監視器開關(影響所有用戶和數據庫)
         DFT_MON_STMT:語句監視器(用于動態 SQL)
    DFT_MON_TABLE:表監視器
    DFT_MON_LOCK:鎖監視器
    DFT_MON_BUFPOOL:緩沖池監視器
    DFT_MON_SORT:排序監視器
    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,在應用程序級別上設置監視器開關(只適合于特定的應用程序)
       在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]
    將監視器開關的值復位成空或0.
        #數據庫快照
         包含如下信息:
         連接
    DB2 代理程序

    排序
    緩沖池活動總數
    SQL 活動
    SQL 語句數量
    日志使用情況
    高速緩存使用情況
    散列連接
        下面是獲取這種快照的命令
    db2 get snapshot for database on databaseName

        #數據庫管理器快照
        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
       
        #動態SQL快照
        #查找執行速度較慢的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

        第二個示例查找平均執行時間最長的五條 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

    ### 事件監控器
         人們用快照來檢查某個精確時刻的DB2,并聚集性能信息。事件監控器與此不同,人們用他在固定的時間
        周期內監控DB2性能。事件監視器檢查數據庫中的轉換事件,并將每個事件都當成一個對象。這允許對 DB2 的行為進行非常詳細的分析。
            事件監視器捕獲的信息類似于快照捕獲的信息。同時可以運行多個監視器,并且每個監視器也可以捕獲多種事件類型的信息。這允許不同的管理員相互獨立地監控不同的活動。

    事件監視器可以捕獲有關下列內容的信息:

    數據庫

    死鎖
    表空間
    緩沖池
    連接
    語句
    事務
    可將事件監視器的信息寫到:

    SQL 表
    文件
    管道

       ##創建事件監視器
         CREATE EVENT MONITOR
       ##打開和關閉監視器
         db2 set event monitor eventMonitorName state [0|1]
    eventMonitorName 是已創建的事件監視器的名稱。0 將關閉監視器,而 1 將打開監視器。
          #獲取狀態
          SELECT EVENT_MON_STATE('drewTest') FROM SYSIBM.SYSDUMMY1

    SYSIBM.SYSEVENTMONITORS 表及該表的視圖 SYSCAT.EVENTMONITORS 包含有關已創建的事件監視器的信息。可以對這些表運行 SQL 查詢,以確定監視器的狀態:
    SELECT evmonname, target_type, target,
    FROM syscat.eventmonitors
    where evmonname LIKE 'drew%'

    autostart 選項

    用于創建事件監視器的命令中的 autostart 選項表明,每當數據庫啟動時,自動啟動事件監視器。

    #清空事件監視器
          注意:事件監控器名稱使用大寫字母,需要創建目錄。
         
         
    還可將事件監視器數據清空到磁盤中。如果您希望記錄這類信息,如通常僅當終止所有連接時才寫的數據庫事件,那么這非常有用。下面是一個示例命令:

    db2 flush event monitor eventMonitorName
    #使用事件監視器
           事件監視器應當用于監控非常具體的一些事件或短時間內的工作負載。它
    們旨在為您提供非常具體的信息,以允許您診斷數據庫或應用程序的問題或行為。
    與快照不同,事件監視器對 DB2 的性能影響極大。這是由于為每個事件對象寫的
    信息的數量造成的。語句監視器對性能的影響極大,因為數據庫引擎必須為每個
    查詢執行所有額外的工作:不只是能夠執行查詢,DB2 引擎還必須寫出這條查詢
    的所有特征和運行時信息。該信息必須寫入文本文件,這樣會進一步降低性能。

    #死鎖監控
            CREATE EVENT MONITOR DEADLOCK_DB
    FOR DEADLOCKS
    WRITE TO FILE 'deadlock_db'
    MAXFILES 1
    MAXFILESIZE NONE
    AUTOSTART
                  注意:事件監控器名稱使用大寫字母,需要創建目錄。

    #SQL監控
            SQL 監視器十分有用,因為它可以俘獲動態和靜態 SQL 語句。如果應用
    程序利用了無法用 SQL 快照捕獲的預編譯 SQL 語句,那么該監視器就
    很重要。

    對于每條被執行的 SQL 語句記錄一個事件。每個語句的屬性(如讀取、
    選擇和刪除等等操作的行數)都被記錄下來,但是不象在快照中那樣以
    匯總的方式進行表示。另外還記錄執行的時間范圍以及啟動和停止次數。這允許您對一些事務以及某個應用程序的 SQL 執行對其它應用程序的 SQL 執行有何影響進行詳細分析。

    還可以使用 SQL 監視器來發現拙劣的執行代碼;如果將輸出放入表中,
    那么通過對個別代碼的執行次數進行搜索,可以做到這一點。由于運行
    SQL 監視器的信息量以及性能開銷,所以只應在短期測試或問題確定中
    使用該技術,而不應在生產環境中使用它。

    CREATE EVENT MONITOR BAR
    FOR STATEMENTS
    WRITE TO TABLE
    STMT(TABLE drewkb.stmtTab)
    includes(rows_read,rows_written_stmt_text)

    #捕獲事件監視器數據
            db2eva [db databaseName] [evm eventMonitorName]

           #利用EXPLAIN分析SQL
            SQL 的 Explain 通過圖形化或基于文本的方式詳細說明了 SQL 語句的每個部分是如何執行以及何時執行的。這包括以下一些基本信息:

    正被訪問的表
    正被使用的索引
    何時連接數據
    何時排序數據
    Explain 還捕獲更復雜的信息,在細究 SQL 正在發生什么時,該信息非常有用:

    表和索引基數
    正連接的表和索引的順序
    結果集的基數
    在查詢的每部分正在選擇哪些字段
    排序方法
    SQL 每部分的時間范圍

           要理解 Explain 信息,您需要掌握的最重要概念是 timeron。timeron 是 DB2 優化器使
    用的計量單位,用來計量完成查詢的時間和資源數量。timeron 綜合了時間、CPU 利用率、
    I/O 和其它因素。由于這些參數值是變化的,因此執行某個查詢所需的 timeron 數量是動態
    的,每次執行該查詢所需的 timeron 都不同。

    #使用控制中心的EXPLAIN SQL
             觀察SQL的存取方案,分析優化參數,考慮優化的級別。
            #使用字符工具
             db2 set current explain mode [no|yes|explain]
    db2exfmt
    可以從命令行調用 db2expln 工具,以獲得查詢的存取方案。但是,該工具不返回優化器信息。
            db2expln -database drew_db -statement "select * from syscat.tables" -terminal

    #SQL故障診斷
            索引使用,是否使用索引,使用索引的順序
            表基數和"SELECT *" 的使用
            優化級別太低。
            設置優化級別:db2 set current query optimization [0|1|2|3|5|7|9]
       ##使用運行狀況中心和內存可視化工具
           # 選定實例使用view memory usage,可以把輸出保存到文件。
       除了提供了內存可視化之外,該工具還允許您對某些參數值設置警報。警報的輸出將被寫到名為
    threshold 的文件,該文件與 db2diag.log 位于同一目錄下。該目錄位于實例主目錄下。根據
    您創建實例時所做選擇的不同,該位置也會不同。
    # DB2運行狀況中心
             是否有充足的資源(如可用內存、表空間容器或日志存儲器)來完成任務
    資源使用是否有效
    任務是否在可接受的時間周期內完成,或者任務的完成是否不會大幅度降低性能
    資源或數據庫對象是否不會永遠處于不可用狀態

      ##DB2查詢巡視器和控制器
           IBM 為 DB2 提供了兩種主要工具,它們允許您監控和控制數據庫上 SQL 的執行。DB2 控制器(Governor)用于控制
    用戶和應用程序執行其 SQL 的優先級。DB2 查詢巡視器(Query Patroller)為決策支持系統提供了查詢和資源管理。
    該工具接受通過您系統的所有查詢,并對其進行分析、優先排序和調度。
          
    DB2 查詢巡視器為決策支持系統提供了查詢和資源管理。該工具可以接受流經您系統的所有查詢,并對其進行分析、
    優先排序和調度。一旦完成查詢,用戶也將接到通知。在大型環境(其中完成某些查詢可能要花幾個小時,或者不
    同部門可能具有不同的系統優先級或用途)中,該功能極其有用。

    通過將工作重定向到合適的數據庫分區,查詢巡視器還將執行負載均衡,以確保某個數據庫分區的使用不會過于繁重
    。該工具只能與 SMP 或 MMP 環境中 DB2 ESE 的多分區選項一起使用。

    在經過最新修訂以后,IBM 已經對 DB2 查詢巡視器徹底進行了重新架構,從而將查詢控制功能集成進了類似 DB2 控制
    中心的 DB2 查詢巡視器中心,并提供了一個易于使用的用戶界面。查詢巡視器是完全基于服務器的,不需要客戶機軟件。

    #性能  監控命令
    get monitor switches  返回會話監控開關的狀態
    update monitor switches using <monitor> <on|off> 為<monitor>設置會話監控開關的狀態
    reset monitor all 復位性能監控程序值
    get snapshot for dbm
    get snapshot for all on <dbname>
    get snapshot for dynamic sql on <dbname>   返回動態SQL高速緩存的內容
    runstats on table <tbschema>.<tbname> 收集<tbname>的統計信息
    reorgchk on table all      確定是否需要重組  reorgchk on table <tbschema>.<tbname>
    reorg table <tablename> 通過重組消除碎片
    ###DB2實用程序
        三種實用程序:EXPORT,IMPORT,LOAD
            這些實用程序支持的文件格式有:

    非定界或定長 ASCII(ASC):顧名思義,這種文件類型包含定長 ASCII 數據,以便與列數據對齊。每個 ASC 文件都是一個
    ASCII 字符流,這個字符流由根據行和列排序的數據值組成。數據流中的行由行定界符分隔,而通常將行定界符假定為換行符。
    定界 ASCII(DEL):它是各種數據庫管理器用于數據交換的最常用文件格式。這種格式包含 ASCII 數據,它使用特殊字符定
    界符分隔列值。數據流中的行由換行符充當行定界符進行分隔。
    PC 版集成交換格式(PC version of the Integrated Exchange Format,PC/IXF):它是數據庫表的結構化描述。這種文件格式不僅
    可以用于導入數據,還可以用于創建目標數據庫中尚不存在的表。
    工作表格式(Worksheet Format,WSF):以這種格式存儲的數據可以在工作表中顯示。這種格式只能用于導出和導入。
    游標:游標是用查詢聲明的。它只能用作裝入操作的輸入。

    #EXPORT 實用程序使用 SQL SELECT 語句將數據從數據庫表抽取到某個文件中。對于導出的數據而言,其文件格式可以是 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;

       在前一頁上的示例中,數據被抽取到一個 DEL 格式的文件中。缺省情況下,列值由逗號(,)分隔,而字符串由雙引號(")括起來。如果要抽取
    的數據已經包含逗號和雙引號,那該怎么辦呢?如果是這樣的話,導入或裝入實用程序不可能確定:哪些符號是實際的數據,哪些是定界符。要定
    制 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 字符串為輸出數據的新代碼頁。在導出操作期間,將字符數據從應用程序代碼頁轉換成這一代碼頁。
    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 表導出數據,其間發生了下列行為:

    字符串由感嘆號(!)括起來
    列由 @ 號定界
    字符串被轉換成代碼頁 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 選項將導入的數據插入表中。目標表必須已經存在。
    INSERT_UPDATE 向表中插入數據,或者用匹配的主鍵更新表中現有的行。目標表必須存在,且定義了主鍵。
    REPLACE 選項刪除現有的全部數據,然后將導入的數據插入現有的目標表中。
    有了 REPLACE_CREATE 選項,如果目標表存在,那么實用程序刪除現有的數據,然后插入新數據,就好像指定了 REPLACE 選項一樣。如果沒有定義目標表,那么在導入數據之前將先創建該表及其相關索引。正如您可以想到的那樣,輸入文件必須是 PC/IXF 格式的,因為這種格式含有導出表的結構化描述。如果目標表是由外鍵引用的父表,就不能使用 REPLACE_CREATE。
    CREATE 選項創建目標表及其索引,然后將數據導入到新表中。它唯一支持的文件格式是 PC/IXF。您也可以指定表空間的名稱,新表將創建于其中。
    示例:


    IMPORT FROM emp.ixf OF IXF
    COMMITCOUNT 500
        MESSAGES msg.out
        CREATE INTO employee IN datatbsp INDEX IN indtbsp
           
            如果上面的命令因為某些原因而執行失敗,那么您可以使用消息文件確定被成功導入并提交的最后一行。然后,您可以使用
    RESTARTCOUNT 選項重新啟動導入。在下面的命令中,實用程序將跳過前面的 30000 條記錄才開始 IMPORT 操作。


    IMPORT FROM myfile.ixf OF IXF
       COMMITCOUNT 500 RESTARTCOUNT 30000
       MESSAGES msg.out
       INSERT INTO newtable

           compound=x
    使用非原子的復合 SQL 來插入數據。每次會嘗試 x 條語句。
    indexschema=schema
    在創建索引期間對索引使用指定的模式。
    striptblanks
    在向變長字段裝入數據時,截斷任何尾部空格。
    lobsinfile
    指出要導入 LOB 數據。實用程序將檢查 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 實用程序是另一種用數據來填充表的方法。經過格式化的頁被直接
    寫入數據庫。這種機制允許進行比 IMPORT 實用程序更有效的數據移動。
    不過,LOAD 實用程序不執行某些操作,如引用或表約束檢查以及觸發器調用。

      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;


    裝入目標必須存在,該實用程序才能啟動。這個目標可以是表、類型表或表別名。不支持向系統表或臨時表進行裝入。

    請使用 MESSAGES 選項來捕獲裝入期間的任何錯誤、警告和信息性消息。

    LOAD 可以以四種不同方式執行:

    INSERT 方式將輸入數據添加到表中,不更改現有表數據。
    REPLACE 方式從表中刪除全部現有數據,然后用輸入數據填充該表。
    TERMINATE 方式終止裝入操作,然后回滾到裝入操作的起始點。一個例外是:如果指定了 REPLACE 方式,那么表將會被截斷。
    RESTART 方式用于重新啟動以前中斷的裝入。它將自動從上一個一致性點繼續操作。要使用該方式,請指定與前面的 LOAD 命令中相同的選項,
    但卻使用 RESTART 方式。它允許該實用程序找到在裝入處理期間生成的所有必需臨時文件。因此
    ,除非能夠確信不需要從裝入生成的臨時文件,否則就不要以手工方式除去任何這類文件,這一點十分重要。
    一旦裝入不出任何錯誤地完成,臨時文件就會被自動除去。缺省情況下,臨時文件是在當前工作目錄中創建的。
    可以使用 TEMPFILES PATH 選項指定存儲臨時文件的目錄。
       #裝入過程的四個階段
           完整的裝入過程分為四個不同階段。

    裝入階段:
    將數據裝入表中。
    收集索引鍵和表統計信息。
    記錄一致性點。
    將無效數據放入轉儲文件,并在消息文件中記錄消息。當數據行與表的定義不一致時,這些數據行就被認為是無效數據,
    并會被拒絕(不裝入表中)。請使用 dumpfile 修飾符來指定文件的名稱和位置,以記錄任何被拒絕的行。
    構建階段:
    根據裝入階段所收集的鍵創建索引。
    刪除階段:
    刪除導致違反鍵唯一性的那些行,并將這些行放入異常表中。除了如上所述有些數據只是不滿足目標表的定義之外,還有
    一些數據已經通過了裝入階段,但卻違反了表中定義的唯一性約束。注:這里只將違反鍵唯一性的行作為壞數據;目前不檢查其它約束。
    由于這類數據已經裝入了表中,因此 LOAD 實用程序將在此階段刪除違規行。異常表可以用來存儲被刪除的行,使您可以決定在裝入操
    作完成之后如何處理它們。如果沒有指定異常表,那么就刪除違規行,而不做任何跟蹤,下面對異常表進行了更詳細的討論。
    在消息文件中記錄消息。
    索引復制階段:
    如果 ALLOW READ ACCESS 是用 USE TABLESPACE 選項指定的,那么就會將索引數據從系統臨時表空間復制到
    索引應該駐留的表空間。
    異常表是一個用戶定義的表,它必須與要裝入的目標表具有相同的列定義。如果至少有一列沒有出現在異常表中,那么就
    會廢棄違規行。只可以向表末尾添加兩個額外的列:記錄行插入時間的時間戳記列,以及存儲(認為行所包含的是壞數據的)
    理由(或消息)的 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 是用以下列定義創建的:
    第一列必須具有唯一性。
    最后一列是不能為 NULL 的數字列。
    (3)中顯示的異常表 EMPEXP 是用與 EMPLOYEE 相同的那些列以及時間戳記和消息列創建的。
    在裝入階段,輸入文件的所有數據都被裝入了 EMPLOYEE — 但用粉紅色標記的兩行除外,
    因為它們不滿足 NOT NULL 和 NUMERIC 列定義。由于指定了 DUMPFILE 修飾符,因此這兩行被記錄在文件 C:\emp.dmp 中。

    在刪除階段,用黃色標記的兩行被從 EMPLOYEE 中刪除了,并且被插入異常表 EMPEXP 中。這是由于違反了 EMPLOYEE 表中第一
    列的唯一性而引起的。

    在裝入結束時,您應該檢查消息文件、轉儲文件和異常表,然后決定如何處理被拒絕的行。
    如果裝入成功完成,那么就會除去在 D:\tmp 中生成的臨時文件。

      #裝入選項
          ROWCOUNT n:允許用戶指定只裝入輸入文件中的前 n 條記錄。
    SAVECOUNT n:每裝入 n 條記錄之后就建立一致性點。同時會生成消息,并會將其記錄在消息文件中,以指出在保存點成功地裝入了多少輸入行。這一點在輸入文件類型為 CURSOR 時是無法做到的。
    WARNINGCOUNT n:在發出 n 次警告后停止裝入。
    INDEXING MODE [ REBUILD | INCREMENTAL | AUTOSELECT | DEFERRED ]:在構建階段,構建索引。這個選項指定 LOAD實用程序是重新構建索引還是增量式地擴展索引。支持四種不同方式:
    REBUILD 方式強制重新構建所有索引。
    INCREMENTAL 方式只用新數據擴展索引。
    AUTOSELECT 方式允許實用程序在 REBUILD 和 INCREMENTAL 之間進行選擇。
    DEFERRED 方式意味著在裝入期間不創建索引。所涉及的索引都用需要的刷新進行標記。這些索引將在重新啟動數據庫或第一次訪問這類索引時重新構建。
    STATISTICS [ YES | NO ]:在執行完裝入以后,以前的目標表統計信息極有可能不再有效,因為目標表中已加入了更多的數據。您可以通過指定 STATISTICS YES 來選擇收集這些統計信息。
      #文件類型修飾符。文件類型修飾符是用 MODIFIED BY 子句指定的。下面是少數幾個您可能會覺得有用的修飾符:

    fastparse:減少了對裝入數據的語法檢查以增強性能。
    identityignore、identitymissing 和 identityoverride:分別用來忽略、指出丟失或覆蓋標識列數據。
    indexfreespace n、pagefreespace n 和 totalfreespace n:在索引和數據頁中保留指定量的空閑頁。
    norowwarnings:禁止行警告。
    lobsinfile:指出將裝入 LOB 文件;并檢查 LOBS FROM 選項以獲取 LOB 路徑。
     
      ##裝入期間的表訪問
        在裝入表期間,LOAD 實用程序會用互斥鎖將它鎖定。在裝入完成以前,不允許任何其它訪問。這是 ALLOW NO ACCESS 選項的缺省行為。在進行這種裝入期間,表處于 LOAD IN PROGRESS 狀態。有一個方便好用的命令可以檢查裝入操作的狀態,還返回表狀態:


    LOAD QUERY TABLE table_name


    您可能猜到了這一點,即有一個選項允許進行表訪問。ALLOW READ ACCESS 選項導致表在共享方式下被鎖定。閱讀器可以訪問表
    中已經存在的數據,卻不能訪問新的數據。正在裝入的數據要等到裝入完成后才可獲得。此選項將裝入表同時置于 LOAD IN PROGRESS
    狀態和 READ ACCESS ONLY 狀態。
    正如在前一頁中所提到的那樣,在構建階段可以重新構建全部索引,也可以用新數據擴展索引。對于 ALLOW READ ACCESS 選項,
    如果重新構建全部索引,那么會為該索引創建一個鏡像副本。當 LOAD 實用程序到達索引復制階段時(請參閱裝入過程的四個階段)
    ,目標表被置為脫機,然后將新索引復制到目標表空間。
    無論指定哪個表訪問選項,裝入都需要各種鎖來進行處理。如果某一應用程序已經鎖定了目標表,那么 LOAD 實用程序就必須等到
    鎖被釋放。不想等待鎖的話,您可以在 LOAD 命令中使用 LOCK WITH FORCE 選項,以強制關閉其它持有沖突鎖的應用程序。

      ##檢查暫掛表狀態
         至此,我們知道:不會將與目標表定義不一致的輸入數據裝入表中。在裝入階段,這樣的數據會遭到拒絕,并被記錄在消息文件中。
    在刪除階段,LOAD 實用程序會刪除那些違反任何唯一性約束的行。如果指定了異常表,違規的行將插入該表。對于表可能定義的
    其它約束(如引用完整性和檢查約束),怎么辦呢?LOAD
    實用程序不檢查這些約束。表會被置于 CHECK PENDING 狀態,這種狀態迫使您先手工檢查數據完整性,然后才能訪問表。如前一頁
    中所討論的那樣,可以使用 LOAD QUERY 命令查詢表狀態。系統目錄表 SYSCAT.TABLES 中的列 CONST_CHECKED 也指出表中所定義的
    每個約束的狀態。

           狀態類型: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 狀態。這樣做確保了在對完整性進行手工
    檢查之前,所有這些表的可訪問性都得到了控制。裝入選項是 CHECK PENDING CASCADE IMMEDIATE,它指出:立即將外鍵約束的檢查
    暫掛狀態擴展到所有派生外鍵表。缺省情況下,只會將裝入的表置于檢查暫掛狀態。這正是裝入選項
    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
    posted @ 2005-06-08 19:07 小馬歌 閱讀(2941) | 評論 (0)編輯 收藏
     
    六,創建數據庫
    創建數據庫時,完成如下任務:
    * 設置數據庫所需的所有系統目錄表
    * 分配數據庫恢復日志
    * 創建數據庫配置文件,設置缺省值
    * 將數據庫實用程序與數據庫綁定

    初始數據庫分區組的定義
    當最初創建數據庫時,會為所有在db2nodes.cfg文件中指定的分區創建數據庫分區.可以用
    add dbpartitionnum 和 drop dbpartitionnum verify 命令來添加或除去其他分區.
    定義了三個數據庫分區組:
             * 用于容納syscatspace表空間的ibmcatgroup, 保存系統目錄表
             * 用于容納tempspaces1表空間的ibmtempgroup,保存系統臨時表
    * 用于容納userspace1表空間的ibmdefaultgroup,缺省保存用戶表和索引

    (創建新的數據庫后最好重新啟動db2clp)

    EXAMPLE:
    CREATE DATABASE PERSONL
       CATALOG TABLESPACE
         MANAGED BY SYSTEM USING (path 'D:\PCATALOG','E:\PCATALOG')
         EXTENTSIZE 16 PREFETCHSIZE 32
       USER TABLESPACE
         MANAGED BY DATABASE USING (FILE 'D:\DB2DATA\PERSION1' 5000,
                                    FILE 'D:\DB2DATA\PERSION2' 5000)
         EXTENSIZE 32 PREFETCHSIZE 64
       TEMPORARY TABLESPACE
         MANAGED BY SYSTEM USING (path 'F:\DB2TEMP\PERSONL')
       WITH "PERSONNEL DB FOR DSCHIEFER CO"

    create database sccrm using codeset GBK territory CN

    #刪除數據庫
       DROP DATABASE <DB-NAME>
      

    # 數據庫目錄的定義
      *本地數據庫目錄(節點的目錄中的文件SQLDBDIR)
         本地數據庫目錄文件存在于定義了數據庫的每條路徑(或WIN中的"驅動器")
         對于可以從該位置存取得每個數據庫此目錄都包含一個條目.包含信息:
          數據庫名稱,數據庫別名,數據庫注釋,數據庫的根目錄的名稱,其他系統信息.
      *系統數據庫目錄(實例中的目錄中的文件SQLDBDIR)
         對于數據庫管理器的每個實例,都存在一個系統數據庫目錄文件,該文件對于針對
         此實例編目的每個數據庫都包含一個條目.使用CREATE DATABASE時隱式的編目數據庫
         每個數據庫包含一條信息: 數據庫名,數據庫別名,數據庫注釋,本地數據庫目錄的位置,
          指示該數據庫是間接的指示符,表示它與系統數據庫目錄文件駐留在相同的機器上.
    查看本地或系統數據庫目錄文件
       LIST DATABASE DIRECTORY ON <location>
       LIST DATABASE DIRECTORY
      
      *節點目錄
         數據庫管理器在編目第一個數據庫分區時會創建節點目錄.要編目數據庫分區,
         使用CATALOG NODE命令.要顯示本地節點目錄的內容,使用LIST NODE DIRECTORY
         .在每個數據庫客戶機上都創建并維護節點目錄.對于具有客戶機可以存取得一個
         或多個數據庫的每個遠程工作站,該目錄都包含一個條目.db2客戶機使用該節點目錄中
         的通信端點信息.
         catalog tcpip node my_node_name remote 10.10.10.10 server 54321
    uncatalog node my_node_name
         catalog database DB as my_data_alias at node my_node_name
    # "輕量級目錄訪問協議" (LDAP)目錄服務
        目錄服務是一個關于分布式環境中的多個系統和服務的資源信息的資源庫;它
        提供對這些資源的客戶機和服務器存取.客戶機和服務器將使用目錄服務來找出
        如何存取其他資源.
        LDAP是業界標準的存取目錄服務的方法.每個數據庫服務器實例都會將它的存在情況發布給LDAP,
        并在創建數據庫時向LDAP目錄提供數據庫信息.當客戶機與數據庫連接后,可從LDAP目錄檢索
        服務器的目錄信息.不再要求每個客戶機將目錄信息以本地方式存儲在每臺機器上.

    # 創建數據庫分區組
        可以使用CREATE DATABASE PARTITION GROUP語句創建數據庫分區組.此語句指定表空間
        容器和表數據將駐留其上的一組數據庫分區.
          *為數據庫分區組創建分區映象.
          *生成分區映象標識
          *將記錄插入下列目錄表:
           SYSCAT.DBPARTITONGROUPS,SYSCAT.PARTITIONMAPS,SYSCAT.DBPARTITIONGROUPDEF

       CREATE DATABASE PARTITION GROUP <name> ON DBPARTITIONNUMS (<value>,<value>)
     
    #創建表空間
    表空間建立數據庫系統使用的物理存儲設備與用來存儲數據的邏輯容器或表的關系

    CREATE TABLESPACE <name>
        MANAGED BY SYSTEM
        USING ('<path>')
       
    CREATE TABLESPACE <name>
        MANAGED BY DATABASE
        USING (FILE'<path>' <size>)
               DEVICE
    *指定分區組
    CREATE TABLESPACE PLANS IN ODDNODEGROUP
        MANAGED BY DATABASE
        USING (DEVICE '/dev/HDISK0' 10000,DEVICE '/dev/n1hd01' 40000) on node 1
            (DEVICE '/dev/HDISK0' 10000,DEVICE '/dev/n1hd03' 40000) on node 3
            (DEVICE '/dev/HDISK0' 10000,DEVICE '/dev/n1hd05' 40000) on node 5 

    CREATE  REGULAR  TABLESPACE CUSTTBS IN DATABASE PARTITION GROUP CUSTOMER
    PAGESIZE 4 K  MANAGED BY DATABASE  USING
    ( FILE 'D:\testdbtbs\custtbs0_1' 5120 ) ON DBPARTITIONNUM (0)
    USING
    ( FILE 'D:\testdbtbs\custtbs1_1' 5120 ) ON DBPARTITIONNUM (1)
    EXTENTSIZE 16 OVERHEAD 10.5 PREFETCHSIZE 16
     
       在多分區數據庫中創建單分區組.
       CREATE DATABASE PARTITION GROUP single_tbs_grp ON DBPARTITIONNUM(0)
       在單分區組中創建單分區表空間.
       CREATE TABLESPACE single_part_tbs IN DATABASE PARTITION GROUP single_tbs_grp
       MANAGED BY DATABASE USING (FILE 'd:\testdbtbs\single_part_tbs_1' 5120)
      
      在UNIX中使用字符設備.
     
    * 創建特定類型的表空間
      創建系統臨時表空間
      CREATE SYSTEM TEMPORARY TABLESPACE tmp_tbsp
       MANAGED BY SYSTEM
       USING ('d:\tmp_tbsp','e:\tmp_tbsp')
      
       在分區數據庫中創建系統臨時表空間 只能在IBMTEMPGROUP中產生
       CREATE  SYSTEM TEMPORARY  TABLESPACE TEMPSYS_TBSP1
        IN DATABASE PARTITION GROUP IBMTEMPGROUP
        PAGESIZE 4 K  MANAGED BY SYSTEM 
        USING ('D:\testdbtbs\sys_temp_0' ) ON DBPARTITIONNUM (0)
        USING ('d:\testdbtbs\sys_temp_1' ) ON DBPARTITIONNUM (1)
        EXTENTSIZE 16 OVERHEAD 10.5 PREFETCHSIZE 16
      創建用戶臨時表空間
       CREATE USER TEMPORARY TABLESPACE usr_tbsp
        MANAGED BY DATABASE
        USING (FILE 'd:\db2data\user_tZbsp' 5000,
               FILE 'e:\db2data\user_tbsp' 5000)
       
        在分區數據庫中創建用戶臨時表空間 可在除IBMTEMPGROUP中的其他分區組中產生.
       CREATE  USER TEMPORARY  TABLESPACE USER_TEMP_TBSP
        IN DATABASE PARTITION GROUP USER_TEMP_TBSGRP
        PAGESIZE 4 K  MANAGED BY SYSTEM 
        USING ('D:\testdbtbs\user_temp_0' ) ON DBPARTITIONNUM (0)
        USING ('d:\testdbtbs\user_temp_1' ) ON DBPARTITIONNUM (1)       
      
      *指定物理設備
      在WINDOWS上,指定物理硬盤驅動器,使用\\.\PhysicalDriveN (N-0,1,2..)
                  指定邏輯驅動器使用\\.\N: (N是系統中的邏輯盤符)
      在UNIX中指定字符設備.
     
       #SMS  當對象增大時,文件每次擴展一頁。若需要提高插入性能,可以考慮啟用多頁分配,如MDC表。
    運行db2empfa. 對于多分區數據庫必須對每個分區運行此使用程序,一旦啟用就不能禁止。
       #DMS 
    單分區表空間大小,4kb - 64gb;8kb-128gb;16kb-256gb;32kb-512gb
                在缺省情況下,每個容器都保留一個數據塊作為開銷,表空間的最小大小是5個數據塊。
    三個保留給開銷使用。兩個用于用戶表數據。

      #在多個節點上產生表空間
    CREATE TABLESPACE TS1 MANAGED BY DATABASE USING
    (device '/dev/rcont $N' 20000)

    CREATE TABLESPACE TS2 MANAGED BY DATABASE USING
    (file '/DB2/containers/TS2/container $N+100' 10000)

    CREATE TABLESPACE TS3 MANAGED BY SYSTEM USING
    ('/TS3/cont $N%2', '/TS3/cont $N%2+2')

      #增加表空間的空間
        ALTER TABLESPACE RESOURCE
           ADD (DEVICE '/dev/rhd9' 10000,
                DEVICE '/dev/rhd10' 10000)
       #改變表空間狀態
        DB2 ALTER TABLESPACE <name> SWITCH ONLINE
       #刪除表空間
        DROP TABLESPACE <name>
        可以先增加一個系統臨時表空間,然后刪除老的.
       #獲取表空間使用信息
        get snapshot for tablespaces on sample
       #獲取表空間的CONTAINER
        LIST TABLESPACE CONTAINERS FOR 0(TABLESPACE_ID) SHOW DETAIL
      
    # 創建和填充表

      列出表:
      list tables - 列出當前用戶的表
      list tables for all - 列出數據庫中所定義的所有表
      list tables for schema schemaname - 列出具有指定模式的表
      describe table tablename - 顯示指定表的結構

      產生表和主鍵
      CREATE TABLE DEPARTMENT
    (DEPTNO CHAR(3) NOT NULL,
    DEPTNAME VARCHAR(29) NOT NULL,
    MGRNO CHAR(6),
    ADMRDEPT CHAR(3) NOT NULL,
    LOCATION CHAR(16),
    PRIMARY KEY (DEPTNO))
      IN RESOURCE
      產生外鍵
      CREATE TABLE EMPLOYEE
    (EMPNO CHAR(3) NOT NULL PRIMARY KEY,
    FIRSTNME VARCHAR(12) NOT NULL,
    LASTNAME VARCHAR(15) NOT NULL,
    WORKDEPT CHAR(3),
    PHONENO CHAR(4),
    PHOTO BLOB(10m) NOT NULL,
    FOREIGN KEY DEPT (WORKDEPT)
    REFERENCES DEPARTMENT ON DELETE NO ACTION)
      IN RESOURCE
            ON DELETE NO ACTION 表示如果該部門有任何雇員則該部門不能被刪除.
      定義表檢查約束
          在創建或改變表時,通過將檢查約束定義與表關聯來對該表創建表檢查約束.
          當INSERT或UPDATE語句修改該表中的數據時,就自動激活此約束.表檢查約束對
          DELETE或SELECT沒有影響.檢查約束不能與類型表相關.
           約束名不能與在同一個CREATE TABLE語句內指定的任何其他約束相同.若不
           指定約束名,系統會自動生成18個字符的唯一標識符.
          表檢查約束用于實現鍵唯一性或引用完整性約束所未涵蓋的數據完整性規則.
          如:
    CREATE TABLE EMP_ACT
    (EMPNO CHAR(6) NOT NULL,
    PROJNO CHAR(6) NOT NULL,
    ACTNO SMALLINT NOT NULL,
    EMPTIME DECIMAL(5,2),
    EMSTDATE DATE,
    EMENDATE DATE,
    CONSTRAINT ACTDATES CHECK(EMSTDATE <= EMENDATE) )
    IN RESOURCE
         約束EMSTDATE必須小于EMENDATE

       定義信息性約束
           信息性約束是一個規則,可由SQL編譯器使用,但數據庫管理器不會強制使用它.
           SQL編譯器包括一個重寫查詢階段,它將SQL語句變換為可能是優化的格式并改進
           所需數據的存取路徑.目的是改進查詢性能.
       對新表定義生成列
           生成列在基本表中定義,在這些列中,存儲的值是使用表達式計算得出的,而不是
    通過插入或更新操作指定.可以改善查詢性能,特別是計算很復雜或在查詢時要進行
    多次表達式求值.
    CREATE TABLE t1 (c1 INT,
    c2 DOUBLE,
    c3 DOUBLE GENERATED ALWAYS AS (c1 + c2)
    c4 GENERATED ALWAYS AS
    (CASE WHEN c1 > c2 THEN 1 ELSE NULL END))
        創建用戶定義臨時表
    臨時表不出現在系統目錄中,不能共享此表
    DECLARE GLOBAL TEMPORARY TABLE gb1_temp
      LIKE tmpltab1
      ON COMMIT DELETE ROES
      NOT LOGGED
      IN usr_tbsp
     
    定義此用戶臨時表所使用的列的名稱和描述與empltabl的列的名稱和描述完全相同.
    隱式定義只包括列名,數據類型,可空性特征和列缺省值屬性.未定義其他列屬性,包括
    唯一約束,外鍵約束,觸發器和索引.
        對新表定義身份列
            為插入表的每一行自動生成保證唯一數字值的方法.
            只在單分區數據庫中支持.
    CREATE TABLE test_table ( col1 int,
      col2 double,
      col3 int not null generated always as identity
           (start with 100,increment by 5))

        創建序列
            序列是一個數據庫對象,它允許自動生成值.序列特別適合于生成唯一鍵值.
            與身份列屬性不同,未使序列與特定表列相關,也未將它綁定至唯一列,只是僅可通過該表
            列存取.只在單分區數據庫中才受支持.
            在多分區環境中的單分區數據庫也不行.
            CREATE SEQUENCE order_seq
                   START WITH 1
                   INCREMENT BY 1
                   NOMAXVALUE
                   NOCYCLE
                   CACHE 24
           使用序列
             insert into order (orderno,custno)
                 values (nextval for order_seq,123456);
             insert into line_item (orderno,partno,quantity)
                 values (prevval for order_seq,987654,1)
             使用NEXTVAL,PREVVAL可以在兩個不同的表中使用相同的序列號.
       對表定義維
      
    引用完整性約束 第 13 頁(共17 頁)




    引用完整性約束是在創建表時定義的,或者是在之后使用 alter table 語句定義的。

    建立引用完整性的子句有:

    primary key 子句
    unique constraint 子句
    foreign key 子句
    references 子句
    例如:


    create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept)
              references department on delete no action)


    讓我們了解一下各種引用完整性規則:

    插入規則:

    有一個隱式規則,在沒有找到父項時取消插入。
    刪除規則:

    Restrict:如果有從屬行就不能刪除父行。
    Cascade:刪除父表中的行會自動刪除其從屬表中的任何相關行。
    No Action(缺省值):在應用了所有其它引用約束之后強制每個子行的父行都存在。
    Set Null:外鍵字段設置成 null;其它列保持不變。
    更新規則:

    Restrict:如果從屬表中的行與鍵的初始值相匹配,則不更新父鍵。
    No Action(缺省值):如果從屬表中沒有任何行與父鍵相匹配,則不更新父鍵。

       增加表中的列
       ALTER TABLE EMPLOYEE
         ADD <COLUMN_NAME> <DATA_TYPE> <NULL_ATTRIBUTE>
        
       增加唯一性約束
       ALTER TABLE EMPLOYEE
            ADD CONSTRAINT NEWID UNIQUE(EMPNO,HIREDATE)
       刪除唯一性約束
       ALTER TABLE EMPLOYEE
         DROP UNIQUE NEWID
       刪除主鍵
       ALTER TABLE <NAME>
         DROP PRIMARY KEY
       增加主鍵
      ALTER TABLE <NAME> ADD PRIMARY KEY (COL1,COL2,..)
       刪除外鍵
       ALTER TABLE <name>
    DROP FOREIGN KEY <foreign_key_name>
       刪除表檢查約束
       ALTER TABLE <table_name>
    DROP CHECK <check_constraint_name>   
       添加表的外鍵
         ALTER TABLE <NAME>
            ADD CONSTRAINT <constraint_NAME>
            FOREIGN KEY <COLUMN_NAME>
            references table_name <col_name>
            ON DELETE <ACTION_TYPE>
            ON UPDATE <ACTION_TYPE>
     
       在多個表空間中創建表
           表數據,表索引及與表相關聯的任何長型列數據可以存儲在同一表空間中,也可以
           放在不同的表空間中.只能使用DMS.
           CREATE TABLE <name>
            (<column_name> <data_type> <null_attribute>)
             IN <table_space_name>
             INDEX IN <index_space_name>
             LONG IN <long_space_name>
            
        在分區數據庫中創建表
            必須小心的選擇適當的分區建,以后不能跟改.再者,必須將任何唯一索引定義為分區鍵的一個超集.
            表的大小是(分區數*分區大小(4K是64GB).
            CREATE TABLE MIXREC (MIX_CNTL INTEGER NOT NULL,
                 MIX_DESC CHAR(20) NOT NULL,
                 MIX_INT INTEGER NOT NULL)
                 IN MIXTS12
                 PARTITIONING KEY (MIX_INT) USING HASHING
        產生觸發器
          用途:
          驗證輸入的數據
          為新插入的行生成值
          為交叉引用而從其他表中進行讀取
          為審計跟蹤而向其他表寫入
         
          CREATE TRIGGER <name>
            <action> ON <table_name>
            <operation>
            <triggered_action>
           
        創建用戶定義函數(UDF)或方法
            UDF擴展并添加了SQL的內置函數提供的支持,且可在可使用內置函數的任何
            地方使用.可使用兩種方式創建UDF:
               外部函數,用一種編程語言編寫
               有源函數,從另一個現有函數繼承產生.
              
              
               三種UDF:標量,返回一個單值答案.
                       列,從一組相似(一列)的值中返回單值答案,如AVG()只能定義有源函數.
                       表,將一個表返回至引用它的SQL,只能在select語句的from子句中引用表函數.
             UDF 記錄在SYSCAT.FUNCTIONS AND SYSCAT.FUNCPARMS目錄視圖中.
        用戶定義類UDT
            UDT是由用戶在數據庫中創建的命名的數據類型.UDT可以是單值類型,它與內部數據類型或
            結構化類型共享一個公共的表示法,結構化類型具有一個命名屬性序列,其中每個屬性都有一個類型.
            結構化類型可以是另一個定義類型層次結構的結構化類型的子類型.
       
        創建視圖
            CREATE VIEW <name> (<column>,<column>,<column>)
               SELECT <column_names> FROM <table_name>
               WITH CHECK OPTION
           WITH CHECK OPTION 子句指示必須根據該視圖定義檢查該視圖的任何更新的行或插入的行,
           如它不符合,則拒絕它,增加了數據完整性.
           CREATE VIEW EMP_VIEW
             SELECT LASTNAME AS DA00NAME,
                    EMPNO AS DA00NUM,
                    PHONENO
             FROM EMPLOYEE
           WHERE WORKDEPT = 'A00'
           WITH CHECK OPTION
          
        創建具體查詢表
            具體查詢表是以查詢結果為基礎所定義的一種表.因此,具體查詢表通常包含預先計算的結果,
            這些結果是根據表定義中引用的一個或多個表中的現有數據計算而得.若SQL編譯器確定查詢
            在針對具體查詢表運行時比對一個或多個基本表運行時效率更高,將對具體查詢表執行該查詢.
           
       創建別名
           別名是引用表,別名或視圖的間接方法,這樣SQL語句可與該表或視圖的限定名無關.
          
           CREATE ALIAS WORKERS FOR EMPLOYEE
          
       索引,索引擴展或索引規范
           索引是行位置的列表,按一個或多個指定列的內容來排序.
           索引擴展是一個索引對象,它配合帶有結構化類型或單值類型列的索引使用.
           索引規范是一個元數據結構.它告訴優化器別名所引用的數據源對象(表或視圖)
           是否存在索引.只是索引的描述.
             索引顧問,,db2advis
           索引得最大列數是16,最大長度是1024字節.
           CREATE INDEX <name> ON <talbe_name> (<column_name>)
       重命名表或索引
           要重命名的表或索引不能是目錄表或索引,總結表或索引,類型表,已聲明
           全局臨時表以及昵稱的名稱.
            并且不能在下列任何一個對象中引用現有表或索引:
            視圖,觸發器,引用約束,總結表,現有引用列的作用域
            表中不能有檢查約束,不能有除身份列以外的其他生成列.
           
            RENAME TABLE <SCHEMA_NAME>.<TABLE_NAME> TO <NEW_NAME>
            RENAME INDEX <schema_name>.<index_name> TO <new_name>
           

    索引可以:

    是升序或是降序(如果沒有指定,缺省值是升序)
    是唯一的,也可以是不唯一的(如果沒有指定,缺省值是不唯一的)
    是復合的
    用來執行群集
    是雙向的(這由 allow 或 disallow reverse scans 控制的)
    包括其它列(這只適用于唯一索引)。

       刪除表
           DROP TABLE <TABLE_NAME>
       刪除索引
           DROP INDEX <index_name>
        
       通過命令行處理器調用"性能配置向導"
           使用AUTOCONFIGURE 
          
    終止所有應用程序與數據庫的連接
    db2 force applicaitons all

    #給用戶授權
    GRANT privilege ON object-type object-name
      TO [{USER | GROUP | PUBLIC}] authorization-name
      [WITH GRANT OPTION]
     
      GRANT INSERT,DELETE ON TABLE staff TO USER rosita WITH GRANT OPTION
     
      #撤消用戶權利
      REVOKE privilege ON object-type object-name
      FROM [{USER | GROUP | PUBLIC}] authorization-name

      REVOKE ALL PRIVILEGES ON TABLE staff FROM joanna
    posted @ 2005-06-08 19:06 小馬歌 閱讀(1195) | 評論 (0)編輯 收藏
     
    db2 -tvf my.sql

    db2level 顯示db2的版本號

    顯示SQL出錯信息
    db2 "? sql6031"

    db2mtrk

    管理DAS
    產生:root運行-dascrt -u dasuser1
    刪除:root運行-dasdrop
    啟動:dasusr1運行-db2admin start
    停止:dasusr1運行-db2admin stop

    db2_kill
    ipclean

    db2start dbpartitionnum 9 restart

    AIX啟動控制中心:
    db2cc

    DB2用戶管理:
      db2 use os to manage users.You can use following steps to add a db2 user:
      1,add a user on os.
      2,grant rights to user.
        GRANT  CREATETAB,CONNECT ON DATABASE  TO USER FUJIE;
        grant select, update, delete on table employee to user john with grant option

    一,實例

    產生
    db2icrt -a AuthType(SERVER,CLIENT,SERVER_ENCRYPT) -p PORT_NAME
    表空間PREFETCHSIZE的設置,EXTENTSIZE的關系,緩沖池的監控,頁清除程序的多少。
       臨時表空間頁面大小與其他表空間頁面大小的設置,臨時表空間與緩沖池的設置。
    example:db2icrt db2 -s ese -p d:\db2 -u Administrator

    注意:在UNIX 上產生實例時需要產生一個和實例名稱相同的用戶名,和fencedid 用戶。
      如:db2icrt -s ese -u db2fenc2 db2inst2 將在db2inst2用戶中產生實例db2inst2.

    缺省創建32位實例,創建64位實例:db2icrt -s ese -w 64 -u db2fenc2 db2inst2
      
    刪除
    db2idrop instance-name
    啟動
    db2start
    停止
    db2stop force
    連接
    db2 attach to testdb2
    db2 detach
    列出實例
    db2ilist
    設置當前實例
    set db2instance=<instance-name>
    得到當前實例
    db2 get instance
    設置實例自動重啟動UNIX
    db2iauto -on <instance-name>
    db2iauto -off <instance-name>

    獲取實例的配置參數
    db2 get dbm cfg
    修改配置參數
    例如:db2 update dbm cfg using authentication server_encrypt
         db2stop and db2start
        
    二,聲明注冊表和環境變量
    db2set   注意:設置完成后需要退出用戶,再注冊進入才能生效。
    列出所有受支持的變量
    db2set -lr
    列出當前實例所有已定義的變量
    db2set
    要列出概要文件注冊表中所有定義的注冊表變量
    db2set -all
    列出單個變量
    db2set registry_variable_name
    更改變量
    db2set registry_variable_name=new_value
    變量復位為缺省值
    db2set -r registry_variable_name

    db2set DB2CODEPAGE=819

    db2set DB2CODEPAGE=1386

    db2 -tvf my_sql.sql

    三,創建節點配置文件
    db2nodes.cfg

    UNIX 格式:dbpartitionnum(0-999) hostname [logical-port [netname]]
    WIN  格式:nodenumber hostname computername logical_port netname

    四,管理服務器
    <配置助手,控制中心,開發中心> 通過DAS來進行工作
    創建DAS
    db2admin create (windows)
    dascrt -u <DASUser>  需要root權限
    啟動和停止
    db2admin start
    db2admin stop
    列出
    db2admin
    配置DAS
    db2 get admin cfg
    db2 update admin cfg using
    db2 reset admin cfg
    最好stop再start
    五,配置多個邏輯節點
    可以用兩個方法來配置多個邏輯節點:
    * 在db2nodes.cfg文件中配置邏輯節點(數據庫分區).然后,可使用db2start啟動所有邏輯和遠程節點.
        對于windows nt,若系統中沒有數據庫,則必須使用db2ncrt來添加節點,否則,若一個或多個數據庫,
        則應使用db2start addnode 命令.在nt 中,不能手工編輯db2nodes.cfg文件.
       db2ncrt /n:1 /u:administrator,yhnu0987 /m:fujie /p:1 /h:fujie
       db2start addnode nodenum 1 hostname guosd port 1 computer GUOSD user db2admin password db2admin

    * 在另一個處理器上重新啟動一個邏輯節點,其他邏輯數據庫分區(節點)已在該處理器上運行.這允許覆蓋
      在db2nodes.cfg中為邏輯數據庫分區指定的主機名和端口號.
     

    在WIN中添加邏輯節點
      db2ncrt /n:1 /u:Administrator,<pwd> /i:db2 /m:FUJIE /p:1
     
    #刪除邏輯節點
    db2ndrop
    有數據庫的時候使用db2stop drop nodenum
    #改變邏輯節點
    db2nchg
    posted @ 2005-06-08 19:04 小馬歌 閱讀(852) | 評論 (0)編輯 收藏
     
    1.
    當使用PreparedStatement\CallableStatement時,盡量使用它提供的setParams的方法。

    下面是錯誤的方法:
    CallableStatement cstmt = conn.prepareCall (
      "{call getCustName (12345)}");
    ResultSet rs = cstmt.executeQuery ();

    下面是正確的方法:
    CallableStatement cstmt - conn.prepareCall (
      "{call getCustName (?)}");
    cstmt.setLong (1,12345);
    ResultSet rs = cstmt.executeQuery();

    2.使用批量更新的方法

    一般都是使用這樣的方法更新:
    PreparedStatement ps = conn.prepareStatement(
      "INSERT into employees values (?, ?, ?)");

    for (n = 0; n < 100; n++) {

      ps.setString(name[n]);
      ps.setLong(id[n]);
      ps.setInt(salary[n]);
      ps.executeUpdate();
    }

    如果使用JDBC的高級功能的話,批量更新應該會有更高的效率:

    PreparedStatement ps = conn.prepareStatement(
      "INSERT into employees values (?, ?, ?)");

    for (n = 0; n < 100; n++) {

      ps.setString(name[n]);
      ps.setLong(id[n]);
      ps.setInt(salary[n]);
      ps.addBatch();
    }
    ps.executeBatch();

    3.正確使用ResultSet的GET方法

    盡量不要使用諸如rs.getObject()這樣的方法,另外如果還要更高的效率的話,請使用rs.getString(1)這樣通過字段索引號的方式來取得字段值,而不是使用象rs.getString("UserName")這樣的方法來取得字段值。

    4.取得剛增加的記錄的自動增加類型的字段的值

    如果你的JDBC驅動支持的話,有一個很方便的方法可以取得自增字段的值,如下:

    int rowcount = stmt.executeUpdate (
      "insert into LocalGeniusList (name) values ('Karen')",
    Statement.RETURN_GENERATED_KEYS);
    ResultSet rs = stmt.getGeneratedKeys ();
    posted @ 2005-06-08 18:03 小馬歌 閱讀(196) | 評論 (0)編輯 收藏
     

    開發一個系統基本完畢的時候,為了提高系統的響應時間,我們需要把經常從數據庫獲取而又不經常修改的內容給緩存起來,但是,緩存起來,我們怎么知道是否緩存生效了,沒從數據庫去取呢?
    對于DB2 V8.1數據庫,它提供了一個數據庫監視器開關,可以監視系統訪問數據庫里表的記錄。
    首先,db2cmd,然后db2 connect to dbname user username using pwd;
    執行db2 get dbm cfg ,其中可以看到:

     缺省數據庫監視器開關
       緩沖池                         (DFT_MON_BUFPOOL) = OFF
       鎖定                                   (DFT_MON_LOCK) = OFF
       排序                                   (DFT_MON_SORT) = OFF
       語句                              (DFT_MON_STMT) = OFF
       表                                 (DFT_MON_TABLE) = OFF
       時間戳記                         (DFT_MON_TIMESTAMP) = ON
       工作單元                            (DFT_MON_UOW) = OFF

    現在,我們把表的監視器開關給打開,執行 db2 update dbm cfg using dft_mon_table on,
    這種方式是 在實例級別上設置監視器開關(影響所有用戶和數據庫),還有另外一種方式,
    執行 db2 get monitor switches,顯示

                監視器記錄開關

    db 分區號 0 的開關列表
    緩沖池活動信息        (BUFFERPOOL) = OFF
    鎖定信息                    (LOCK) = OFF
    排序信息                    (SORT) = OFF
    SQL 語句信息           (STATEMENT) = OFF
    表活動信息                 (TABLE) = OFF
    獲取時間戳記信息(時間戳記)    = ON  06/08/2005 08:28:10.052196
    工作單元信息                 (UOW) = OFF
        db2 update monitor switches using switchName ,這種方式是 在應用程序級別上設置監視器開關(只適合于特定的應用程序)
    再執行 db2 get dbm cfg 的時候發現 表的監視開關打開了:   表        (DFT_MON_TABLE) = ON
    然后db2admin stop,db2admin start 讓表監視器開關生效。
    執行 db2 reset monitor for database dbname 讓計數器復位,現在就可以運行應用系統了。之后獲取數據庫的快照可以執行 db2 get snapshot for database on dbname 就可以知道系統是否訪問數據庫了,緩存是否生效了。

    posted @ 2005-06-08 17:57 小馬歌 閱讀(499) | 評論 (0)編輯 收藏
     
         剛開始學習加載的時候,接觸到的是HeloWorld程序,當時不知道為什么在public static void main(String [] args) 方法里寫了System.out.println("Hello World!") 就可以在控制臺打出“Hello World!”來,確實的說,是什么東西隱蔽在后面執行了我們寫的這段代碼,通過后來的學習,知道了所有的class都是通過classloader來加載的。java規范這么說,Java的ClassLoader就是用來動態裝載class的,ClassLoader對一個class只會裝載一次,JVM使用的ClassLoader一共有4種:

             啟動類裝載器,標準擴展類裝載器,類路徑裝載器網絡類裝載器
    這4種ClassLoader的優先級依次從高到低,使用所謂的“雙親委派模型”。確切地說,如果一個網絡類裝載器被請求裝載一個java.lang.Integer,它會首先把請求發送給上一級的類路徑裝載器,如果返回已裝載,則網絡類裝載器將不會裝載這個java.lang.Integer,如果上一級的類路徑裝載器返回未裝載,它才會裝載java.lang.Integer。

           再說說Package權限。Java語言規定,在同一個包中的class,如果沒有修飾符,默認為Package權限,包內的class都可以訪問。但是這還不夠準確。確切的說,只有由同一個ClassLoader裝載的class才具有以上的Package權限。比如啟動類裝載器裝載了java.lang.String,類路徑裝載器裝載了我們自己寫的java.lang.Test,它們不能互相訪問對方具有Package權限的方法。這樣就阻止了惡意代碼訪問核心類的Package權限方法。    
           現在來通過擴展ClassLoader類實現一個自己的類裝載器,每個Class對象都有一個引用指向裝載他的ClassLoader,可以通過public ClassLoader getClassLoader()方法得到它。為了創建自己的類裝載器我們應該擴展ClassLoader類,這是一個抽象類。假設要從本地文件系統使用我們實現的類裝載器裝載一個類,創建一個FileClassLoader extends ClassLoader,需要覆蓋ClassLoader中的findClass(String name)方法,這個方法通過類的名字而得到一個Class對象。

    package test.International;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    public class FileClassLoader extends ClassLoader {
        
    public static final String drive = "d:/";
        
    public static final String fileType = ".class";
        
    public FileClassLoader() {
            super();
        }

        
    public FileClassLoader(ClassLoader arg0) {
            super(arg0);
        }

        
    public Class findClass(String name) {
            
    byte[] data = loadClassData(name);
            
    return defineClass(name, data, 0, data.length);
        }

        
    public byte[] loadClassData(String name) {
            FileInputStream fis 
    = null;
            
    byte[] data = null;
            
    try {
                fis 
    = new FileInputStream(new File(drive + name + fileType));
                ByteArrayOutputStream baos 
    = new ByteArrayOutputStream();
                
    int ch = 0;
                
    while ((ch = fis.read()) != -1{
                    baos.write(ch);
                }

                data 
    = baos.toByteArray();
            }
     catch (IOException e) {
                e.printStackTrace();
            }

            
    return data;
        }

        
    public static void main(String[] args) throws Exception {
            FileClassLoader loader 
    = new FileClassLoader();
            Class objClass 
    = loader.loadClass("HelloWorld"true);
            Object obj 
    = objClass.newInstance();
            System.
    out.println(objClass.getName());
            System.
    out.println(objClass.getClassLoader());
        }

    }

    現在把HelloWorld.java放到默認包下,然后編譯,把HelloWorld.class放到D:\盤根目錄下,運行FileClassLoader類,控制臺輸出:

    HelloWorld
    sun.misc.Launcher$AppClassLoader@82ba41
    可見,我們的確加載上了HelloWorld.class
    posted @ 2005-05-19 22:57 小馬歌 閱讀(1264) | 評論 (4)編輯 收藏
     

          最近,部門的一個關于基礎數據和權限控制的項目已近尾聲,可由于性能的問題,一直沒有做好正式上線運行的準備,由此,引發了一些我對壓力測試的認識。
          MI 的LoadRunner8.0是一個工業級負載測試標準工具,用它進行壓力測試,可以節約公司的人力,財力, 它本身可以模擬成千上萬個用戶并發訪問系統,給系統一定的壓力,模擬實際的生產環境,并且根據測試結果,它可以幫助我們分析系統的瓶頸,提供我們應用系統的性能。它分三個部分,首先要錄制腳本,并在此基礎上進行一些編輯(例如設置集合點,事務,參數化數據等),然后把這個腳本放到一個特定的場景里去執行,執行前可以進行一些運行期的設置,運行過程中可以監控系統的一些反映參數,最后通過它的分析工具來分析測試結果,給我們的應用系統提供一些性能方面的合理化建議。
         壓力測試做完之后,雖然知道了問題,但是問題的方向是比較模糊的,為此,可以借助Quest公司的JProbe Suite性能測試工具進行內存,代碼覆蓋,方法調用時間方面的分析,查出具體的問題,進行修改發布之后,再利用LoadRunner進行反復測試,看性能是否優化了。
       
      在壓力測試的過程中,應用服務器和數據庫的一些參數調優也是非常重要的,針對應用服務器,比較重要的參數有jvm占用堆大小,線程池的大小,連接池的大小,prepareStatement Cache條數大小;針對數據庫,表空間,索引,事務級別,鎖大小,臨時表這些參數也對系統應用有重要的影響。同時,在java應用里,sql優化,數據庫連接的管理,緩存的使用,查詢分頁,防內存泄露的代碼的使用會直接對應用系統造成巨大的性能影響。

         跟蹤應用服務器里jvm垃圾回收的頻率和所消耗時間的時候,可以加 -Xverbosegc參數來打印垃圾回收的詳細信息。分析gc日志的工具有GCAnalyze 和HeapRoot 。

    posted @ 2005-05-19 22:07 小馬歌 閱讀(332) | 評論 (0)編輯 收藏
     
        以前很早就聽說過java是單繼承的類結構,即一個類只能繼承一個直接父類,并且所有的類都直接或間接繼承于java.lang.Object類。對于這一點,一直接受,并且在jdk文檔里看到的類繼承層次結構也的確是這樣。后來,無意中看到一個問題,問數組是不是繼承自Object類,這一下還給問糊涂了,因為數組在java里是對象,不過像這種繼承結構我還一直未看到呢?后來,寫了點代碼做了一個小測試,如下:
    System.out.println(new int[1].getClass().getName());

    發現int型數組的類是:[I 比較奇怪,是吧,并且代碼顯示:
    System.out.println(new int[1].getClass().getSuperClass().getName());

    它的直接父類就是java.lang.Object類,即所有類的根類。根據這些,做了一個總結:
    第一種情況,當數組元素是基本類型時:
             int [] 對應class [I
             char [] 對應class [C
             byte [] 對應class [B
             short [] 對應class [S
             long [] 對應class [J
             float[] 對應class [F
             double [] 對應class [D
             boolean [] 對應class [Z

    第二種情況,當數組元素是對象時:
            統一為 [L java.lang.Object

    posted @ 2005-04-09 15:35 小馬歌 閱讀(349) | 評論 (0)編輯 收藏
     
    // 判斷是否閏年,如果是,返回true,否則,返回false,
    public boolean isLeapYear(int year){
    //MAX_YEAR,MIN_YEAR分別代表可以判斷的最大年最小年
    if(year< MIN_YERA || year> MAX_YEAR){
         
    throw new Exception("判斷的年份不在判斷范圍內!");
      }

    //覺得精練的地方就在下一行
    if((year&3)==0){
        
    return ((year%400==0|| (year%100!=0));
      }

     
    return false;
    }
      寫到這里,我想起來“java程序員變態32題”的其中一題了,題目是這么說的:請寫出利用 2 最有效率得到 8的代碼?答案是 2<<2。
      位操作一直是計算機最擅長的事情,可自從有了高級編程語言之后,我幾乎把它忘了。現在明白java要保留位操作的原因了,覺得是效率~ 
      回到這個方法上,一般的人代碼寫得邏輯清晰,也能實現功能,可是像這么簡潔高效的代碼才是程序員夢寐以求的!我從此不敢小瞧 編碼 。
    posted @ 2005-04-08 21:09 小馬歌 閱讀(2472) | 評論 (8)編輯 收藏
    僅列出標題
    共95頁: First 上一頁 87 88 89 90 91 92 93 94 95 
     
    主站蜘蛛池模板: 青青视频观看免费99| 久久精品夜色噜噜亚洲A∨| 亚洲AV无码AV吞精久久| 国产亚洲av片在线观看18女人| 美女在线视频观看影院免费天天看| 亚洲一级毛片免费观看| 亚洲?V无码成人精品区日韩 | 精品久久久久久国产免费了| 久久精品国产99精品国产亚洲性色| 69式国产真人免费视频| av午夜福利一片免费看久久| 亚洲网红精品大秀在线观看| 国产在线不卡免费播放| 免费播放一区二区三区| 高潮毛片无遮挡高清免费视频 | eeuss影院免费92242部| 亚洲成人免费网站| 国产亚洲精午夜久久久久久| 久久久久久99av无码免费网站 | 亚洲精品无码专区久久| 国产A在亚洲线播放| 免费国产精品视频| 日本免费网站视频www区| 中文字幕在线免费视频| 亚洲人成电影网站免费| 久久亚洲精精品中文字幕| 亚洲精品成a人在线观看| 成人毛片18女人毛片免费视频未| 国产免费阿v精品视频网址| 国产成人精品亚洲| 在线aⅴ亚洲中文字幕| 亚洲成人中文字幕| 亚洲色欲久久久久综合网| 最近最好的中文字幕2019免费| 亚在线观看免费视频入口| caoporm超免费公开视频| 国产综合激情在线亚洲第一页| 亚洲一区在线观看视频| 亚洲黄色中文字幕| 亚洲国产精品SSS在线观看AV| 亚洲高清国产拍精品青青草原 |