SuperTaoer::Thanksgiving

李白斗酒诗百篇,鲁迅文章不离烟。我吸烟喝酒,既没有李白的诗情画意,也没有鲁迅的行云流水。

九月 30, 2007

安装mysql4.0.x joomla1.5RC2下的yvcomment插件小记…

文章类别: 程序 技术 — SuperTaoer @ 10:11 pm

安装mysql4.0.x joomla1.5RC2下的yvcomment插件小记…

首先用zip方式从本地上传安装,不成功~~~发现是权限问题…
需要将网页目录下的如下几个目录修改为777权限:

  1. tmp/
  2. components/
  3. administrator/components/
  4. language/
  5. administrator/language/
  6. plugins/
  7. cache/

如果你能用ssh进入服务器的shell模式,也可以这样直接修改:

  1. chmod -R 777 tmp/
  2. chmod -R 777 components/
  3. chmod -R 777 administrator/components/
  4. chmod -R 777 language/
  5. chmod -R 777 administrator/language/
  6. chmod -R 777 plugins/
  7. chmod -R 777 cache/

修改好了,上传依然不成功,这次报告错误是 CREATE TABLE xxxxx (LIKE ….) 这个sql语句有错误…
于是乎上网搜索,得知,CREATE TABLE *** (LIKE ***)是myql4.1以上版本才有的功能,我这个mysql4.0用户当然无福消受了啊~~~
于是打开安装文件:
也就是你从网站下载后解压缩的:www/administrator/components/com_yvcomment/install.com_yvcomment.php
这个文件,找到如下代码:

  1. $query = 'CREATE TABLE #__yvcomment (LIKE #__content)';

修改成:

  1. //$query = 'CREATE TABLE #__yvcomment (LIKE #__content)';
  2. $FromTableName   = $db->replacePrefix('#__content');
  3. $FromTableResult = $db->getTableCreate(array($FromTableName));
  4. $query           = str_replace($FromTableName, $TableName, $FromTableResult[$FromTableName]);

再安装,成功了….真tmd不容易…
好事儿多磨啊~~~接着打算试用下这个功能,先打算再后台设置下,好了…紧接着麻烦又来了,提示我:
Fatal error: Undefined class name ‘joutputfilter’ in /html/joomlatest/plugins/content/yvcomment.php on line 124

没办法,在整个目录搜索joutputfilter这个关键字,呵呵,在CHANGELOG搜索到了如下内容:
17-Jul-2007 Johan Janssens
^ Changed template _system directory to system for consistency reasons
+ Added storage parameter to JFactory::getCache to allow different stores to be used
^ Renamed JOutputFilter classname to JFilterOutput to adhere to naming conventions
^ Renamed JInputFilter classname to JFilterInput to adhere to naming conventions

其中第四行就说把JOutputFilter这个类名已经重命名为:JFilterOutput
靠,难怪搜索不到,于是乎改呗,这个问题需要修改的有两个文件
www/components/com_yvcomment/controller.php
搜索到:

  1. $url = JOutputFilter::ampReplace( $url );

修改成:

  1. //$url = JOutputFilter::ampReplace( $url );
  2. $url = JFilterOutput::ampReplace( $url );

www/plugins/content/yvcomment.php
搜索到:

  1. $url = JOutputFilter :: ampReplace($url);

修改成:

  1. //$url = JOutputFilter :: ampReplace($url);
  2. $url = JFilterOutput :: ampReplace($url);

重新安装~~~
再进入后台,没问题,设置允许评论的单元和分类…成功
再去前台发个评论试试看,也没问题…发出去了,后台也看到了…
hoho~~~安装成功,使用成功…

顺便提供下载 :)
yvCommentComponent_v1.05.000_chinese_utf-8_forMysql4.0And1.5RC2.zip
yvCommentPlugin_v1.05_chinese_utf-8_forMysql4.0And1.5RC2.zip



八月 1, 2007

mysql服务器my.cnf文件的权限问题。

文章类别: 程序 技术 — SuperTaoer @ 11:31 am

今天启动mysql服务的时候,其中一个端口正常,另外一个端口则显示:
warning: World-writeable config file /etc/my2.cnf is ignored
然后也能启动。。。

