https://blog.csdn.net/rocketluoqq/article/details/81610993
http://www.valleytalk.org/wp-content/uploads/2012/10/Spanner-Chinese.pdf
DevOps
办法1: 不知道
办法2:
把现有的db2 connect to 。。,db2 connect reset等用bash的function包装一下,在包装函数里面添加逻辑,不直接db2使用原生的方法
实用的脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/bin/bash DB=$1 db2 connect to $DB || exit #### 提取所有表名到变量tables # 错误的写法 tables=$(db2 -x list tables | awk '{print $1}') # 正确的写法 (这一定不是最简洁的,但是逻辑很清晰) tmp=$(db2 -x list tables) tables=$(echo "$tmp"| awk '{print $1}' ..... |
脚本基本逻辑是:
脚本很简单,但是,还是写出问题来了
其实,短短的代码里面藏着很多知识呢
上述的错误的写法之所以错,是因为db2进程的PPid不是当前的bash,但是和正确的写法差别不大呀,为什么PPid就不一样了呢? 可以参考: https://phpor.net/blog/post/12836
为什么db2 那么关心PPid ?可以参考:https://phpor.net/blog/post/12806
就算非常小心的去写,bash中通过函数内部使用db2命令,很容易就进入的不同的环境,所以,为了能让db2和bash很好的结合,我创造了一个db2cli,其架构就是:
bash中定义函数调用自定义的db2函数,该db2函数内部通过curl访问一个httpserver,让本次会话的db2命令都在同一个httpserver进程内部执行,httpserver地址:https://github.com/phpor/go-example/tree/master/app/db2-proxy
db2cli地址:
场景:
想执行一个命令,如果命令成功,则不输出任何信息,如果命令失败,输出错误信息;
通常来讲,特别简单:
1 |
$cmd >/dev/null || exit $? |
就行; 但是,如果 $cmd 会通过标准错误输出一些debug信息呢?这样的话,即使命令成功也会看到一些不必要的信息,那么如何改进呢?
基本思路就是,把标准输出扔掉(可选),标准错误重定向到标准输出,然后赋值给一个变量:
1 |
x=$(no_such_cmd 2>&1); [[ $? -ne 0 ]] && echo $x |
这个没有问题;
但是,当我们试图把这个逻辑写到函数中时,似乎就不太对了,因为函数中的变量尽量local声明,而且,声明和赋值写在一起显得紧凑、美观、有修养;如下:
1 2 3 4 |
function xx() { local x=$(no_such_cmd 2>&1) [[ $? -ne 0 ]] && echo $x } |
这是,和我们预期不一样了 ; $? 已经不是no_such_cmd 的返回值了,为什么?
参看下面截图:
显然,第一个函数中 $? 其实是local语句的返回值了(local的返回值和变量被赋了什么值没有关系,参看: help local),所以,正确的姿势是,先声明变量,再使用
问题:
db2 connect to XXX 究竟做了什么,使得 后续的db2 进程就知道自己当前上下文的数据库是XXX ?而且,不同的bash进程下都有自己单独的上下文,不相互影响。
分析:
通过 db2 get db cfg |grep -i log 查看事务日志相关配置,也可以看到事务日志文件的位置
通过 :
1 2 3 |
db2 update db cfg for $DB USING LOGFILSIZ 32768 db2 update db cfg for $DB USING LOGPRIMARY 10 db2 update db cfg for $DB USING LOGSECOND 10 |
修改事务日志的文件大小及文件个数,修改后可以通过:
1 2 |
db2 deactive database $DB db2 active dabase $DB |
是修改生效,会发现事务日志的文件大小和文件数量都发生了变化
使用db2look导出的sql文件根据当前环境不同生成的文件编码也不同;
原因1:
如果LANG=zh_CN.UTF-8 ; db2set db2codepage=gbk ; 则会导致文件的第一部分包含utf-8 编码的汉字:
而文件的sql部分中的汉字则是gbk的;
那么,该文件的编码就不能被正确识别; 所以,较好的做法是,使用db2look时,设置 LANG=C, 这样的话Timestamp部分就不会显示中文了; 而sql中的汉字编码跟随db2set 中的db2codepage,建议设置为数据库的字符集和编码,一方面可以避免字符集的转换,另一方面,不通字符集之间不见得就是能转换的,转换失败的话就转成 问好(?) 了。另外,导出的文件在自己的终端打开时,可能和终端的字符集编码不一致导致查看时乱码,这个并不紧要,如果终端的LANG设置正确的话,通常vim会自动将文件的编码转码为终端的编码(vim通过LANG来检测终端的编码)的。
原因2:写入数据库的编码确实就是不同的,下图正常显示的是utf-8 编码的,不正常显示的是写入的gbk编码当做utf-8 解释了; 但是,这种错误不易被发现,因为执行的时候会被认为是合法的utf-8的(确实真的合法)
真实的将,该截图是vim查看后截图的,vim根据当前环境将文件原本的GBK自动转码为utf8显示的,乱码部分是原本的GBK文件中的utf8字符又往utf8转了一次所致
如果使用vim查看总是看到满屏的乱码,可能就是识别错编码了,比如:识别成了utf-16; ,因为所有的文件都可以认为是有效的utf-16的。
相关命令:
客户端:
1 2 |
mkfifo /tmp/dns while : ; do nc -l -u 53 </tmp/dns | (nc -w 1 localhost 5353 > /tmp/dns && { pid=$( ps -ao comm,pid|awk '$1=="nc"{print $2}'); [[ $pid != "" ]] && kill $pid; } ) done & |
(如果有socat,就不用这这个while循环了)
服务端:
1 2 3 4 |
mkfifo /tmp/dns nc -l -k -p 5353 < /tmp/dns | nc -u 172.16.16.1 53 > /tmp/dns & ssh -R 5353:localhost:5353 |
参考:
总以为垃圾分类需要很高的国民素质,总以为垃圾分类只会出现在某些发达国家,总以为垃圾分类实现起来困难重重,总以为垃圾分类很遥远,然而,垃圾分类来了,来的那么迅雷不及掩耳,曾经总觉得自己做不到,其实只是没信心,只要你下决心去做了,办法总比问题多,相信不久的将来,我将不需要去日本,也能看到干净的街道了。