为什么我觉得拿版权较真的人都在扯淡

    重申一遍,我不反对版权,我只反对使用版权牟取暴利。
    什么叫暴利?我是个程序员,我做一个软件出来,我希望用我软件的人能给我点钱,对得起我的工作。或者最起码,不要拿着我的软件改的面目全非,在里面安放病毒什么的。这就是我对知识产权/版权的全部诉求——我希望得到收益,这个是一种尊重,也会激励我更好的做别的软件。
    然而今天,我们往往碰到这么一个情况。在校的时候,我们看到漫天的,学XX语言吧。同学老师都在讨论XX技术,彷佛美好的未来向自己招手。等到了工作时,发现,原来XX技术是XXX公司的专利,以此技术为核心构架程序,尤其是企业级程序必须向XXX公司交费。好吧,用东西付钱天经地义,哥回头也做个值钱的东西出来。做着做着,XXX公司又往往会三天两头变来变去,做一些你觉得技术上说不通的,很恶心的变更。当然,人家的东西,人家说了算。等自己做了很久后,发现自己用心做出的XXXX技术压根无人问津,因为XXX公司又推出了和这个技术相近的XXXX技术。他们曾经开出一个天价——天下最低的价——来购买你的技术的全部权利,并且宣称,自己的收购价这么低而权利费这么高,是因为在策划,宣传,包装,完善上花费了巨额投入的原因。这时你才发现,原来当初在学校里面,还有OOO语言可以选择。一切都是免费的,你不需要付钱来用别人的技术,当然产品多数也是免费给别人使用的,通常也只能收服务费。一切都和你想的差不多,只是——你当时根本不知道。

    宣传,策划,包装,完善到底要花多少钱呢?这个和中国移动到底从我们的手机账单中支出多少到基础设备建设,支出多少到服务一样,是个很难揣测的概念。然而我们可以知道另一个东西——他们的资产回报比——一般是多高。一切拿着策划,宣传,包装,需要花费巨额费用来说事,但是自己却有超高资产回报比的公司,哥都认为是在扯淡。
    更不提因为XXX技术和OOO技术针对的客户群接近,就无视两者根本没有血亲的事实,打官司指控OOO技术抄袭XXX技术,企图将松散的社区送上死路的动作。这其实不是为了给程序员更高的回报,而是出于资本的贪婪。版权/著作权应当保护作者的利益,而不是资本的利益。这就是我对版权/著作权的态度。

    夸张?松茸叔叔说过一个很有趣的内容,因为是豆瓣广播,链接不好找,我就不贴了。“从前有群人喜欢吃狗不理包子,他们搞了个狗不理包子同好会。后来有天来个人说,我是狗不理新老板,你们借用狗不理的名字,这是亲,呃,侵了我的权,你们得散了。于是他们只好改名为包子同好会。好笑吗?如果JavaEye没说谎,这就是Oracle对他们干的事情。”

手工删除oracle数据库实例的全部文件

今天公司搬家,没啥好写的,简单记录一下前两天删除重建oracle数据库的过程吧。
首先,我重建的是oracle数据库,而不是oracle数据库程序。这几天不知道怎么回事,整个数据库的redo log出问题了,我又懒得去找。加上这个数据库做演示的时候乱糟糟的配置做了一堆,也记不请了,干脆重建。
重建的第一步,需要找到所有程序实例的位置,这个可以看/etc/oraInv什么的一个文件,这里会指向一个目录。这个目录是标准的,里面有各种格式的oracle程序实例的位置。然后,一个程序实例可以运行多个数据库实例,因此,要找出这些数据库实例的配置文件。这个就需要对oracle的数据库基本结构有所了解,这里不赘述oracle数据库的各种基本概念。
oracle的数据库配置文件在一个很怪的位置,/etc/oratab里面。其中有SID到spfile路径的对应关系,通常而言,这个路径位于$ORACLE_HOME/dbs/init$ORACLE_SID。我们首先不要删除这个对应关系和文件,因为启动中其他文件需要通过这个找到。我们首先通过spfile建立pfile,来读取其中的参数。
$ export SID=orcl
$ sqlplus / as sysdba
> create pfile from spfile
> exit
OK,这样我们就建立了pfile,现在可以删除$ORACLE_HOME/dbs目录下所有的SID相关的文件,并且删除oratab中的对应关系。完成这步后,数据库就无法启动,也不存在了。但是我们还需要回首数据库相关的文件,主要是收回空间,同时也免除后患。
首先,数据库有三个control files,还有一个到多个data files,以及多个redo log。在默认设置中,这些文件一般放在一起,你可以通过查看pfile确认这些文件的路径。找到之后,直接删除,没啥好多说的。在完成数据基础文件的删除后,我们还需要删除flash_recovery文件,这个也可以通过pfile确认,位置一般在data文件上两级(就是通常$ORACLE_BASE的位置)下面,flash什么的一个目录,很好找。
最后,我们删除admin目录,具体是在$ORACLE_BASE下面的admin下面,以SID命名的,可以通过pfile确认。至此,oracle数据库的删除完成。不过呢——呵呵——让大家失望的是,其实DBCA也可以完成一样的工作…
不过,dbca的工作必须通过vnc,绝对不要通过ssh + xming,因为那个会让最后一步执行前的确认无法被确认,导致不能执行。实在是很让人郁闷的一个bug,切记切记。