后来仔细观察,发现了两个my.cnf的权限不一样,按照my1.cnf的权限修改为755
重启,好了,错误提示没有了。。。
就是这么简单~~~

七月 30, 2007

Linux架设ntp时间服务器并且进行同步

文章类别: 程序 技术 — SuperTaoer @ 5:38 pm

首先,你可以从这里下载一个时间服务器的tar.gz包:
support.ntp.org/bin/view/Main/WebHome

参考:
大部分都参考了这里:鳥哥的 Linux 私房菜 — NTP 時間伺服器

客户端和服务端安装一样,解开tar包,
#./configure –prefix=/usr/local/ntp && make && make install && make clean

好了,进入你的/usr/local/ntp/bin目录下,你会发现如下几个文件:
ntpd ntpdate ntpdc ntp-keygen ntpq ntptime ntptrace ntp-wait sntp tickadj
其中有几个是待会儿需要用到的。。。

好了,接下来进行第一步:
设定ntp服务端的配置文件: /etc/ntp.conf
ntp.conf里主要可以使用如下几个命令:restrict,server,driftfile,keys
其中server是设定上级时间服务器用的,而restrict是设定哪台服务器可以和ntp server进行时间同步,具有什么样的权限。driftfile是用来指定记录时间差异的文件,keys是用来指定认证key文件的(这里不用)。

先来看restrict的格式为:
restrict [客户端IP] mask [netmask_IP] [parameter]

客户端IP,就是都是哪几台服务器要和这台ntp server进行同步的ip地址
最后的parameter可以有如下几个参数:
ignore:拒绝连接到ntp server
nomodiy:可以连接到ntp server,但是不能对ntp server进行时间上的修改
noquery:不提供对ntp server查询时间,也就是拒绝和ntp server进行时间同步
notrap:不提供 trap 远程登录功能(这个我不是很明白)
notrust:对没有认证的客户端不提供服务

如果在配置的时候parameter没有填写,则默认表示允许进行同步。

现在比如想让自己网内的服务器同步,拒绝网外的,那么ntp.conf这部分可以写成:

  1. #权限设置
  2. restrict default nomodify notrap noquery               #默认拒绝所有来源的任何访问
  3. restrict 127.0.0.1   mask 255.0.0.0                      #开放本机的任何访问
  4. restrict 192.168.0.0 mask 255.255.255.0 nomodify  #开放本网段的可查询访问
  5. restrict 192.168.0.11 mask 255.255.255.0 nomodify #限制单个IP,限制了局域网内192.168.0.11这台服务器可以执行除修改外的访问

好了,restrict就算完成了,接下来看server命令部分。
server命令的格式是:
server [IP or hostname] [prefer]
其中[IP or hostname]为上级时间服务器的IP或者域名,主机名:
可以是192.43.244.18形式,或者time.nist.gov再或者ntpserver这样的形式。
后面的[prefer]参数是可选的,加上prefer后,ntp server和上级时间服务器同步时会优先先访问加了prefer这行的进行同步。

ok,现在设置上级时间服务器在ntp.conf这部分可以写成:

  1. #上级时间服务器设置
  2. server time.nist.gov prefer  #优先使用time.nist.gov和上级时间服务器同步
  3.  
  4. #原本内定的一个内部时间数据,不需要更动他
  5. server  127.127.1.0     # local clock
  6. fudge   127.127.1.0 stratum 10

ok,接下来,来看driftfile命令,driftfile格式为:
driftfile [ntpd driftfile]
其中[ntpd driftfile]参数为记录日志文件的位置,关于这个文件,有以下几点需要注意:
a.driftfile要使用完整路径,即从/根目录开始的路径
b.给出的必须是一个实体文件,不能是软链接,硬链接等这样的文件
c.ntpd要对其有可读可写的权限
d.该档案所记录的数值单位为:百万分之一秒 (ppm)

关于这个命令的作用,有如下解释:
因为预设的 NTP Server 本身的时间计算是依据 BIOS 的芯片震荡周期频率来计算的,但是这个数值与上层 Time Server 不见得会一致啊!所以 NTP 这个 daemon (ntpd) 会自动的去计算我们自己主机的频率与上层 Time server 的频率,并且将两个频率的误差记录下来,记录下来的档案就是在 driftfile 后面接的完整档名当中了!
driftfile 后面接的档案会被 ntpd 自动更新,所以他的权限一定要能够让 ntpd 写入才行。在 CentOS 4.x 预设的 NTP 服务器中,使用的 ntpd 的 owner 是 ntp ,这部份可以查阅 /etc/sysconfig/ntpd 就可以知道啦!
PS,解释这段完全照抄的。。。

