维护管理相关
1.表空间监控
db2 list tablespaces
db2 list tablespaces containers for <tablespace_id>
db2pd -d <db_name> -tablespaces
db2 get snapshot for tablespaces on <db_name> sysibmadm.snaptbsp和sysibmadm.snapcontainer管理视图
2.表空间类型:
SMS,DMS,自动存储管理,SMS不支持表空间容器的更改,只能更改表空间容器所在文件系统的大小 DMS提供了下面几种更改表空间的方法
ADD新增容器
DROP删除容器
Extend 用来扩展已有容器大小
Reduce 用来减小已有容器大小
Resize 重新设定容器大小
db2 "alter tablespace tbs_data extend (FILE '/data1/tbs_data/cont0' 15M,FILE '/data1/tbs_data/cont1' 15M)" --新增30M
db2 "alter tablespace tbs_data Reduce (FILE '/data1/tbs_data/cont0' 15M,FILE '/data1/tbs_data/cont1' 15M)" --减小30M
db2 "alter tablespace tbs_data Resize (FILE '/data1/tbs_data/cont0' 15M,FILE '/data1/tbs_data/cont1' 15M)" --变为30M
db2 "alter tablespace tbs_data drop (FILE '/data1/tbs_data/cont0')" --删除容器(不能删除最后一个容器!)
db2 "alter tablespace tbs_data add (FILE '/data1/tbs_data/cont0' 15M)" --新增容器
3.表空间状态:db2tbst 0X0040
DML操作性能问题
1.DML操作性能问题(INSERT,SELECT,UPDATE,DELETE)
SELECT:
- 在查询的连接或条件子句中的相关字段是否加了索引
- 看缓冲池的大小,缓冲池太小会造成很多数据不能读到缓冲池而直接从硬盘上读取,造成很大的瓶颈另一方面关于缓冲池预取的设置,一般能将预取大小(
PREFETCHSIZE
)设定为区段大小与容器个数的积,这样可以最大利用到预取的并行性 - 在查询中涉及到
order by
字句时,如果排序的字段没有设置索引那么排序将会用到内存中的排序堆(sortheap
)如果排序堆过小会造成排序溢出到硬盘上(Overflowed
)造成性能衰退 - 同时还要考虑到
RUNSTATS/REORG
因素 - 从存储方面应当注意的是选取裸设备的
DMS
要比SMS
性能要好,因为它少了一层文件系统的缓冲而直接访问缓冲池
2.增删改的性能优化方法:
- 首先是索引因素,在做增删改时数据库会对表中的索引做相应的修改。这会消耗一定的资源,所以在保证数据完整性的前提下可以先将索引删除,待到增删改结束后再重建这些索引。这也会节省一些时间。将索引和数据放在不同的硬盘上也可以增加写操作的并行性
- 其次要考虑日志因素,在数据写操作的同时,数据库系统也在维护着事务日志,所以应尽量减少日志维护的代价
Log file size (4KB) (LOGFILSIZ) =156072
##定义了每个日志文件的大小增大LOGBUFSZ,LOGFILSZ
可以减少刷新日志的次数以及日志文件切换的次数或者将表的属性改为”ACTIVATE NOT LOGGED INITIALLY
”,这样可以屏蔽表的日志操作,以提高写操作的性能,但是失去事务日志的表的数据很难修复,这一点需要权衡
查看表大小
1.查表大小:syscat.tables大小就是用NPAGES*PAGESIZE就可以了
- CARD-指出表中数据行的数量
- NPAGES-指出包含数据的页面总量
Number of pagescontaining rows
- FPAGES—指出分配给这个表的页面总量
Number of pagesbeing used by a table
- OVERFLOW-指出溢出行的数量
给一个范例:
SELECT A.TABSCHEMA, A.TABNAME,A.TBSPACE, B.PAGESIZE, A.NPAGES, DECIMAL(B.PAGESIZE*A.NPAGES/1024/1024, 20,5)TABLESIZE
FROMSYSCAT.TABLES A
LEFT JOINSYSCAT.TABLESPACES B
ONA.TBSPACEID=B.TBSPACEID
WHERE TABNAMELIKE '%TABLE%' AND TYPE='T' ORDER BY A.TBSPACE
这句可以计算名称包含“TABLE
”的每张表所使用的空间,NPAGES
是表使用的表空间页数,
乘以对应表空间的PAGESIZE
就可以算出一张表的大小,至于想要针对某个模式名或者其他变化就自己调整一下语句,或者增加一些GROUPBY
db2 "select NPAGES,FPAGES from syscat.tables where tabname='ZB_ZMCCCALL57520120715'
d2b "SELECT TABNAME,SUM(DATA_OBJECT_P_SIZE)/1024FROM TABLE (SYSPROC.ADMIN_GET_TAB_INFO('DW',TABNAME')) AS T
GROUP BY TABNAME";
那用SYSIBMADM.ADMINTABINFO
管理视图,速度慢
db2pd -db dbname -tcbstats
其中datasize
字段用来表示表的页数,乘以页大小即为表的大小
elect funcname from syscat.functions where funcschema='SYSPROC' and funcname like 'SNAPSHOT_%' with ur;
Reorg/runstats
1.reorg+runstats
db2 reorg table EMPLOYEE
db2 runstats on table db2inst2.employee with distribution and detailed indexes all
db2 reorg table department
db2 runstats on table db2inst2.department with distribution and detailed indexes all
A classic table reorganization (offline reorganization)rebuilds the indexes during the last phase of the reorganization. When more than one temporary table spaceexists, it is possible that a temporary table space in addition to the one specified on the REORG TABLEcommand may be utilized for additional sorts that can accompanying table reorg processing. However,the inplace table reorganization (onlinereorganization) does not rebuild the indexes. It is recommended that youissue a REORG INDEXES command after the completion of an inplacetable reorganization. An inplace table reorganization isasynchronous, therefore care must be taken to ensure that the inplacetable reorganization is complete before issuing the REORG INDEXES command. Issuing the REORG INDEXES command before the inplace table reorganization is complete, might cause the reorganization to fail (SQLCODE -2219).
注意:
在indexrebuild阶段force reorg,之后随便一个进程执行SELECT语句就会带是INDEXREBUILD,而且这个进程还会对那张表加上一个Z锁,所谓的超级排他锁,其他进程如果也想SELECT查询就会进入LOCK-WAIT状态。之前就是不知道Z锁是怎么产生的,结果闹了不少麻烦事。
reorg:阶段
SORT、BUILD、REPLACE、IDXRECREAT(有z锁)
well, replace phase is
copy extentsfrom temp space to user tablespace if it's reorg using temp
repointing theobject table to the new reorganized copy if it's not reorg using temp...
监视reorg执行过程
select
substr(tabname, 1, 15) as tab_name,substr(tabschema, 1, 15) as tab_schema, reorg_phase,
substr(reorg_type, 1, 40) as reorg_type, reorg_status, reorg_completion,
dbpartitionnum from sysibmadm.snaptab_reorg
order by dbpartitionnum
数据库监控KPI指标
1.缓冲池命中率
db2 "select substr(BP_NAME,1,16) BP_NAME,TOTAL_HIT_RATIO_PERCENT from sysibmadm.bp_hitratio"
命中率不高解决办法
1.增大缓冲池,最好能够达到数据量的10%
2.针对不同的应用使用不同的缓冲池
2.有效索引读
db2inst1@db2server:~> db2 "select rows_read,rows_selected,rows_read/(rows_selected+1) as IREF from sysibmadm.SNAPDB"
ROWS_READ ROWS_SELECTED IREF
-------------------- -------------------- --------------------
13596 2978 4
1 record(s)selected.
OLTP<5
解决办法:
1.根据语句为表设计合理索引
2.反复校准确认能够使用匹配索引扫描
3.平均结果集
平均每条查询语句所返回的结果集行数
db2inst1@db2server:~> db2"select rows_read,select_sql_stmts,rows_read/(select_sql_stmts+1) as avg_result_set from sysibmadm.SNAPDB"
ROWS_READ SELECT_SQL_STMTS AVG_RESULT_SET
-------------------- -------------------- --------------------
13618 1005 13
1record(s) selected
4.排序溢出
db2inst1@db2server:~> db2"select sort_overflows,total_sorts,sort_overflows/(total_sorts+1) as avg_sort_overflow from sysibmadm.SNAPDB"
SORT_OVERFLOWS TOTAL_SORTS AVG_SORT_OVERFLOW
-------------------- -------------------- --------------------
0 24 0
1record(s) selected.
解决办法:
- 尽量为orderby/group by的谓词创建索引
- 尽量避免为排序字段使用索引
- sortheap尽量能够大于所排序的行数
5.同步读取比例-read
通过索引直接访问数据叫同步IO,对OLTP异步读越少越好,否则对CPU利用率较高。对OLAP来说预取多一点比较好。
解决办法:
部署合适的索引,减少异步读取时候的预取
db2inst1@db2server:~> db2"select100-(((POOL_ASYNC_DATA_READS+POOL_ASYNC_INDEX_READS)*100)/(POOL_DATA_P_READS+POOL_INDEX_P_READS+1))as SRP from sysibmadm.snapdb"
SRP
--------------------
97
1record(s) selected.
6.数据索引页清除-write
页面清除程序将数据写入磁盘的效率
db2inst1@db2server:~> db2"select(POOL_ASYNC_DATA_WRITES+POOL_ASYNC_INDEX_WRITES+POOL_ASYNC_XDA_WRITES)/(POOL_DATA_WRITES+POOL_INDEX_WRITES+POOL_XDA_WRITES+POOL_ASYNC_DATA_WRITES+POOL_ASYNC_INDEX_WRITES+POOL_ASYNC_XDA_WRITES+1)as async_write_ratio from sysibmadm.snapdb"
ASYNC_WRITE_RATIO
--------------------
0
1record(s) selected.
7.包缓存命中率
理想值是100%
db2inst1@db2server:~> db2 "selectPKG_CACHE_INSERTS,PKG_CACHE_LOOKUPS,(1-PKG_CACHE_INSERTS/PKG_CACHE_LOOKUPS)*100pkg_hitratio from sysibmadm.snapdb"
PKG_CACHE_INSERTS PKG_CACHE_LOOKUPS PKG_HITRATIO
-------------------- -------------------- --------------------
78 1702 100
1record(s) selected.
8.编目缓冲区命插入比率
理想值是0
db2inst1@db2server:~> db2 "selectCAT_CACHE_INSERTS,CAT_CACHE_LOOKUPS,CAT_CACHE_INSERTS/CAT_CACHE_LOOKUPS as cat_insert_ratio from sysibmadm.snapdb"
CAT_CACHE_INSERTS CAT_CACHE_LOOKUPS CAT_INSERT_RATIO
-------------------- -------------------- --------------------
40 4105 0
1 record(s)selected.
9.脏页偷取
当缓冲池不够容纳新页面时,就选择一个脏页将其写入磁盘。脏页偷取属于同步写入,对数据库是个负担,应当减少。
db2inst1@db2server:~> db2"select POOL_DRTY_PG_STEAL_CLNS from sysibmadm.snapdb"
POOL_DRTY_PG_STEAL_CLNS
-----------------------
0
1 record(s) selected
OLTP的值应该小于10.
解决办法:
通过调整NUM_IOCLEANERS,softmax,chngpgs_thres的值,让改值处于一个合理范围
10.缓冲池读取IO响应时间
```sql
db2inst1@db2server:~> db2"select substr(TBSP_NAME,1,16)TBSP_NAME,POOL_READ_TIME/(POOL_DATA_PREADS+POOL_TEMP_DATA_PREADS+POOL_INDEX_P_READS+POOL_TEMP_INDEX_P_READS+1) tsormsfrom sysibmadm.snaptbsp"
TBSP_NAME TSORMS
---------------- --------------------
SYSCATSPACE 2
TEMPSPACE1 0
USERSPACE1 0
IBMDB2SAMPLEREL 1
IBMDB2SAMPLEXML 0
5 record(s)selected.
```
DB2组件
DB2的底层组件主要有OSS组件、BSU组件、CCI组件、RDS组件、DMS组件、IXM组件、BPS组件、DPS组件等
Fourth Position Letters | Type of Activity indicated |
---|---|
b | Bufferpool management and |
c | Communications between clinets and |
d | Data management |
e | Database engine processes |
o | Operating system calls |
p | Data protection |
r | Realational database services |
s | Sorting operations |
x | Indexing operations |
1.组件:OSS
- 负责DB2和OS之间的工作交互
- 内存管理:启动实例、数据库和应用程序时,DB2需要向操作系统去申请共享内存
- I/O管理:当DB2进行文件的I/O读取访问时,OSS组件负责磁盘访问
- DB2相应进程和线程的创建于管理
- 安全认证【db2ckpwd】:使用db2ckpwd进程到操作系统文件/etc/passwd和/etc/security/passwd中验证用户名和密码 错误日志输出
2014-03-11-23.32.44.321745-240 E5279E576 LEVEL: Warning
PID : 35581 TID : 140680089298688PROC : db2sysc 0
INSTANCE: db2inst1 NODE : 000
EDUID : 1 EDUNAME: db2sysc 0
FUNCTION: DB2 UDB, oper system services, sqloSystemControllerMain, probe:100
DATA #1 : String, 242 bytes
Address Space Layout Randomization (ASLR) is enabled in this environment.
ASLR may cause intermittent failures in shmat() for any processes other than
db2sysc, and is recommended to be disabled. To disable it, set
kernel.randomize_va_space=0
2.组件:BSU
- Base Services Utilities,BSU[SQLE]
- 为实例和数据库分配内存,拦截和处理信号,并处理发送到DB2的异常 。就是DB2的底层引擎—发动机
- 在DB2启动的时候启动所有相关的进程、线程和其它相关的EDU,并分配实例和数据库所需的内存
3.组件:DPS
- Data Pretection Services,DPS[SQLP]
- 交易管理、处理数据库日志和数据库并发服务
- 负责将日志缓冲区的记录写到日志文件中
4.其他组件
组件名 | 作用 |
---|---|
Commen Client, CCI[SQLC] | 处理通信协议;当客户端通过相应的编程接口API连接数据库时要通过该组件。这个组件在DB2后台主要是通过DRDA来实现的,所以通常是先通过DB2RA通信接口来实现通信。 |
Relation Data Services,RDS [SQLR] | 用来优化和处理SQL语句 |
构造查询访问计划APM | |
Data Management Services,DMS [SQLD] | 用来处理数据并返回数据;按照RDS获得查询访问计划 |
Index Management Component,IXM[SQLI] | 对DB2中的所有索引进行管理 |
Bufferpool Services,BPS[SQLB] | 负责从磁盘中将数据页和索引页读取到内存缓冲区中 |
HANG住时分析
解决方法图:
BufferPool定义的太大, 无法连接数据库
如果是BufferPool定义的太大, 无法分配造成的数据库不能连接, 可以尝试用下面的步骤来解决:
用DB2实例Owner的用户登录到系统,
-
执行下面的命令来设置环境变量
DB2_OVERRIDE_BPF
db2setDB2_OVERRIDE_BPF=number-of-pages
其中
number-of-pages
为页数, 应该是一个较小的, 操作系统可以分配的值, 如5000; 下一次DB2数据库连接以激活数据库时, DB2系统会尝试按照此参数指定的大小来分配BUFFERPOOL
; -
执行
db2 terminate
,运行命令
db2connect to db
来建立数据库连接; 由于我们已经设置了DB2_OVERRIDE_BPF
环境变量, 此连接应该可以成功; -
连接建立后,不要做其他操作, 立刻修改
bufferpool
;db2 alter bufferpool bufferpool-name size number-of-pages
为了使得我们修改的新buffer pool的大小可以生效, 需要先运行命令
db2 connect reset
断开当前的连接;运行命令
db2set DB2_OVERRIDE_BPF=
以去掉该环境变量, 使得我们配置的新的buffer pool
的大小可以生效;重新连接数据库
删除有小写字母表的方法
删除有小写字母表的方法:
db2 => connect to sample
Database Connection Information
Databaseserver = DB2/LINUXX8664 10.1.3
SQL authorizationID = DB2INST2
Local databasealias = SAMPLE
db2 => drop table "EMP_TESTACZI4ko"
DB20000I The SQLcommand completed successfully.
或者用下面方法:
hadrinst@linux-nhmg:~> db2 drop table \" EMP_TESTACZI4ko \"
DB20000I The SQLcommand completed successfully.
bin用户禁用安装DB2失败
场景:开发反馈风险缓释项目申请了一台测试环境的虚拟机,原先只装了WAS,现因需求变化要另装DB2客户端。
但我们在安装过程中一直报这个错,能帮忙看下是什么原因吗?
查看日志提示如下:
ERROR: The output will be saved in /tmp/db2chgpath.log.16360 DBI1149E You have to be the ownerof the install copy to execute this program. ERROR: An error occurred whilesetting DB2 runtime path. Contact a technical service representative.
原因如下:
/etc/passwd 里bin用户被禁用,DB2安装失败
DB2 HADR介绍
- 技术成熟、可靠,满足同城及异地灾备需要
- 备库性能或故障对主库的影响尽可能最小
- 网络拥塞或不稳定情况下,对主库性能影响尽可能小
- 实施便捷、成本经济
HADR同步模式-4种
模式 | 主库何时发送日志页 | 主库何时落实应用事务 |
---|---|---|
同步 | 成功地将日志页写入主数据库日志磁盘后 | 日志已写入主数据库上的日志文件; 主数据库已接收到来自备用数据库的应答,确定日志也已写入备用数据库上的日志文件时。 |
准同步 | 以并行方式写日志页并发送它们 | 日志已写入主数据库上的日志文件; 主数据库已接收到来自备用系统的应答,确定日志也已写入备用系统上的内存时。 |
异步 | 日志的写操作和发送操作是并行进行的 | 主数据库已将日志记录传递给主系统主机的 TCP 层时; 主系统不会等待来自备用系统的应答。 |
超级异步(9.7新功能) | 日志的写操作和发送操作是并行进行的 | 日志记录已写入主数据库上的日志文件时; 主系统不会等待来自备用系统的应答。 |