紧急修复

贝壳周四的时候收到消息,烟台的系统崩溃,于是在24小时之内走了一趟天堂和地狱间的旅行。
开始的时候,贝壳在查一些业务有关的资料。期间和一个同事开了几句玩笑,但是发现他一脸便秘的样子,和我说没空。贝壳很郁闷,怎么这么没面子?过了几分钟,事情就发展成贝壳也一脸便秘的没胆子了,原因是烟台的系统崩溃。由于远程无法连接,只能让客户去机房重起整个系统。可重起后也没有反应。于是贝壳怕了,马上通知了老板。老板马上做了决定,要我们当时飞去烟台,并且在几分钟内给我们搞定了机票。于是在贝壳头处理紧急问题的时候,就受到了”飞机-出租- 零反应”的待遇。
中间首先要感谢一下给我们做Oracle技术支持的纪锋老师,这次如果不是他的大力协助,恐怕问题不会这么快解决。我们在零时间往烟台赶的时候,纪老师也马上打车往机场走。我们是五点接到的问题通告,五点半就联络好了各种问题,乘公司的车子往机场走(主要怕下班高峰不好打车)。六点多点的时候,我们拿到了登机牌,去做安检,然后顺便讨论起问题原因。当时认为基本不可能是软件问题,因为软件问题重起后基本都可以解决,也不会弄的机器停机(这个最终被检验是正确的)。可能是维护问题或者硬件问题。按照机器安装时间来计算,硬件问题的可能居多(系统才刚刚交付几个月)。
飞机是8点50在烟台落的地,落地后我们心急火燎地坐出租往报社赶。车刚出机场,收到一个消息,问题消失了。我们顿时安心很多,要是问题继续出现导致更严重问题,怕我们全都吃不了兜着走。现在,虽然我们还要去找出根本原因,可总比被客户拷问着检查系统来的好的多。到了报业后,我们先检查了系统。第一个被发现的问题是备份机已经满了,怎么会这样?系统的设计容量是三年500G,按照现在的数据量估计,最高不会超过30G,可备份机上足足有100G的空间!我们倒推了数据,发现备份要用140G以上的空间。怎么会这样呢?
原因我们没有找到,不过按照纪老师给出的原因,是备份的时候大量的归档日志造成了数据量暴增。但是备份暴增怎么会造成系统不能访问呢?贝壳陷入了奇怪的感觉中。虽然直觉上觉得就是这个理由,但是实际上却无法确定。按照我和同事说的话,如果用这个理由来说服我,是无法说服的。但是如果在目前让我给出一个理由,恐怕只有这个了。当天比较晚了,因此没有进一步分析,只是让纪老师调整了备份策略就去睡觉了。
第二天,贝壳仔细检查了所有的系统日志,找到了真正引发错误的理由。Linux9号错误,原因是因为文件无法访问。可是,究竟为什么造成9号错误呢?又是为什么导致重起后错误不消失,过后错误又莫名消失呢?进一步分析日志找到了这后两个问题的理由,客户重起节点1未完成时,直接重起了节点2。RAC似乎在所有节点同时失效后无法自动重连,即使重起也不行,必须重起客户端。最后按照数据倒推,认定问题在本地磁盘耗尽上。只是开始为了检测数据库备份,执行了 crosscheck,释放了部分磁盘空间,因此查不出来。
从这次事故恢复来说,最大的问题在于客户那里没有人及时进行系统维护,最终导致了磁盘耗尽。因此说做一个系统简单,然而要长期维护系统,恐怕就没这么简单了。