那么在ntp.conf中,driftfile这部分写成:

  1. driftfile /var/lib/ntp/drift
  2. broadcastdelay  0.008

最后,关于keys,先来解释下:
除了以 restrict 来限制客户端的联机之外,我们也可以透过金钥系统来给客户端认证, 如此一来可以让主机端更放心了。不过在这个章节里面我们暂不讨论这个部分, 有兴趣的朋友可以参考 ntp-keygen 这个指令的相关说明喔!
PS,解释这段完全照抄的。。。

keys这段在ntp.confi中设定格式为:
keys [key_file]
后面的key_file就是key文件的位置了。。。这里咱们不用。。。
默认的写成:

  1. keys /etc/ntp/keys

执行:
#mkdir /etc/ntp
#touch /etc/ntp/keys

综合以上4块儿,最后的ntp.conf文件就是这样子的。。。

  1. restrict default nomodify notrap noquery
  2. restrict 127.0.0.1   mask 255.0.0.0
  3. restrict 192.168.0.0 mask 255.255.255.0 nomodify
  4.  
  5. server time.nist.gov prefer
  6. server 127.127.1.0
  7. fudge 127.127.1.0 stratum 10
  8.  
  9. driftfile /var/lib/ntp/drift
  10. broadcastdelay  0.008
  11.  
  12. keys /etc/ntp/keys

ok,保存吧。。。

ntp用的是udp的123端口,接下来,开启防火墙规则允许ntp对外服务器。

接下来,来开启ntp服务运行试试看。。。执行:
#/usr/local/ntp/bin/ntpd

来看看服务了没?执行:
#netstat -tlunp
如果显示出类似于下面的dd,说明成功了哈。
Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name
udp 0 0 192.168.0.254:123 0.0.0.0:* 15118/ntpd
udp 0 0 127.0.0.0:123 0.0.0.0:* 15118/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 15118/ntpd
udp 0 0 :::123 :::* 15118/ntpd

参考文档说可以用ntpstat查看ntp当前运行的状态。
但是我在/usr/local/ntp/bin 目录下并没有发现有这个文件。。。
执行后效果是这样的。。。
#ntpstat
synchronised to NTP server (220.130.158.71) at stratum 3
time correct to within 495 ms
polling server every 64 s
# 这个指令可以列出我们的 NTP 服务器有跟上层联机否。由上述的输出结果可以知道,
# 时间有校正约 495 * 10^(-6) 秒,且每格 64 秒会主动去更新时间喔!

也罢,先跳过这个。。。接着下面。。。
ntptrace,这个命令则可以列出目前我们的NTP服务器与上层NTP服务器彼此之间的关系。
#/usr/local/ntp/bin/ntptrace -n 127.0.0.1

我晕,报出了下面的错误。。。
Can’t exec “ntpq”: No such file or directory at /usr/local/ntp/bin/ntptrace line 29.
failed to start command ntpq -n -c rv 127.0.0.1: No such file or directory at /usr/local/ntp/bin/ntptrace line 29.

#whereis ntpq
ntpq:
汗,找不到。。。再:
#ls /usr/local/ntp/bin/
确实有ntpq这个文件。。。
感觉应该是找不到ntpq这个dd,看来要给ntpq指定目录,或者在/usr/local/bin 目录下建立ntp的软链接。。。

#ln -s /usr/local/ntp/bin/ntpq /usr/local/bin/ntpq
然后再执行:
#/usr/local/ntp/bin/ntptrace -n 127.0.0.1
127.0.0.1: stratum 11, offset 0.000000, synch distance 0.010981
这下正常显示了。。。呵呵。。。

接下来。。。使用ntpq命令:
#/usr/local/ntp/bin/ntpq -p
显示如下:
remote refid st t when poll reach delay offset jitter
========================================================
time.nist.gov .ACTS. 1 u 1606 1024 22 357.845 334.375 71.122
*LOCAL(0) .LOCL. 10 l 11 64 377 0.000 0.000 0.001

