zoukankan      html  css  js  c++  java
  • db2笔记

    第七章:数据库备份与恢复 (恢复的概念,db2日志,数据库和表空间的备份,数据库和表空间的恢复,数据库和表空间的前滚,recover使用程序,数据库重建,监控备份恢复和复原,优化备份恢复和复原)
    1) Redo 是指db记录了完成的操作commite之后但没及时的写入硬盘,这个时候开机数据库会自动做写入硬盘的操作
    2)崩溃恢复(crash recovery)是数据库的一个功能,使数据库达到一致的状态,能够回滚未提交的数据,重做已经在内存提交的数据。选项:autorestart on ,以及可以使用db2 list utilites show detail或db2pd -until查看过程。
    3)脱机是指在崩溃恢复的时候表空间发生错误
    4)灾难恢复(disaster recovery),用HADR功能来恢复,原理 是将源数据复制到目标数据库防止
    5)前滚恢复要基于启用备份并且启用了归档日志,恢复数据库时且不能用without rolling forward,数据库在恢复操作结束时处于roll foward pending
    6)前滚恢复分为:前滚数据库和前滚表空间
    7)前滚表空间一般可以选择在日志中前滚至:日志末尾(to end of log)和某个特定时间点(称为时间点恢复)。一般两种情况用前滚表空间:表空间作恢复操作后处于前滚暂挂状态(做rollfoward database将日志应用于表空间)和崩溃恢复时遇到一个或多个表空间处于前滚暂挂(这种情况要先修复表空间,才能做rollfoward database将日志应用于表空间)
    8)前滚恢复要启用归档日志功能,默认是没有的
    9)日志记录任何commit到磁盘的数据,提交的数据redo ,没有提交的数据undo
    10)日志只记录DML(insert,delete,update)
    11)循环日志 有 主日志(primary log files) 和 辅助日志(second log files).循环日志只能恢复到备份点
    12)活动日志(active log)是还没写入磁盘的日志,两种条件任意一个条件下就是活动日志:包含尚未提交或回滚的事务信息;包含已经提交但没有写入磁盘的事务信息
    13)logarchmeth1=off 是循环日志
    14)logarchmeth1=logretain,userexit,disk:directory_name,tsm:managment class name,vendor:libary name
    15)日志总结:循环日志支持崩溃恢复和版本恢复,归档日志支持除了前两个外还有一个前滚恢复
    16)备份不会去备份数据库管理器配置文件或注册变量
    17)如果是在线备份(backup online)那就一定要是归档日志
    18)恢复(restore)数据库只能是离线来做,这个和rollforward 数据库是一样的规则
    19)本地数据库目录 和 系统数据库目录都是同一个名字的文件夹:sqlbdir
    20)表空间的恢复一定会有rolling forward的操作以达到一致的状态
    21)可以使用db2 list tablespaces show detail或db2 get snapshot for tablespace on db查看minimum recovery time这一选项
    22)db2ckbkp -h 检测备份性息 db2ckrst -d dbname -t time 检查增量恢复
    23)恢复restore数据库的时候,容器的位置或名称设备与备份时的不同,就要利用重定向恢复
    24)drop是删除表,使用drop之后表结构和表的数据都会被删除,truncate 和 delete是删除表里的数据,但不删除表本身,truncate 和 delete相比,truncate要快很多,但缺点就是不能回滚,包括索引等都会变成初始值,数据就无法恢复了
    25)db2 select tbspace,drop_recovery from syscat.tablespaces 查看表空间的选项                    
    26)drop_recover这个选项不能用在system temporary tablespace ; LOB ; XML上
    27)恢复删除表步骤:1)完整数据库备份2)restore在删除表之前建立的数据库级或表空间级备份image 3)检索已删除表的对象ID 4)rollforward 数据库 5)重建表 6)用前滚的数据库导入的数据导入到表中
    28)rollforward 会使表空间处于不可访问的状态
    29)历史文件db2rhist.asc 在db2inst1/NODE0000/SQL00001下面,及其备份文件db2rhist.bak
    30)db2rhist.asc可以用list history来查看哪
    31)db2 list history backup all for db tomdb 列出tomdb的历史文件
    32)prune histroy 命令管理恢复破坏了的历史文件
    33)为了确保日志文件可以保存,可以使用backup db dbname online to /backuodir include logs,保存日志在备份映像中的操作之能是在线备份
    34)离线备份:earliest log=current log   而在线备份 earliest log < current log 
    35)恢复删除的历史文件:db2 restore db dbname history file 
    36)可恢复数据库重建:表空间备份可恢复数据库,部分表空间备份可恢复数据库,含有log文件的在线备份可恢复数据库,使用增量备份重建可恢复数据库,使用重定向选项重建可恢复数据库
    37)db2 restore db tomdb rebuild with all tablespaces in database taken at 20140317130324 用表空间备份重建数据库(归档日志)
    38)用表空间重建之后要前滚表空间,如果没有相应的备份映像都能在历史文件中找到才能RF,其中日志文件一定要可用,如果不在数据库参数的Path to log files里面,就要指定日志文件位置(用overflow log path这个选项)
    39)[db2inst1@oc6162546036 SQL00001]$ db2 rollforward db tomdb stop
    SQL1271W  Database "TOMDB" is recovered but one or more table spaces are 
    offline on members or nodes "0".           qa:????为什么恢复不了 
    40)部分表空间重建数据库,除了重建,还要恢复restore pending的表空间
    41)可恢复数据重建可以用其他备份,不可恢复数据库只能用数据库备份
    42)0x0100 表示:restore pending 
    ================================================================================================================


    第六章 数据移动 (export,import.load,db2move,db2look)
    1)db2 "export to table1.dat of del messages table1.log select * from table1"
    SQL3015N  An SQL error "-1585" occurred during processing. 虽然有记录但是会报错 
    2)import 脱机导入(allow no access), 联机导入(allow write access)
    3)导入方式有:insert,insert_update,replace,db2look 前三适合目标表存在(支持的格式IXF,WSF,ASC,DEL),db2look适合没有目标表(支持的格式PC/IXF)
    4)load有四个动作选项:insert,replace,restart,terminate


    ================================================================================================================
    第九章 基本监控方法 
    1)监控工具有:快照监视器,事件监视器,db2pd工具,db2mtrk, activity monitor等
    2)快照监控器是在会话级别更改:有三种方法更改:更改数据库的配置参数(db2 update dbm cfg using dft_mon_lock on) ,调用应用程序级的db2MonitorSwitches() API函数,或者执行update monitor switches using [[SwitchID] on | off,...]
    3)获得快照信息:db2 get snapshot for dbm/database on dbname/locks on dbname/sdynamic sql on dbname
    4)重置计数器:reset monitor for db dbalias,reset monitor all, 可以重置单个数据库,全局数据库,但不能选择性的对用快照监视器开关控制的特殊监视器组重置计数器
    5)db2pd主要是监控锁
    6)为什么快照监控没有其他项,如:tablespaces ,dbm,tables
    7)快照监控的方法:get snapshot for
    8)利用函数监控,但是要受控于监视器开关 
    9)利用视图监控 sysibmadm模式名开头的视图
    10)monitor switches 作用与单个数据库,dbm 是所有数据库,db2 update dbm cfg 是总开关,monitor switches是小开关
    11)event monitor是要为特定事件类型创建
    12)db2evmon工具来格式化sql event monitor原始数据 
    13)db2mtrk是用来监控内存
    14)db2pd -version -osinfo查看版本 操作系统信息


    ================================================================================================================
    第十章 运行数据库必须考虑的数据库设置
    1)db2 get dbm cfg show detail里面的Delayed Value 与Current Value在在线配置的情况下,值应该是相等的
    2)db2pd -dbptnmem可以查看数据库内存统计信息
    3)通信设置不可以联机配置(在线配置,包括注册变量,节点配置,端口配置);
      内存设置中instance_memory可以联机动态更新;
      self_tunning_mem单分区多分区DPF可以联机配置;
      数据库共享内存可以联机配置(databse_memory,这个内存共享配置取决于slef_tunning_mem 是ON的情况);
      缓存池大小可以联机配置(IBMDEFAULTBP是默认的缓冲池,当syscat.bufferpools目录表中该缓冲的NPAGES值为-1是,db2数据库配置参数    BUFFPAGE控制缓冲池大小,否则会忽略BUFFPAGE参数,并用NPAGES参数指定的页数创建缓冲值);
      pckcachesz可以联机配置(程序包告诉缓存用来高速缓存数据库上的静态和动态SQL和XQuery语句的所有section);
      catalogcache_sz高速缓存可以使用的数据库堆中最大空间(以页计算)可以联机配置;
    4)数据库管理器需要从磁盘I/O进行的越少,性能越好
    5)BPHR缓冲池命中率应该超过90%(可以使用SYSIBMADM.BP_HITRATIO计算命中率),其中的字段:SNAPSHOT_TIMESTAMP ,DB_NAME ,BP_NAME  ,TOTAL_HIT_RATIO_PERCENT ,DATA_HIT_RATIO_PERCENT,INDEX_HIT_RATIO_PERCENT)
    6)程序包高速缓存(pckcachesz)不建议设置automatic ,它使SQL不用访问系统目录,以及动态SQL或XQuery免去编译这一步,其中可以是用下面这个语句判断是否满足需求:
    select (1-pkg_cache_inserts/pkg_cache_lookups)*100 as pchr,pkg_cache_num_overflows from sysibmadm.snapdb
    7)catalogcache_sz(高速缓存)使用情况查看:db2 get snapshot for dabtabase on dbname|grep -i "catalog")中的catalog cache overflows这一项,不为0就要增加:db2 update db cfg using catalogcache_sz XX
    8)locklist达到maxlocks时,数据库管理器会对应用程序挂起的锁定执行从行到表的锁定升级
    9)db2 event monitor
    记录下信息后用db2evmon -path 命令打开

    1.db2 update monitor switches using lock on statement on

    2.create event monitor lockmonitor for deadlocks, statements  write to file ‘c:dulog’ 
      db2 "create event monitor dlockevm for deadlocks with details history write to file '/home/db2inst1/locks'"

    3.set event monitor lockmonitor state 1

    最后
    4.set event monitor lockmonitor state 0 

    5.db2evmon -path /home/db2inst1/deadlock > deadlock.txt

    6 more sqltrace.txt


    ================================================================================================================
    第十一章 日常运行维护 runstats,reorg,rebind,健康检查,数据库监控
    1)统计信息是记录各个数据库对象信息,并保存在数据库系统表目表中,优化器会根据这些信息选择最低的执行成本
    1)db2运行的成本是指CPU成本(以指令数计)和I/O(以寻道数和页的转换数计),成本的单位是timeron,数据库统计信息误差过大,就有可能造成性能问题
    2) 静态SQL在runstats之后需要重新bind,因为在bind之前就已经确定,则会出现统计信息不一致的情况,但动态SQL就不需要,因为动态SQL语句的访问策略是根据统计信息在运行是动态生成的
    3)runstats就像汽车的GPS
    4)  静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。
        动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。 
     根据编程方法的不同,DB2 的应用程序开还可以分为嵌入式 SQL 编程和非嵌入式编程 :

        嵌入式 SQL 编程将 SQL 语句嵌入到宿主语言 (host) 的程序中,例如 C/C++ 程序。因为宿主语言不识别 SQL 语句,先要对程序进行预编译,把 SQL 语句转变为对 DB2 服务的调用,并重写源代码,最后再使用宿主语言的编译器对应用程序进行编译。嵌入式 SQL 都需要被绑定到特定的数据库中,可分为嵌入式静态 SQL 和嵌入式动态 SQL。
        非嵌入式应用程序不需要预编译,且方法较多,如 CLI、JDBC、ODBC、ADO.NET 等等,这些方法中都使用动态 SQL。表 2列举了常见的 DB2 编程接口。 
    5)db2 reorgchk update statustucs on table all 对全表进行runstats,如果有批量的数据插入时候,就需要做runstats
    6)对特定表的runstats,db2 -v runstats on table tablename and indexs all
    7)查看是否执行了runstats: syscat.tables中的stats_time列显示的值可以查看是否运行,当为null时,就是没有运行runstats;syscat.indexes也可以用这种方法检测
    8)在表中运行runstats有两种用户访问选项:allow read access,allow write access(默认)
    9)9.5之前的runstats之能在单区(单个数据库分区)进行统计,所以如果不是在所有数据库分区中一致发布,那么会出现统计信息不一致,就要在runstats之前逐个的对各个分区之间重新分发数据,用这个命令:redistribute database partition group
    10)db2rbind可以用于重新绑定数据库中所有应用程序包,使用 db2 flush package cache dynamic删除程序包缓存器中所有当前缓存的动态SQL,并强制隐式的编译一下请求
    11)stat_heap_sz是代理私有内存的一部分,指定了runstas统计的所有内存堆的最大值,启动是分配,完成时释放,最好是能增大其值
    12)当定义了runstats调整(thrittling,其中的参数util_impact_priority,util_impact_lim),并且该调整可操作时,runstas通常会话费更多的时间,但对生产系统影响较小
    例:db2 runstats on table tablename and indexes all util_impact prioriy 10 ,如果util_impact_lim 10 ,说明工作负载限定在10%下
    13)在自动化统计信息配置之前,要通过运行sysinstallobjects存储过程创建查询反馈库,即在设置auto_stats_prof on,auto_prof_upd on之前,要用call sysinstallobjects(toolname,action,tablespacename,schemaname)
    14)在使用runstats对特定表和索引进行时,必须使用完全限定的表名和索引名
    15)收集分布式统计信息:db2 runstats on table tablename with distribution and indexes all
    16)runstats有很多种不同的选项进行提高优化效率:
       在特定的列和索引进行
       收集分布式统计信息
       包含频率和分位数统计信息
       包含列组统计信息
       包含like statistics的runstats
       包含统计信息配置文件的runstats
       带有抽样的runstats
       带有系统页级抽样的runstats
       reorgchk收集所有表的数据库统计信息:reorgchk update statistics on table / schema
       边load边做统计信息,边创建索引边统计信息
    17)重组表要比runstats统计信息时间更长,可以先执行runstats绑定程序包统计信息,如果没有改善可以再进行reorg
    18)v8之前只能离线重组,v8之后可以联机也可以离线:指定了选项inplace就是联机重组,默认是离线脱机重组
    19)有关重组的进度信息将记录在数据库活动的历史记录文件中,可以用db2 list history命令打开,也可以用表快照来见识重组进度(db2 get snapshot for table on db,不关如何设置数据库监视表开关,都会记录表重组监视数据
    20)如果系统进行的崩溃恢复且进入替换过程,那么一定要使重组表操作完成
    21)脱机表重组需要将副本复制到临时表空间,但在线重组表不会
    22)联机表重组会创建一个.OLR的二进制的文件记录重组时要用的信息,如:LSN 重组类型,下个腾出的范围,索引标识,是为了维护数据集群还是回收空间等
    23)联机表重组包括四个阶段:select N pages,vacate the range,fill the range,truncate table 
    24)如果要对联机表重组进行重新重组,必须先暂停(db2 reorg table tbname inplace pause),才能重组
       发出resume请求之后,如果没有再次指定执行的重组项中truncate的选项,将沿须原来的截断表选项truncate
       在restore 和 backup的时候不能进行重组
    25)监视在线重组表方法:快照(get snapshot),管理视图(snaptab_reorg),表函数(snap_get_tab_reorg)
    26)由于脱机表重组是同步的,因此脱机表重组中的任何错误都会返回给实用程序
       联机表重组是异步的,因此没有SQL消息写入CLP,查看返回SQL错误,请发出list history reorg
    27)联机重组索引,如果指定了allow write access这个选项,将会重建该表的所有索引,命令:db2 reorg index index_name for table table_name[clean up /clean up all /cleanup only pages]
    28)PCTfree是指 在创建索引的时候为其定义的可用空间百分比
    29)db2 "select 'revoke select  on '||rtrim(tabschema)||'.'||rtrim(tabname)||' from public;' from syscat.tables " > script.sql 利用目录表做的脚本rvoke public的权限
    30)脱机表重组需要的额外存储空间保存表的影子副本,脱机索引重组不需要,联机表重组需要的是更多的日志空间,联机索引重组需要更多的日志空间和影子副本存储空间
    31)rebind会对应用程序在执行前进行绑定,绑定和根据统计信息和数据库对象创建一个程序包,这个程序包就是执行计划
    32)所以如果进行了统计或是重组,那就要重新进行rebind
    33)runstats > reorgchk > reorg > rebind/db2rbind > runstats 循环
    34)syscat.packages表中的valid值标识当前的程序包是否可用,如果是X值,就代表当前的程序包是不可用,那么就需要重新绑定
    35)db2diag.log 错误日志,db2inst1.nfy通知日志。这两个需要经常检查
    36)DMS表空间的剩余查询是用,db2 list tablespaces show detail ,SMS表空间对应的容器用操作系统查看剩余空间df -k 
    37)DB2有很多工具用于监控数据库和实例活动 例如:snapshot monitors/sql snapshot函数 ; event monitor ; sysibmadm动态性能试图
    38) db2 list utilities show detail 可以监控 LOAD ,BACKUP ,RESTORE, RUNSTATS


    ================================================================================================================
    第十二章 数据库常用工具
    1)db2cfexp ,db2cfimp 实例配置信息导入导出
    2)db2exfmt,db2expln是用来查看已收集并写入解释表(explain_instance)的全面解释数据
    3)visual explain查看特定SQL语句选择的访问计划的图形化表示GUI解释工具
    4)timeron是db2优化器使用的一种成本度量单位,用于计算查询完全执行所需的时间和资源数量
    5)访问计划是db2用于执行db2语句的路径和步骤,这是所有可用解释工具显示的信息
    6)syscat.packages是用来存储数据库中的以程序包的形式的访问计划
    7)查看静态SQL,动态SQL用 db2expln
    8)db2exfmt是直接处理已收集并村混在解释表中的全面解释数据或解释快照数据,输出是基于文本的报告
    9)db2advis索引设计工具,测试如果创建了索引,SQL执行成本可以提高多少,
    10)使用db2advis第一步是要收集和描述提供给Design advisor的工作负载
    11)db2batch 是一种基准测试工具,是以一组sql和xquery语句作为输入,动态的准备语句的执行时间,并返回结果集
    12)db2dart 数据库一致性检查工具和修复工具,这个实用程序会直接从硬盘中读取数据库的数据和元数据进行比较,因此不能对具有活动连接的数据库运行该工具
    13) db2look 可以提取数据库定义语言DDL;生成缓冲池,表空间和数据库分区组信息 ; 创建数据定义语言DDL ;收集数据库子集的统计数据和DDL。以及用db2look来构建模拟测试数据库
    14)
    ================================================================================================================
    第十三章 v10.1的新特性 
    1)
    ================================================================================================================================================================================================================================
    ================================================================================================================================================================================================================================
    ================================================================================================================================================================================================================================
    ================================================================================================================================================================================================================================
    ================================================================================================================================================================================================================================
    ================================================================================================================================================================================================================================
    ================================================================================================================================================================================================================================
    ================================================================================================================================================================================================================================
    ================================================================================================================================================================================================================================

     
    1)CLI JDBC ODBC 是应用程序是用于db2服务器交流的驱动,当一个语句被驱动后,会打成一个网络包发送给数据库

    2)查看db2进程执行情况: ps -ef|grep -i db2

    3)查看db2版本下有哪些实例: db2ilist

    4)如果db2stop force无法停止实力,db2start无法启动,可以试试db2_kill强制终止所有分区执行的进程,然后执行 ipclean ,重新启动数据库时,做崩溃恢复

    5)db2 get dbm cfg 观察的是sqllib目录下的db2systm这个文件

    6)db2 list db directory /catalog databse 观察编目的是/sqllib/sqldbdir/sqldbdir这个文件 ,这个和node 是一样的(node要创建才有)

    7)db2support <output_path> -d <db name> -cl 0 备份当前实例和数据库配置信息,

    ??8)难道说补丁的基础上不能打补丁,一定要有基础版本 ? qa

    9)表空间容器的相关信息可以通过list tablespace containers for tbspid show detail

    10)用db2pd -d <dbname> -tablespaces直观显示表空间的配置信息

    11)list tablespaces相比,get snapshot for tablespaces信息要全面,比如自动存储和表空间map信息

    12)SMS表空间不支持容器大小,只支持更改路径;DMS可以支持容器大小更改,ADD,DROP,(add和drop会重新平衡rebalance) EXTEND,REDUCE,RESIZE;自动存储管理表空间(这个表空间是db在创建时默认选项或是指定了automatic storage yes)情况下默认的选项,不能在表空间级更改表空间大小,只能在数据库级增加add storage on 选项为数据库添加新的存储路径(db2 alter database dbname add storage on dbpath),这里有一点要说明:
    9.7 之前新加的路径不会被表空间立即使用,只有已有存储路径文件系统满了,才会使用新增加的路径,而且只能增加不能删除。9.7之后就可以对自动存储表空间执行rebalance操作就能立即使用这个存储路径

    13)DMS中使用add增加容器会重新rebalance,影响性能 ,

    14) DMS中使用begin neww stripe set 选项是当已有容器已用完后,再使用新增加的容器,于add容器不同,该选项不会rebalance,但会造成数据偏移

    15)db2pd -d tomdb -storagepaths 查看存储路径(数据库级别)

    16)在数据库级增加存储路径一定要在实例目录下面建立才行:db2 "alter database tomdb add storage on '/home/db2inst1/testdbpath/' "
    DB20000I  The SQL command completed successfully ,qa ?

    17)对什么表做rebalance ,哪个表就有新增的路径咯

    18)可以从DMS改成自动管理表空间(显示的用上选项alter tablespace tbname managed by automatic storage)

    19)如何删除一个在数据库级创建的容器,表空间已经rebalance,容器路径已经rm -rf掉了 ,db2pd -d dbname -storagepath查看现在是drop pending? qa

    20)quiesce可以对表空间锁定,防止其他用户对表空间的表数据进行更改db2 quiesce tablespaces for table db2inst1.t1 share /【reset】

    21)对表空间状态的二进制解释用:db2tbst 0x4000

    22)SYSIBM.SYSCAT,SYSIBMADM,SYSSTAT这几个系统模式对相关对象进行分组

    23)syscat.schemata这个视图用来查看数据库创建了哪些模式

    24)decimal(p,s)p是数字的总位数,s是小数位 ;如果不指定精确的位数就按照decima(5,0)来表示

    25)表约束:*非空约束 not null *唯一约束 unique(columm)*主键约束和外键约束 *检查约束 constraint constraintname chek

    26)constraint只是约束名称 ,其中外键约束需要名称,检查约束需要名称

    27)可以通过syscat.references检查所有完整性约束,syscat.checks查看检查约束 

    28)删除约束:db2 alter table tbname drop constraint contraintname

    29)在sysibmadm.admintabinfo里面查看表容量,已经压缩之后的容量

    30)在根节点上找到大概对应的数值范围,然后通过这个范围指针知道叶节点对应的数值,然后在数值通过RID偏移找到对应的行信息

    31)唯一索引:当在表上创建了主键或唯一键的时候,表会自动创建唯一索引:db2 create unique index indexname on tablename(column)

    32)只有创建了唯一索引才能使用include这个选项进行多个字段的查询

    33)db2 describe indexes for table tablename show detail 命令查看一个表是否有索引,在哪个字段上创建了索引,以及索引的类型,也可以通过syscat.indexes选取字段查看索引

    34)如何更改默认使用的表空间? qa

    35)有三个方法解决序列唯一:generate_unique , identity , sequence

    36)唯一序列号:generate_unique函数是db2最早使用在表中生成唯一值的方法(bit data)

    db2 create table tablename(columnname char(13) for bit data,columnname....),其中13个字节的数据串包含的是timestamp和表分区,例如:
    [db2inst1@oc6162546036 ~]$ db2 "select * from customers"

    CUSTNO                        CUSTNAME        
    ----------------------------- ----------------
    x'20140402203636696427000000' tom             
    x'20140402203636696544000000' sam             

      2 record(s) selected.

    [db2inst1@oc6162546036 ~]$ db2 "select timestamp(custno) as custno,custname from customers"

    CUSTNO                     CUSTNAME        
    -------------------------- ----------------
    2014-04-02-20.36.36.696427 tom             
    2014-04-02-20.36.36.696544 sam             

      2 record(s) selected.

    36)sequence是db2的一个对象,用选项nextval for seqname抓取下个值,prevval for seqname抓取上个值 用法:db2 create sequence db2inst1.my_seq as bigint start with 1 increment by 1 no maxvalue cycle cache 100 ; 其中cache 100是指 100个预先算出来的序列存在内存中,当要读取的时候直接从内存里面拿,所以cache 不等于1的时候,连接断开会出现缓存值丢失而造成不连续,通过syscat.sequences视图查看序列定义
    [db2inst1@oc6162546036 ~]$ db2 "create sequence myseq start with 1 increment by 1"
    [db2inst1@oc6162546036 ~]$ db2 "create table t1(id int,name char(16)) in testdms2"
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 ~]$ db2 "insert into t1 values (nextval for myseq,'tom')"
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 ~]$ db2 "insert into t1 values (nextval for myseq,'sam')"
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 ~]$ db2 "select * from t1"

    ID          NAME            
    ----------- ----------------
              1 tom             
              2 sam             

      2 record(s) selected.


    37)indentity自增字段 ,于sequence的区别在于,indentity只能在表中某一列使用,作用范围是一个表。而sequence是db2对象,于表无关,可以在整个数据库总使用


    ###############################################################################################################################################################################################  
    储存过程(stored procedure),函数,LOB,tirgger,自增字段(indentity) 这些没有学
    ###############################################################################################################################################################################################

    39)定界ASC(II) DEL是db2最常用的格式。""双引号作为字符分割符 ; ,逗号列字段分割符 ;换行来界定行分割符

    40)定长ASC(II)格式,每个字符长度于列定义的字符长度相同 ,不足用空格补齐

    41)PC/IXF 这个是IBM特有的,能够保存表结构定义,WSF格式是lotus的格式

    42)cursor游标只支持LOAD,不需要中介就可以在表和表之间迁移 :declare mycursor cursor for select c1 ,c2 ,c3 from tab1 ; load from mycursor of cursor insert into newtab

    43)export :db2 "export to tablename.del of del messages emp.msg select * from tablename"
                db2 "export to tablename.del of del modified by chardel'' messages emp.msg select * from tablename"  
        import : db2 "import from tablename.del of del messages emp.msg insert/insert_update/replace into tablename
                 db2 "import from tablename.del of del modified by chardel'' allow wirte access commitcount messages emp.msg insert into tablename"

    44)load跟import不一样,import还是执行insert,update,delete操作,需要验证约束和触发器,通过事务日志记录变化。而load不是一行行的导入,而是格式化数据,不必验证约束和触发器,日志也很少,适合大量数据导入。

    45)load常用命令:db2 load source-file of filetype messages msgfile [insert,replace,terminate,restart] into targettable

    46) load除了是非唯一键的表只有load装载这个操作,只要是有唯一键的表(唯一索引)就要进行构建,删除,索引复制另外3个阶段,可通过db2diag.log查看每个阶段步骤

    47)load在删除重复值阶段,只会检查唯一键,不会检测check和完整性(主键和外键),在第一个装载阶段不符合表定义的输入数据不会被装载到表中

    48)含唯一键的load过程:load(不通过db2引擎将文件解析成物理存储模式,无效数据可以放在转储文件) > build(如果有索引就会基于load收集的键创建索引) > delete(检测唯一键,创建异常表) > index copy(指定了allow read access/use ts选项会将build的索引数据从temporary sp里面copy到index sp(索引表空间))
        
    49)LOAD例子:
    [db2inst1@oc6162546036 ~]$ db2 "alter table t1_exp add column ts timestamp add column msg clob(32k)" 《《《《《《创建异常表,加上timestamp 和 大对象
    [db2inst1@oc6162546036 ~]$ db2 "load from t1load.del of del modified by dumpfile=/home/tomzhao/t1.dmp messages msg.t1 insert into t1load for exception t1_exp" 《《《《《《load过程

    Number of rows read         = 8
    Number of rows skipped      = 0
    Number of rows loaded       = 6
    Number of rows rejected     = 2
    Number of rows deleted      = 2
    Number of rows committed    = 8

    SQL3107W  At least one warning message was encountered during LOAD processing.
    [db2inst1@oc6162546036 ~]$ cat t1.dmp.load.000  《《《《《《查看无线数据(转储文件)
    20,"sam",
    40,"aaaaa",x
    [db2inst1@oc6162546036 ~]$ db2 "select id ,name,seqno,ts,substr(msg,1,10)as msg from t1_exp" 《《《《《《查看重复值(异常表)

    ID          NAME       SEQNO       TS                         MSG       
    ----------- ---------- ----------- -------------------------- ----------
             30 mike                 4 2014-04-04-12.26.15.342640 00001I0000
             50 cccc                 7 2014-04-04-12.26.15.342640 00001I0000

      2 record(s) selected.


    装载完之后,要检查错误信息(msg.t1),异常表(t1_exp),转储文件(t1.dmp) 

    50)在实际中如果能保证唯一键没有重复值的话,可以不用创建异常表

    51)用load query检查表load状态

    52)load有个copy选项用来备份load,因为有可能进行数据库或表空间的恢复,这时前滚需要copy的表空间备份恢复被数据库恢复删掉的load数据 (copy no 缺省,copy之对归档日志有效)

    53)copy no会是归档日志load的时候处于backup-peding状态,这个时候需要backup db/ts来消除这个状态

    54)copy yes会使归档日志数据库load的时候产生备份介质,用于db 恢复rolllforward的时候使用 
    [db2inst1@oc6162546036 ~]$ db2 update db cfg for sample using archlogmeth1 disk:/home/dbi2nst1/archlog  《《《《《《归档数据库
    [db2inst1@oc6162546036 ~]$ db2 "load from t3.del of del insert into t3 copy yes to /home/db2inst1"     《《《《《《copy yes 的load
    [db2inst1@oc6162546036 ~]$ db2 restore db sample taken at 20140404143751                               《《《《《《恢复数据库
    [db2inst1@oc6162546036 ~]$ db2 connect to sample
    SQL1117N  A connection to or activation of database "SAMPLE" cannot be made 
    because of ROLL-FORWARD PENDING.  SQLSTATE=57019               
    [db2inst1@oc6162546036 ~]$ db2 rollforward db sample to end of logs and stop                           《《《《《《前滚数据库

                                     Rollforward Status

     Input database alias                   = sample
     Number of members have returned status = 1

     Member ID                              = 0
     Rollforward status                     = not pending
     Next log file to be read               =
     Log files processed                    = S0000001.LOG - S0000001.LOG
     Last committed transaction             = 2014-04-04-18.57.17.000000 UTC

    DB20000I  The ROLLFORWARD command completed successfully.
    [db2inst1@oc6162546036 ~]$ db2 "select * from t3"                                                     《《《《《《表在restore / rollforward后 和之前的一样
              6 record(s) selected.

                                  

    55)-rw-------.  1 db2inst1 db2iadm1  20M Apr  4 14:37 SAMPLE.0.db2inst1.DBPART000.20140404143751.001
        -rw-r-----.  1 db2inst1 db2iadm1 528K Apr  4 14:45 SAMPLE.4.db2inst1.DBPART000.20140404144545.001
    其中第二个字段 4代表load备份,0代表数据库备份

    56)除了copy yes, copy no 还有一种load 选项 nonrecoverable ,这个选项可以在load之后不备份表空间,立即可以使用表,但是这个表在日后需要备份前滚的时候不能被恢复(时间点在nonrecoverable这个动作之后),如果需要恢复就要重建表或对数据库进行load点之后的备份

    57)copy no 会使表空间处于backup-pending
        copy yes 会使表空间处于长时间等待
        nonrecoverable 会使表不可恢复,但是速度很快

    58)对于load装载阶段会将不符合表定义的输入数据放入转存文件,将违反唯一约束放入异常表,那么违反完整约束和check约束,load会将其设置为set intergrity (SQL0668n ,reason code "1" )

    59)set intergrity 有三种选项:set intergrity no 默认
    db2 set integrtiy for T1
       set intergrity immediate checked 

       set intergrity unimmediate checked

    60)和违反唯一键一样,也要创建异常表把违反完整约束和check约束记录下来

    61)演示过程:
    [db2inst1@oc6162546036 ~]$ db2 "create table t2(col1 char(10),col2 char(10))"                                          《《《《《《创建表
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 ~]$ db2 "alter table t2 add constraint check1 check (col2 in( 'a','b','c'))"                    《《《《《《增减check约束
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 ~]$ cat t2.del                                                                                  《《《《《《创建del文档
    "AAA","A"
    [db2inst1@oc6162546036 ~]$ db2 create table t2_exp like t2                                                             《《《《《《创建异常表
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 ~]$ db2 "set integrity for db2inst1.t2 immediate checked for exception in t2 use t2_exp"        《《《《《《对t2进行检查,并使用异常表  
    SQL3602W  Check data processing found constraint violations and moved them to  
    exception tables.  SQLSTATE=01603 
    [db2inst1@oc6162546036 dbbackup]$ db2 "select * from t2_exp"                                                           《《《《《《异常表查看,不管是否有异常数据,t2都将脱离set integrity pending状态
     
    COL1       COL2      
    ---------- ----------
    AAA        A         

      1 record(s) selected.


    62)对于数据仓库来说,有很多表需要检查,那么可以使用表字典查看哪些表处于set integrity pending状态:db2 select tabname,status,access_mode,substr(const_checked,1,1) as fk_checked,substr(const_checked,2,1) as cc_checked from syscat.tables where status='c'

    63)表d>c>b>a,当C做完load处于set integrity pending状态的时候,其他表不会处于此状态,但是对C表执行set integrity这个动作之后,a和b表都会处于set integrity pending的状态,像这种情况主外键约束比较多的情况,可能要执行多次set integrity命令   

    64)db2 "select tabname from syscat.tables where status='c'" 查看表处于set integrity pending 状态的表

    65)db2 set integrity for t1 off no access cascade immediate 《《《《《《对表t1设置为set integrity pending状态,不允许访问,同时他的依赖表也处于set integrity pending状态

    66)db2 set integrity for manager foregin key, employee check immediate unchecked 《《《《《《对表manager的外键和employee的检查约束检查,并将该表脱离set integrity pending状态(确保没有违反约束的情况下可以这么用unchecked)

    67)如果表处于load pending状态,可以使用load...restart,terminate,replace,例如load termiante模拟下列操作:
    [db2inst1@oc6162546036 ~]$ db2 create bufferpool bp8k size automatic 《《《《《《创建8k bufferpool
    [db2inst1@oc6162546036 ~]$ db2 "create tablespace ts3 pagesize 8k managed by database using(file '/home/db2inst1/ts3' 256) bufferpool bp8k"《《《《《《创建8k的ts3表空间
    [db2inst1@oc6162546036 ~]$ db2 "create table t1(id int,name char(50),desc char(50)) in ts1"《《《《《《创建表
    [db2inst1@oc6162546036 ~]$ db2 -td@ -f sp_insert.sql《《《《《《执行插入存储过程
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 ~]$ db2 "call sp_insert(6500)"《《《《《《执行插入存储过程

      Return Status = 0
    [db2inst1@oc6162546036 ~]$ db2 "export to t1.del of del select * from t1"《《《《《《导出数据
    [db2inst1@oc6162546036 ~]$ db2 drop tablespace ts3《《《《《《删除ts3
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 ~]$ db2 "create tablespace ts3 pagesize 8k managed by database using(file '/home/db2inst1/ts3' 232) bufferpool bp8k"《《《《《《重建一个232页的8k ts3表空间
    [db2inst1@oc6162546036 ~]$ db2 "create table t1(id int,name char(50),desc char(50))in ts3"《《《《《《重建表
    [db2inst1@oc6162546036 ~]$ db2 "load from t1.del of del insert into t1"《《《《《《重新load数据
    [db2inst1@oc6162546036 ~]$ db2 load query table t1《《《《《《查看表状态 load pending 
    Tablestate:
      Load Pending
    [db2inst1@oc6162546036 ~]$ db2 "load from /dev/null of del terminate into t1"《《《《《《使用terminate选项
    [db2inst1@oc6162546036 ~]$ db2 load query table t1《《《《《《查看表状态
    Tablestate:
      Normal

    68)从客户端load数据,如果出现路径不存在,表就处于load in progress,这时要在客户段执行load terminate,如果load 是insert动作,表会恢复到load之前状态,如果是replace动作,表会被terminate清空

    69)如果要导入的数据是分号;和单引号,可以是使用modified by修饰符来指定,coldelx指定分隔符,chardelx指定字符串分割,其中x代表导入数据的分号,单引号 例如:
    [db2inst1@oc6162546036 ~]$ db2 "load from t1.del of del modified by coldel; chardel'' insert into t1"

    70)modified by 有很多修饰选项来修饰格式,如:decimal小数会有"aaa",+00023.40这中情况,可以使用decplusblank striplzeros去除+号和零 0 ;可以这样设定日期timestampformate="YYYY/MM/DD HH:MM:SS.uuuuuu"

    71)要导入的数据比表中的字段多怎么办:DEL格式的可以使用 import,load的method p选项,对于ASC格式,method L ,对于IXF格式,用method N选项 :db2 "import from t4.del of del method p(1,3) insert into t4",其中p(1,3)代表截取导入数据的1列和3列 

    72)要导入的数据比表中的字段少,和字段多一样,DEL的格式用method P(1,99,2),利用99创建一个null值就可以了

    72)qa :为什么时不时的会TS 会backup-pending

    73)如果插入的数据是sequence的,而初始的数据也是来源于sequence的数据,那么插入新值的时候要reset sequence的起始数值。模拟操作如下:
    [db2inst1@oc6162546036 ~]$ db2 "create sequence seq1 as integer start with 1 increment by 1 minvalue 1 maxvalue 9999999 cycle cache 10" 《《《《《《创建sequence cache10
    [db2inst1@oc6162546036 ~]$ db2 "create table test2(id int,name char(20))"《《《《《《创建表    
    [db2inst1@oc6162546036 ~]$ db2 "load from seq.del of del insert into test2"《《《《《《load数据
    [db2inst1@oc6162546036 ~]$ db2 "select * from test2"《《《《《《三行数据

    ID          NAME                
    ----------- --------------------
              1 aaa                 
              2 bbb                 
              3 ccc                     

    [db2inst1@oc6162546036 ~]$ db2 "select max(id) as counter from test2"《《《《《《这是重点,设置最后断点 select max(id) as counter from table

    COUNTER    
    -----------
              3

      1 record(s) selected.
    [db2inst1@oc6162546036 ~]$ db2 "alter sequence seq1 restart with 4"《《《《《《重设起始值,alter sequence seq1 restart with counter+1
    [db2inst1@oc6162546036 ~]$ db2 "backup database sample tablespace(ts3) to /home/db2inst1"《《《《《《表空间不可用,做了备份 
    [db2inst1@oc6162546036 ~]$ db2 connect to sample《《《《《《重新链接db
    [db2inst1@oc6162546036 ~]$ db2 "insert into test2 values (nextval for seq1,'bbbbb')"《《《《《《插入下个值
    [db2inst1@oc6162546036 ~]$ db2 "select * from test2"《《《《《《发现变成了14,而不是4,这是因为在开始创建sequence的时候cache 10 ,当数据库断开,前10组数据(4-13)会从内存消失,链接db后从14之后开始算起

    ID          NAME                
    ----------- --------------------
             14 bbbbb               
              1 aaa                 
              2 bbb                 
              3 ccc                 

      4 record(s) selected.
     
    74)IXF格式一般会自己转换不会出现乱码,DEL则会有乱码的问题。当load的时候乱码,可以使用 modified by codepage=1208/1386/819来转换数据库指定的格式,默认是1208 
    [db2inst1@oc6162546036 ~]$ db2 get db cfg for sample |grep -i code 来查看,db2set db2codepage=1386来更改


    75)表空间之间的表迁移,典型的做法是,t1原表export出来,在另个表空间创建相同和t1表相同t2,把t1export出来的数据import进t2,删除或rename t1,把t2改成t1

    76)可以使用存储过程admin_move_table来进行表空间之间的迁移,这种在线的迁移方式保持原表持续访问

    77)在线表迁移有5个步骤:init copy replace swap cleanup

    78)db2move适用于db2move程序用来在两个数据库间的迁移,适合不同平台,表数据量比较多,是import,export,load命令的封装,将数据导出为pc/ixf格式

    79)db2look能为目标表产生表,视图,索引,函数,trigger,存储过程等对象定义语句,db2look也可以抽取表的对象定义信息,以及表空间结构

    80)db2move无法迁移identity标识列的表,之能用单独的load去导入

    81)查看缓冲池大小:
        SELECT BPNAME,NPAGES,PAGESIZE FROM SYSCAT.BUFFERPOOLS
    修改缓冲池大小:
        ALTER BUFFERPOOL <bp_name> SIZE <number_of_pages>
    创建缓冲池时指定大小:
        CREATE BUFFERPOOL <bp_name> SIZE <number_of_pages> PAGESIZE <integer K>

    82)db2look+ db2move数据库数据之间垮平台迁移步骤,例如linux 到 window : 1)db2look 导出表和表空间对象的定义 db2look.ddl 
                                                                     2)db2move 导出整个数据库表数据到一个目录下 
                                                                     3)FTP 到window, 修改db2look.ddl中的内容,比如路径,执行db2 -tvf db2lool.ddl 加载定义
                                                                     4)通过db2move导入 db2move sample load   


    83)db2dart 功能十分强大可以导出数据,

    84)ixf是二进制自带结构的,del是只有数据


    81) qa 如果4k页面,什么情况下表创建不了 行大小超过了4k 。。。。
    ############################################################################################################################################################################################### 
    identity数据导入,lob数据导入,换行导入没学
    ############################################################################################################################################################################################### 

    82)两种情况的恢复:恢复+前滚 ; 恢复事务日志和崩溃恢复(数据保持一致性)

    83)前滚可以恢复到备份之后的某个点或日志结尾

    84)崩溃恢复:redo提交到内存缓冲池还没写进磁盘,undo还没提交的,缺省情况下崩溃恢复是自动执行不需要人工干预,

    85)日志是数据库一种恢复机制,用于操作数据在没写入存储系统之前的永久记录

    86)db2采用写日志优先算法,先写日志,再写数据,写数据的过程是异步的。日志是不进行任何不是物理数据更新操作的,比如查询就不需要记录到日志内,以及日志只记录操作发生地点,时间点和前后的数据变化,比如不需要记录sql语句和发命令的用户account 

    87)数据流两种方式计算,这两种可以自由转换
        LSN(log sequence number)记录所在日志文件在磁盘中的真实的位置,用十六进制表示
        LSO(logical stream offset)记录真正的数据,不包含日志文件的各种头信息

    88)外部的日志命令和控制文件都普遍使用LSN记录数据流的位置

    89)pageLSN会保证日志文件在恢复的时候不把写进磁盘的数据拿来恢复,每个数据页头都记录了LSN,当恢复的时候读到LSN,会跟pageLSN对比,如果LSN更老,pageLSN更新的话,那么就不会去恢复这个老的LSN,pageLSN是用来和LSN对比用的

    90)查看pageLSN 使用 db2dart /Dd选项,其中有pageLSN的信息

    91)非活动日志是在恢复起点之前的日志,活动就是之后

    92)所有重要的LSN都会记录到 SQLOGCTL.LFH这个控制文件内,backup pending,rollforwarding pending 都是由这个文件掌控

    93)db2日志原理,写日志的优先算法,先写日志,在写数据,当崩溃或前滚恢复时候,需要将日志文件写回到数据盘,保证db2数据库的一致性,db2日志最终都存在日志文件中,在内部结构上,每个日志文件由一些日志构成,每个日志也包行一些日志记录,每个日志记录同LSN记录,但恢复时,db2需要知道从那个LSN开始,这就是min(MinfuffLSN,LowtranLSN),以及活动日志一定不要删除,否则会down机
    一致性就是恢复前滚到一个时间点,这个时间点会将提交的数据写入磁盘,没有提交或已经回滚的时候都被撤销

    94) 日志的大小,主日志文件和辅助日志文件:日志文件个数
     Log file size (4KB)                         (LOGFILSIZ) = 1024
     Number of primary log files                (LOGPRIMARY) = 13
     Number of secondary log files               (LOGSECOND) = 12

    95)
    获取 DB2 数据库大小和其最大容量信息的方法
    db2 "call GET_DBSIZE_INFO (?,?,?,0)"
    获取表空间占用大小的方法
    DMS可以直接查看容器大小,如果想查看里面的数据也,db2 list tablespaces show detail
    SMS由于每个对象都占用一个文件,可以计算SMS表空间容器中文件的总大小
    DMS自动存储管理表空间,只要自动存储路径有足够的空间,满了之后会自扩
    获取表/索引占用空间的方法
    三种方法:
    db2pd -tcbstats;datasize*页数(这种方法仅限于被访问过的表)
    admin_get_tab_info 表函数;
    和sysibmadm.admintabinfo系统管理视图



    96)获取事务日志大小:(logprimary+logsencond)*logfilesiz*4k  设置为数据库大小10-20%性能最佳(用kbyte来计算比例),logprimary+logsecond不能超过255,日志空间大小不能超过256GB.
    对logprimary和logfilsiz参数的更改需要断开链接才能生效。而logsecond的修改会立即生效,logsecond日志文件使用完后不会立即删除,而是在所有连接都断开并重新连接的时候才会删除

    97)日志满:SQL0946C ,事务会回滚

    98)日志路径:
    [db2inst1@oc6162546036 NODE0000]$ db2 get db cfg for tomdb2|grep -i 'path'
     Changed path to log files                  (NEWLOGPATH) = 
     Path to log files                                       = /home/db2inst1/db2inst1/NODE0000/SQL00002/LOGSTREAM0000/

    99)如果需要对创建日志镜像文件 ,可以通过mirrorlogpath设置日志镜像文件,将日志存在两个位置

    100)循环日志,主日志用完事务提交到磁盘,可以重新利用这个日志,当主日志全部分配出去,并且都没提交到磁盘,则利用分配辅助日志来继续日志,辅助日志分配完没提交到磁盘,系统报错SQL09460C

    101) 归档日志,日志一旦写满就归档(不管是否commit或者写入磁盘,归档日志还可以是活动日志,包括没提交的数据),系统会复制写满的日志进行重新利用(如果日志是活动的那么会用辅助日志,如果是非活动,那么就会复制)

    102)归档日志常用选项:db2 get db cfg for sample using logarchmeth1 disk:/archlogs

    103)创建数据库默认是循环日志,更改成归档日志需要离线完全备份,否则会报backup-pending状态

    104)循环日志多用于OLAP 数据仓储的查询,并发,多维,支持rollback,崩溃恢复,backup/restore,但无法保留日志,不支持前滚
        归档日志多用于OLTP 交易系统,可以在出现问题时,第一时间恢复

    105) DML(data manipulation language)是数据操纵语言:它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。

        DDL(data definition language)是数据定义语言:DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。

        DCL(DataControlLanguage)是数据库控制语言:是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。



    106)监控日志使用情况:db2 get snaphost for database on sample 

    107)查看归档日志 :db2 list history archive log all for sample,

    108)first active log file(db2 get db cfg for sample |grep -i 'first log' )之前是非活动日志,之后是活动日志

    108)事务日志满的情况(SQL09460N) : 事务太大,可以加大logsecond大小,logprimary大小 logfilsiz大小。可以考虑用load from /dev/null of del replace into tbname(这种方法可以不用记录日志)
                                    事务小但没提交:使用快照查看最早事务应用程序(appl id holding the oldest transaction),抓取应用快照:db2 get snapshot for application agentid 228



    110)备份:离线备份 和 在线备份(归档日志)
              数据库备份 和 表空间备份
              增量备份(归档日志)和完全备份 

    111)在线备份中的include logs是把日志一起打包在备份介质,是为了在另一台机器方便恢复前滚,其中在线备份中的include logs是可选,但一般情况下都是加上这个选项 
    例如:
    db2 backup db sample online include logs 在A机器上做在线备份
    db2 restore db sample from /data1 taken at timestamp logtarget /data/logs 把介质传到B机器上做通过logtarget将日志恢复到一个指定的目录
    d2b "rollforward db sample at the end of logs and stop overflow log path(/data/logs) 在B机器上通过overflow log path恢复的日志做前滚恢复
    如果不想恢复数据库只想恢复日志使用logtarget:db2 restore db sample logs from /data1 logtarget /data/logs

    112)可以查看恢复执行顺序:db2ckrst -d sample -t timestamp -r database

    113)如果要使用增量备份:db2 update db cfg for sample using trackmod on

    114)增量备份:db2 backup db sample [tablespace(tbspname)] [online] incremental [delta] to /home/db2inst1
        增量恢复:db2 restore db sample [tablespace(tbspname)] incremental [auotmatic] taken at timestamp

    115)db2ckbkp -h image(介质)查看备份介质正确性

    116)db2支持三种恢复:崩溃恢复,前滚恢复,版本恢复

    117)默认情况下崩溃恢复是默认(autorestart on),不需要人为干预

    118) db2每个备份介质就是一个版本(image),所以版本恢复就是利用介质恢复

    119)重定向恢复:db2 restore db sample redirect generate script redirect.ddl
                  db2 -tvf redirect.ddl
    重定向恢复不支持 自动存储表空间,可以在恢复命令中通过 on path-list  指定存储路径,重定向恢复要前滚恢复,对于源端和目标段表空间容器不匹配的情况特别适合

    120)前滚恢复三个选项:时间
                       end of logs and stop (最大程度恢复)
                       end of backup and stop (最小时间恢复,backup中包含了在线备份的log)

    121)前滚提取日志顺序:活动日志目录 > overflow log path > logarchmeth1

    122)表空间的最小时间恢复点=表空间的系统目录表或其中表的最后一次更新操作的时间点,只有前滚到最小恢复时间之后才能保证系统表和数据库对象


    123)删除表恢复(dropped table recovery)(归档日志),默认是开启的,可以手动打开,db2 alter tablespace tbspname dropped table recovery on
    模拟操作表恢复:
    [db2inst1@oc6162546036 ~]$ db2 "create table t3(id int,name char(10))" 《《《《《《创建表
    [db2inst1@oc6162546036 ~]$ db2 "insert into t3 values(10,'tom')"《《《《《《插入值
    [db2inst1@oc6162546036 ~]$ db2 backup db sample online《《《《《《在线备份

    Backup successful. The timestamp for this backup image is : 20140413153752
    [db2inst1@oc6162546036 ~]$ db2 drop table t3《《《《《《删除表
    [db2inst1@oc6162546036 ~]$ db2 list history dropped table all for sample《《《《《《利用历史文件查看表定义

     Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
     -- --- ------------------ ---- --- ------------ ------------ --------------
      D  T  20140413153841                                        00000000000053430004000a 
     ----------------------------------------------------------------------------
      "DB2INST1"."T3" resides in 1 tablespace(s):

     00001 IBMDB2SAMPLEREL
     ----------------------------------------------------------------------------
        Comment: DROP TABLE
     Start Time: 20140413153841
       End Time: 20140413153841
         Status: A
     ----------------------------------------------------------------------------
      EID: 47

     DDL: CREATE TABLE "DB2INST1"."T3" ( "ID" INTEGER , "NAME" CHAR(10) )  IN "IBMDB2SAMPLEREL" ;     
    [db2inst1@oc6162546036 ~]$ db2 "restore db sample tablespace(IBMDB2SAMPLEREL) taken at 20140413153752"《《《《《《表空间恢复
    [db2inst1@oc6162546036 ~]$ mkdir droppedtablerecoverytest
    [db2inst1@oc6162546036 ~]$ db2 "rollforward database sample to end of logs tablespace(IBMDB2SAMPLEREL) recover dropped table 00000000000053430004000a to /home/db2inst1/droppedtablerecoverytest"《《《《《《利用历史文件的表定义,可以查看到backup id ,和使用的tablesapce .在前滚的过程中将表数据导出到一个目录里
    [db2inst1@oc6162546036 NODE0000]$ cat data《《《《《《
    10,"tom       "
    [db2inst1@oc6162546036 ~]$ cat creatt3.ddl《《《《《《创建一个脚本,DDL语句可以在历史记录里查看到
    CREATE TABLE "DB2INST1"."T3" ( "ID" INTEGER , "NAME" CHAR(10) )  IN "IBMDB2SAMPLEREL" ;
    [db2inst1@oc6162546036 ~]$ db2 -tvf creatt3.ddl《《《《《《
    [db2inst1@oc6162546036 ~]$ db2 "import from /home/db2inst1/droppedtablerecoverytest/NODE0000/data of del insert into t3"《《《《《《
    [db2inst1@oc6162546036 ~]$ db2 "select * from t3"《《《《《《
    ID          NAME      
    ----------- ----------
             10 tom       

      1 record(s) selected.

    124)前滚恢复一旦完成就会生成新的日志链,之后时间的日志将永久的不能被恢复,被删除了已经
    例如:
     
    125)前滚恢复有三个选项:timestamp某个时间点
                         end of logs and stop 最大恢复时间
                 end of backup最小恢复时间

    126)db2 "values current timestamp"  这个可以记录当前精准的时间和前滚时候需要的格式
    [db2inst1@oc6162546036 ~]$ db2 "values current timestamp"

    1                         
    --------------------------
    2014-04-14-04.50.13.452212


    127)使用db2 list history backup all for sample查看备份最小时间(start time)和最大时间(end time)
         使用db2 list history archive log all for sample 查看归档日志 



    ###############################################################################################################################################################################################
    常见备份恢复场景及遇到的问题 
    ###############################################################################################################################################################################################

    128)自动表空间设置有两个选项要同时设置才会自动管理空间:创建的表空间的是automatic storage yes ;autoresize yes,  autoresize yes才能实现automatic storage 

    129)runstats > reorgchk > reorg > runstats > rebind
        runstats > reorgchk > rebind

    130)runstats 使用distrubution 参数收集数据分布(一种是frequency,一种是quantile)

    131)[db2inst1@oc6162546036 ~]$ db2 "select tabname,stats_time from syscat.tables where stats_time is null" 《《《《《《查看是否收集过统计信息 

    132)runstats只能对单一表进行执行,无法对整个数据库做运行统计,需要脚本来收集整个数据库的统计信息

    133)runstats有allow write access(默认)和allow read acess

    134)如果出现表和索引统计信息不一致,runstats将会报警,此时就要同时对表和索引进行统计信息
    db2 runstats on table db2inst1.t1 and detailed indexes all

    135)如果执行大数据量的统计信息收集时,会出现sql2310n 使用程序不能生成统计信息,这是可以采取抽样统计

    136)runstats统计的结果是保存在sysstat.tables 和sysstat,indexs, 不建议修改

    137)db2look -d sample -m > db2look_stat.out保存统计信息

    138)runstats使用实践:

    *当表数据量发生巨大变化的时候,如通过load加载大量数据或reorg后,或增加的新的索引,建议runstats
    *空闲的时候执行runstats
    *表很大,或表数据频繁变动,可以考虑在某些字段上runstats,而不是整个字段,
    *表很大,统计时间很长,可以考虑抽样统计
    *提高可以用性,可以默认使用allow wirte access
    *系统表也要经常做runstats
    *为减少信息不一致的情况,考虑同时在表和索引上同时进行统计信息收集
    *统计完信息要发出commit 以释放锁。对于静态语句,还需要对package重新绑定,一便生成新的访问计划

    139)reorg磁盘碎片整理工具

    140)但出现问题时,reorg表可能会大大提高性能

    *如果表中有许多删除的行,或者有些表已经是空表,那么reorg可以是表占用的空间大大降低
    *如果发生overflow行溢出,主要发生在变长字段varchar更新之后,记录的长度会跨页,增大了 I/O,reorg表数据可以重新组织数据的存储顺序
    *按照某个索引重新组织表数据的顺序物理,即cluster index聚集索引的概念,表数据在物理上的存储顺序于索引顺序相匹配。
    *但表数据压缩是,可以通过reorg建立字典,并对表数据进行压缩

    141)当然 reorg不是万能的,有可能按照索引增加页数,DBA 比较关系 reorg执行时间,频率 和对应用的影响
     
    142)判定是否需要reorg 两个选择:reorgchk和sysibmadm.snaptab管理视图
    db2 reorgchk on schema db2admin
    如果F1,F2,F3标记 *,则需要重组表,如果索引统计结果 F4-F8 有* 标记,则需要对索引重组 


    143)判断某一张表是否需要重组,可以使用视图sysibmadm.snaptab管理视图,overflow_accesses于rows_read比例高于3%,就需要对表进行重组
    [db2inst1@oc6162546036 ~]$ db2 "select substr(tabname,1,18) as tabname,rows_read,overflow_accesses from sysibmadm.snaptab where (rows_read > 999) and ((overflow_accesses *100) / (rows_read +1) >3 )"

    TABNAME            ROWS_READ            OVERFLOW_ACCESSES   
    ------------------ -------------------- --------------------

      0 record(s) selected.

    144)对索引重组的检查仍然需要reorgchk

    145)reorg分为 离线重组 和 在线重组

    离线重组 采用shoadow copy的方法,创建一份原始数据副本保持原表可读(allow read access),reorg过程中会记录日志,可以在异常的情况下进行根据日志恢复
    对于离线重组。可以根据具体的索引进行重组index indexname ,如下:
    [db2inst1@oc6162546036 ~]$ db2 reorg table db2inst1.t3 index il allow read access use tempts1
    DB20000I  The REORG command completed successfully.

    146)db2 提供多种方式检查监控reorg是否完成:

    *通过sysibmadm.snaptab 检查(打开dft_mon_table实例监控器开关 
    *通过快照查看db2 get snapshot for tables on sample(current counter/max counter来预测完成的百分比)
    *通过db2pd -d sampe -reorg
    *通过list history reorg all for sample 获得表或索引重组信息(因为 reorg会记录日志)

    147)在线reorg表比离线reorg慢很多,因为在线不会创建数据副本,分批次重组,每次只有一部分数据

    148)在线reorg表也叫inplace reorg( 原定reorg),reorg可随时启动和停止,为了保证恢复性,在线reorg会记录大量的日志,需要在日志空间依赖于移动的行数,表上索引的个数和索引键大小,因此可能是表大小的几倍

    db2 reorg table db2inst1.t3 inplace allow write access

    149)在线reorg表是后台异步,即使我们看到命令成功返回,实际上仍然在后台执行。如果在线重组的表很多,那么可能导致I/O cpu资源占用很多,并且可能会消耗所有的活动日志,影响系统正常运行,那么可以使用脚本控制多个表在线reorg执行顺序:db2 list applicaitons show detail |grep -i db2rerog判断,如果有 reorg 正在执行,则等待该 reorg 执行完毕,否则执行脚本里的下一个表重组 ,其中db2reorg是一个应用进程,可以断开

    150)监控在线重组和离线重组的监控类似

    151)离线reorg表之后会重建索引,在线表重组仅仅维护索引,而不会重建索引(除 cluster index 之外),如果要对索引单独重组可以:db2 reorg indexs all for tbname,对在线重组索引的监控:db2 list history all for sample,或者查看db2diag.log文件

    152)对于在线重组,要保持足够的日志空间,同时要确保 util_heap_sz 数据库参数的值足够大

    153)bind(绑定),是将C程序中的DB2 SQL 语句经过编译(prep)绑定到db2的package中,package中包含了每个SQL语句的访问计划,以后执行这个C程序时,就会按照保存的package的访问计划执行SQL语句
    那么rebind就是重新绑定更新执行计划。rebind一般都对静态sql (事先已经在package里面)绑定,存储过程也是在package里面,所以rebind也同样适合

    154)逻辑空间可能小于物理空间(物理空间是分配过没有释放的,实际占用的空间是逻辑空间),计算表空间大小的时候是用物理空间),reorg可以消除这种状态

    ###############################################################################################################################################################################################
    ###############################################################################################################################################################################################
    155)隔离级别只限于读锁

    156)默认级别的CS可以在程序级,语句级,事务级设置

    157)4中隔离级别:
    UR(uncommited read):读的时候不加锁,可以读到未提交的数据
    CS(cusror stability):读到哪行,哪行就加锁,读完之后就释放锁
    RS(read stability):把查询的结果行,全部都加锁
    RR(repeatable stablility):把读过的行,全部都加锁

    157)表锁在默认情况下db2不会实施强锁(s u x z ),只有通过lock table 或 发生锁升级的时候才会在表上加强类型锁模式,弱类型锁主要是配合行锁使用,在获得行锁之前一定要有表锁(IN,IX,IS,SIX)
        
    158)db2pd是锁的监控好工具,因为不需要锁定引擎资源,对系统开销小,格式上也比较直观

    159)加Z锁,是当create,alter,drop,表或create.drop索引时需要要。用db2pd -d sample -locks观察,发现出了mode上面有Z锁外还有其他锁,这是因为drop属于DDL语句,DDL定义会存到catalog table 中,所以系统表上会加行锁和表锁

    160)list tables for schema <schema name>
         list tables for all 
         list tables 查看当前用户做为模式名的表和视图
         syscat.tables系统视图查看表的定义,所属的表空间
     
    161)U锁是介于 S 和 X锁之间的锁,一般用于"select....for update ",目的是为了保持和s锁的兼容,但两个u锁是不兼容的。防止连个S锁之间升级到X锁 所发生的死锁
    模拟如下:

    [db2inst1@oc6162546036 ~]$ db2 +c "select * from t1 for update with rr"
    [db2inst1@oc6162546036 ~]$ db2pd -d sample -locks

    Database Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:04:19 -- Date 2014-04-16-23.45.20.002013

    Locks:
    Address            TranHdl    Lockname                   Type       Mode Sts Owner      Dur HoldCount  Att        ReleaseFlg rrIID
    0x00007FD8F6611980 552        41414141415649626B457D1AC1 PlanLock   ..S  G   552        1   0          0x00000000 0x40000000 0     
    0x00007FD8F6611D80 552        010000000100000001004079D6 VarLock    ..S  G   552        1   0          0x00000000 0x40000000 0     
    0x00007FD8F6611B80 552        06000400000000000000000054 TableLock  ..U  G   552        1   0          0x00002000 0x00000001 0     

    162)SIX锁是S+IX锁或IX+S锁形成的 。即先有S锁,或IX锁再去申请IX锁或S锁
    模拟如下:
    [db2inst1@oc6162546036 ~]$ db2 +c lock table t1 in share mode 
    [db2inst1@oc6162546036 ~]$ db2 +c "insert into t1(id,name) values(13,'tim')"
    [db2inst1@oc6162546036 ~]$ db2pd -d sample -locks

    Database Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:12:56 -- Date 2014-04-16-23.53.57.095565

    Locks:
    Address            TranHdl    Lockname                   Type       Mode Sts Owner      Dur HoldCount  Att        ReleaseFlg rrIID
    0x00007FD8F6611980 552        41414141415649626B457D1AC1 PlanLock   ..S  G   552        1   0          0x00000000 0x40000000 0     
    0x00007FD8F6612100 552        000005000F1E0000C19D3AFBC3 CatCacheLock ..S  G   552        5   0          0x00000000 0x40000000 0     
    0x00007FD8F6611B80 552        06000400040000000000000052 RowLock    ..X  G   552        1   0          0x00200008 0x40000000 0     
    0x00007FD8F6612700 552        000021000A000000A0FA39FBC3 CatCacheLock ..S  G   552        6   0          0x00000000 0x40000000 0     
    0x00007FD8F6611A80 552        06000400000000000000000054 TableLock  SIX  G   552        255 0          0x00202000 0x40000000 0     

    163)W 和 NW行锁 是有索引的时候才会用到,S和NS是不同隔离级别下读锁的模式,在CS 和 RS隔离级别下是NS锁,在RR隔离级别下是S锁

    164)在获得行锁之前,要获得这个行所在表的最低表锁,如果要查询某个行,那么就是对表有读的意图,需要先的到表的意向读(IS),如果是增删改某行,就是有意图写(IX)

    165) 行锁的s和x模拟: 
    锁窗口的观察可以看出,有一个IS表锁和NS行锁,但NS行锁是W状态,表示锁等

    [db2inst1@oc6162546036 ~]$ db2pd -d sample -locks

    Database Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:01:50 -- Date 2014-04-17-22.41.46.759541

    Locks:
    Address            TranHdl    Lockname                   Type       Mode Sts Owner      Dur HoldCount  Att        ReleaseFlg rrIID
    0x00007F9B55C72300 3          04000A00080000000000000052 RowLock    ..X  G   3          1   0          0x00200008 0x40000000 0     
    0x00007F9B55C76100 14         04000A00080000000000000052 RowLock    .NS  W   3          0   0          0x00000000 0x00000000 0     
    0x00007F9B55C76200 14         010000000100000001006057D6 VarLock    ..S  G   14         1   0          0x00000000 0x40000000 0     
    0x00007F9B55C71980 3          41414141415649626B457D1AC1 PlanLock   ..S  G   3          1   0          0x00000000 0x40000000 0     
    0x00007F9B55C76300 14         41414141415649626B457D1AC1 PlanLock   ..S  G   14         1   0          0x00000000 0x40000000 0     
    0x00007F9B55C71B80 3          04000A00000000000000000054 TableLock  .IX  G   3          1   0          0x00202000 0x40000000 0     
    0x00007F9B55C76180 14         04000A00000000000000000054 TableLock  .IS  G   14         1   0          0x00003000 0x40000000 0 
    166)锁等
         锁超时 locktimeout=-1 是无限等待的意思
         死锁
         锁升级(lock escation),就是由行锁替换为表锁,释放内存资源的过程 (行锁升级为表锁),可以使用db2diag.log查看
         锁转换(lock conversion)是锁的模式转黄,比如NS锁转为X锁 (弱型的锁转向强类型的锁)

    167)db2 用locklist和maxlocks出发锁升级,locklist用来控制每个数据可以使用最大锁内存;maxlocks用来控制每个应用可以占用的锁内存百分比,在多用户并发系统中,此参数的目的是限制某个应用占用过多的锁内存,锁升级发生的条件包括:
    锁内存超出了locklist大小
    某个应用使用的锁内存空间达到了locklist * maxlock%
    发生锁升级时,会在db2diag.log 中记录锁升级的详细信息。
         

    168)判断锁的问题出现:
    *系统响应慢,吞吐量低,cpu使用率低,磁盘空闲
    *应用程序返回错误 SQL911
    *通过日常监控工具,如快照监控和事件监控 ,这一点是最佳起点db2 get snapshot for db on sample |more

    169)锁是瞬间的,某一时刻可能监控到很多锁等,而另一时刻可能已经释放,所以需要通过脚本执行多次(find_lickwait.sh 脚本用于抓取超过2min的应用)

    170)db2pd -d sample -locks showlocks wait -tra -app -dyn >db2pd.out 这是db2pd常用的命令组合
    我们可以根据db2pd -locks选项定位锁信息,找到持有锁和锁等的事务句柄(TranHdl)>>根据db2pd -tra找到这几个事务句柄所属的应用句柄(AppHandl)>>接着根据db2pd -app找到这些句柄刚执行的或正在执行的sql句柄(通过Anchid和Stmtid识别>>最后根据db2pd -dyn找到sql句柄所代表的sql语句,在实际环境中,可以根据需要写一个脚本,定时调度和抓取锁的信息

    171)对锁的监控,尽管锁快照也可以获得锁的信息,但我们还是建议用db2pd,锁列表可以达到几百m ,而且锁快照会对db2内部数据结构加上内部锁,以保证自己独享内存,而db2pd不需要占用内部锁

    172)db2pd具有一定的局限性,不能保证一定能抓取到引起锁等的SQL语句,db2pd只能抓取到现在和上一个的执行语句(C-AnchID/C-StmtID)(L-AnchID/L-StmtID),如果一个事务增删改操作之后,又进行了多次读的操作,这是db2pd抓取的结果就不是真正占有锁的SQL

    173)9.5版本如果使用db2pd不能抓取到引起锁等的SQL,那么可以locktimout的值间隔设置小一些,然后用v9.5提供的db2_capture_locktimeout注册变量来抓取

    174)9.5之后 如果想要用+C 这个选项,首先要查看这个配置参数(CUR_COMMIT) = disabled [on , off]
    [db2inst1@oc6162546036 ~]$ db2 get db cfg for sample|grep -i 'commit'
     All committed transactions have been written to disk    = NO
     Currently Committed                        (CUR_COMMIT) = ON
    当前以落实这个参数用来控制currently commited 机制,CC是CS默认级别的新实现,目的是防止写操作阻碍读操作(wirte blocks read),减少锁等而提高并发性,,即一个事务做update delete之前的数据无需等待,一个事务做insert但未提交,另个事务读取是会忽略新插入的数据,无需等待。这种机制是通过其内部的日志来保证事务一致性,即在行锁上面增加一个标识(no information ; uncommited insert identifier ; log information )

    175)
    [db2inst1@oc6162546036 ~]$ db2 get snapshot for db on sample|more

    Number of Threshold Violations             = 0      
    Locks held currently                       = 0
    Lock waits                                 = 1   《《《在快照瞬间发生锁的次数
    Time database waited on locks (ms)         = Not Collected 《《《锁等的时间总和 (除以lock waits 即没个锁等的时间,这个时间比较大,就要查处引起锁等的SQL语句,db2pd -d sample -locks showlocks wait -tra -app -dyn)
    Lock list memory in use (Bytes)            = 19200  
    Deadlocks detected                         = 0    《《《多少个死锁被检测到
    Lock escalations                           = 0    《《《多少个锁发生升级 (db2diag.log查看)
    Exclusive lock escalations                 = 0     
    Agents currently waiting on locks          = 0
    Lock Timeouts                              = 1    《《《发生锁超时的次数
    Number of indoubt transactions             = 0     《《《正在等待锁的应用

    对于快照监控锁,一定要在某个时间内分析才有意义


    176)锁超时
    因为db2pd抓取SQL语句的能力有限,所以我们可以用这个注册变量:db2_capture_locktimeout来有效的抓取死锁和锁超时,还需配合创建deadlock event monitor才能正确完整的抓取锁超时的相关信息(适用于9.5以上)
    [db2inst1@oc6162546036 ~]$ db2set -lr|grep -i 'capture' 《《《注册变量
    DB2_CAPTURE_LOCKTIMEOUT

    模拟:
    [db2inst1@oc6162546036 ~]$ db2set db2_capture_locktimeout=on 《《《打开注册变量
    [db2inst1@oc6162546036 ~]$ db2set 
    DB2_CAPTURE_LOCKTIMEOUT=ON
    DB2AUTOSTART=YES
    [db2inst1@oc6162546036 ~]$ mkdir locks 《《《创建死锁监控器目录
    [db2inst1@oc6162546036 ~]$ db2 "create event monitor deadlock for deadlocks with details history write to file '/home/db2inst1/locks'" 《《《创建死锁监控器
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 locks]$ db2 set event monitor deadlock state=1 《《《打开死锁监控器
    [db2inst1@oc6162546036 locks]$ db2 +c "insert into t3 values(20,'may')"
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 locks]$ db2 +c "select * from t3 where id=20"

    ID          NAME      
    ----------- ----------
             20 may       

      1 record(s) selected.
    [db2inst1@oc6162546036 ~]$ db2 +c "select * from t3 where id=20"
    SQL0911N  The current transaction has been rolled back because of a deadlock 
    or timeout.  Reason code "68".  SQLSTATE=40001
    [db2inst1@oc6162546036 db2dump]$ ll |grep -i 'lock' 查看db2dump里面生成的db2locktimout文件,这个文件包含两个部分,一个部分是申请锁类型,锁超时的语句,另外一个为锁拥有者相关信息,包含了当前模式,和当前事务执行的所有SQL
    -rw-r-----. 1 db2inst1 db2iadm1    3160 Apr 17 23:23 db2locktimeout.0.40.2014-04-17-23-23-55
    [db2inst1@oc6162546036 db2dump]$ cat db2locktimeout.0.40.2014-04-17-23-23-55
    Lock Requestor: 
    .
    .
     Lock mode requested:     .NS  《《《请求锁的类型
    Context of Lock Request: 
    .
    .
        Statement:              select * from t3 where id=20  《《《发生锁超时的持有者语句
    Lock Owner (Representative): 
    .
    .
     Lock mode held:          ..X 《《《锁持有模式

    177)死锁目前的常用的方法就是通过deadlock event monitor (9.5版本)
    模拟:
    第一个窗口:
    [db2inst1@oc6162546036 ~]$ db2 +c "insert into t1 values('aaa')"
    [db2inst1@oc6162546036 ~]$ db2 set event monitor deadlock state=1
    [db2inst1@oc6162546036 ~]$ db2 +c "select * from t2"
    [db2inst1@oc6162546036 ~]$ db2 flush event monitor deadlock
    [db2inst1@oc6162546036 ~]$ db2 set event monitor deadlock state=0
    [db2inst1@oc6162546036 deadlock]$ db2evmon -path /home/db2inst1/deadlock > deadlock2.txt
    Reading /home/db2inst1/deadlock/00000000.evt ...
    [db2inst1@oc6162546036 deadlock]$ cat deadlock2.txt
    .
    .
    5) Deadlocked Connection ...
    .
    Deadlocked Statement:
    .
    Text     : select * from t1 《《《发生死锁回滚的SQL语句

    第二个窗口:
    [db2inst1@oc6162546036 ~]$ db2 +c "insert into t2 values('bbb')"
    [db2inst1@oc6162546036 ~]$ db2 +c "select * from t1"
    SQL0911N  The current transaction has been rolled back because of a deadlock 
    or timeout.  Reason code "2".  SQLSTATE=40001

    死锁监控器event monitor只能用一次 

    178)为了改变锁等 锁超时 死锁都需要用不同工具去检测,9.7使用统一抓取锁超时,锁等 和 死锁,这就是creat event monitor for locking 语句
    [db2inst1@oc6162546036 deadlock]$ db2 get db cfg for sample
     Lock timeout events                   (MON_LOCKTIMEOUT) = NONE
     Deadlock events                          (MON_DEADLOCK) = WITHOUT_HIST
     Lock wait events                         (MON_LOCKWAIT) = NONE
     Lock wait event threshold               (MON_LW_THRESH) = 5000000
    可以把前3个参数改成hist_values,将mon_LW_thresh改成10000(10秒)

    179) 参数设置完成后,即可开始创建锁监控器进行锁时间的抓取:
    [db2inst1@oc6162546036 ~]$ db2 "create event monitor lockevmon for locking write to unformatted event table(table locks)"
    DB20000I  The SQL command completed successfully.
    db2 set event monitor lockevmon state=1 开启监控开关

    180)因为用了未格式化的表,所以需要解析,解析方法包括java程序和存储过程(略),如下:
    [db2inst1@oc6162546036 jdbc]$ cp db2evmonfmt.java DB2EvmonLocking.xsl /home/db2inst1 《《《在samples目录下面自带一个java解析程序,需把这个程序编译成class才能执行
    [db2inst1@oc6162546036 ~]$ ~/sqllib/java/jdk64/bin/javac db2evmonfmt.java 
    [db2inst1@oc6162546036 ~]$ ls -alt db2evmon*
    -rw-r--r--. 1 db2inst1 db2iadm1 16996 Apr 21 01:57 db2evmonfmt.class
    -r-xr-xr-x. 1 db2inst1 db2iadm1 40360 Apr 21 01:55 db2evmonfmt.java
    [db2inst1@oc6162546036 ~]$ ~/sqllib/java/jdk64/jre/bin/java db2evmonfmt -d sample -ue locks -ftext -u db2inst1 -passwd > db2locks.out 《《《出现锁等,锁超时,死锁的时候,就可以使用刚编译的java程序对未格式化的表进行解析,其中ue <table>指定未格式化的表名,-ftext将输出格式化为文本文件,-u -p指定用户和密码


    181)除了用java程序解析表还可以用存储过程

    182)如果不能从应用层面改变隔离级别(UR>CS>RS>RR,隔离级越低,并发越好),可以通过sql语句级通过with设置隔离级别:select....from...with UR 表示通过UR隔离级别查询数据

    183)有这么三个锁参数可以减少锁的行数,提高并发
    [db2inst1@oc6162546036 ~]$ db2set -lr |grep -i 'db2_eva*'
    DB2_EVALUNCOMMITTED
    [db2inst1@oc6162546036 ~]$ db2set -lr |grep -i 'db2_skip*'
    DB2_SKIPDELETED
    DB2_SKIPINSERTED

    DB2_EVALUNCOMMITTED:验证未提交数据,默认情况下决定某行数据是否满足查询条件前,如果满足就加锁,如果不满足,则不加锁
    DB2_SKIPDELETED:跳过插入行,在CS或RS隔离级别下,如果插入的行没有提交,那么另外一个应用程序扫描时会处于锁等,但如果用了这个参数,则忽略未提交的新插入数据
    DB2_SKIPINSERTED:跳过删除行,在CS或RS隔离级别下,如果删除的行没有提交,那么另外一个应用程序扫描时会处于锁等,但如果用了这个参数,则假设这数据没有删除

    后面两个参数其实在某种形式上面是脏读,要小心使用

    ###############################################################################################################################################################################################
    ###############################################################################################################################################################################################

    184)db2 提供了很多监控工具,主要分为:实时监控和跟踪监控

    185)实时监控记录数据库某一个时刻的快照信息:snapshot,db2pd,db2top和9.7版本的in-memory metrics等工具,就像照相机
         跟踪监控提供了更详细的数据库活动:事件监控器和9.7版本的activity monitor,事件监控器可能会产生较大的数据量

    186)snapshot可以监控的对象包括实例,数据库,每个应用程序的活动,表空间,缓冲池,表,动态sql语句,锁和排序等信息,最好是把他们都打开,实例级别的要重启数据库生效
    [db2inst1@oc6162546036 ~]$ db2 get dbm cfg |grep -i 'dft'
     
       Buffer pool                         (DFT_MON_BUFPOOL) = OFF
       Lock                                   (DFT_MON_LOCK) = OFF
       Sort                                   (DFT_MON_SORT) = OFF
       Statement                              (DFT_MON_STMT) = OFF
       Table                                 (DFT_MON_TABLE) = ON
       Timestamp                         (DFT_MON_TIMESTAMP) = ON
       Unit of work                            (DFT_MON_UOW) = OFF
        

    187)snapshot监控命令比较简单,分析结果才难,监控的结果是由一些监控元素组成:
    计数器(counter)用来存储累计值,比如自启动以来发生的总排序次数(total sorts)死锁个数(dead locks)读的行数(rows read)
    计量/瞬时值(gauge):记录某个监控元素的当前值。比如当前发生的次数(active sorts),当前锁的个数(locks).
    高水位(high water mark),记录一个监控元素在打开监控器开关最大的值或最小值。
    通常需要进行多次的抓取来分析一段时间内的数据库活动,可以用脚本

    188)为了更直观的查看snapshot的分析结果,v9之后可以用snapshot管理视图查看,这些视图与snapshot命令行是对应的
    [db2inst1@oc6162546036 ~]$ db2 list tables for schema sysibmadm|grep -i 'snap*'可查看
    注意:snapshot管理视图需要将实例监控开关打开,否则无法抓取所有快照,在会话级设置无效。db2 reset monitor all 命令只对snapshot命令生效,对管理视图不起作用

    189)db2pd不需要db2内部锁(latches)和引擎资源返回监控数据,因此速度更快,性能更好。db2pd直接调用shmat链接到数据库与实例的共享内存,不许要建立到数据库的链接,db2pd基本不会对系统造成明显的影响

    190)db2pd工具包括大量公开与未公开的参数,如果需要更多信息,可以使用db2pd-everything得到大部分公开的信息

    191)db2pd在分区数据库可以使用dbp参数来指定分区:db2pd -db -sample -dbp 3

    192)db2pd常用参数:

    db2pd -db sample -appl,该参数列出数据库中当前连接,这部分信息等同于db2 list applications show detail的输出
    db2pd -edus ,EDU列表,即引擎处理单元(engine dispathched unit) ,用来监控edu的cpu总消耗量,如果需要使用该命令检测特定时间内的cpu消耗,则需要做差,给定时间的开始和终止计算差量
    db2pd -edus interval=3,还可以使用interval参数来获取时间段内的cpu消耗量,user delta 和 sys delta 列是用户cpu和系统cpu对于该线程的消耗cpu时间差,这样就不需要手动计算
    db2pd -osinfo,操作系统信息
    db2pd -bufferpool,缓冲池信息,该参数要打开bufferpool监控器开关,
    db2pd -db sample -logs,日志信息
    db2pd -db sample -tablesapces,表空间信息
    db2pd -db sample -locks,锁信息
    db2pd -db sample -agents,代理信息
    db2pd -db sample -static |more ,查看系统中存在的静态语句包信息
    db2pd -db sample -dynamic,该信息包括数据库的包缓存中所有动态sql,
    db2pd -db sample -tcbstats,表状态信息

    193)db2top的原理就是在后台每个一段时间收集一次快照,然后通过计算其与最近一次快照之前的数据差别于经过的时间,计算出一些列统计数据胡
    db2top主要有两个作用:
    实例检测系统
    捕捉历史快照信息,
    其实db2top对性能尤其在分区数据库上会影响系能,因为没有指定的话,会对全局做快照,占用内存
    相对于db2pd, db2top是抓取快照信息,所以需要打开监控开关,db2pd 是从内存结构中抓取,不需要监控开关

    194)db2top -d sample


    ###############################################################################################################################################################################################
    ###############################################################################################################################################################################################

    195)dba实现数据库安全计划:身份认证(authentication);权限(authorizaiton);特权(privilege)

    196)db2 server 数据库服务器是数据库实际所在机器(在分区数据库系统上可能是多台机器)
        db2 client 数据库客户机是对服务器上的数据执行查询的机器,这些客户可以是本地的(驻留在与数据库服务器相同的物理机器上),也可以是远程的(驻留在单独的机器上)

    197)authentication决定了db2客户在什么地方进行身份认证

    198)v9可以根据不同需求来设定认证机制,比如是执行实例连接和实例级操作,还是只是连接数据库都有不同的参数指定
    [db2inst1@oc6162546036 ~]$ db2 get dbm cfg |grep -i 'authentication'
     Server Connection Authentication          (SRVCON_AUTH) = KERBEROS  《《《廉洁数据库的认证
     Database manager authentication        (AUTHENTICATION) = SERVER   《《《连接实例的认证
    这两个参数说明:用户在连接实例会用SERVER,但是在连接数据库时会用kerberos身份认证,如果在服务器上没有正确初始化kerberos,但是提供了有效的userid和passwd,那么允许这个用户连接实例,但是不允许连接数据库。

    199)服务器上每个实例仅允许一种类型的身份,也就是说,设置适用于该实例下所有的数据库
        客户机上编目的各种数据库拥有自己的身份认证类型,用catalog database 命令中的authentication参数指定:db2 catalog db test as test2 at node db2inst1 authentication server 

    200)authentication是 sever的时候,在本地连接的话不需要认证,如果是远程连接的话,需要将服务器上的db2user和db2passwd通过网络发送给服务端
        authentication是 client的时候,允许客户在客户机上进行身份认证,即能登入到客户机,便可以连接数据库,无需再次提供口令
        authentication是 client的时候,需要注意两个参数trust_allclnts , trust_clntauth ,这两个仅在authentication 为clinet的时候生效
        trust_allclnts 为yes(默认设置),即在客户段进行认证
        trust_allclnts 为no ,则信任的客户机不需要提供口令,而不信任的客户机则还是需要提供密码和userid以便在服务端进行身份认证
        trust_allclnts 为drdaonly ,则仅信任在iSeries和zSeries平台上运行的客户机,除此之外都要提供口令和id 
        trust_clntauth 为client,身份认证在客户机处执行,不需要用户id和口令
        trust_clntauth 为server,身份认证在服务器处完成,需要提供用户id和口令(这是为了以其他身份在客户机上登入去执行其他特权的操作)
    [db2inst1@oc6162546036 ~]$ db2 get dbm cfg |grep -i 'trust'
     Trust all clients                      (TRUST_ALLCLNTS) = YES
     Trusted client authentication          (TRUST_CLNTAUTH) = CLIENT

    201) 按照权限(authorization) 作用范围来区分,db2中共包括两类权限:实例权限和数据库权限。
         实例权限:sysadm,sysctrl,sysmaint,sysmon
    [db2inst1@oc6162546036 ~]$ db2 get dbm cfg |grep -i 'sys'
     
     SYSADM group name                        (SYSADM_GROUP) = DB2IADM1
     SYSCTRL group name                      (SYSCTRL_GROUP) = 
     SYSMAINT group name                    (SYSMAINT_GROUP) = 
     SYSMON group name                        (SYSMON_GROUP) = 

    9.7之后sysadm的权限中对数据库对象的访问以及数据库对象上的管理权限分离给了数据库管理员(dbadm)和安全管理员(secadm). dbadm也分成了dataacess和acessctrl
    sysctrl 不能访问数据库中的任何数据除非赋予特定的权限
    sysmaint 也不能访问数据库中的任何数据,以及不能删除创建数据库和表空间
         

    202) 数据库权限:secadm,dbadm,accessctrl,dataacess,sqladm,wlmadm,explain,load,connect,createtab
    9.7中,只有secadm才能grant/revoke dbadm权限 

    203)db2 create db sample 《《《  sample上面的dbadm将隐式的赋予发此命令的用户
         db2 grant dbm on database to user tom 《《《这是显示
         db2 grant dbadm with dataaccess without accessctrl on database to user tom 《《《注意这里一定要已经连上指定的数据库
         db2 grant dbadm on database to group db2grp1 《《《也可以给一个组,同样这个命令只有secadm用户发出


    204)只有secadm和accessctrl权限用户才能grant/revoke 用户/用户组的load权限,以及对象的control特权,

    205)特权大体上分两种:数据库特权(针对数据库中所有对象)和对象级特权(与特定对象相关联)
    表空间特权:use(允许用户在指定表空间中创建表)(除了syscatspace或任何系统临时表空间)
    模式特权:createin;alterin;dropin
    表和视图特权:control;alter;delete;index;insert;references;select;update;
    索引特权:control(允许用户删除索引)
    包特权:control;bind;execute
    例程:execute
    序列特权:usage;alter

    206)于实例级权限相似,可以使用命令语法grant/revoke :db2 grant insert on table test to user tom ;db2 grant select on table test to group db2grp1

    207)从 DB2 V9.1 开始,CREATE DATABASE 命令语法增加了 RESTRICTIVE 选项。如果该命令中包括了 RESTRICTIVE 选项,那么会导致 RESTRICT_ACCESS 数据库配置参数被设置为 YES,同时不自动授予 PUBLIC 任何特权。如果忽略了 RESTRICTIVE 选项,那么 RESTRICT_ACCESS 数据库配置参数被设置为 NO,前述所有特权都将自动授予 PUBLIC。
    [db2inst1@oc6162546036 Security]$ db2 get db cfg for sample |grep -i 'access'
     Restrict access                                         = NO

    208)with grant option并不适用所有grant语句 ,control特权也只能有secadm和accessctrl来授予,系统编目表也只能由这两个用户授予。并且在授予数据库级权限,索引权限,表权限或视图的control权限是,with grant option字句无效
    撤销dbadm权限,必须要有secadm权限

    209)显示grant connect sample的权限给 tomzhhao

    [db2inst1@oc6162546036 ~]$ db2 connect to sample user tomzhao 
    Enter current password for tomzhao: 
    SQL1060N  User "TOMZHAO " does not have the CONNECT privilege.  SQLSTATE=08004

    [db2inst1@oc6162546036 ~]$ db2 grant connect on database to user tomzhao
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 ~]$ db2 connect to sample user tomzhao 
    Enter current password for tomzhao: 

       Database Connection Information

     Database server        = DB2/LINUXX8664 10.1.1
     SQL authorization ID   = TOMZHAO
     Local database alias   = SAMPLE

    210)显示赋予select 特权在table db2inst.t3

    [db2inst1@oc6162546036 ~]$ db2 "select * from db2inst1.t3" 
    SQL0551N  "TOMZHAO" does not have the required authorization or privilege to 
    perform operation "SELECT" on object "DB2INST1.T3".  SQLSTATE=42501
    [db2inst1@oc6162546036 ~]$ db2 grant select on db2inst1.t3 to user tomzhao
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 ~]$ db2 "select * from db2inst1.t3"

    ID          NAME      
    ----------- ----------
             15 tom       
             16 tim       
             17 tim       
             17 tim       

      4 record(s) selected.


    210) 显示grant insert 在表t3上的特权 给tomzhao 组
    [db2inst1@oc6162546036 ~]$ db2 "insert into db2inst1.t3 values(18,'sam')"
    DB21034E  The command was processed as an SQL statement because it was not a 
    valid Command Line Processor command.  During SQL processing it returned:
    SQL0551N  "TOMZHAO" does not have the required authorization or privilege to 
    perform operation "INSERT" on object "DB2INST1.T3".  SQLSTATE=42501
    [db2inst1@oc6162546036 ~]$ db2 grant insert on table db2inst1.t3 to group tomzhao
    DB20000I  The SQL command completed successfully.
    [db2inst1@oc6162546036 ~]$ db2 "insert into db2inst1.t3 values(18,'sam')"
    DB20000I  The SQL command completed successfully.


    211)显示grant dropin 在模式db2inst1的特权 给用户tomzhao 
    [db2inst1@oc6162546036 ~]$ db2 drop table db2inst1.t3
    DB21034E  The command was processed as an SQL statement because it was not a 
    valid Command Line Processor command.  During SQL processing it returned:
    SQL0551N  "TOMZHAO" does not have the required authorization or privilege to 
    perform operation "DROP TABLE" on object "DB2INST1.T3".  SQLSTATE=4250
    [db2inst1@oc6162546036 ~]$ db2 grant dropin on schema db2inst1 to all
    DB20000I  The SQL command completed successfully.

    212)隐式的赋予权限:
    创建数据库的时候,将dbadm,secadm权限以及bindadd.connect.createtab.create_external_rounte等授权于创建者
    赋予dbadm权限的时候,将bindadd.connect.createtab.implict_schema.load.quiesce_connect等授权于被赋予dbadm权限者
    显示创建模式的时候,将createin,alterin,dropin授予创建模式者
    隐式创建模式的时候,将createin授予public
    创建对象(表,索引,包),将control授予对象创建者
    创建视图,将拥有视图定义基础表视图别名control权限赋予control权限 

    213)认证>>权限(实例,数据库)>>特权(对象)

    214)db2将关于特权的信息存储在7个系统编目视图里:
    syscat.dbauth
    syscat.colauth
    syscat.indexauth
    syscat.packageauth
    syscat.schemaauth
    syscat.tabauth
    syscat.tbspaceatuh

    ###############################################################################################################################################################################################
    ###############################################################################################################################################################################################

    1)如果系统生成的索引,删除主键就可以删除索引,alter table drop primary key

    2)打补丁之前要做的准备工作
           :备份数据库配置信息和实例信息:db2support . -d sample -cl 0 (-cl 0收集数据库系统目录,数据库和实例配置参数,db2 注册参数变量,这些都会打包到db2support.zip)
             备份packages :db2 list packages for all show detail > packages.txt
             备份数据库的ddl语句 :db2look -d sample -e -l -x -o sample.ddl
             备份数据库本身数据:db2 backup db sample 
      补丁之后的工作
             使用补丁的新特性升级数据库:db2updv10 -d sample
             对工具进行绑定,path是绑定文件目录:比如:/home/db2inst1/sqllib/bnd (db2 bind path..)
             重新绑定packages:dbrbind dbname -l logfile all


    3)查看数据库是否可以升级
    [db2inst1@oc6162546036 instance]$ ./db2ckupgrade sample -l /tmp/db2chkupgrade.log -u db2inst1 -p guoguo0308
    DBT5508I  The db2ckupgrade utility completed successfully. The database or databases can be upgraded.

    4)db2在读写数据的时候,是跨容器按顺序写的,以保证读写效率,数据均匀分布

    5)容器可以是目录,文件 和裸设备,其中文件就好比是DMS的容器file '/' ,其中目录路径就好比SMS的容器 ‘/’ 

    6)db2 create database dbname automatice storage yes on /dbauto dbpath on /database,其中数据库表空间数据的路径是可以指定的(比如其中的自动表空间路径/dbauto),数据库路径也是可以指定的.
    只有指定了automatic storage yes 才能指定自动存储管理表空间路径/dbauto

    7)监控表空间的方法:
      db2 list tablespaces show detail / db2 list tablespace containers for tablespacesID show detail
      db2 get snapshot for tablespaces on sample 
      db2pd -d sample -tablepsaces
      sysibmadm.snaptbsp / sysibmadm.snapcontainer管理视图

    8)如何删除归档日志中,不活动的归档日志(logarchmeth1 using disk):
    第一步,list history backup all for db,找到最早的备份 ,
    第二部,在备份中找到first log
    第三部,删除fist log之前的归档日志 

    如果logarchmeth1 的值是logretain,这个就要注意因为活动日志也在日志文件中,会误删

    9)如果用户不想记录日志可以使用这个选项:alter table tbname activate not logged initially 

    10)SUBSTR 第一个参数是 字符串, 第二个参数 开始位置,  第三个参数  长度
    如果第3个参数没有,默认到底

  • 相关阅读:
    案例分析
    阅读任务
    准备工作
    课程总结
    十三周总结
    第十二周总结
    第十一周学习总结
    第十周学习总结
    第九周课程总结&实验报告7
    第八周课程学习总结与实验6
  • 原文地址:https://www.cnblogs.com/xiaojianblogs/p/6769171.html
Copyright © 2011-2022 走看看