Debian GNU/Linux下安装Oracle 9i

    最近因为工作需要,在Debian GNU/Linux安装了Oracle 9i。Debian代号sarge,版本号release 3.1,testing发行。Oracle代号9ir2,版本号9.2.0.4。安装文件名称为ship_9204_linux_disk1.cpio.gz ship_9204_linux_disk2.cpio.gz ship_9204_linux_disk3.cpio.gz。需要一个补丁,文件名为p3006854_9204_LINUX.zip。Oracle 9i安装的是Enterprise Datebase。
    先执行以下脚本:
#! /bin/bash
 
#变更内核参数
cd /proc/sys/kernel
#1G内存状况,按照需要调整
echo 4294967295 > shmmax
touch /etc/rac_on
 
#增加一个link,debian需要
apt-get install libstdc++-glibc ; 或者使用aptitude
cd /usr/lib
ln -s libstdc++-libc6.2-2.so.3 libstdc++-libc6.1-1.so.2
 
#增加用户
cd /home
mkdir oracle
groupadd dba
useradd -g dba -d /home/oracle -s /bin/bash oracle
#注意-s参数,如果不指定下面的初试化脚本不一定跑的起来
passwd -d oracle
chown -cR oracle:dba oracle
cd /usr
mkdir oracle
chown -cR oracle:dba oracle
cd /var
mkdir oracle
chown -cR oracle:dba oracle
 
#增加初试化脚本
cd /home/oracle
echo "export DISPLAY=”">.bash_profile
echo "export BASH_ENV=$HOME/.bashrc">>.bash_profile
echo "export LD_ASSUME_KERNEL=2.4.1">>.bash_profile
echo "ORACLE_HOME=/usr/oracle; export ORACLE_HOME">>.bash_profile
echo "ORACLE_BASE=/var/oracle; export ORACLE_BASE">>.bash_profile
echo "ORACLE_SID=oracle; export ORACLE_SID">>.bash_profile
echo "ORACLE_TERM=xterm; export ORACLE_TERM">>.bash_profile
echo "TNS_ADMIN=/home/oracle/config/9.0.1; export TNS_ADMIN">>.bash_profile
echo "NLS_LANG=american_america.ZHS16GBK; export NLS_LANG">>.bash_profile
echo "ORA_NLS33=\$ORACLE_HOME/ocommon/nls/admin/data; export ORA_NLS33">>.bash_profile
echo "LD_LIBRARY_PATH=\$ORACLE_HOME/lib;export LD_LIBRARY_PATH">>.bash_profile
echo "PATH=\$PATH:/bin:/usr/bin:/usr/sbin:/etc:/opt/bin:/usr/ccs/bin:/usr/openwin">>.bash_profile
echo "PATH=\$PATH:/opt/local/bin:/opt/NSCPnav/bin:\$ORACLE_HOME/bin">>.bash_profile
echo "PATH=\$PATH:/usr/local/samba/bin:/usr/ucb">>.bash_profile
echo "export PATH">>.bash_profile
echo "CLASSPATH=\$ORACLE_HOME/JRE:\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib">>.bash_profile
echo "CLASSPATH=\$CLASSPATH:\$ORACLE_HOME/network/jlib">>.bash_profile
echo "TMPDIR=/tmp;export TMPDIR">>.bash_profile
echo "umask 022">>.bash_profile
 
    然后,复制oracle安装程序到用户目录,执行以下脚本:
#! /bin/bash
cd /home/oracle
gunzip -dc ship_9204_linux_disk1.cpio.gz | cpio -idv –quiet &
gunzip -dc ship_9204_linux_disk2.cpio.gz | cpio -idv –quiet &
gunzip -dc ship_9204_linux_disk3.cpio.gz | cpio -idv –quiet &
#使用补丁p3006854_9204_LINUX.zip
cd /home/oracle/patch
unzip p3006854_9204_LINUX.zip
cd 3006854
chmod 755 rhel3_pre_install.sh
./rhel3_pre_install.sh
cd ..
rm p3006854_9204_LINUX.zip
rm -R 3006854
cd /home/oracle
rm ship_9204_linux_disk2.cpio.gz
rm ship_9204_linux_disk1.cpio.gz
rm ship_9204_linux_disk3.cpio.gz
cd ..
chown -cR oracle:dba oracle
 
 
    最后检查临时盘大小大于400M,交换区大小大于两倍内存。
df -hT
    重新登录,使用oracle。
startx
    Xwindows启动后开一个console,运行以下指令。
cd Disk1
./runInstaller
 
谢谢观赏