这个 ntpq -p 可以列出目前我们的 NTP 与相关的上层 NTP 的状态,上头的几个字段的意义为:
remote:亦即是 NTP 主机的 IP 或主机名称啰~注意最左边的符号, 如果有『+』代表目前正在作用当中的上层 NTP ,如果是『*』代表也有连上线,不过是作为次要联机的 NTP 主机。
refid:参考的上一层 NTP 主机的地址
st:就是 stratum 阶层啰!
when:几秒钟前曾经做过时间同步化更新的动作;
poll:下一次更新在几秒钟之后;
reach:已经向上层 NTP 服务器要求更新的次数
delay:网络传输过程当中延迟的时间,单位为 10^(-6) 秒
offset:时间补偿的结果,单位与 10^(-6) 秒
jitter:Linux 系统时间与 BIOS 硬件时间的差异时间, 单位为 10^(-6) 秒。
事实上这个输出的结果告诉我们,时间真的很准了啦!因为差异都在 0.0001 秒以内, 可以符合我们的一般使用了。另外,你也可以检查一下你的 BIOS 时间与 Linux 系统时间的差异, 就是 /var/lib/ntp/drift 这个档案的内容,就能了解到咱们的 Linux 系统时间与 BIOS 硬件时钟到底差多久?单位为 10^(-6) 秒啦!
PS:上面这段也是纯抄的~~~

好了,再来执行:
#cat /var/lib/ntp/drift
0.000
这么说这个文件也能被写入。。。没啥问题。。。

接下来,就是客户端和服务器端进行同步了哈。。。
同样的,客户端也需要编译安装ntp,这个和开始一样。。。

安装后,如下执行:
#/usr/local/ntp/bin/ntpdate 192.168.0.133
其中的192.168.0.133就是你ntp server的ip哈。。。

我倒~~~
又报错儿了~~~
30 Jul 16:43:07 ntpdate[31077]: no server suitable for synchronization found
把错误放在网上查,一般的都是说ntp server在启动后的5-15分钟内不提供服务,所以才会给出这样的提示。。。
可是我这么一边配置一边写。。。也过了15分钟了啊。。。既然是不提供服务,那么有没有可能是防火墙呢?
上了服务端一看防火墙配置。。。我汗。。。应该是123:udp我写成udp:123了。。。修改,重启防火墙和服务。。。
再次进行测试。。。
#/usr/local/ntp/bin/ntpdate 192.168.0.133
显示:
30 Jul 16:56:38 ntpdate[32752]: adjust time server 192.168.0.198 offset 0.000332 sec

哈哈。。。成功了。。。
设定为自动调整,你还可以把上面的命令加入到crontab中。。。
比如:/usr/local/ntp/bin/ntpdate 192.168.0.198 ; /sbin/hwclock -w
ntpdate和hwclock配合使用。。。
先进行同步,然后在把时间写入BIOS,这样即使重启服务器也不会时间失效。。。

在服务端再把
/usr/local/ntp/bin/ntpd &
加入到/etc/rc.local中。。。呵呵。。。

hoho~~~搞定,收工!!!

七月 23, 2007

Linux下监测网卡流量的两款软件

文章类别: 程序 技术 — SuperTaoer @ 5:38 pm

Linux下检测网卡流量的两款软件,
其一是:nload
另外一个就是:iftop

这两个软件的安装方法都很简单,从以上网址下载下来后,
安装nload:

  1. ./configure --prefix=/usr/local/nload && make && make install

安装iftop:

  1. ./configure --prefix=/usr/local/iftop && make && make install

这样就好了,然后你就可以执行如下命令来监测网卡流量了:
nload是:

  1. #/usr/local/nload/bin/nload

iftop是:

  1. #/usr/local/iftop/sbin/iftop

一般的服务器都会有内网和外网两块网卡,nload默认的是eth0网卡,如果你想监测eth1网卡的流量:
那么

  1. #/usr/local/nload/bin/nload eth1

