db2之事务日志大小

通过 db2 get db cfg |grep -i log 查看事务日志相关配置,也可以看到事务日志文件的位置

通过 :

修改事务日志的文件大小及文件个数,修改后可以通过:

是修改生效,会发现事务日志的文件大小和文件数量都发生了变化

db2look 导出sql文件乱码的原因

使用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的。

ssh udp proxy

 

 

相关命令:

客户端:

(如果有socat,就不用这这个while循环了)

服务端:

 

参考:

关于垃圾分类

总以为垃圾分类需要很高的国民素质,总以为垃圾分类只会出现在某些发达国家,总以为垃圾分类实现起来困难重重,总以为垃圾分类很遥远,然而,垃圾分类来了,来的那么迅雷不及掩耳,曾经总觉得自己做不到,其实只是没信心,只要你下决心去做了,办法总比问题多,相信不久的将来,我将不需要去日本,也能看到干净的街道了。

关于bash的输入输出重定向

先写一个语义不太清晰的写法:

通常来讲,1是标准输出,如果我们要重定向标准输出到文件 /tmp/file , 则写法如下:

这里没有写文件描述符,默认为输出重定向说的就是文件描述符1,即:

那么,你可能会说:

也有这个效果,那么这个有如何解释呢?

该命令逻辑上等效于: (实际上不是)

前面是说的输入重定向,后面说的是输出重定向;

但是,通常我们不会去读标准输出的,虽然0/1/2 和其它文件描述符都是一样的。

下面看一个实际测试:

因为每个文件描述符只有一个位置指针,读写操作的指针不是分开的,所以,这里我们是从文件尾部开始read的,所以啥也read不到,能否跳转到文件头read呢?

这里有很多有意思的思路: https://stackoverflow.com/questions/3838322/bash-read-write-file-descriptors-seek-to-start-of-file

  1. python可以直接打开fd,也能seek,c也能,但是借助外部程序的话,势必要把整个进程空间替换成外部程序,这样就回不来了
  2. 有时候,我们大可不必非要使用 &的方式访问文件描述符,直接使用 /proc/self/fd/8 可能更加方便,如:
    1. 当然,这样总是读第一行

 

为什么下面写法是不对的?

  1. 一个文件描述符不可能同时指向两个不同的文件,相同的文件打开两次也是要覆盖的;所以这里读打开是覆盖了写打开的,所以,最终是写不了的
  2. 所以,如果要读写同一个文件,最好使用不同的文件描述符分别打开文件

 

bash 解析db2look 导出的sql文件中的create table语句

通过bash解析db2look 导出的sql文件中的create table语句,并写入对应的独立的文件。

脚本如下:

其实,grep也能提取,只是不方便分文件写入,而且,不方便去掉不想要的IN子句,grep的写法:

bash 清理文件空行以及行首行位空行

一般来讲,这个事儿是sed该干的,但是,sed做起来也不那么简单,可能每次写都需要问百度。

bash如何实现呢?

这里涉及了三种情况:

  1. 空行(空字符)
  2. 行首空字符
  3. 行尾空字符
  4. 空字符可能是空格有可能是tab,一般也就这两种情况了

写起来是不是比较麻烦?

脚本:

简直不敢相信,远比sed要简单的多吧。

因为read自然帮我们去的掉了行首行尾的空白了。

不过需要注意的是:

  1. 这里echo的$line 是加了双引号的,如果没有双引号,echo 就会帮我们把line中间的空格或tab给吃掉,连续的空白只剩余一个空格;加入我们想要的就是这种效果的话,你们直接去掉双引号就行了,省却考虑相关处理逻辑了
  2. 如果文件中含有类似 “a\+b\c” 这种包含了\ 的字符串,处理完之后, \ 就没了; 所以,上面的处理方式有局限性
  3. 如果文件是二进制文件,也不能这样处理

 

关于echo “$line” 中双引号的作用:

假如 line=”1 2    3″

echo $line   等效于  echo 1 2   3  ;根据我们基本的认知,2和3中间有多少个空格都等于1个空格,对于echo来讲都是3个参数

echo “$line” 等效于 echo “1 2   3” ; 这里的echo接收到的是1个参数,自然不能随意丢掉其中的空格

db2 命令行查看表结构

db2 中没有类似mysql中的show create table 的命令,只是db2look 可以导出表结构,如果要查看建表语句也不太方便,尤其想把每个表的建表语句都放在单独的文件,下面的命令可以从db2look到处的sql文件中提取表结构:

 

不过这样的话,也是先db2look得到文件后,先将表名提取出来,再提取表结构,步骤稍许麻烦。

db2look 用法: