haoweishow Blog

ESB/Java

OSX 升级导致 Octopress 异常

现象

octopress创建文章,本地测试,上传等命令都无法使用.

解决

1
2
3
4
5
6
7
8
ruby -v   #ruby 版本异常
brew update
brew install rbenv ruby-build
rbenv install 2.2.3 #这个之后只是安装了2.2.3版本,但并未在环境变量中生效
在.bash_profile 中增加 export PATH=/Users/haoweishow/.rbenv/versions/2.2.3/bin:$PATH
gem install bundler
rbenv rehash
bundle install  #进入博客的目录执行该命令(需要 Gemfiles,在2.2.3中在重新安装一次 octopress 依赖的组件,2.0.0的 ruby 目录/Library/Ruby/Gems/2.0.0)

参考

Git常用命令

数据库维护

  • 查看数据库的使用统计git count-objects -v
  • 数据库垃圾回收git gc

    恢复分支

  • 查看最近访问的sha1数(版本号)git reflog
  • 重新创建删去的分支git branch experimental SHA1_OF_HASH

    基本命令

  • 添加文件到暂存区git add .
  • 提交并添加注释git commit -a -m "xx"
  • 修改文件名称git mv oldname newname
  • 删除文件git rm file
  • 删除文件夹git rm -r dir
  • 停止跟踪文件但不删除git rm --cached file

    合并

  • 把dev分支合并到当前分支git merge dev
  • git rebase branch

    分支

  • 创建并切换到新分支git checkout -b dev
  • 切换分支git checkout dev
  • 以某个版本创建分支git checkout -b dev commitid
  • 在主分支的基础上创建分支git checkout -b dev master
  • 创建分支git branch dev
  • 删除分支git branch -d dev
  • 强制删除git branch -D dev
  • 查看分支git branch
  • 修改分支名称git branch -m oldname newname

    标签

  • 抽取某个tag的版本git archive --format=zip --output=v1.0.zip v1.0
  • 列出所有本地taggit tag
  • 创建标签,基于已经提交的版本git tag tagname
  • 删除标签git tag -d tagname

工作总结

工作总结 2015-06-20 终于自由了,跟以往的休假不一样了.没有工作的问题,没有工作上的电话,就算有,心态也会不同. 工作6年,学到了很多东西.

西安神州数码

从09年毕业,入职神码西安平台,没有经历过实习.刚入职的时候,还感觉有些后悔,因为其它实习过的同学跟公司其它人都很熟,公司的流程,项目的工作,都能侃侃而谈.而我,干瞪眼. 新入职的好像分了两批,刚进公司之后,出来领取电脑,装系统一些杂事之后,一帮人被拉到会议室开会. 会议的内容也不见简单,简单的介绍公司,介绍各个项目(公司的项目很多),下来是自我介绍.从哪开始呢,按照座位顺序来吧.好吧,我是第一个,我的介绍很简单(听了后面同学的介绍,发现自己真的说的太简单了,有点懊悔.好歹这算是个表现自己的机会啊) 后来被分到了一个组,新人4个,跟着两位老大学.感谢李敏姐,Thinks very much!学习ESB,从ESB的发展,到ESB的作用,到ESB的架构,到ESB的环境.在那台用了1个月的台式机上搭建环境.再到我们四个人写PPT,介绍自己对ESB的理解.那一个月没有留下多少印象,只记得有一次,下午下班跟同事讨论技术,讨论到很晚,没有给女朋友电话短信,后来她发飙了. 在这一个月里,真的就是年轻,用不完的经历,每天早上6点多就起床,坐车1个多小时,早早来到公司,晚上回去偶尔很晚.用不完的精力,已经不记得那个时候在公司都干了些什么. 公司每个月15号发上个月的工资,领取到上个月1周的工资700+,哇.好开心,自己第一次正式的赚钱了(以前做过临时工不算).在回去的路上给女朋友买了好多零食. 在租的房子里,笔记本电脑丢了,大学毕业前,老爸给买的,没敢告诉他老人家.报警,感受到中国警察的工作内容和态度,无语.最后又把台式机搬出来用.