这样即可。
nload默认分为上下两块:上半部分是:Incoming也就是进入网卡的流量,下半部分是:Outgoing,也就是从这块网卡出去的流量,每部分都有当前流量(Curr),平均流量(Avg),最小流量(Min),最大流量(Max),总和流量(Ttl)这几个部分,看起来还是蛮直观的。
另外,你也可以自己定义流量数值显示的单位 #/usr/local/nload/bin/nload –help
就可以看到具体的相关参数了。

下面再来说下iftop
iftop默认也是监测eth0网卡的流量,如果你想要监测eth1这块网卡,则需要加-i+eth1来指定网卡,也就是这样:

  1. #/usr/local/iftop/sbin/iftop -i eth1

iftop显示的也很直观,样子和操作有些像top命令。
在iftop的图表中最后有三列流量的数值显示,
其中第一列的意思是:在之前两秒钟的平均流量
第二列的意思是:在之前10秒钟一共的流量
最后一列的意思是:在之前的40秒钟五分之一的流量数值
大约是这个意思,具体的限于本人英文不好,下面贴出man page的英文:
Display:
When running, iftop uses the whole screen to display network usage. At the top of the display is a logarithmic scale for the bar graph which gives a visual indication of traffic.

The main part of the display lists, for each pair of hosts, the rate at which data has been sent and received over the preceding 2, 10 and 40 second intervals. The direction of data flow is indicated by arrows, <= and =>. For instance,

  1. foo.example.com  =>  bar.example.com      1Kb  500b   100b
  2.                  <=                       2Mb   2Mb   2Mb

shows, on the first line, traffic from foo.example.com to bar.example.com; in the preceding 2 seconds, this averaged 1Kbit/s, around half that amount over the preceding 10s, and a fifth of that over the whole of the last 40s. During each of those intervals, the data sent in the other direction was about 2Mbit/s. On the actual display, part of each line is inverted to give a visual indication of the 10s average of traffic. You might expect to see something like this where host foo is making repeated HTTP requests to bar, which is sending data back which saturates a 2Mbit/s link.
By default, the pairs of hosts responsible for the most traffic (10 second average) are displayed at the top of the list.

At the bottom of the display, various totals are shown, including peak traffic over the last 40s, total traffic transferred (after filtering), and total transfer rates averaged over 2s, 10s and 40s.

hoho~~~哪位英文好的高人帮忙翻译下?先谢了 :)

要监测网卡流量,基本以上的dd就够用了吧?

另外还可以参考以下几个地方使用:
Linux看网卡流量的命令
这里面介绍了几个iftop命令的参数示例,也挺有用的。。。
iftop的man page

七月 22, 2007

linux 用tar命令打包一个时间点之后的文件

文章类别: 程序 技术 — SuperTaoer @ 3:51 am

比如你想用tar命令打包/tmp目录下2007年3月20日之后的文件
则命令为:

  1. tar --after-date="2007-03-20 23:59:59" -zcvf tmp_after20070320.tar.gz /tmp/*

这个对于增量备份似乎有些用处,不过从程序的角度来说,还是将上传的附件之类的dd按照应用和年/月/日来划分比较恰当,容易管理些。

六月 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一样随系统自启动的朋友不吝赐教 :)

五月 21, 2007

[转]破解淘宝宝贝图片的js代码

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

代码部分均转自:
blog.csdn.net/wqf2/archive/2007/04/10/1559216.aspx

这里可以测试效果效果
获得淘宝网站的宝贝图片真实地址。

(more…)

四月 21, 2007

asp实现UNIX时间戳功能

文章类别: 程序 技术 — SuperTaoer @ 2:15 am

今天要做asp和php的同步问题,标识是一个unix时间戳。。。
php就不用说了。。。
关键到asp的时候,找到asp手册。。。时间函数。。。
没有直接的UNIX时间戳的功能,最后锁定在了datediff函数。。。
用当前的时间,减去1970年1月1日。。。得出的秒数,就是UNIX时间戳了。。。

  1. utime  = DateDiff("s", "1970-1-1 8:00:00", Now())

为什么不是”1970-1-1 00:00:00″ 而是 “1970-1-1 8:00:00″呢?
我刚开始也不知道,就是在windows和linux下的时间戳总是相差8小时。。。
后来明白了。。。8小时。。。不正是时区的一个时间么?
于是乎。。。。。。

« 前一页下一页 » 


本站使用 WordPress架设