java中跑批指的是什么_DB2几个问题的处理(三)

想起来一个问题,先记下来。

1. 同样的查询语句,从Java程序里面需要1分多钟,在CLP里面执行只用了不到一秒钟,这是怎么回事?

这个问题我遇到过两次,一次是因为从Java过来的语句使用了参数标记,导致执行计划和CLP里面直接赋值的语句的执行计划不同;一次是因为使用V8的驱动连接V10的数据库,数据到了服务器端,服务器编译的时候需要隐式的对一个连接字段进行类型转换。

但是这两次都是通过比较Java过来的语句的执行计划和CLP里面语句的执行计划发现的问题。CLP里面的执行计划很容易输出:

db2expln -d -t -g -q ""

但是从Java过来的语句的执行计划怎样得到呢?这个要从section里面得到。使用一下步骤:

1). 找到从Java过来的语句的executable_id:

db2 "select executable_id, stmt_text from table(mon_get_pkg_cache_stmt(null,null,null,-1)) where stmt_text like '%

2). 下面这个不知道是干啥的:

db2 "call explain_from_section(,'M',NULL,0,'',?,?,?,?,?)"

3). 格式化执行计划:

db2exfmt -d -g TIC -w -1 -n % -s % -# 0 -o explain.out

explain.out保存在从Java过来的语句的执行计划。

2. DB2 HADR搭建

3. DB2 HADR环境里面的load怎么做?

因为DB2 HADR是通过ship log进行数据同步的,那如果遇到load这种不太记日志的操作怎么办呢?之所以说load不太记日志,是因为load的数据不记录在日志里面,但是load操作的一些控制数据会记在日志里面。如果load操作在主机上执行了,但是备机有没有发现load image,这张表在备机上就会被标记为无效表。当服务从主机切换到备机,这张表就不能被访问了。

如果在HADR环境里面,这张表不能用了,怎么办呢?如果允许回切,那就切回去,如果不允许回切,打开备机上的ROS,把表里的数据导出来,再主机上导进去。

怎样解决HADR环境中的load问题呢?有两种思路:

1)使用load copy yes,这种load会产生一个load image,如果主机和备机可以共享存储(nfs/gpfs),可以把这个load image的路径放到共享路径里面。当备机从日志里面看到load开始的日志记录时,就会去找这个image,然后把数据导入到备机中。如果主机和备机没有条件使用共享的存储,那可以在load开始之前,先把hadr停下来,既在备机上执行:db2 deactivate db ,然后在主机上执行load copy yes,load结束之后,把生成的load image拷贝到悲伤同样的路径下,然后启动备机:db2 activate db 。这样,日志追平以后,备机上也会有数据了。

2)禁止HADR环境里面的load操作,也就是把db cfg里面的blocknonlogged打开。这样,所有不记日志的操作执行的时候都会报错。

4. HADR环境里面出现了问题以后,都怎么样诊断?

HADR这个组件时在db2diag.log里面消息记录最全的组件之一。当发生异常情况时,例如,网络断开等,首先去看一下db2diag.log的Error日志,看看发生了什么什么事情。

然后使用db2pd -db -hadr看一下状态。

5. HADR怎样切换?

首先解释一下,DB2 HADR的切换过程,对于graceful takeover:

1. 备机收到takeover这个命令以后,如果开了ROS,首先force application,然后发送一个消息给主机。然后等。

2. 主机收到这个消息,首先force application,然后发送剩下的日志给备机。

3. 主机改变自己的角色为备机,然后备机改变自己的角色为主机。

对于forced takeover:

1. 备机收到takeover命令,如果开了ROS,首先force application,然后发送一个消息给备机。然后等一会(忘记具体的时间了,好像是4秒钟),尽量收以下日志。然后改变角色。

2. 原主机收到消息以后,把自己的日志系统标记为不可用。如果只有读操作,主机上还可以做查询,但是如果还有写操作,主机就crash它自己。

如果切换的时候,主备机处于peer状态,应该使用db2 takeover hadr on db 进行graceful切换。但是想切的快,或者是切换的时候hang住了,就使用by force的强制切换。这里,说明一下,如果主备机载peer状态进行了by force的切换,当原备机接管服务以后,不要使用deactivate db的方式停止原主机,一定要用db2_kill的方式停止,好让主机做reintegration的时候,从尽量早的LSN去redo,从尽量早的地方做remote catchup。

另外一个注意的地方,HADR主备机切换以后,一定要检查一下备机上表的状态,防止有些表处于不可访问的状态,影响以后的交易。

5. 什么是reintegration?

reintegration的发生指以下场景:主备机运行过程中,使用了forced takeover,原来的备机称为主机。要把原来的主机不使用backup/restore的方式,而是它作为备机的角色加入到原来的主机,重新成为一对hadr。加入的命令时在原来的主机上执行:db2 start hadr on db as standby。像前面说的,执行start hadr之前,如果机器没有crash,必须使用db2_kill去停止原主机实例。

6. DB2 HADR支持NAT吗?

是的,支持。正常情况下,hadr主备机建立关系之前,两台机器会互相校验对方的IP地址。但是,有一个环境变量:db2set -lr | grep -i hadr | grep -i nat。可以把这个变量设置为yes,这样,hadr就不会校验IP地址了。

7. 当主机跑批的时候,备机replay跟不上,影响批处理性能怎么办?

在DB2 V10以前,没什么办法,你可以使用superasync,或者临时断开HADR。

V10以后,可以使用log spooling来解决这个问题。log spooling会开辟一段日志区域临时保存下收到的缓存,redo尽快去做。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值