深圳平安银行

公司安排去深圳出差,女朋友亲自送我,同去的还有个女同事,她男朋友送.到机场跟李敏姐碰面,还被笑话. 第一次坐飞机,起飞的时候,怕,脚底都冒汗了,超重到无所谓,失重的感觉,让人毫无安全感.后来好多次的出差也就习惯了. 来到大深圳,天呐,好热.之前李敏姐说深圳的雨很夸张;当你发现下雨,从你把伞拿出来到撑开,雨已经很大了.后来,有一次是真真切切的体会到了. 下飞机,去酒店,换衣服,直接去客户现场(平安大厦).这一去,就是3年8个月,我成长的第一个阵地. 项目组好多人呀,客户和同事十几二十呢.

项目经理金义红,人称老金,工作上很严厉,平时都很好,有一次他带我去吃深圳的卤肉饭,一个很小的店. 跟经理在一起聊的很少,没有过多的谈过工作之外的事情,但是在我成长道路上给我压力的第一个人. 印象最深刻的是一次,系统出现生产问题,需要运营同事帮忙从备份库中找出历史某天某个服务的日志.历史日志都是压缩备份的,我跟经理通过VNC(平安都使用VNC,这个在多人协查问题的时候真的很方便)连接运营的电脑,告诉他找哪天哪个文件.一连串的操作命令之后,日志文件找出来交给我们之后他就闪人了.

插播一下,平安高效的执行率,离不开VNC和电话会议,超级方便和高效.浦发差远了.

剩下的是我在那检查日志,检查了一会发现日志不够,还得查.好在之前运营告诉我们日志服务器用查询用户可以上去登录,只要记得把解压的临时文件清理掉就可以了. 然后我连上那台机器,根据记忆中的路径找到了日志文件,但是解压命令忘了.日志是gz结尾,tar命令我是刚刚看过运营的同事使用了,再轮到自己解压,中间的参数忘了是zcvf还是zxvf.在犹豫的时候,经理提醒了我,顺带说了下这些命令我都不熟悉,以后怎么解决问题(言语中带了不满,或者生气,或者鼓励,他的态度已经不重要了,重要的是我不懂这些接本的命令,而且我已进入项目组有一段时间了).这件事,过去5年多了,我一直记得.后来我也指导新同事,发现他们linux命令不熟悉,我也提醒过,态度和语气,有缓和的说明,也有严肃的教育,但是没觉得多少人后来能下功夫学习.

系统架构师陈宏鸿:这位可是公司的传奇人物,连续升职,最年轻的架构师,最年轻的技术总监,他的成长都是他拼搏所得.出入职能跟到这样一位大人物,真的太荣幸了.不过不是所有人都能进入架构师培养的视野.我刚进去的时候,都是做最底层的开发,渐渐的技术能力提升,做的事情也比较多,人也灵活(自我评价:思维灵活有想法). 慢慢的工作难度上去了,任务也越来越艰巨.宏鸿给我最最深刻的印象是,那时候我在处理一个数据修改的功能,总是出现数据丢失或者数据异常的问题.(具体逻辑就不表了,没多大的事,但是对刚刚开搞的我来说,晚上想问题都想的睡不着,夜里做梦都是工作上的那个问题,困扰了我好久(能困扰好久的问题,而不将问题升级,这个也是我的问题))后来宏鸿,当着我的面,写了一个完整的数据库操作工具类.我惊呆了,我那个问题也解决了(我的问题是当操作出现异常的时候,程序没有正确的回滚,导致数据状态异常).原来程序的问题是可以解决的.

跟女朋友异地,总是各种相思,后来同住的老同事(老雷)提醒我说可以让女朋友过来一起住,可以问问项目经理.我找老金说了情况,他同意了.(感谢老金,感谢公司的各位领导,在神码的6年里,我一直有这样的福利待遇) 女朋友来深圳,工作生活结婚生子,再到后来我在上海出差,公司也是给我很好的福利,我可以带着老婆孩子,还有我妈,一起来上海.

