2007年6月28日

用 VIM 管理 Oracle 的 SQL 历史

本文介绍一种方法,尝试用 VIM + SQLPLUS 的方法模拟出 informix 中 dbaccess 的 SQL 读入、运行功能。


可以试试在 vim 的 .vimrc 里面定义这样的热键:

nmap <silent> <F2> :1,.y<CR>:bel new<CR>p:%!sqlplus -s user/passwd<CR>

开一个 vim 写 SQL,写完以后按 F2 就可以从开头执行到当前行

---------解释------------
:1,.y 复制从第一行到当前行
:bel new 在当前窗口下方开个窗口(容纳运行结果)
p 把SQL粘到下面的窗口
:%!sqlplus -s user/passwd 把SQL传给 sqlplus 执行
---结果:上窗口显示编辑的SQL,下窗口显示运行结果---

(你也可以修改一下,改成按 Fx 执行全文,但是我觉得“执行到当前行”更灵活一些)

至于 SQL 历史保存的问题,我写了一个脚本,名字叫 d (很眼熟吧,infomix下用的这个名子,已经成了开 dbaccess 的专用缩写),内容如下:
biff@biffasus:~/bin$ cat d
#!/bin/bash

mkdir -p $HOME/.oracle
cd $HOME/.oracle

vi $HOME/.oracle

cd -

其实什么都没干,很神奇吧(不过你的VIM版本要支持目录编辑)
vim 带参数是目录时它会显示目录下的文件供你编辑,如下:

" ============================================================================
" Netrw Directory Listing (netrw v109)
" /domain/home/biff/.oracle
" Sorted by name
" Sort sequence: [\/]$,\.h$,\.c$,\.cpp$,\.[a-np-z]$,*,\.info$,\.swp$,\.o$\.obj
" Quick Help: :help -:go up dir D:delete R:rename s:sort-by x:exec
" ============================================================================
../
./
@@test.sql
create_t_cif_info.sql
cur_speed_test.sql
zh16encoding.sql

看到没有,目录下的SQL显示给你供选择,可以直接对SQL文件删除、改名
用光标上移、下移选择文件,回车开始编辑SQL,光标移到最后一行按 F2 开始运行

2007年6月26日

SQLPLUS微型手册

SQLPLUS微型手册

1、启动参数
sqlplus -s 使用 silent 模式(不输出版本相关信息)
Usage: SQLPLUS [ ] [[/] [@]]
[@ [ ] [ ] ...]
where ::= { -s | -? }
-s for silent mode and -? to obtain version number

userid/password@db -- Connection details
/nolog -- Do not login to Oracle. You will need to do it yourself.
-s or -silent -- start sqlplus in silent mode. Not recommended for beginners!
@myscript -- Start executing script called "myscript.sql"



2、查看帮助
> help set
显示关于 set 命令的帮助
> help TOPIC
显示所有可以提供的帮助信息


3、调用SQL语句
> r
执行上一条SQL,与输入 / 效果相同

> r 2
执行缓存里编号为2的SQL

> @ nn
执行当前目录下的 nn.sql 文件


4、保存SQL语句
> save nn
将当前语句存入 nn.sql
> save nn app
将当前语句追加到 nn.sql
>help save
SAV[E] [FILE] file_name[.ext] [CRE[ATE] | REP[LACE] | APP[END]]


5、查看表和表结构
>select * from tab;
>select table_name from user_tables;
>desc mytable;


6、改密码
> grant connect to identified by ;


7、配置监听器访问远程主机
修改 $ORACLE_HOME/network/admin/tnsnames.ora ,加入远程主机信息,格式:
local_SID =
(DESCRIPTION =
(ADDRESS = (PROTOCOL= TCP)(Host= hostname.network)(Port= 1521))
(CONNECT_DATA = (SID = remote_SID))
)
local_SID 给远程主机取的本地名字
HOST 写IP地址
remote_SID 远程连接的库实例名

然后 'sqlplus user/pass@local_SID'


7、使用 & 操作
> select &amp;name from dual;
Enter value for name: *
old 1: select &name from dual
new 1: select * from dual

