日历

« 2008-12-05  
 123456
78910111213
14151617181920
21222324252627
28293031   

统计信息

  • 访问量: 909
  • 日志数: 12
  • 文件数: 1
  • 书签数: 1
  • 建立时间: 2008-02-25
  • 更新时间: 2008-12-04

RSS订阅

我的最新日志

  • 在Linux系统中搭建Apache、Tomcat的过程

    2008-12-04

    接下来安装Tomcat:

    6. http://tomcat.apache.org/index.html 上下载最新版本的Tomcat(Tomcat 6.0.18), 一般是

       下载Binary文件,我下载的是apache-tomcat-6.0.18.tar.gz

    7.     解压文件:

             Shell> cd /home

             Shell>tar –xzvf apache-tomcat-6.0.18.tar.gz   这里假定文件放在/root目录下

        解压成功后就会在/home 目录下生成apache-tomcat-6.0.18目录

     

    8. apache-tomcat-6.0.18中的内容复制到Tomcat目录下:

          Shell> cd /home

          Shell> ln –s apache-tomcat-6.0.18 Tomcat

          这样就会在home目录下生成一个Tomcat目录

     

    9. 配置Tomcat环境变量:

          同样需要修改/etc/profile中的内容:

          Shell> vi /etc/profile

          在文件的末尾加上如下信息:

          CATALINA_HOME=/home/Tomcat

          Export CATALINA_HOME

     

    10. 启动Tomcat:

          Shell> cd /home/Tomcat

          Shell> bin/startup.sh

          则会出现如下消息:

          Using CATALINA_HOME=/home/Tomcat

          Using CATALINA_BASE=/home/Tomcat

          Using JAVA_HOME=/home/JDK/jdk1.6.0_10

     

    11. 测试Tomcat是否安装成功

          打开浏览器,并在地址栏输入: http://localhost:8080

          如果出现Tomcat 的主页面,就表示安装成功了。

     

     

     

     

     

     

     

     

  • 在Linux系统中搭建Apache、Tomcat过程

    2008-12-04

    这2天忙于搭建测试环境,以下是搭建Apache、Tomcat的详细步骤:

    一、安装Apache:

       1.从网上下载Apache: httpd-2.2.10.tar.gz (source file);

           2. 解压httpd-2.2.10.tar.gz的安装包:

         Shell> tar –xzvf http-2.2.10.tar.gz

           3. 编译并安装Apache:

             Shell> cd httpd-2.2.10

             Shell> ./configure --prefix=/usr/local/Apache   配置安装路径

        Shell> make   编译

        Shell> make install   安装

        4.启动apache server:

            Shell> cd /usr/local/Apache

            Shell> bin/apachectl start

            5.  验证apache是否安装成功

        打开浏览器,并在地址栏输入:http://localhost , 如果出现“It Works!,则表明安装成功了。

    二、安装Tomcat:

        安装Tomcat之前必须先安装JDK:

        1.http://java.sun.com/网站上下载JDK(jdk-6u10-linux-i586.bin).

         2. 给文件加上可以执行的权限:

               Shell> Chmod  + X  /home/ jdk-6u10-linux-i586.bin   这里文件放在 /home目录下

     

       3. 执行jdk-6u10-linux-i586.bin,即安装:

          

          Shell>cd  /home/JDK

              

                Shell> ./ jdk-6u10-linux-i586.bin

               在安装的过程中会出现很多协议内容,直接按“Enter”键,直到最后出现“would you

       Like to accept the protocols yes or no;

     输入 yes,系统就开始安装该文件,安装完后在JDK目录下生成一个jdk1.6.0_10的文档。

     

    4.配置环境变量:

     

             修改/etc/profile 文件,直接在shell中修改,过程如下:

             Shell> vi /etc/profile

    打开文件后,按i键,在profile文件的末尾加上如下内容:

    JAVA_HOME=/home/JDK/jdk1.6.0_10

    PATH=$ JAVA_HOME/bin:$PATH

    CLASSPATH=.:$ JAVA_HOME/lib/tools.jar:$ JAVA_HOME/lib/dt.jar

    Export  JAVA_HOME  PATH  CLASSPATH

    Press “ESC” key, 输入“: wq”保存退出

    重新启动计算机.

     

    5. 验证配置环境的正确性:

     

         下面写一个HelloWorld.java的例子来检验环境变量是否正确:

             Shell> vi HelloWorld.java

             在文件中输入以下代码:

             Class HelloWorld

    {

             Public static void main(String arg[])

             {

                       System.out.println(“Hello World in Linux!”);

             }

             }

    Shell> javac HelloWorld.java

    Shell> java HelloWorld

    如果输出以下信息,就表示JDK已经安装成功了:

    Hello World in Linux!

     

           

  • MySql常用命令总结

    2008-11-27

    这2天将MySql的一些常用命令总结了一下,详细信息如下:

    1. 登录MySql:

    shell> mysql '没有密码的情况

    shell> mysql -u username -p password '有密码的情况

    shell> mysql -h hostname -u username -p password ' hostname 表示Mysql的主机名称

    2. 退出MySql:

    shell> quit

    3. 修改密码:

    shell> mysqladmin -u username password newpassword ' 增加密码

    shell> mysqladmin -u username -p oldpwd password newpwd '修改密码

    4. 增加新用户,并给新用户授权:(由于该命令是在Mysql环境下运行的,因此所 有语句后面都要加上“;”

    mysql> grant privileges on database.tables to 'username'@'hostname' identified by password with grant option;

    5. 显示所有的数据库:

    mysql> show databases; ' mysql搭建好后,系统默认有3个数据库: information_schema、test、mysql . mysql库很重要它里面有MYSQL的系统信息,我 们改密码和新增用户,实际上就是用这个库进行操作。

    6. 显示指定数据库中的表:

    mysql> show tables from databasename;

    7. 显示指定表中的列:

    mysql> show columns from tablename from database;

    8. 创建数据库:

    mysql> create database databasename;

    9. 创建数据库中的表:

    mysql> use databasename; mysql> create table tablename(字段定义列表);

    10. 查看表中的记录:

    mysql> select * from tablename; ' 注意要先进入该数据库

    11. 修改表中的数据:

    mysql> update tablename set field=newvalue where field=value;

    12. 删除表中的数据:

    mysql> delete from tablename where field=value;

    13. 删除数据库、表:

    mysql> drop database databasename;

    mysql> drop table tablename;

    14. 备份数据库:(该命令是在shell中运行)

    shell> cd /usr/local/mysql/bin ' 假定mysql安装在local目录下

    shell> mysqldump --opt database > back-file.sql

  • linux系统下搭建MySql的步骤

    2008-11-26

    今天尝试在Linux系统中搭建MySql数据库,经过了几番波折,最终搭建成功,一下是搭建的步骤:

    1.从网上下载解压安装包:MySql-5.0.67-linux-i686-glibc23.tar.gz;

    2.创建mysql组和mysql用户:

      1> shell> groupadd mysql

      2> shell> useradd -g mysql mysql

    3.解压并安装Mysql:

      shell> cd /usr/local  '进入local目录下

      shell> tar -xzvf /tmp/MySql-5.0.67-linux-i686-glibc23.tar.gz '这里安装包放在tmp目录下

      shell> ln -s MySql-5.0.67-linux-i686-glibc23 mysql  '这里做一个链接

    4.添加MySQL配置文件:如果你想要设置一个选项文件,使用support-files目录中的一个作为模板.在这个

      目录中有4个模板文件,是根据不同机器的内存定制的.

      shell> cd mysql

      shell> cp/support-files/my-medium.cnf /etc/my.cnf

    5.设定目录访问权限,用mysql_install_db创建MySQL授权表初始化,并设置mysql,root帐号访问权限:

      shell> chown -R mysql .

      shell> chgrp -R mysql .

      shell> scrīpts/mysql_install_db --user=mysql

      shell> chown -R root .

      shell> chown -R mysql data

      注意:以上“.”不能少,否则会出错。

    6.运行mysql:

      shell> cd bin

      shell> ./mysqld_safe --user=mysql &

      如果运行成功的话,应该会出现类似这样的提示信息:

      [1] 3148

      Starting mysqld daemon with databases from /usr/local/mysql/data

      如果出现 mysql ended这样的语句,表示Mysql没有正常启动,你可以到log中查找问题,Log文件的通常

      在/etc/my.cnf中配置。

    7.为root用户设置密码,因为默认root用户的密码是空的,为了安全你需要修改密码

      shell> cd bin

      shell> mysqladmin -u root password "password"

    8.登录mysql:

      shell> mysql  '没有密码的情况

      shell> mysql -u root -p  '有密码的情况

      Enter password: password

    9.在Mysql服务器中设置用户的访问权限,允许被授权的用户能够从其它机器访问mysql数据库服务器:

      进入mysql:

      mysql> Grant all privileges on *.* to 'root'@'%' identified by 'password'

             with grant option; '*.* 代表database and tables

    10.从其它机器的mysql客户端访问服务器端的mysql数据库:

       在客户端输入以下信息:Mysql服务器IP、username、password、port:3306、databasename

       如果以上信息都正确,点击“确定”后,就可以访问mysql数据库了。

       注意:如果防火墙关闭了3306端口,需要将防火墙关闭。

       shell> /etc/init.d/iptables stop

    11.将mysql设置成自动启动:

       shell> cd /usr/local/mysql

       shell> cp support-files/mysql.server /etc/init.d/mysql

       shell> chmod +X /etc/init.d/mysql

       shell> chkconfig –add mysql

       shell> chkconfig –level 345 mysql on

       这样设置后,每次linux启动时mysql都会自动启动。

  • QTP读取Excel表格中的数据代码

    2008-11-20

    在构建自己的测试框架时,或者是从Excel读入外部数据进行检查时都要用到ExcelCOM对象编程方法,下面脚本中的ReadFile函数就实现了这样的功能,首先创建Excel应用程序对象,然后打开Excel文件,把Excel数据读取到一个数组中。

    '调用函数

    arrRange = ReadFile("D:\data.xls","Sheet1")
    'Msgbox UBound (arrRange,1)
    'Msgbox UBound (arrRange,2)
    '
    读取其中一个单元格的数据
    Msgbox arrRange(1,1)

    ' 输入:
    '             sFileName
    Excel文件
    '             sSheetName
    :表单名称
    '
    返回:
    '            
    包含Excel数据的数组

    Function ReadFile(sFileName,sSheetName)
    Dim oExcel
    Dim oSheet
    Dim oRange
    Dim arrRange

    On Error Resume Next
    '
    创建Excel应用程序对象
    Set ōExcel = CreateObject("Excel.Application")
    If err.Number <> 0 Then
    MsgBox "
    未能初始化Excel" & vbCrLf & _
    "
    请确保Excel已安装", vbCritical
    Exit Function
    End If
    On Error Goto 0

    On Error Resume Next
    '
    打开Excel文件
    oExcel.Workbooks.Open(sFileName)
    If err.Number <> 0 Then
    MsgBox "
    未能加载Excel文件" & vbCrLf & _
    "
    请确保Excel文件路径正确或格式正确", vbCritical
    Exit Function
    End If
    On Error Goto 0
    '
    获取表格的使用范围
    Set ōSheet = oExcel.Worksheets(sSheetName).UsedRange
    '
    获取从A列到Z列,从第1行到第1000行的范围i中的所有值
    Set ōRange = oSheet.Range("A1:Z1000")
    '
    Excel数据转换到数组
    arrRange = oRange.Value
    '
    关闭工作簿
    oExcel.WorkBooks.Item(1).Close
    '
    退出Excel
    oExcel.Quit
    Set ōExcel = Nothing
    '
    返回包含Excel数据的数组
    ReadFile = arrRange
    End Function


     


     

  • Http服务器常见状态代码定义

    2008-10-26

    在测试时常常会遇到服务器返回Http代码为404,500之类的错误信息,现在就将常见的服务器Http返回代码归纳如下:
    1. 成功2xx(Successful 2xx)
    表示客户端请求被成功接收、理解、接受。
    200 OK
    请求成功。回应的信息依赖于请求所使用的方法,如下:
    GET 要请求的资源已经放在回应的实体中了。
    HEAD 没有实体主体,回应中只包括标题信息。
    POST 实体(描述或包含操作的结果)。
    201 Created
    请求完成,结果是创建了新资源。新创建资源的URI可在回应的实体中得到。原始服务器应在发出该状态代码前创建该资源。如果该操作不能立即完成,服务器必须在该资源可用时在回应主体中给出提示,否则,服务器端应回应202(可被接受)。
    在本文定义的方法,只有POST可以创建资源。
    202 Accepted
    请求被接受,但处理尚未完成。请求可能不一定会最终完成,有可能被处理过程随时中断,在这种情况下,没有办法在异步操作中重新发送状态代码。
    202回应是没有义务的,这样做的目的是允许服务器不必等到用户代理和服务器间的连接结束,就可以响应其它过程的请求(象每天运行一次的,基于批处理的过程)。
    在某些回应中返回的实体中包括当前请求的状态指示、状态监视器指针或用户对请求能否实现的评估信息。
    204 No Content
    服务器端已经实现了请求,但是没有返回新的信息。如果客户是用户代理,则勿需为此更新自身的文档视图。该回应主要是为了在不影响用户代理激活文档视图的前提下,进行scrīpt语句的输入及其它操作。该回应还可能包括新的、以实体标题形式表示的元信息,它可被当前用户代理激活视图中的文档所使用。

    2.重定向(Redirection 3xx)
    该类状态码表示用户代理要想完成请求,还需要发出进一步的操作。这些操作只有当后跟的请求是GET或HEAD时,才可由用户代理来实现,而不用与用户进行交互。用户代理永远也不要对请求进行5次以上的重定向操作,这样可能导致无限循环。
    300 Multiple Choices
    该状态码不被HTTP/1.0的应用程序直接使用,只是做为3xx类型回应的缺省解释。存在多个可用的被请求资源。
    除非是HEAD请求,否则回应的实体中必须包括这些资源的字符列表及位置信息,由用户或用户代理来决定哪个是最适合的。
    如果服务器有首选,它应将对应的URL信息存放在位置域(Location field)处,用户代理会根据此域的值来实现自动的重定向。
    301 Moved Permanently
    请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源。有编辑链接功能的客户端会尽可能地根据服务器端传回的新链接而自动更新请求URI。 新的URL必须由回应中的位置域指定。除非是HEAD请求,否则回应的实体主体   (Entity-Body)必须包括对新URL超链接的简要描述。
    如果用POST方法发出请求,而接收到301回应状态码。在这种情况下,除非用户确认,否则用户代理不必自动重定向请求,因为这将导致改变已发出请求的环境。
    注意:当在接收到301状态码后而自动重定向POST请求时,一些现存的用户代理会错误地将其改为GET请求。
    302 Moved Temporarily
    请求到的资源在一个不同的URL处临时保存。因为重定向有时会被更改,客户端应继续用请求URI来发出以后的请求。新的URL必须由回应中的位置域指定。除非是HEAD请求,否则回应的实体主体 (Entity-Body)必须包括对新URL超链接的简要描述。
    如果用POST方法发出请求,而接收到302回应状态码。在这种情况下,除非用户确认,否则用户代理不必自动重定向请求,因为这将导致改变已发出请求的环境。
    注意:当在接收到302状态码后而自动重定向POST请求时,一些现存的用户代理会错误地将其改为GET请求。
    304 Not Modified
    如果客户端成功执行了条件GET请求,而对应文件自If-Modified-Since域所指定的日期以来就没有更新过,服务器应当回应此状态码,而不是将实体主体发送给客户端。回应标题域中只应包括一些相关信息,比如缓存管理器、与实体最近更新(entity’s Last-Modified)日期无关的修改。相关标题域的例子有:日期、服务器、过期时间。每当304回应中给出的域值发生变化,缓存都应当对缓存的实体进行更新。

    3.客户端错误(Client Error )4xx
    4xx类的状态码表示客户端发生错误。如果客户端在收到4xx代码时请求还没有完成,它应当立即终止向服务器发送数据。除了回应HEAD请求外,不论错误是临时的还是永久的,服务器端都必须在回应的实体中包含错误状态的解释。这些状态码适用于任何请求方法。
    注意:如果客户端正在发送数据,服务器端的TCP实现应当小心,以确保客户端在关闭输入连接之前收到回应包。如果客户端在关闭后仍旧向服务器发送数据,服务器会给客户  端发送一个复位包,清空客户端尚未处理的输入缓冲区,以终止HTTP应用程序的读取、解释活动。
    400 非法请求(Bad Request)
    如果请求的语法不对,服务器将无法理解。客户端在对该请求做出更改之前,不应再次向服务器重复发送该请求。
    401 未授权(Unauthorized)
    请求需要用户授权。回应中的WWW-Authenticate标题域(10.16节)应提示用户以授权方式请求资源。客户端应使用合适的授权标题域(10.2节)来重复该请求。如果请求中已经包括了授权信任信息,那回应的401表示此授权被拒绝。如果用户代理在多次尝试之后,回应一样还是返回401状态代码,用户应当察看一下回应的实体,因为在实体中会包括一些相关的动态信息。HTTP访问授权会在11节中解释。
    403 禁止(Forbidden)
    服务器理解请求,但是拒绝实现该请求。授权对此没有帮助,客户端应当停止重复发送此请求。如果不是用HEAD请求方法,而且服务器端愿意公布请求未被实现原因的前提下,服务器会将拒绝原因写在回应实体中。该状态码一般用于服务器端不想公布请求被拒绝的细节或没有其它的回应可用。
    404 没有找到(Not Found)
    服务器没有找到与请求URI相符的资源。404状态码并不指明状况是临时性的还是永久性的。如果服务器不希望为客户端提供这方面的信息,还回应403(禁止)状态码。

    4.服务器错误(Server Error )5xx
    回应代码以‘5’开头的状态码表示服务器端发现自己出现错误,不能继续执行请求。如果客户端在收到5xx状态码时,请求尚未完成,它应当立即停止向服务器发送数据。除了回应HEAD请求外,服务器应当在其回应实体中包括对错误情况的解释、并指明是临时性的还永久性的。
    这类回应代码没有标题域,可适用于任何请求方法。
    500 服务器内部错误(Internal Server Error)
    服务器碰到了意外情况,使其无法继续回应请求。
    501 未实现(Not Implemented)
    服务器无法提供对请求中所要求功能的支持。如果服务器无法识别请求方法就会回应此状态代码,这意味着不能回应请求所要求的任何资源。
    502 非法网关(Bad Gateway)
    充当网关或代理的服务器从要发送请求的上游(upstream)服务器收到非法的回应。
    503 服务不可用(Service Unavailable)
    服务器当前无法处理请求。这一般是由于服务器临时性超载或维护引起的。该状态码暗示情况是暂时性的,要产生一些延迟。
    注意:503状态码并没有暗示服务器在超载时一定要返回此状态码。一些服务器可能希望在超载时采用简单处理,即断掉连接。



     

  • 如何使用LoadRunner来监控MySql数据库的性能

    2008-10-04

    一、利用SiteScope工具来监控

       在LoadRunner中没有提供直接监控MySQL的方法,但是在实际工作中需要我们对mysql数据库服务器进行监控,我们可以利用sitescope监控然后在lr中显示SiteScope监控的结果,达到间接监控mysql的目的。

       备注:Mercyry SiteScope 介绍:它是一款无代理监测解决方案,可确保分布式IT基础架构——如服务器、操作系统、网络设备、网络服务、应用和应用组件的可用性和性能。这款主动的、基于Web界面的基础架构监测解决方案是非常简洁的,而且完全根据客户度身定制,无需在您的上线系统中增加额外的代理。
    SiteScope为上线系统提供24×7的监控服务,为维护工程师及时发现问题提供帮助,确保系统架构内一切组建的正常运作。SiteScope在大量增加检测周期的同时也降低了维护人员的工作成本 。
    SiteScope能够监控UNIX服务器资源、windows服务器资源、weblogic应用服务器、IIS应用服务器、Oracle数据库、SQLServer数据库、F5、URL地址、Ping、内存、CPU、磁盘空间、服务等等系统架构内各种组建的运行状况;监控器按照指定频率对目标进行检测,一旦发现异常会及时向管理员发送意外事件的报警,警报可以通过声音提醒、email、短信等方式发送;另外,SiteScope还可以生成监测活动的汇总报告,该对象从日志文件中读取历史信息,接着总结、筛选信息,并生成图表格式的报告。

       SiteScope利用Database Query monitor监控指定的数据库,通过SiteScope监控器的SHOW STATUS 命令,获得相应数据,命令如下:

      show status where variable_name like ’innodb_buffer_pool_pages_total’

      为了确保监控请确认LoadRunner and SiteScope之间的端口, SiteScope和MySQL必须打开TCP 8888TCP 3306 . 还有SiteScope要监控必须要确保有JDBC的安装。 

    以下为监控前需要注意的地方:

      1. SiteScope to be deployed.
      2. Sufficient license points for Database Query monitor.
      3. TCP 8888 (default) opened two-way for LoadRunner to SiteScope.
      4. TCP 3306 (default) opened two-way for SiteScope to MySQL.
      5. Monitoring privileges for SiteScope to monitor MySQL.
      6. JDBC driver to be installed on SiteScope.
      7. Have knowledge of the counter you want to monitor.

    转自SiteScope帮助:

    Monitoring mySQL Databases

    Monitoring a MySQL database requires the use of a JDBC driver. To enable SiteScope to monitor a MySQL database:

    1. Download the JDBC driver from http://www.mysql.com/downloads/api-jdbc.html
    2. Uncompress the distribution file
    3. Among all the other files, you should find a file with a .jar extension.
    4. Copy the .jar file into the <SiteScope install path>/SiteScope/java/lib/ext directory
    5. Stop and restart SiteScope
    6. Now, use your browser to add a Database Query Monitor within SiteScope.

      The Database Connection URL format for the MySQL JDBC driver is:

      jdbc:mysql://<database hostname>[:<tcp port>]/<database>

      For example to connect to the MySQL database "aBigDatabase" on a machine using the standard MySQL port number 3306 you would use:

      jdbc:mysql://206.168.191.19/aBigDatabase

      If you are using a different port to connect to the database then you should include that port number as part of the IP address.

      The specification for the MySQL JDBC driver is: org.gjt.mm.mysql.Driver

      Enter this string into the Database Driver text box under the Advanced Options section of the Add Database Query Monitor form.

    二、通过编写脚本来进行监控

    // mysql_dll.cpp : Defines the entry point for the DLL application.

    #include "stdafx.h"
    #include "stdlib.h"

    MYSQL *conn=NULL;
    MYSQL_RES *p_res_ptr=NULL;
    MYSQL_ROW sqlrows;


    BOOL APIENTRY DllMain( HANDLE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
          )
    {
        return TRUE;
    }

    extern "C" int _declspec(dllexport) init_mysql_connection(char *str_server,char *str_username,char *str_pwd,char *str_Table)
    {
     conn=mysql_init(NULL);

        if(!conn)
     {
      printf("\nFailed to initate MySQL connection");
      return 1;
      exit(0);
     }
        else
     {
      printf("\nSuccess to initate MySQL connection");
      if (!mysql_real_connect(conn,str_server,str_username,str_pwd,str_Table,0,NULL,0))
      {
       printf( "Failed to connect to MySQL: Error: %s\n", mysql_error(conn));
      }
      else
      {
       printf("\nLogged on to %s sucessfully",str_server);
       return 0;
      }
      return 0;
     }
    }

    extern "C" int _declspec(dllexport) close_mysql_connection()
    {
     if(conn=NULL)
     {
      printf("\nConnection is Null");
      return 1;
      exit(0);
     }
     else
     {
         mysql_free_result(p_res_ptr);
      printf("\nClose connection");
      mysql_close(conn);   
      return 0;
     }
    }

    //"show status like \'qcache%\'"

    extern "C" int _declspec(dllexport) get_mysql_table_query(char *str_query)
    {
     int res=0;
     res=mysql_query(conn,str_query);
     if(res)
     {
      printf("Failed to mysql query: Error: %s\n", mysql_error(conn));
      return 1;
     }
     else
     {
      printf("\nSucess in Mysql Query");
      return 0;

     }

    }

     

    extern "C" int _declspec(dllexport) get_mysql_query_data(char *str_query,char *str_data)
    {
        unsigned long u1_numrow=0;
        unsigned int i_index = 0;
     p_res_ptr=mysql_use_result(conn);

     if(p_res_ptr){
     
      while((sqlrows=mysql_fetch_row(p_res_ptr))){
      
       if(*sqlrows[0]=*str_query)
       {
        strcpy(str_data,sqlrows[1]);
       
        
       }
      }
     }

     return NULL;

    }

     

    lr 9.1中代码:

    Action()
    {

            int i=0; 
            double x;
            char *str_data;