在平安的三年里,经历了ESB可能有上百次的版本投产,碰到了各种各样的问题,修复和优化了系统无数的bug和功能.工作和生活在平安都显得无比安逸和稳定.

但是现在想想,那个时候的想法真的很幼稚.自己虽然有空余的时间学习其它技术,但是没有经历过实战应用的技术和思想,是无法经得起考验,并且印象也不会深刻. 在平安的工作太安逸了.

在离开平安要来到浦发项目组的时候,我的想法并不是很清晰,但是我心底里知道,我要来这里.因此,平安的项目经理鲁健伟,最后一次邀请我挽留的时候,我还是拒绝了.我记得那顿饭,鲁总和他老婆,我和我老婆,还有我们家宝宝,一起在八卦一路的老船长旁边的餐厅吃的饭.感谢鲁总对我的认可.

在平安待久了,有时候都觉得东家都忘了是谁,可是毕竟无法跟银行相比.但在神码这家公司,在平安做项目,成长虽然慢,但是我走出来了.我工作的3年里,我收获了很多,得到了客户和公司的认可. – 2015-06-20 12:00 写于上海虹桥机场(快要登机了.再见,大上海!)

在从深圳平安银行去上海浦发银行的过程中,还在深圳顺丰待了一个礼拜,学习新版本的ESB,顺丰用神码的ESB产品,不过是神码工程院的人在实施. 之后就来上海浦发了.

上海浦发银行

插播一条:从深圳到上海预订机票的时候,至考虑了价格(公司规定,折扣在7折以上的需要领导特批),买的机票居然是要在景德镇中转,刚好那天晚上上海暴雨,好多航班都未在上海落地.在景德镇待了一晚,第二天上午才到上海.

正式开启新的工作. 满心期待的可以一展身手,可以好好的写代码.结果按照项目实施,或者软件开发的流程,先是文档的编写,各种需求文档,概要设计,详细设计(虽然是公司现成的产品,但是文档多多少少有问题,要么缺少,要么不符合行内的规范),总之花了好多个人月来写文档.

这里必须提一下,在这个过程中,我写文档的能力又被鄙视了(不对,是我自己深深的意识到自己的这方面的能力是有多差劲).由于产品是工程院出品,客户有些特别的需求,跟我们提及之后,我们需要整理成需求文档,发给工程院的同事,让他们实现. 我写的需求文档(记得好像就3,4个需求吧),拿给宏鸿看,结果他无语的表情深深的刺激了我.我了解他,我的东西如果只是一般的差,他会当面批评教育,但是这时,肯定是我的东西差到无话可说的地步. 又发现了自己的薄弱.这个薄弱点是在之前的工作中不曾遇到多的,工作中也很少涉及文档,或者正式文档的编写.

既然有弱项,那么就改进喽.边改进,边反思.这方面的经验,简直是对自己几年ESB实施经历的否认,做了这么多年ESB的是实施,来到这里,感觉跟没做过一样.

坚持不懈,我挺过来了,挺过了那段自我怀疑的阶段.文档编写的能力在之后的两年里慢慢的一点点提升,虽然达不到很厉害的水平,但总归有所提升,有所收获.

2013年6月初来到上海浦发银行,到2013年12月份,系统上线.这半年时间里,几乎每天加班,项目组的同事和领导都很有干劲,工作是那么有激情.浦发项目成功上线,我作为项目架构师(在这里担任架构师的职责,宏鸿负责督战),也满心期望的能成为真正的架构师. 在公司的架构师评审中,我的表现很差,当初没有认真对待,没有认真准备自己的材料.通过电话会议的评审,没有通过各位委员的认可. 总结几点: 1. 评审问了我ESB产品的缺点?我当时脑袋空白,不知道该怎么回答,就说了ESB产品模块化程度不够…bilibili说了一些. 2. 我有没有从头到尾做过一个产品的架构?有还是没有?我脑子闪过我所做的事情,除了ESB产品的实施,而且做实施类项目,怎么可能有机会从头到尾进行产品的架构设计呢?而那些之前做过的小产品我也没觉得架构有多NB,因此我坚定的回答了没有. 过了好久之后,宏鸿总告诉我结果,当然是没有通过了.告诉我失败的原因,上面两点还有其它的一些. 当时还没怎么想,没怎么考虑,当天就糊里糊涂的过去了.