D
-
X



8、用sqlplus启动和停止实例
$> sqlplus /nolog
> conn system/passwd as sysdba
然后就可以
> startup 启动实例
> shutdown 关闭实例


9、初始化 sqlplus 的环境变量
. oraenv
export ORACLE_SID=[orcl] ? orcl


(摘译自:http://thomas.eibner.dk/oracle/sqlplus/ , 还可以参考 http://orafaq.com/faqplus.htm )

整合 SQLPLUS & VIM

习惯是一种很有意思的事情:有人把 Linux 改成 windows 的操作方式,觉得这样更易用;有人在 Windows 下面加入 linux 的功能,这样顺手点。
在 informix 的 dbaccess 下习惯了整合 vi 进行编辑,现在进到 sqlplus 第一句话就是“怎么不能用 VI 编辑?”。没办法,习惯了 VIM,不扩展一下真的没法用!

在网上查了一下,大致方法有:


1、在 sqlplus 里设置环境变量 set editor=vim

可以每次在 sqlplus 里输入,或写在 $ORACLE_HOME/sqlplus/admin/login.sql里面每次启 sqlplus 时自动调用。也可以写在 .bashrc 里面,加一句 export EDITOR=vim

然后在 sqlplus> 提示符下输入 edit nn.sql 就调用 vi 编辑 nn.sql 文件了
编辑完毕以后 :wq 保存退出,用 @nn 可以调用 nn.sql ( edit 可以用缩写 ed 代替)

其原理说白了就是调用 vi 编辑当前目录下的 nn.sql 文件(因为文件名没有带路径),保存以后用 @nn 命令调用当前目录 nn.sql

这种方法很原始,最不爽的就是会在当前目录下产生很多 SQL 文件,有用没用的都混在一起了。

参考自:http://www.oracle.com/technology/global/cn/pub/articles/kalosi_vim.html (这篇文章实在头重脚轻,长篇大论讲VIM,讲得也不怎么样,只在结尾提了一下 SQLPLUS 设置)



2、直接在 VIM 里面调用 sqlplus
在shell环境下启动 vim 编写 nn.sql ,如
$> vi nn.sql
select * from tab;
然后在 VIM 里面执行命令 : :%!sqlplus -s system/passwd ,如果有错误信息或执行产生的显示数据都会进入到当前文本。

原理:
sqlplus -s user/pass 用 -s 参数屏蔽 sqlplus 的版本信息,后面跟帐号和密码
!command 是 vim 执行外部命令的方式,如 !ls 就是在 vim 里面调用 ls 命令列出工作目录下的文件
% 号是命令执行的范围,%表示全部。当然也可以用 : :3,15 !sqlplsu -s user/pass 来调用 sqlplus 执行第 3~15 行的SQL语句

这种方法很值得一试:首先,工作环境完全变成 vim,对于熟悉 VIM 的用户来说可以在 VIM 里输入、执行SQL,然后操作结果进入到了 VIM 里面可以接着用 VIM 查看、编辑、过滤,一箭双雕

参考:http://www.oracleadvice.com/Tips/UXvi-sqlplus.htm (很不错的oracle技术网站,文章都是短小精干)

2007年6月25日

开篇语:恶补Oracle

很久以前把 Oracle 当 Access 用了两年
现在真的要在 Oracle 上搞开发了,才悔不当初

刚在笔记本的 Linux 上装了个 Oracle 10g
乱码、缺文件、建库报错、监听启动失败。。。。
折腾得够受

然后才发现
竟然完全不知道怎么关闭,只好 KILL 了,够暴力的
KILL掉以后麻烦又来了,该怎么启动呢,急人哟

恨 Linux 怎么就没有个图形界面的图标让我点击呢

只能从零开始了!!

2007年6月20日

成功升级 Ubuntu 到 7.10 Gutsy,偷着乐

早就把 /etc/apt/source.list 改成Gutsy的源了,但是一直没敢全面升级,趁着晚上事情闲点,终于下了“一刀”。

本来不想在笔记本上升级 Ubuntu Gutsy 的,必竞这是工作环境,风险还是挺大的。

但是每天看着三位数的“软件包可升级”就心里痒痒,先是把几个网络软件包升了,后来还是忍不住,终于全面进入7.10了,大伙一起来品味一下:

一边开着Firefox上网,一边升级,
看着系统界面的工具栏变成很烂的GTK原始风格,接着面板上的IP Messager报错退出,然后系统任务监视的Applet也不知道什么时候停止了工作......心里还是有点紧张的(必竞是因为升级 OpenSuSE Alpha4 失败过转到 Ubuntu 来的 ,有点一朝被蛇咬十年怕草绳的味道)

报了几个提示让覆盖配置文件,最后有几个软件包没能从CN99网站找到,就结束了,准备重启。


第一关: GRUB,已经习惯了但还是很难接受

BIOS自检过了就发现 GRUB 的启动选择界面变回到恶心的黑白文本框了,这个倒是在想象之中,因为每次升级完内核或是重装GRUB,系统都会很“热心”的重新生成一次menu.lst,但是这一点着实有些可恶!

还好有每次修改menu.lst系统都会自动产生备份文件,还原回去就好了。把 menu.lst~拷回成menu.lst,OK,我的GRUB背景又回来了,(我用的是那辆老式自行车bike_gua.jpg的图片,有兴趣的可以上Google找一下 grub splashimages ,其实最棒的是 SuSE 的动画界面,不过也没必要花时间搞这么花哨的东西了)。

第二关:SCIM,吓出了一身冷汗
没有SCIM就等于整个系统报废,一个完整的工作环境没有了中文输入法件非常恐怖的事情,但是还是发生了。启动完毕,没发现什么异常,但是打开Firefox发现五笔没办法输入中文了,打五笔的时候还显示的是汉字,上屏就变成两个英语字母了(出一身冷汗。不过心里还有垫底的,至少Google还支持拼音搜索,虽然解决问题不一定非要输中文的问题描述进行搜索,但是有了Google的这个功能还是能给人不少信心)

上Google查找 Gusty 7.10 Scim,没多少关于Scim的BUG,挑了几个看了看,在常去的http://blog.eshangrao.com找到些信息,照着改了 SCIM的配置文件,把 xcim 改成 scim ,重启X,问题解决(目前还不清楚具体是不是这个原因引起的,因为升级失败的十几个包就有4个是与SCIM相关的,而且包括最关键的socket接口包)

第三关:Themes,实在没道理出现的问题
早就把系统的Themes调成MacOS的风格,一直用得不错。升级过程中界面变回到基本的GTK也就罢了,可是重启完仍旧停在这个难看的界面上就有些不对了。明明我的风格文件都在,为什么不沿用升级前的风格呢?实在有些令人费解!!

打开Themse配置才发现,已经不记得升级前用的是哪些风格了(升级前用的是多格主题里的内容拼出来的MacOS效果),只好再东看看西点点,又凑出个与升级前有几分相似的风格出来。有些后悔了,升级前该把自定义的风格保存成自定义配置留一份的。悔不该呀!!(不过其实也无所谓了,风格嘛,换换也好)

第四关:VirtualBox,启动,OK,没问题

VirtualBox也是出不得一点错的。前次升级的时候已经把VMPlaer搞坏了一直没时间理,如果这次VirtualBox也出个三长两短可要了命了,必竞有个VM跑Windows还是非常必要的,有备无患嘛。还好,因为内核没有升级,VirutalBox直接就启动了(不记是内核是什么时候升上来的了)。

所以,每升一次系统,换笔记本的欲望就增强一次,我盯着T5600很久了一直没机会下手,一直想体会一下KVM下“与内核版本无关”的VM会有多么的可靠。

.........

OK,进系统没问题,SCIM没问题,VirtualBox没问题,Firefox没问题,其它的就出不了什么天大的漏子了,还等什么,你还不快升级去。。。。。。


另外简单看了一下

Tomboy升级到7.1了,增加了Tag功能,似乎很实用,不过我已经有的上百条便签不是又得一条条的加Tag,着实很烦!!

登录界面里有 zh_CN.GB18303 的选项了,但不知道是我升级前已经手工配置过的原因还是新版本添加了这一项(记得7.04只有GBK和GB2312的)

2007年6月19日

修改了 curlftpfs 在挂载 AIX 和 HP-UX 时的问题

ftpfs目前仍然不稳定,我在连接hp-ux时遇到中文日期不兼容等问题,
可以参见我在 ubuntu bug 提交的出错报告 [ 我的QQ是274980,不过很少在线 ]

现在发现的不兼容情况如下:

1、在AIX上,早于6个月的数据会显示年份而不显示分秒。这种情况本来
是在程序的考虑范围之内的,但是不知道为什么程序少去掉了一个空格,
导致部分文件名比实际文件名前多了一个空格,自然访问报错。

I'v reported that curlftpfs 0.9 + libcurl 7.15.5 works unnormal with aix ftpserver,
( https://bugs.launchpad.net/ubuntu/+source/curlftpfs/+bug/120018 )
so,i updated curlftpfs to 0.9.1 and update libcurl to 7.16.2,things goes even badder.

with curlftpfs 0.9.1 + 7.16.2 ( mount remote aix ftp direcotry to local linux system ):
files and directories older than six month are displayed error with a space before it.

I had to modify ftpfs-ls.c ,
line 61:
/* "%5s" "%*c" year */
"%5s" SPACES /* year */
line 73:
/* "%5s" "%*c" year */
"%5s" SPACES /* year */

thing goes well, i can list direcotries and vi files now .
NOTICE!! havn't test under other ftpservers !!

files lists by aix ftpserver is:
-rw-r--r-- 1 smisdep tsgrp 502 Nov 16 2006 card_type
-rw-r--r-- 1 smisdep tsgrp 3853069 Nov 22 2006 info.txt
-rw-r--r-- 1 smisdep tsgrp 7827 Nov 22 2006 inst.txt
-rw-r--r-- 1 smisdep tsgrp 12590 Dec 01 2006 m_bmw_data_fhyzhdzd.txt
-rw-r--r-- 1 smisdep tsgrp 15054 Dec 01 2006 m_bmw_data_dwyqtdwwl.txt
-rw-r--r-- 1 smisdep tsgrp 201344 Dec 11 2006 888
-rw-r--r-- 1 smisdep tsgrp 81308 Dec 21 10:23 111.txt
-rw-r--r-- 1 smisdep tsgrp 4533 Dec 21 10:26 create_cardapp_tabel.sql
-rw-rw-rw- 1 smisdep tsgrp 1528 Dec 25 15:31 makeGroup.log
-rw-r----- 1 smisdep tsgrp 12753 Dec 25 16:37 makegroup.sql
-rw-r--r-- 1 smisdep tsgrp 128 Dec 28 10:44 wlq.sql

files modifed at 2006 have double space before it's name ,and those modifed at 2007
have only one space before it's name.


2、第二种情况还没有汇报(因为这是中文Locale的问题,不知道是否有通用性)
在HP-UX 下面设置FTP服务器显示中文日期后,格式如下:

有多种情况,而且空格的出现也不是非常有规律,为了方便说明,我把 年月日用??
代替,大家应该看得明白

drwx------ 2 pcrm pcrm 8192 6??18?? 09:17 bin
drwxrwxrwx 1 pcrm pcrm 18 2006??6?? 8?? data
drwx------ 2 pcrm pcrm 8192 6?? 7?? 16:12 etc
drwx------ 3 pcrm pcrm 8192 6??18?? 09:17 include
drwx------ 6 pcrm pcrm 8192 3??19?? 10:38 init
drwx------ 3 pcrm pcrm 32768 6??18?? 23:04 log
drwx------ 11 pcrm pcrm 8192 6?? 8?? 16:21 public
-rw-r--r-- 1 pcrm pcrm 22266 5??23?? 11:02 t_mng_reportinfo.txt
-rw-r--r-- 1 pcrm pcrm 15977 6?? 7?? 15:48 t_prod_info.txt
-rw-rw-rw- 1 pcrm pcrm 19070 6??15?? 17:54 time20070531.txt
drwx------ 4 pcrm pcrm 8192 6??18?? 08:48 tmp

------------------------------------------------------------------------------

花了两天时间把 curlftpfs的 ftpfs-ls.c 文件进行了修改(版本是curlftpfs-0.9.1)
增加函数 parse_dir_hpux_zhcn

test code here, ( base on curlftpfs0.9.1 -- ftpfs-ls.c )


支持 AIX 下
-rw-r--r-- 1 smisdep tsgrp 502 Nov 16 2006 card_type

支持 HP-UX 下
drwxrwxrwx 1 pcrm pcrm 18 2006年6月 8日 data

------------------------------------------------------------------------------

2007年6月17日

把远程服务挂载成LINUX目录

本文介绍如何利用服务器端的 samba、nfs、ssh、ftp 中任意一个服务,实现远程目录挂载


把远程主机的目录挂载成本地目录的优点是不言而喻的
能够将远程UNIX的目录挂成本地目录,就可以:

1、用VIM编辑程序,而不用再忍受VI的折磨(语法高亮、ctags扩展)
2、在本地写脚本进行文件备份、维护、VCS版本管理
3、所有操作不被远程主机的 .sh_history 记录
4、更直观的文件拷贝操作 cp /mnt/unix/src/hello.c ~/dev/hello.c
5、更多


本人用到的一些方法如下:


1、本人很少用到,但是也是最可能用到的 -- samba

在window遍天下的今天,哪个Linux用户身边没几百个windows用户?
samba服务历史非常悠久,这个就不用多说了。

命令行:
smbmount //192.168.0.100/d /mnt/winshare -o gid=users,uid=biff

或按如下格式写到fstab:
//server/share /media/share smbfs user,username=xx,password=xx,fmask=777,dmask=777 0 0

以后就可以直接用 mount /media/share 加载了 ( 后面不作特别说明都参照本例 )



2、最正统,但是几乎遇不到的 -- nfs

这个也不用多讲了,多讲也无益,除了做实验学习用过几次,十几年没用到过。

命令行:
mount server:/usr/local/pub /home/unixshare
fstab:
server:/usr/local/pub /home/unixshare nfs rsize=32768,wsize=32768,timeo=14,intr



3、绝对实用,程序员必备 -- sshfs

需要fuse sshfs模块,这通常都是本地linux默认安装,只要远程主机提供了ssh服务就可以使用。

命令行:
sshfs user@192.168.0.100:/ /mnt/share
fstab:
sshfs#user@192.168.0.100 : /mnt/share fuse user,noauto,uid=biff,gid=user 0 0
卸载的时候用:
fusermount -uz /mnt/share ( fusermount -u 是卸载 )

建议通过证书进行ssh认证,以后 mount /mnt/share 的时候就不用输入密码了。

sshfs是最棒的,传输加密、工作稳定、不需要在fstab里留明文密码

但是如果管理员仍然老土到让你用telnet,那就只好另寻高招



4、补救手段,有总比没有好 -- ftpfs

虽然本人极力推荐sshfs,但是并不是在每个工作环境都那么好久

管理员不会因为个人的需要而专程到服务器上装个sshserver,但是ftp例外

只要服务端提供了ftp服务,我们还是能偷着乐一把的

命令行:
curlftpfs user:passwd@ftpserver /mnt/ftpshare -o uid=biff,gid=users
fstab:
curlftpfs#user:passwd@192.168.0.100 /mnt/ftpshare fuse rw,user,noauto,uid=biff,gid=users,noauto 0 0


如果你的管理员甚至不给你提供ftp服务(太毒了),那你还是老老实实telnet上去让vi折磨你吧,我也救不了你!


其中方法3、4用到 fuse 模块,这是目前很流行的 user_space mount 方式,
不需要 root 权限就可以将 ssh/ftp/iso/samba/nfs 甚至 gmail 邮箱挂载成本地目录
可以参考这些关键字到google去关注一下:fuse sshfs ftpfs smbfs nfs gmailphs

另外,使用sshfs的过程中遇到个很奇怪的问题,
可以参见前面的文章:Linux下使用 sshfs 挂载 HP-UX 时遇到的巨大BUG

ftpfs目前仍然不稳定,我在连接hp-ux时遇到中文日期不兼容等问题,
可以参见我在 ubuntu bug 提交的出错报告 [ 我的QQ是274980,不过很少在线 ]

Linux下使用 sshfs 挂载 HP-UX 时遇到的巨大BUG

我在用sshfs挂载HP-UX时出现了下面的情况,大家分析一下:

本地系统是 OpenSUSE 10.2,具体的sshfs和fuse版本不记得了(未升过级)
远端是 HP-UX B.11.11 U 9000/800

sshfs 挂载 deva@hp-ux 到 biff@linux下

远程主机名hp-ux,用户 deva 的 uid=1234,gid=105
本地是linux系统,用户 biff 的 uid=1000,gid=100

fstab内容如下:
sshfs#deva@hp_ux_server:/ /mnt/src fuse
user,noauto,umask=007,uid=1000,gid=100 0 0

(留意下面 test 文件UID及GID的变化)

操作过程大至如下:

第一步
local:/mnt/src$ touch test ( 产生一个 test 文件 )

因为 /mnt/src 是挂载的 hp-ux 的目录,在 hp-ux 的 /dev/src 下会产生一个 test 文件
本地 ls -l 查看,test 文件是属于 linux 的 biff 用户,uid=1000,gid=100
远程 ls -l 查看,test 文件是属于 hp-ux 的 deva 用户,udi=1234,gid=105 (正常)

第二步
local:/mnt/src$ gzip -9 test ( 应该产生一个 test.gz 文件 )

本地 ls -l 查看,test.gz 文件是属于 linux 的 biff 用户,uid=1000,gid=100
远程 ls -l 查看,test.gz 文件是属于 hp-ux 的 1000 用户,uid=1000,gid=100 (出错了)

通过这两步操作,我们会在HP-UX系统上产生一个别人用户的文件(文件的UID != deva用户的UID)
telnet hp-ux ,用户名 deva
rm /dev/src/test.gz 提示没有权限访问

产个一两个异常文件还可以在本端用rm干掉,最要命的是不知什么时候产生了一个bak目录,
这个bak目录在HP-UX主机上用户名、用户组分别是 100/1000,
不论本地还是telnet到远端都不能进入,也不能删除,但是可以改名(因为所在目录的写权限是正常的)

HP-UX竟然轻易的让 deva 用户产生了一个非 deva 用户的文件,我认为这是HP UNIX系统的BUG

大家怎么看??

2007年6月16日

昨天,财务找我

昨天,旁边的一个同事告诉我

同事:财务让你上QQ,有事找你

我我:问她msn行不行,我没装QQ (注:我在linux下面pidgin最近上不了QQ)

......1分钟后

同事:财务说她的msn坏了,让你装一个

......启 Virtualbox,进windows

我我:有没有qq安装文件,发一个我

......1分钟后

我我:晕倒,你给的安装文件里面有病毒, QQxxxClient, AV99木马

同事:啊!我装怎么没发现. ....

...... 打开 QQ,提示输验证码 (输完验证码VirtualBox就死掉,直接退出)

...... 连试三次,发现真的是有问题,不是 VirtualBox兼容性有问题就是QQ的程序有问题

.......3分钟后,重启系统进windows,还好有备无患

.......杀毒软件提示:您已经162天未更新病毒库了

.......4分钟后,升级完病毒库,安装QQ,(仍然发现QQ安装文件有AV99木马,KILL掉 )

...... 输完验证码,进入QQ, ( QQ狂跳3分钟,N多未读消息 )

我我: 你找我?什么事

财务: 工资发了,你查一下

我我: 哦

财务: 886

............... 当场晕倒 ...........


2007/06/16