想起来一个问题,先记下来。
1. 同样的查询语句,从Java程序里面需要1分多钟,在CLP里面执行只用了不到一秒钟,这是怎么回事?
这个问题我遇到过两次,一次是因为从Java过来的语句使用了参数标记,导致执行计划和CLP里面直接赋值的语句的执行计划不同;一次是因为使用V8的驱动连接V10的数据库,数据到了服务器端,服务器编译的时候需要隐式的对一个连接字段进行类型转换。
但是这两次都是通过比较Java过来的语句的执行计划和CLP里面语句的执行计划发现的问题。CLP里面的执行计划很容易输出:
db2expln -d <dbname> -t -g -q "<SQL Statement>"
但是从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 '%<something from your SQL in Java'"
2). 下面这个不知道是干啥的:
db2 "call explain_from_section(<executable_id>,'M',NULL,0,'<schema>',?,?,?,?,?)"
3). 格式化执行计划:
db2exfmt -d <dbname> -g TIC -w -1 -n % -s % -# 0 -o explain.out
explain.out保存在从Java过来的语句的执行计划。
2. DB2 HADR搭建
我以前曾经写过一个过程:http://blog.csdn.net/baoshengfei/article/details/4823976
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 <dbname>,然后在主机上执行load copy yes,load结束之后,把生成的load image拷贝到悲伤同样的路径下,然后启动备机:db2 activate db <dbname>。这样,日志追平以后,备机上也会有数据了。
2)禁止HADR环境里面的load操作,也就是把db cfg里面的blocknonlogged打开。这样,所有不记日志的操作执行的时候都会报错。
4. HADR环境里面出现了问题以后,都怎么样诊断?
HADR这个组件时在db2diag.log里面消息记录最全的组件之一。当发生异常情况时,例如,网络断开等,首先去看一下db2diag.log的Error日志,看看发生了什么什么事情。
然后使用db2pd -db <dbname> -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 <dbname>进行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 <dbname> 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尽快去做。
最后,给大家推荐一下zhuge yuke的wiki:https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/DB2HADR/page/HADR%20simulator
DB2 HADR的限制:http://www.ibm.com/support/knowledgecenter/api/content/SSEPGG_9.7.0/com.ibm.db2.luw.admin.ha.doc/doc/c0011760.html?locale=en
DB2 HADR ROS的限制:http://www.ibm.com/support/knowledgecenter/?lang=en#!/SSEPGG_9.7.0/com.ibm.db2.luw.admin.ha.doc/doc/c0054258.html
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
关于TWT使用指南社区专家合作厂商入驻社区企业招聘投诉建议版权与免责声明联系我们 © 2024talkwithtrend — talk with trend,talk with technologist京ICP备09031017号-30
添加新评论1 条评论
2016-03-28 17:51