在后来的工作过程中,我的工作热情慢慢的降下来了,由原来的200%慢慢回归到正常的工作状态. 怀疑过公司,怀疑过我的努力,怀疑过自己的能力…. 期间看过淘宝的一篇文章,作者是在非常努力,各种表现都很好的情况下,毫无理由的被否定,后来领导告诉他说这是对他的考验,如果连这点压力都扛不住,那他真的不适合这个职位.

我也这么想过,我也试着平复自己的心情,平复自己内心的无奈. 时间是最好的药. 很庆幸自己那时候没有太冲动(当然很大一部分原因在于家庭,我拖家带口的,怎么可能说走就走呢). 自己之所以没有成为架构师,原因还是在自己. – 2015-06-20 13:00 写于上海虹桥机场(飞机登机时间延迟到13:00)

自己确实如他所说,没有从头开始进行一个产品架构的设计,那些小的系统,在我眼里真的不值一提. 后来公司组织的一次架构培训,他也提到过,要成为架构师,必须经历两个阶段,一个失败的架构设计,和一个成功的架构设计. 个人理解:经历过失败,你才明白,产品或者功能要怎么设计才能解决问题,避免踩坑.其实在现在这种类型的实施项目中,我也经历的可能更多的是产品细节实现上一些有问题的设计.

不过这些要作为成为架构师的资本来说,远远不够,真的就要像他说的一样,必须从头开始设计产品的架构,才有资格成为架构师.

因此我的思想,慢慢的从抱怨(做实施类的项目怎么可能有机会从头开始呢),到慢慢的接受,再到现在发现自己不成功的原因.

关于我不能成为架构师,我的理解: 公司角度:我做的过项目太少,经历的少,经验方面肯定会有局限性,经验这东西真的需要踩坑,需要实际接触到,才能变成自己的;而我自己因为家庭,同时公司也需要一些稳定的人来支撑项目的实施,因此我也不用到处跑,待在一个项目里好好干即可.

个人角度:我做过的东西确实少,写过的技术博客也很单薄,到目前为止也都是一些工作总结性质的,技术方面的深度还是不够.因此,就算公司给我个架构师,我也觉得自己不合格.

既然找到原因: 那么结论就显而易见了,我选择了离开神码,几点原因: 1. 出差,长期的出差,很少有归属感,也不好照顾父母; 2. 家庭,孩子的教育问题,在上海或者其它地方,肯定无法给孩子安稳的教育环境; 3. 环境,是指工作周围的同事,这里绝无贬义,但却是个不争的事实,我希望自己能够与优秀的人共事; 4. 工资,这个行业现状,跳槽永远比升职工资涨的快; 这个思想的转变也是慢慢形成的,包括对自己当前环境,工作状态的审视,更早的时候,都没有考虑过这些问题.当被严重打击之后,才意识到要好好考虑考虑,好好想想.

推荐一篇文章,二爷写的:人生苦短,度日如年. 这么短暂的人生,哪有时间浪费呢?因此,我要找更优秀的公司,更优秀的团队,更优秀的同事一起共事,提升自己的能力. 而且你周围人的平均水平就是你的水平,因此,如何选择就很容易了.

再提一句,我喜欢与聪明的人共事. 培养那些上进心不足的人,简直是浪费时间.(请见谅这句话如此的过分,但如果你觉这句话让你不舒服,那么你有可能就是那种人)

– 2015-06-20 写于虹桥机场MU2156(已经登机,等待起飞,晚点多久,不得而知)

西安华为

2015-07-17将会加入华为云计算部门,后面的境况如何,现在无法预测. 工作6年,明白的道理: 如果当前的环境无法再让你有所提升,那么你就必须考虑换一个,人生苦短,考虑好就不要再犹豫!

端口占用查询

(根据端口号,查找对应的进程)

