SuperTaoer::Thanksgiving

不论什么情况,当你决定了,就不要再留有机会,值得留恋的以后还会在一起,至于不值得的,也就不带走什么了。

六月 28, 2007

太阳和草的对话~~~

文章类别: 我,就TMD一俗人!!! — SuperTaoer @ 3:52 pm

太阳给草打电话
太阳:“喂,草你吗,我日。”
草:“我草,你谁啊?”
太阳:“我日啊!”
草:“我草,你到底谁啊?!”
太阳:“我日啊,你草吧?”
草:“TMD,你到底是谁啊,我草!”
太阳:“我日,我日啊!”
草:“我草!!!”
这时,太阳的妈妈接过电话:“我日他妈呀,你是草吧,草你妈呢?”



六月 26, 2007

mysql4.0.x的增量备份脚本

文章类别: 程序 技术 — SuperTaoer @ 12:47 am

mysql 4.0实现增量备份的功能。。。

首先,在mysl调用的配置文件(my.cnf)中打开binlog选项,即加入:
log-bin

然后重启mysql数据库使设置生效。

接下来,就是编写脚本进行测试,脚本参考网上的mysq4.1实现备份功能的说明。

脚本分为两个部分,一个是全部备份的脚本,另外一个是增量备份的脚本。

先来看全部备份的脚本,比较简单,就是用mysqldump命令完成的。。。。

  1. #!/bin/sh
  2.  
  3. # mysql data backup script
  4. # use mysqldump --help,get more detail.
  5. #
  6.  
  7. #db config
  8. DBHOST=localhost
  9. DBUSER=dbuser
  10. DBPASS=dbpass
  11. DBPORT=3306
  12. DBSOCK=/tmp/mysql.$DBPORT.sock
  13.  
  14. #backup config
  15. BakDir=/dbbak/mysql/$DBPORT
  16. LogFile=/dbbak/mysql/$DBPORT/mysqlbak.$DBPORT.log
  17.  
  18. DATE=`date +%Y%m%d`
  19.  
  20. echo " " >> $LogFile
  21. echo " " >> $LogFile
  22. echo "-------------------------------------------" >> $LogFile
  23. echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
  24. echo "--------------------------" >> $LogFile
  25.  
  26.  
  27. cd $BakDir
  28.  
  29. DumpFile="$DBPORT\_$DATE.sql"
  30. GZDumpFile=$DBPORT"_"$DATE".sql.gz"
  31.  
  32.  
  33. /usr/local/mysql/bin/mysqldump -u"$DBUSER" -p"$DBPASS" -P"$DBPORT" -h"$DBHOST" -S"$DBSOCK" --quick --all-databases --flush-logs --delete-master-logs --lock-tables | gzip -f > $GZDumpFile
  34.  
  35. echo "Dump Done" >> $LogFile
  36.  
  37. echo "[$DumpFile]" >> $LogFile
  38. echo "[$GZDumpFile]Backup Success!" >> $LogFile
  39.  
  40. #delete previous daily backup files:采用增量备份的文件,如果完整备份后,则删除增量备份的文件.
  41. #if use full dump, after backup delete all previous daily file
  42. cd $BakDir/daily
  43.  
  44. rm -rf ./*
  45.  
  46. cd $BakDir
  47.  
  48. echo "Backup Done!"
  49.  
  50. echo "please Check $BakDir Directory!"
  51.  
  52. echo "copy it to your local disk or ftp to somewhere !!!"
  53.  
  54. ls -alh $BakDir

好了,测试下吧,一般的都不会出什么问题的。
接下来,来看增量备份的脚本。
增量备份的脚本实际上就是从启用了log后的每次所做修改的备份。

  1. #!/bin/sh
  2.  
  3. #db config
  4. DBHOST=localhost
  5. DBUSER=dbuser
  6. DBPASS=dbpass
  7. DBPORT=3306
  8. DBSOCK=/tmp/mysql.$DBPORT.sock
  9.  
  10. #
  11. # mysql binlog backup script
  12. #
  13.  
  14. /usr/local/mysql/bin/mysqladmin -u"$DBUSER" -p"$DBPASS" -P"$DBPORT" -h"$DBHOST" -S"$DBSOCK" flush-logs
  15.  
  16. DATADIR=/db/mysql/$DBPORT/data
  17. BAKDIR=/dbbak/mysql/$DBPORT/daily
  18.  
  19. ###如果你做了特殊设置,请修改此处或者修改应用此变量的行:缺省取机器名,mysql缺省也是取机器名
  20. HOSTNAME=`uname -n`
  21. HOSTNAME=`echo "$HOSTNAME"|awk -F '.' '{print $1}'`
  22.  
  23. cd $DATADIR
  24.  
  25. FILELIST=`cat $HOSTNAME-bin.index`
  26.  
  27. ##计算行数,也就是文件数
  28. COUNTER=0
  29. for file in $FILELIST
  30. do
  31. COUNTER=`expr $COUNTER + 1 `
  32. done
  33.  
  34. NextNum=0
  35. for file in $FILELIST
  36. do
  37. base=`basename $file`
  38. NextNum=`expr $NextNum + 1`
  39. if [ $NextNum -eq $COUNTER ]
  40. then
  41. echo "skip lastest"
  42. else
  43. dest=$BAKDIR/$base
  44. if(test -e $dest)
  45. then
  46. echo "skip exist $base"
  47. else
  48. echo "copying $base"
  49. cp $base $BAKDIR
  50. fi
  51. fi
  52. done
  53.  
  54. echo "backup mysql binlog ok"

以上就是增量备份的脚本了。。。上面的两个脚本都是从mysql4.1备份脚本修改过来的。。。
需要注意的是:
在mysql4.1版本中,mysqldump命令有 可能会有lock-all-tables 这个参数,在但是mysql4.0中是 lock-tables 参数
在mysql4.1版本中,mysql生成增量文件名可能是: yourhostname-bin.index
例如你的hostname是: localhost.mysql.server
那么增量文件名就是: localhost.mysql. server-bin.index
但是在mysql4.0版本中却是 localhost-bin.index
即hostname中的第一部分,所以如果mysql版本是4.1
可以将 HOSTNAME=`echo “$HOSTNAME”|awk -F ‘.’ ‘{print $1}’` 省略。。。
上面之所以用可能,是因为我没有用过mysql4.1 版本,并且脚本是从mysql4.1的备份修改而来。

现在进行测试,先建立一个测试的数据库,然后再建立一个测试的表,向里面插入几条记录。。。
好了。。。试着先执行你的全部备份文件,然后再插入几条记录,这个时候,再执行你的增量备份文件。。。
接下来。。。试着从你的数据库中删除数据。。。
现在就该用咱们的增量备份来恢复刚才删除的数据了。。。

从二进制的增量备份中恢复数据,使用mysql的mysqlbinlog命令,
进入到你的备份目录,执行。。。

  1. /usr/local/mysql/bin/mysqlbinlog ./daily/* | /usr/local/mysql/bin/mysql -uroot -p -P3306 -localhost -S/tmp/mysql.3306.sock yourdatabasename

现在再看看,删除的数据是不是又回来了?
针对于次,各位还可以进行脚本的扩展。。。这个就要靠自己举一反三了。。。

六月 11, 2007

将WebLucene中的lucene部分升级到2.1

文章类别: 程序 技术 — SuperTaoer @ 4:41 pm

将WebLucene中的lucene部分升级到2.1

目前升级失败,原因是车东的SAXIndexer.java文件中调用Field类的实例化方法并不能在lucene的Field.java中并不能找到相应的构造函数。。。希望知道解决方法的朋友可以指导我一下。。。

首先编译java环境和resin,怎么搞,可以参考我的:
www.taoer.com/2005/12/31/linux-lamp-lucene-server-awstats/

但是。。。麻烦遇到了。。。
解压缩lucene-2.1.0-src.tar.gz
找到lucene-2.1.0/src/java/org
这个目录下面的dd就是待会儿咱们需要覆盖的dd了哈。。。
还是先将weblucene解压缩到/usr/local/resin/webapps
因为对java的build不甚了解,也不知道是替换哪个目录的文件,所以就将所有含有org/apache/lucene的全部替换成新的lucene2.1吧。。。
进入weblucene的目录,
#find ./ apache | grep apache
发现共有如下两个目录需要替换
./webapp/WEB-INF/src/org/apache
./webapp/WEB-INF/build/org/apache
然后将lucene的包解压缩覆盖到weblucene的上面的两个目录吧。
如果想把原来weblucene的自带的lucene部分进行备份,建议备份到weblucene的目录之外,
似乎build的时候会build所有子目录。。。所以可能会出现class重复的报错儿。。。
#rm -rf ./org
#cp -R /root/sss/lucene-2.1.0/src/java/org ./
#rm -rf ./org
#cp -R /root/sss/lucene-2.1.0/src/java/org ./

然后执行退到/usr/local/resin/webapps目录
配置build,具体如何配置,可以参考这里:
www.taoer.com/2005/12/31/linux-lamp-lucene-server-awstats/ 的配置build的部分
接着执行
#ant build
好么。。。报告了一大堆错误~~~

Buildfile: build.xml

init:
[echo] ———– WebLucene 0.5 [2003 -2004] ————

javacc_check:

javacc:

prepare-src:
[copy] Copying 13 files to /usr/local/resin/webapps/webapp/WEB-INF/build

build:
[javac] Compiling 229 source files to /usr/local/resin/webapps/webapp/WEB-INF/classes
[javac] /usr/local/resin/webapps/webapp/WEB-INF/build/org/apache/lucene/search/spans/NearSpansOrdered.java:163: warning: as of release 1.4, assert is a keyword, and may not be used as an identifier
[javac] assert (subSpansByDoc[i].doc() == maxDoc)
[javac] ^
[javac] /usr/local/resin/webapps/webapp/WEB-INF/build/org/apache/lucene/search/spans/NearSpansOrdered.java:164: ‘;’ expected
[javac] : ” NearSpansOrdered.toSameDoc() spans ” + subSpansByDoc[0]
[javac] ^
[javac] /usr/local/resin/webapps/webapp/WEB-INF/build/org/apache/lucene/search/spans/NearSpansOrdered.java:180: warning: as of release 1.4, assert is a keyword, and may not be used as an identifier
[javac] assert spans1.doc() == spans2.doc() : “doc1 ” + spans1.doc() + ” != doc2 ” + spans2.doc();
[javac] ^
[javac] /usr/local/resin/webapps/webapp/WEB-INF/build/org/apache/lucene/search/spans/NearSpansOrdered.java:180: ‘;’ expected
[javac] assert spans1.doc() == spans2.doc() : “doc1 ” + spans1.doc() + ” != doc2 ” + spans2.doc();
[javac] ^
[javac] /usr/local/resin/webapps/webapp/WEB-INF/build/org/apache/lucene/search/spans/NearSpansOrdered.java:247: warning: as of release 1.4, assert is a keyword, and may not be used as an identifier
[javac] assert prevStart <= matchStart;
[javac] ^
[javac] /usr/local/resin/webapps/webapp/WEB-INF/build/org/apache/lucene/search/spans/NearSpansOrdered.java:247: ';' expected
[javac] assert prevStart <= matchStart;
[javac] ^
[javac] 3 errors
[javac] 3 warnings

BUILD FAILED
/usr/local/resin/webapps/build.xml:134: Compile failed; see the compiler error output for details.

看了看。。。上网上搜了一下。原来是需要jdk1.5的环境。。。
那么就把java升级到1.5,顺便resin升级到3.1吧。。。
其中编译jdk1.5和resin3的时候遇到了一些小麻烦
我是这么解决的:
www.taoer.com/2007/06/08/java-jdk-resin-install-note/

(more…)

六月 8, 2007

jdk1.5+resin3的安装小记

文章类别: 程序 技术 — SuperTaoer @ 2:58 pm

今天由于工作需要,需要在服务器上配置jdk1.5和resin3或者jdk1.5+tomcat5的环境,但是由于偏爱的原因,
选择了jdk1.5+resin3。。。。。。

下载就不用说了。。。
cn.sun.com 下载jdk1.5
www.caucho.com/download 下载 resin3.1.0

安装jdk1.5

  1. #chmod 700 ./jdk-1_5_0_11-linux-i586.bin
  2. #./jdk-1_5_0_11-linux-i586.bin

按照提示安装即可

看了下官方的文档
基本的安装和resin2基本都是一样的。。。。

编译resin:
如果你要将resin安装在/usr/local下

  1. cd /usr/local
  2. tar zxvf resin-pro-3.1.0.tar.gz
  3. mv resin-pro-3.1.0 resin
  4. cd resin
  5. ./configure --prefix=/usr/local/resin --with-apache=/usr/local/apache2 --with-openssl=/usr/local/openssl && make && make install

编译好resin后
做一些准备工作来让resin启动起来

resin的环境在上面配置java的时候已经一起给加上去了。
如果要让resin随系统自动运行
你需要做如下的操作

  1. cp contrib/init.resin /etc/rc.d/
  2. chmod +x /etc/rc.d/init.resin

下面修改你的 init.resin
找到文件中

  1. start)
  2. echo -n "Starting resin: "
  3. if test -n "$USER"; then
  4. su $USER -c "$EXE -pid $PID start $ARGS"
  5. else
  6. $EXE -pid $PID start $ARGS
  7. fi

在后面加入

  1. sleep 15

在这个时候问题出现了。。。
执行 /etc/rc.d/init.resin start 会提示如下信息:

  1. Starting resin: unknown argument '-pid'
  2.  
  3. usage: java -jar resin.jar [-options] [start | stop | restart]
  4.  
  5. where options include:
  6.    -conf <file>       select a configuration file
  7.    -resin-home <dir>  select a resin home directory
  8.    -root-directory <dir>  select a root directory
  9.    -server <id>   select a <server> to run
  10.    -verbose       print verbose starting information

然后查看了一下源代码发现:

  1. start)
  2.         echo -n "Starting resin: "
  3.         if test -n "$USER"; then
  4.           su $USER -c "$EXE -pid $PID start $ARGS"
  5.         else
  6.           $EXE -pid $PID start $ARGS
  7.         fi
  8.         echo
  9.         ;;
  10.   stop)
  11.         echo -n "Shutting down resin: "
  12.         $EXE -pid $PID stop
  13.         echo
  14.         rm -f $PID
  15.         ;;

这里面都有个参数-pid,感觉应该和-pid有问题吧,没有深究,改为另外一种启动方法测试:

  1. #/usr/local/resin/bin/httpd.sh start

显示:
Resin/3.1.0 started -server ”.
OK,启动成功。。。
但是在停止服务的时候,第一次出现了。。。
Resin/3.1.0 can’t stop -server ”.
java.lang.IllegalStateException: Can’t connect to ResinWatchdogManager.
java.net.ConnectException: 127.0.0.1:6600/watchdog: Connection refused
这样的错误提示。。。
随后就没有了。。。

设置成系统自动启动:
在/etc/rc.local中加入
/usr/local/resin/bin/httpd.sh start &

这种方法启动仍然不行,似乎是由于加载java环境的缘故吧,这个也是上面的脚本需要加sleep 15的原因。

OK,配置完成。。。

接下来看虚拟主机如何配置
resin2和resin3的配置虚拟主机也有一点小小的不同:

  1. <host id='www.xxx.com' root-directory=".">
  2.     <web-app id='/' app-dir='/html/xxx/www'>
  3.     </web-app>
  4. </host>

ok,这样一个简单的虚拟主机站点目录就配置好了。。。
其他的问题,目前还没有遇到过。。。

——- 更新于 2007年6月8日下午 ——-
今天从sun和resin的网站下载了最新的
jdk-1_5_0_12-linux-i586.bin 和 resin-pro-3.1.1.tar.gz

按照以前的开始编译。。。。
编译resin的时候就出问题了。。。没有在意。。继续。。。
当启动resin服务器的时候。。。麻烦来了。。。

报告 java 不能解释 -jar参数的问题。。。。
然后单独执行java
出现:
Usage: gij [OPTION] … CLASS [ARGS] …
to invoke CLASS.main, or
gij -jar [OPTION] … JARFILE [ARGS] …
to execute a jar file
Try `gij –help’ for more information.
根本就没有java应该有的那些选项。。。
于是查找原因
#whereis java
返回的结果是:java: /usr/bin/java /etc/java /usr/lib/java /usr/share/java
然后
#ll /usr/bin/java
发现
/usr/bin/java -> /etc/alternatives/java
/etc/alternatives/java -> /usr/lib/jvm/jre-1.4.2-gcj/bin/java

/usr/bin/java 是指向 /etc/alternatives/java 的链接
然后/etc/alternatives/java 又是指向 /usr/lib/jvm/jre-1.4.2-gcj/bin/java 的链接。。。
这个时候明白了。。。
先执行
#unlink /usr/bin/java
然后接着执行
ln -s /usr/local/jdk1.5.0_12/bin/java /usr/bin/java
把软链接重新定义。。。
测试成功。。。

接着重新编译resin
#./configure –prefix=/usr/local/resin –with-apache=/usr/local/apache2 –with-openssl=/usr/local/openssl && make && make install
编译的时候会出现一些类似于
make[2]: Entering directory `/usr/local/resin/modules/c/src/resin_os’
mkdir /usr/local/resin/libexec
mkdir: cannot create directory `/usr/local/resin/libexec’: File exists
make[2]: [install] Error 1 (ignored)
cp libresin_os.so /usr/local/resin/libexec
make[2]: Leaving directory `/usr/local/resin/modules/c/src/resin_os’
make[2]: Entering directory `/usr/local/resin/modules/c/src/resin_os’
mkdir /usr/local/resin/libexec
mkdir: cannot create directory `/usr/local/resin/libexec’: File exists
make[2]: [install] Error 1 (ignored)
cp libresin_os.so /usr/local/resin/libexec
make[2]: Leaving directory `/usr/local/resin/modules/c/src/resin_os’
make[1]: Leaving directory `/usr/local/resin/modules/c/src’
这样的错误。。。
因为在解压缩的时候就已经再/usr/local/resin目录解压缩了。。所以会提示File exists,不用去管他

测试启动resin服务器
#/usr/local/resin/bin/httpd.sh start
显示:
Resin/3.1.1 started -server ”.
说明成功了。

剩下的仍然还是自启动的问题。。。。
希望知道如何让resin向apache一样随系统自启动的朋友不吝赐教 :)




本站使用 WordPress架设