• 热线电话
  • 17798885678
  • 18021659625
新闻资讯
联系我们

 

南通米锐软件工作室

业务手机:18021659625

企业邮箱:mirocn@163.com

地址:南通市如皋市中山东路210号东景国际

浅谈DB2数据库开发管理

日期:2016/8/17 9:28:25

  随着银行科技信息化管理的需求不断增大,银行科技部门需要投入大量精力在信息系统管理和自主研发项目中,而信息系统的基础是数据,因此,数据库的合理、高效、规范管理在科技部日常工作中变得尤为重要。我行目前重要数据库均使用DB2数据库,而我接触DB2数据库也有大概三年的时间,下面我就结合平时工作,简单的谈谈如何更合理、高效、规范的管理DB2数据库。

一、如何建表

对于新建的每个表,都需要把public用户的权限去除。因此创建每个新表的sql语句后,需要添加如下语句:revoke all on tablename from "public"。

同一数据库中的表应该由同一个用户来创建,减少用户复杂性。

数据库中的表应该建在所分配的tablespace,禁止建到未经允许的他人的tablespace上。

二、大数据量清理和装载

1、数据清理

要删除大表中的大部分数据,则不能直接delete,因为会产生长事务及锁资源溢出的问题。可以根据表的使用情况区分处理:1) 对于可以停断的应用系统,可以新建不带日志的表,把需要保留的数据插入新表,然后通过表换名的方法实现。2) 对于不能停断的应用系统,则要分批提交以降低事物长度,比如每删除10万行就提交,以免造成长事物而回滚。

如果全部删除表中的所有数据,使用truncate,不要使用delete。

2、数据装载

关于import

import默认是allow no access,即在表上会有独占锁,会导致其他人不能访问。如需同时访问此表,设置为allow write access。

如下列会锁表:

db2 “import from test.del of del insert into test”

建议改为下列方式:

db2 “import from test.del of del insert into test allow write access”

关于Load

默认load也是allow no access,即在表上会有独占锁,会导致其他人不能访问。如需同时访问此表load之前的数据,设置为allow read access。

Load默认使用copy no,会导致所属表空间状态为backup pending,即同一表空间上的所有表都只能查询,不能写。切记load时一定要加nonrecoverable参数或者copy yes参数,建议使用nonrecoverable!测试环境数据库不开归档日志模式,Load不会导致backup pending;但是生产环境是开归档的,不带copy yes或者norecoverable,会造成backup pending。

Nonrecoverable这种方式不记数据库日志,导入速度快。完成后要对数据库做全备,否则数据恢复时此表不能恢复出来(因为不记归档日志),或者需要通过重建受影响的表。语法如下:db2 "load from xxx.del of del insert into shcema.tablename nonrecoverable"。

对于使用了HADR数据库同步技术的系统(目前只有信用卡核心系统,后续还会有互联网核心和Emao),要使用copy yes,否则会造成HADR损坏。Copy yes会在load结束后对表空间做一次全备,备份出来的文件不要删除,可以用于HADR追加或者增量恢复。并且load之前把HADR关闭,load完成之后,把load期间产生的备份数据复制到HADR同样的目录,最后HADR,并且验证。但是由于要对整个表空间进行备份,时间会较长。语法如下:db2 "load from xxx.del of del insert into shcema.tablename copy yes to /data"。

鉴于Load所带来的这么多问题,安全起见,建议不要再使用load,可以改用import之类的。即使要用,一定要提前告知数据库管理员,以确定对数据库的影响。

在进行过数据装载后一定要对表进行统计更新,以保持系统表信息和实际表信息的同步。

3、临时表

创建临时表之后,及时提交,以免对系统表长时间锁定。

4、数据库连接

应用应尽量实现重连机制,以免数据库重启或者切换后必须重启应用。

对数据库的连接数应该设置合理,以免过多占用数据库服务器内存资源。

三、如何提高性能

1、统计更新

重要系统应用自行收集统计信息,没有统计信息,即使有索引可能也不会使用。

特殊表的注意事项:如果数据库中存在某些特殊的表,如早上有大量数据,晚上就清空的表,对于这种周期性伸缩的表,应该在表满的时候做收集统计信息。

运行runstats之后,要发出commit以释放锁,并且需要重新bind 静态语句和存储过程,以使用新的统计信息。绑定时,逐个绑定。

可以通过下列查询确认表是否被统计过

db2 “select name,stats_time from syscat.systables where name=’***’”

 

或者通过下列查询是否存在未统计的表:

db2 “select name,stats_time from syscat.systables where stats_time is null”

Runstats默认为allow write access,不会锁表。

 

2、索引的使用

对于经常访问的表中字段,并且其唯一性较强(即取值比较分散),建议对其建立索引。

少建唯一性差的索引,索引太多会影响优化器选择。

多用join连接,少用子查询。使用join时join字段上尽量有索引。

使用matches,like匹配时要从字段的第一位开始匹配,否则不会用到索引。

在查询条件中如果对字段使用函数,如trim等,不会使用索引。

对于多字段的联合索引,只有当SQL语句中where过滤条件用到相应的字段,出现在联合索引的最前面几个字段,才会使用索引。如建立联合字段索引(a,b,c,d),where字段b=1 and a=1之类会使用;而where字段b=1 and c=1之类就不会使用,因为没有包含a字段。

新建索引之后,要对表收集统计信息。

  db2 “runstats on table *** and detailed indexes all”

并对静态语句进行绑定,静态语句索引才会被使用,动态语句不需要重新绑定。