Win系统

  • 查找pid: C:\>netstat -aon|findstr "1088"
  • 查找进程名称: C:\>tasklist|findstr "<pid>"

Linux系统

  • 方法1: lsof -i :8388
  • 方法2: netstat -ntlp
1
2
3
4
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      868/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      868/sshd

Aix系统

  • step1: netstat -Aan|grep 6200|grep LISTEN
  • step2: rmsock f1000e0000307bb0 tcpcb
  • step3: ps -ef|grep <pid>

Db2数据导入导出效率对比

背景

  • 生产环境的流水数据,在日终批量的时候,需要把前一天的流水数据迁移至历史库.
  • 每天两千万条流水,整个批量耗时1~2个小时.
  • 当前交易量还只是未来计划的1/4,如果达到预期的交易量,那么批量程序的耗时这么下去就太离谱了.
  • 批量程序只记录开始和结束时间,未统计或者日志中输出每个主要过程的耗时,因此只能在测试环境尝试发现耗时点和优化方法.
  • 有些地方更新线上版本实在太困难(没有大的问题,能跑就坚决不动)

处理过程

  • 当前库.流水表->卸载分区->生成临时表->导出数据
  • 后线库.流水表->导入数据->生成临时表->加载分区->数据完整性校验
  • 当前库.流水表->删除临时表

耗时分析

数据导出

  • 这里的导出是指[生成临时表->导出数据]这一步
  • 优化前
1
db2 "export to 文件名.ixf of ixf select * from 临时表名"
  • 优化后
1
db2 "export to 文件名.ixf of del modified by coldel0x01 select * from 临时表名"
  • 两种方式导出的数据文件,数据的分隔符不同(再深入的差别不晓得)
  • 在测试环境,针对优化前后进行了测试
项目 数据量 导出耗时 导出文件
优化前 1000万 10分钟 8G
优化后 1000万 2分钟 4G

数据导入

  • 导入是指[导入数据->生成临时表]这一步
  • 优化前
1
db2 "import from 文件名.ixf of ixf commitcount 500 create into 临时表名 in 表空间"
  • 优化后
1
2
db2 "create table 临时表名 like 表名 in 表空间"
db2 "load from 文件名.ixf of ixf insert into 临时表名 nonrecoverable"
  • 在测试环境,针对优化前后进行了测试,该导入测试,依赖的导出数据为优化前的导出格式(默认的分隔符)
项目 数据量 导入耗时
优化前 1000万 too lang
优化后 1000万 2分钟

Db2stop Force 失败

背景

系统使用DB2数据库,日常操作没有遇到问题. 但是最近出现两次操作错误,引起一些问题,有必要记录一下.

现象1

  • 执行db2move esbdb load的时候,数据库名称写错,直接Ctrl+C终止,但是shell并未终止.
  • 再次执行db2stop force,仍然未停止,CPU占用在0~50%之间
  • 尝试发现DB2在做什么?无果,db2diag的日志在不停的刷
  • 经过一些毁灭性的操作之后,请来db2专家搞定(过程不表,反正是一身冷汗)

现象2

  • 手动执行存储过程,由于未指定时间,导致SQL执行长时间未停止
  • 强制停止该存储过程,也是没有停掉
  • 执行db2stop force仍然未停止数据库
  • 有了第一次的经历,不敢再进行更进一步的动作,希望DB2能够自己处理完之后能够停下来
  • 等到第二天(大约过了15个小时),依然CPU很高,没有停止的迹象

解决

这个解决是在现象2之后执行的. * ps -ef|grep db2stop * kill <pid> #kill掉'db2stop force'对应的进程 * 再次执行ps -ef|grep db2stop,没有对应的信息,数据已经停止 * 重启数据库db2start

DB2数据库同步

背景

  • 在进行第二轮UAT测试的时候,需要进行版本重新部署,该部署过程要与上线一致(即验证投产的程序和SQL版本的正确性,验证部署说明的可操作性),因此需要将该UAT环境与准生产环境初始化成一致的状态.
  • 应用程序直接拷贝过来即可.
  • 数据库需要进行同步,来保证UAT环境的数据库和准生产环境的数据库一致.

前提

  • 数据库: DB2 V9.7
  • 准生产环境: 简称PRD
  • 准生产数据库名称: prddb
  • UAT环境: 简称UAT
  • UAT数据库名称名称: uatdb
  • 数据库实例用户: db2inst
  • 数据库应用用户: db2app
  • 注:两个环境的数据库表结构/表空间等信息一致
  • 注:导入导出涉及两个用户,下述步骤忽略用户操作的目录和权限相关内容,在实际操作中请自行处理
  • 注:此方法可以保证导入后的数据库,表的索引/约束等信息仍然保留

导出

导出DDL

  • db2app用户登录PRD环境
  • 连接数据库: db2 connect to prddb
  • 导出DDL: db2look -d prddb -e -o ddl.sql
  • 关闭连接: db2 connect reset
  • 注:上述命令会导出db2app用户相关的所有表/视图/存储过程等

导出数据

  • db2inst用户登录PRD环境
  • 创建目录: mkdir prddb.ixf;cd prddb.ixf
  • 导出ixf: db2move prddb export

数据迁移

  • 将db2db.sql文件从PRD环境传输到UAT环境
  • 将prddb.ixf文件夹从PRD环境传输到UAT环境

导入

创建表

  • db2app用户登录UAT环境
  • 删除uatdb库中的全部表/视图/存储过程等,该步骤需要手动执行
  • 修改db2db.sql文件中的数据库名称为uatdb
  • 连接数据库: db2 connect to uatdb
  • 执行命令db2 -tvf db2db.sql重新创建表/视图/存储过程等
  • 关闭连接: db2 connect reset

导入数据

  • db2inst用户登录UAT环境
  • 进入文件夹: cd prddb.ixf
  • 方法1
    • 导入ixf:db2move uatdb load
    • 修改表状态:db2 set integrity [表名] immediate checked
  • 方法2
    • 导入ixf:db2move uatdb import
    • 有主外键依赖的关系,表数据会导入失败

DB2数据库日志空间满

DB2数据库日志空间满

错误:

1
SQL0964C The transaction log for the database is full. SQLSTATE=57011

检查数据库日志配置

1
2
3
4
db2 connect to esbdbfe user esbinst using esbinst 
db2 get db cfg for esbdbfe show detail |grep -i log
Log buffer size(4KB)  (LOGBUFSZ) = 8192      8192
Log file size(4KB)   (LOGFILSIZ) = 655       655   #单个日志文件size太小

更新数据库日志配置

1
2
3
4
db2 connect to esbdbfe user esbinst using esbinst
db2 update db cfg using LOGFILSIZ 10240  
db2stop force 
db2start

DB2 表状态异常SQL20054N

DB2 表状态异常SQL20054N

背景

测试环境的一张表在前线库和后线库中进行了分区处理. 前线库存放当天和未来的分区, 后线库存放昨天和过去N天的数据. 该表的消息ID字段是主键.

现象

在日终批量的时候,从前线库卸载下来的分区数据,可以导入后线库,但是该表的状态异常,不能删除更早的历史分区(手动执行也报错) DB2错误码: SQL20054N reeasoncode:29

原因

消息ID出现重复,前线库中有一条记录与后线库的历史分区里某一天的数据重复.因为消息ID可以保证在前线库唯一,但是无法保证两个库唯一.
出现异常的流程:
* 前线库:分区卸载
* 前线库:数据导出ixf文件
* 后线库:关闭约束检查db2 "set integrity for tabname check immediate unchecked"
* 后线库:从ixf文件中import数据(正常)
* 后线库:开启约束检查db2 "set integrity for tabname immediate checked"(异常,该语句报错,导致后面删除分区也未能执行)

解决

临时解决

  • 删除后线库该表的数据(也可以只删除重复的数据)
  • 开启约束检查
  • 删除多余的分区

    永久方案

  • 前线库采用唯一约束,保证逻辑处理不会产生重复.
  • 后线库删除该表的唯一约束,仅保存相应的索引即可