﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-table-文章分类-datebase</title><link>http://www.blogjava.net/table/category/36700.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 14 Aug 2009 00:04:53 GMT</lastBuildDate><pubDate>Fri, 14 Aug 2009 00:04:53 GMT</pubDate><ttl>60</ttl><item><title>监控和剖析数据库操作 -- P6Spy、SQL Profiler、IronTrack SQL 使用简介</title><link>http://www.blogjava.net/table/articles/290827.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Wed, 12 Aug 2009 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/290827.html</guid><wfw:comment>http://www.blogjava.net/table/comments/290827.html</wfw:comment><comments>http://www.blogjava.net/table/articles/290827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/290827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/290827.html</trackback:ping><description><![CDATA[<blockquote>本文介绍如何在应用程序中利用 P6Spy、SQL Profiler、IronTrack SQL 工具来对数据库操作进行监控与剖析，从中发现应用系统存在的性能瓶颈，得到相关的优化建议并最终找到相应的解决办法。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0" sizset="35" sizcache="2">
    <tbody sizset="36" sizcache="2">
        <tr sizset="36" sizcache="2">
            <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
            <td sizset="36" sizcache="2">
            <table cellspacing="0" cellpadding="5" width="100%" border="1" sizset="36" sizcache="2">
                <tbody sizset="36" sizcache="1">
                    <tr>
                        <td bgcolor="#eeeeee">
                        <p>几乎 80% - 85% 的数据库性能问题是由于应用数据库的设计或者应用程序本身的代码所引起的。因此良好的事务处理能力需要在设计应用程序的时候，在设计数据库的时候就考虑到性能和伸缩性。</p>
                        <p>---- DB2 Magazine</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<p>在我们 Java 开发应用程序的过程中，难免会碰到系统的性能问题，特别在企业应用的开发过程中，都会与数据库进行打交道。当我们碰到数据库性能时，最有效的就是直接跟踪每一个 SQL 语句的执行情况，SQL 语句的优化、索引的优化往往也是最容易取得最直接的效果的。</p>
<p>下面，我们首先开始介绍 P6Spy 这个剖析工具，看它是如何无侵入性地进行数据库操作的监控与剖析。</p>
<p><a name="N10059"><span class="atitle">P6Spy</span></a></p>
<p>P6Spy 是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架。通过 P6Spy 我们可以对 SQL 语句进行拦截，相当于一个 SQL 语句的记录器，这样我们可以用它来作相关的分析，比如性能分析。P6Spy 用 Log4J 来记录 JDBC 调用的日记信息。</p>
<p>自从 2003 年 11 月 30 日 P6Spy 版本 1.3 发布后，已经被下载超过 19,000 次了。P6Spy 支持 WebSphere、WebLogic、JBoss、Resin 和 Tomcat 等绝大多数的应用服务器。</p>
<p><a name="N10066"><span class="smalltitle">使用步骤</span></a></p>
<p>首先，你的应用系统应当是基于数据库的，然后你需要去获取 P6Spy 相关的文件（在 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/index.html#resources" cmimpressionsent="1">参考资源</a> 中可以找到下载链接，您可以直接下载软件包）。下面介绍 P6Spy 的安装与使用的详细操作过程：</p>
<ol>
    <li><a href="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/index.html#resources" cmimpressionsent="1">下载</a> P6Spy 的文件包，也可以下载它的源文件包来研究；
    <li>把 P6Spy 的 jar 包 p6spy.jar 放到 <code>CLASSPATH</code> 中，如果是 Web 应用程序则放在 <code>YourWebApp/WEB-INF/lib/</code> 目录下；
    <li>把 spy.properties 放到 <code>CLASSPATH</code> 目录下，如果是 Web 应用程序放在 <code>YourWebApp/WEB-INF/classess/</code> 目录下，注意不是 <code>lib/</code> 目录
    <li>修改你应用系统中的数据库驱动名称为 P6Spy 的驱动程序名称 <code>com.p6spy.engine.spy.P6SpyDriver</code> 其它的全部使用默认值，暂时先都不用修改；
    <li>打开配置文件 spy.properties 文件，找到 <code>realdriver</code>，把它的值改为你的应用系统的真正的数据库驱动名称；
    <li>运行你的应用程序或 Web 应用程序，可以在 spy.log 里看到 P6Spy 监测到的 SQL 详细的执行与操作的记录信息了，包含有完整的 SQL 执行参数。 </li>
</ol>
<p><a name="N100A7"><span class="smalltitle">P6Log 与 P6Outage</span></a></p>
<p>在 P6Spy 发布包中，它包含 P6Log 和 P6Outage 两个模块：</p>
<ol sizset="37" sizcache="2">
    <li sizset="37" sizcache="2"><strong>P6Log</strong>
    <p>P6Log 是用来拦截和记录任务应用程序的 JDBC 语句的。这个功能对于开发者监控 EJB 服务器上的 SQL 语句执行情况尤其有用，可以让开发者完成尽可能高效的代码。同时 P6Spy 的部署是极其简单的，而且根本不需要更改任何一行代码，即对现有的应用是无侵入性的。</p>
    <table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="37" sizcache="2">
        <tbody sizset="37" sizcache="1">
            <tr>
                <td class="code-outline">
                <pre class="displaycode">realdriver= (your driver)       (你的实际 JDBC 驱动程序名称)
                executionthreshold=整数时间     (以毫秒为单位)
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li sizset="38" sizcache="2"><strong>P6Outage</strong>
    <p>P6Outage 专门用来检测和记录执行时间比较长的 SQL 语句，P6Outage 只记录超过配置条件里时间的那些信息，并对可能影响到数据库的运行效率减小到最低。</p>
    <table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="38" sizcache="2">
        <tbody sizset="38" sizcache="1">
            <tr>
                <td class="code-outline">
                <pre class="displaycode">#outagedetection=true|false    (是否记录较长时间运行的语句)
                #outagedetectioninterval=整数时间 (以秒为单位)
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    </li>
</ol>
<p><a name="N100CC"><span class="smalltitle">架构原理</span></a></p>
<p>简单地讲，我们可以认为 P6Spy 就是一个代理（Proxy），它只做了一层对 JDBC 驱动的拦截，然后转发出去，这样的设计与实际的应用程序没有任何的耦合性，除了在配置中将驱动程序改成 P6Spy 的拦截驱动外，程序其他地方并不需要做任何的改变。这层拦截器除了可能会给系统带来略微的性能下降外，对程序其他方面没有任何的影响。而相对于这一点点的性能下降，在开发环境中对于开发人员来说是无法感觉到，相比它所带来的好处，完全可以忽略不计。</p>
<br />
<a name="N100D6"><strong>图 1. P6Spy 对数据库进行拦截监控的处理过程</strong></a><br />
<img alt="图 1. P6Spy 对数据库进行拦截监控的处理过程" src="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/fig001.jpg" /> <br />
<p><a name="N100E0"><span class="smalltitle">问题与解决</span></a></p>
<p>如果在你的应用程序启动后，却在 spy.log 文件中发现了如下的提示信息，那就是驱动程序加载先后的问题了。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="39" sizcache="2">
    <tbody sizset="39" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;你的程序的数据库驱动名称&gt; is a real driver in spy.properties, but it has
            been loaded before p6spy.  p6spy will not wrap these connections.  Either
            prevent the driver from loading, or try setting'deregisterdrivers' to true in
            spy.properties
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>请把 spy.properties 配置文件里的 <code>deregisterdrivers=false</code> 改为 <code>deregisterdrivers=true</code>，重新运行即可。</p>
<p>这是因为有些应用系统中会先于 P6Spy 加载了真正的数据库的驱动程序，导致 P6Spy 无法监控到，设置 <code>deregisterdrivers</code> 为 <code>true</code>，是显式地把真正的数据库的驱动程序进行反注册掉，而采用 P6Spy 的驱动程序。</p>
<p><a name="N10102"><span class="smalltitle">配置参数及相关意义</span></a></p>
<p>下表列出了 spy.properties 配置文件中的各配置项的名称、默认值及其意义和相关注意事项：</p>
<table class="data-table-1" cellspacing="0" cellpadding="0" width="100%" summary="" border="0" sizset="40" sizcache="2">
    <tbody sizset="40" sizcache="1">
        <tr>
            <th width="25%">配置项名称</th>
            <th width="25%">默认值</th>
            <th width="50%">配置项意义及相关注意事项</th>
        </tr>
        <tr>
            <td>module.log</td>
            <td>com.p6spy.engine.logging. P6LogFactory</td>
            <td>用来拦截和记录任务应用程序的 JDBC 语句。若无配置或注释掉则无此功能。</td>
        </tr>
        <tr>
            <td>module.outage</td>
            <td>com.p6spy.engine.outage. P6OutageFactory</td>
            <td>检测和记录执行时间比较长的 SQL 语句。若无配置或注释掉则无此功能。</td>
        </tr>
        <tr>
            <td>realdriver</td>
            <td>　</td>
            <td>真正的应用系统使用的数据库驱动程序名称。</td>
        </tr>
        <tr>
            <td>realdriver2</td>
            <td>　</td>
            <td>真正的应用系统使用的第二种备用数据库驱动程序名称。</td>
        </tr>
        <tr>
            <td>realdriver3</td>
            <td>　</td>
            <td>真正的应用系统使用的第三种备用数据库驱动程序名称。</td>
        </tr>
        <tr>
            <td>deregisterdrivers</td>
            <td>false</td>
            <td>显示地把真正的数据库的驱动程序进行反注册掉。取值 true| false</td>
        </tr>
        <tr>
            <td>executionthreshold</td>
            <td>　</td>
            <td>P6Log 模块执行时间设置，整数值 (以毫秒为单位)，只有当超过这个时间才进行记录 Log。</td>
        </tr>
        <tr>
            <td>outagedetection</td>
            <td>false</td>
            <td>P6Outage 模块是否记录较长时间运行的语句。取值 true| false</td>
        </tr>
        <tr>
            <td>outagedetectioninterval</td>
            <td>　</td>
            <td>P6Outage 模块执行时间设置，整数值 （以秒为单位)），只有当超过这个时间才进行记录 Log。</td>
        </tr>
        <tr>
            <td>filter</td>
            <td>false</td>
            <td>是否过滤 Log，取值 true| false</td>
        </tr>
        <tr>
            <td>include</td>
            <td>　</td>
            <td>过滤 Log 时所包含的表名列表，以逗号分隔。</td>
        </tr>
        <tr>
            <td>exclude</td>
            <td>　</td>
            <td>过滤 Log 时所排除的表名列表，以逗号分隔。</td>
        </tr>
        <tr>
            <td>sqlexpression</td>
            <td>　</td>
            <td>过滤 Log 时的 SQL 表达式名称</td>
        </tr>
        <tr>
            <td>autoflush</td>
            <td>true</td>
            <td>是否自动刷新。取值 true| false</td>
        </tr>
        <tr>
            <td>dateformat</td>
            <td>　</td>
            <td>设置时间的格式，也就是用 Java 的 SimpleDateFormat 程序。</td>
        </tr>
        <tr>
            <td>includecategories</td>
            <td>　</td>
            <td>显示指定过滤 Log 时包含的分类列表，取值为 error，info，batch，debug，statement，commit，rollback，result 的各种组合。</td>
        </tr>
        <tr>
            <td>excludecategories</td>
            <td>　</td>
            <td>显示指定过滤 Log 时排队的分类列表，取值同上。</td>
        </tr>
        <tr>
            <td>stringmatcher</td>
            <td>　</td>
            <td>使用正则表达式来过滤 Log，取值为 com.p6spy.engine.common.GnuRegexMatcher 和 com.p6spy.engine.common.JakartaRegexMatcher</td>
        </tr>
        <tr>
            <td>stacktrace</td>
            <td>false</td>
            <td>打印堆栈跟踪信息。取值 true| false</td>
        </tr>
        <tr>
            <td>stacktraceclass</td>
            <td>　</td>
            <td>如果 stacktrace=true，则可以指定具体的类名来进行过滤。</td>
        </tr>
        <tr>
            <td>reloadproperties</td>
            <td>false</td>
            <td>监测属性配置文件是否进行重新加载。取值 true| false</td>
        </tr>
        <tr>
            <td>reloadpropertiesinterval</td>
            <td>60</td>
            <td>属性配置文件重新加载的时间间隔，以秒为单位。</td>
        </tr>
        <tr>
            <td>useprefix</td>
            <td>false</td>
            <td>是否加上前缀，设置为 true，会加上 p6spy: 作为前缀。取值 true| false</td>
        </tr>
        <tr>
            <td>appender</td>
            <td>com.p6spy.engine.logging. appender.FileLogger</td>
            <td>指定 Log 的 appender，与 Log4J 有点同义，取值：com.p6spy.engine.logging.appender.Log4jLogger、com.p6spy.engine.logging.appender.StdoutLogger 和 com.p6spy.engine.logging.appender.FileLogger</td>
        </tr>
        <tr>
            <td>logfile</td>
            <td>spy.log</td>
            <td>指定 Log 的文件名，任何适于操作系统的文件。</td>
        </tr>
        <tr>
            <td>append</td>
            <td>true</td>
            <td>指定是否每次是增加 Log，设置为 false 则每次都会先进行清空。取值 true| false</td>
        </tr>
        <tr>
            <td>log4j.appender.STDOUT</td>
            <td>org.apache.log4j.ConsoleAppender</td>
            <td>当 appender 为 log4j 时采用的配置，配置如同 Log4J 的相关配置。</td>
        </tr>
        <tr>
            <td>log4j.appender.STDOUT.layout</td>
            <td>org.apache.log4j.PatternLayout</td>
            <td>同上</td>
        </tr>
        <tr>
            <td>log4j.appender.STDOUT. layout.ConversionPattern</td>
            <td>p6spy - %m%n</td>
            <td>同上</td>
        </tr>
        <tr>
            <td>log4j.logger.p6spy</td>
            <td>INFO,STDOUT</td>
            <td>Log 级别的设置，取值同 Log4J 的配置</td>
        </tr>
        <tr>
            <td>realdatasource</td>
            <td>　</td>
            <td>设置数据源 DataSource 的配置名称。</td>
        </tr>
        <tr>
            <td>realdatasourceclass</td>
            <td>　</td>
            <td>设置数据源 DataSource 的类的全称。</td>
        </tr>
        <tr>
            <td>realdatasourceproperties</td>
            <td>　</td>
            <td>设置数据源 DataSource 的属性，以分号分隔。</td>
        </tr>
        <tr>
            <td>jndicontextfactory</td>
            <td>　</td>
            <td>设置 JNDI 数据源的 NamingContextFactory。</td>
        </tr>
        <tr>
            <td>jndicontextproviderurl</td>
            <td>　</td>
            <td>设置 JNDI 数据源的提供者的 URL。</td>
        </tr>
        <tr>
            <td>jndicontextcustom</td>
            <td>　</td>
            <td>设置 JNDI 数据源的一些定制信息，以分号分隔。</td>
        </tr>
    </tbody>
</table>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="77" sizcache="2">
    <tbody sizset="77" sizcache="1">
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizset="78" sizcache="2">
    <tbody sizset="79" sizcache="2">
        <tr align="right" sizset="79" sizcache="2">
            <td sizset="79" sizcache="2"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0" sizset="79" sizcache="2">
                <tbody sizset="79" sizcache="1">
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/index.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N102D2"><span class="atitle">SQL Profiler</span></a></p>
<p>SQL Profiler 是一个由 Jahia.org 提供的基于 P6Spy 引擎的快速剖析工具，用来统计 SQL 查询语句以便了解哪里是性能瓶颈，在哪里创建索引或者采取相应的办法才能提高效率，并且能根据 SQL 查询语句的情况帮你生成合适的索引脚本。</p>
<p>这个小工具可以实时地显示数据库查询的情况，通过集成的 SQL 解析器，在访问大多数表与列上面建立统计分析，并生成索引脚本。当然，其它的信息也会进行收集和显示，比如：单个数据库请求的时间、一类请求的时间以及所有请求的时间。因此，可以有效地通过视图的排序来检测数据的性能问题所在。这个工具对于大量的需要进行分析的请求是非常有用的，而不是人工一个个地去做分析。当你需要知道比如对相同的表和列进行访问但是采用不同的查询值时，这种分组的查询可以用建立在 ANTLR 上的 SQL 解析器进行分析。</p>
<p><a name="N102DF"><span class="smalltitle">使用步骤</span></a></p>
<p>首先，你的应用系统同样也应当是基于数据库的，然后你需要去获取 SQL Profiler 相关的文件（在 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/index.html#resources" cmimpressionsent="1">参考资源</a> 中可以找到下载链接，您可以直接下载软件包）。下面介绍 SQL Profiler 的安装与使用的详细操作过程： </p>
<ol>
    <li><a href="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/index.html#resources" cmimpressionsent="1">下载</a> SQL Profiler 的文件包进行安装；
    <li>把 p6spy.jar 及 sqlprofiler.jar 放到 <code>CLASSPATH</code> 中，如果是 Web 应用程序则放在 <code>YourWebApp/WEB-INF/lib/</code> 目录下；
    <li>把 spy.properties 放到 <code>CLASSPATH</code> 目录下，如果是 Web 应用程序就放在 <code>YourWebApp/WEB-INF/classess/</code> 目录下，注意不是 <code>lib/</code> 目录；
    <li>修改你应用系统中的数据库驱动名称为 P6Spy 的驱动程序名称 <code>com.p6spy.engine.spy.P6SpyDriver</code> 其它的全部使用默认值，暂时不用修改；
    <li>打开 spy.properties 文件，把 <code>realdriver</code> 的值改为你的程序的数据库驱动名称；
    <li>注意要先运行 <code>java -jar sqlprofiler.jar</code> 来启动 SQL Profiler，并成功看到启动界面；
    <li>然后再启动你的应用程序或服务器，并开始进行正常的系统请求处理操作；
    <li>这样就可以在 SQL Profiler 图形化的界面上看到结果并进行分析了。 </li>
</ol>
<p><a name="N1032A"><span class="smalltitle">分析结果</span></a></p>
<p>经过一段时间的系统运行后，点击 Pause 按钮停止拦截，可以得到分析结果如下图：</p>
<br />
<a name="N10334"><strong>图 2. SQL Profiler 的分析结果 Profiler 视图</strong></a><br />
<img alt="图 2. SQL Profiler 的分析结果 Profiler 视图" src="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/fig002.jpg" /> <br />
<p>接着，可以切换到 Loggers 视图，这是 Lgger 视图的信息：</p>
<br />
<a name="N10343"><strong>图 3. SQL Profiler 的分析结果 Logger 视图</strong></a><br />
<img alt="图 3. SQL Profiler 的分析结果 Logger 视图" src="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/fig003.jpg" /> <br />
<p>当然，也可以切换到 Analysis 视图，这是 Analysis 视图的分析结果信息：</p>
<br />
<a name="N10352"><strong>图 4. SQL Profiler 的分析结果 Analysis 视图</strong></a><br />
<img alt="图 4. SQL Profiler 的分析结果 Analysis 视图" src="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/fig004.jpg" /> <br />
<p>在经过分析后，我们可以直接通过 SQLProfiler 提交的保存按钮，直接导出应当进行数据库优化的建议的索引脚本，通过查看索引脚本，我们可以看到创建索引的详细 SQL 脚本，这样，我们就可以非常方便地进行数据库调优了。</p>
<p><a name="N1035F"><span class="smalltitle">问题与解决</span></a></p>
<p>最后一个需要注意的问题就是需要先启动 SQLProfiler，然后再启动应用程序或者 Tomcat 等应用服务器。这是因为 SQLProfiler 默认使用的是 Log4j 的 SocketAppender，所以要先启动。否则，会因你的应用程序或应用服务器中的 Web 应用之类的因连接不到 Socket 的服务器（SQLProfiler 相当于 Socket 的服务器）而发生错误，可以通过 SQL Profiler 控制界面最下面的连接状态就可以知道是否有程序连接上来。</p>
<br />
<a name="N10369"><strong>图 5. SQL Profiler 处于非连接状态</strong></a><br />
<img alt="图 5. SQL Profiler 处于非连接状态" src="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/fig005.jpg" /> <br />
<br />
<a name="N10375"><strong>图 6. SQL Profiler 处于连接状态</strong></a><br />
<img alt="图 6. SQL Profiler 处于连接状态" src="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/fig006.jpg" /> <br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="80" sizcache="2">
    <tbody sizset="80" sizcache="1">
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizset="81" sizcache="2">
    <tbody sizset="82" sizcache="2">
        <tr align="right" sizset="82" sizcache="2">
            <td sizset="82" sizcache="2"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0" sizset="82" sizcache="2">
                <tbody sizset="82" sizcache="1">
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/index.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N1037F"><span class="atitle">IronTrack SQL</span></a></p>
<p>IronEye，一个专注于 JDBC 性能的监控和测试的开源项目，它包含有三个工具：IronEye SQL，IronEye Cache，IronTrack SQL。其中，IronEye SQL 用于监测 Java 应用和数据库服务器之间查询开销的时间，诊断在性能方面是否存在着相关问题，让开发人员在测试之前就能发现问题。IronEye 于 2003 年 10 月 1 日开始基于 Apache Software License 发布。</p>
<p>IronEye SQL 这个轻量级的 Java 工具提供所有流动在数据库与应用程序之间的 SQL 统计信息并用多张图表展现，可以快速优化程序的性能。</p>
<p>IronGrid 相对于 Continuous Integration 提出了 Continuous Performance 的概念，即在项目开发过程中随时关注性能问题，而不是传统的出了问题再解决的方案。</p>
<p>IronGrid 在应用程序对数据库的操作上的 Continuous Performance 是通过 IronTrack SQL 进行体现的。IronTrack SQL 能通过对 JDBC 的包装来拦截应用程序对数据库的请求，完成性能监控。IronTrack SQL 的好处在于不需要修改任何代码或者在数据库端安装任何程序，只需要在测试时把依赖的 JDBC 替换就可以了。</p>
<p><a name="N10392"><span class="smalltitle">使用步骤</span></a></p>
<p>首先，你的应用系统同样也应当是基于数据库的，然后你需要去获取 IronTrack SQL 相关的文件（在 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/index.html#resources" cmimpressionsent="1">参考资源</a> 中可以找到下载链接，您可以直接下载软件包）。下面介绍 IronTrack SQL 的安装与使用的详细操作过程：</p>
<ol>
    <li><a href="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/index.html#resources" cmimpressionsent="1">下载</a> IronTrack SQL 的文件包进行安装；
    <li>把 irontracksql.jar, p6spy.jar 和 log4j-1.2.8.jar 放到 <code>CLASSPATH</code> 中，如果是 Web 应用程序则放在 <code>YourWebApp/WEB-INF/lib/</code> 目录下；
    <li>把 spy.properties 放到 <code>CLASSPATH</code> 目录下，如果是 Web 应用程序就放在 <code>YourWebApp/WEB-INF/classess/</code> 目录下，注意不是 <code>lib/</code> 目录；
    <li>修改你程序的数据库驱动名称为 P6Spy 的驱动程序名称 <code>com.p6spy.engine.spy.P6SpyDriver</code> 其它的都不用更改；
    <li>打开配置文件 spy.properties 文件，找到 <code>realdriver</code>，把它的值改为你的应用系统的真正的数据库驱动名称；
    <li>设置监听端口号 <code>monitorport=2000</code>；
    <li>先运行 <code>java -jar irontracksql.jar</code> 来启动 IronTrack SQL；
    <li>再启动你的应用程序或服务器；
    <li>可以在 IronTrack SQL 图形化的界面上看到结果并进行分析了。 </li>
</ol>
<p><a name="N103E4"><span class="smalltitle">连接设置</span></a></p>
<p>点击&#8220;Config&#8221;按钮就可以设置主机名、端口与刷新的时间（毫秒为单位）。根据你的服务器与端口的不同而进行相应地改变，下面以本地和 2000 端口，刷新时间为 500 毫秒为示例。设置完成后，确定，点击&#8220;Connect&#8221;就可以连接应用系统并进行监测与分析了，当要停止分析时，只要点击&#8220;Disconnect&#8221;按扭即可立刻停止分析了。</p>
<p>在分析的过程中，我们可以根据需要点击&#8220;Purge&#8221;按钮，它可以清除目前所监测到的内容，然后重新进行记录监测信息，很方便地进行重新开始。</p>
<br />
<a name="N103F1"><strong>图 7. IronTrack SQL 连接示例</strong></a><br />
<img alt="图 7. IronTrack SQL 连接示例" src="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/fig007.jpg" /> <br />
<p><a name="N103FB"><span class="smalltitle">分析结果</span></a></p>
<p>经过一段时间的系统运行后，我们可以直接得到分析的结果与相应的图形分析示例。相关的信息显示如下：</p>
<br />
<a name="N10405"><strong>图 8. IronTrack SQL 分析结果</strong></a><br />
<img alt="图 8. IronTrack SQL 分析结果" src="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/fig008.jpg" /> <br />
<ul>
    <li>Count 列显示 SQL 语句的调用次数；
    <li>Avg Time 列显示 SQL 语句的执行平均时间；
    <li>Max Time 列显示 SQL 语句花费的最高时间；
    <li>SQL 列显示真正执行的 SQL 语句内容。 </li>
</ul>
<p>同时也可以通过设置过滤条件来显示指定条件的结果，比如：只关注平均调用次数大于 100 次 的结果。点击&#8220;Filtering&#8221;左边的小三角图标，可以显示如下的过滤条件设置栏目：</p>
<br />
<a name="N10423"><strong>图 9. IronTrack SQL 设置相关的过滤条件</strong></a><br />
<img alt="图 9. IronTrack SQL 设置相关的过滤条件" src="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/fig009.jpg" /> <br />
<p>设置完成后，点击&#8220;Apply Filter&#8221;按钮即可以获取所需要的相关结果了。这样可以更加方便地集中精力进行所需要的内容分析，可以更加方便快速地定位到问题的所在之处，然后进行解决。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="83" sizcache="2">
    <tbody sizset="83" sizcache="1">
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizset="84" sizcache="2">
    <tbody sizset="85" sizcache="2">
        <tr align="right" sizset="85" sizcache="2">
            <td sizset="85" sizcache="2"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0" sizset="85" sizcache="2">
                <tbody sizset="85" sizcache="1">
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/index.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N10430"><span class="atitle">总结</span></a></p>
<p>通过使用 P6Spy、SQL Profiler、IronTrack SQL 工具，我们可以无侵入已有的应用系统而有效地进行数据库操作的监控与剖析，为发现系统的性能瓶颈，寻找系统的性能调优提供了相当便利的方法。</p>
<br />
<br />
<p><a name="resources"><span class="atitle">参考资料 </span></a></p>
<strong>学习</strong><br />
<ul>
    <li><a href="http://www.p6spy.com/" cmimpressionsent="1">P6Spy 站点</a>：提供数据库性能监控和剖析工具。<br />
    <br />
    <li><a href="http://sourceforge.net/projects/sqlprofiler/" cmimpressionsent="1">SQL Profiler 站点</a>：提供的基于 P6Spy 引擎的数据库快速剖析工具 SQL Profiler。<br />
    <br />
    <li><a href="http://www.ibm.com/developerworks/cn/java/" cmimpressionsent="1">Java 技术专区</a>：寻找 Java 编程各方面的技术文章。<br />
    <br />
    </li>
</ul>
<br />
<strong>获得产品和技术</strong><br />
<ul>
    <li><a href="http://www.p6spy.com/download.html" cmimpressionsent="1">下载 P6Spy</a> 软件包。 <br />
    <br />
    <li><a href="http://sourceforge.net/projects/sqlprofiler/" cmimpressionsent="1">下载 SQL Profiler</a> 软件包。 <br />
    <br />
    <li><a href="http://www.ibm.com/developerworks/cn/java/j-lo-p6spy/IronTrackSQL.zip" cmimpressionsent="1">下载 IronTrack SQL</a> 软件包。 </li>
</ul>
<img src ="http://www.blogjava.net/table/aggbug/290827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2009-08-12 14:48 <a href="http://www.blogjava.net/table/articles/290827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql日期和时间函数不求人</title><link>http://www.blogjava.net/table/articles/256299.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Mon, 23 Feb 2009 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/256299.html</guid><wfw:comment>http://www.blogjava.net/table/comments/256299.html</wfw:comment><comments>http://www.blogjava.net/table/articles/256299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/256299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/256299.html</trackback:ping><description><![CDATA[对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6&nbsp;日期和时间类型。&nbsp; <br />
<br />
这里是一个使用日期函数的例子。下面的查询选择了所有记录，其date_col的值是在最后30天以内：&nbsp; <br />
<br />
mysql&gt;&nbsp;SELECT&nbsp;something&nbsp;FROM&nbsp;table&nbsp; <br />
WHERE&nbsp;TO_DAYS(NOW())&nbsp;-&nbsp;TO_DAYS(date_col)&nbsp;&lt;=&nbsp;30;&nbsp; <br />
<br />
DAYOFWEEK(date)&nbsp; <br />
返回日期date的星期索引(1=星期天，2=星期一,&nbsp;&#8230;&#8230;7=星期六)。这些索引值对应于ODBC标准。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DAYOFWEEK('1998-02-03');&nbsp; <br />
-&gt;&nbsp;3&nbsp; <br />
<br />
WEEKDAY(date)&nbsp; <br />
返回date的星期索引(0=星期一，1=星期二,&nbsp;&#8230;&#8230;6=&nbsp;星期天)。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;WEEKDAY('1997-10-04&nbsp;22:23:00');&nbsp; <br />
-&gt;&nbsp;5&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;WEEKDAY('1997-11-05');&nbsp; <br />
-&gt;&nbsp;2&nbsp; <br />
<br />
DAYOFMONTH(date)&nbsp; <br />
返回date的月份中日期，在1到31范围内。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DAYOFMONTH('1998-02-03');&nbsp; <br />
-&gt;&nbsp;3&nbsp; <br />
<br />
DAYOFYEAR(date)&nbsp; <br />
返回date在一年中的日数,&nbsp;在1到366范围内。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DAYOFYEAR('1998-02-03');&nbsp; <br />
-&gt;&nbsp;34&nbsp; <br />
<br />
MONTH(date)&nbsp; <br />
返回date的月份，范围1到12。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;MONTH('1998-02-03');&nbsp; <br />
-&gt;&nbsp;2&nbsp; <br />
<br />
DAYNAME(date)&nbsp; <br />
返回date的星期名字。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DAYNAME("1998-02-05");&nbsp; <br />
-&gt;&nbsp;'Thursday'&nbsp; <br />
<br />
MONTHNAME(date)&nbsp; <br />
返回date的月份名字。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;MONTHNAME("1998-02-05");&nbsp; <br />
-&gt;&nbsp;'February'&nbsp; <br />
<br />
QUARTER(date)&nbsp; <br />
返回date一年中的季度，范围1到4。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;QUARTER('98-04-01');&nbsp; <br />
-&gt;&nbsp;2&nbsp; <br />
<br />
WEEK(date)&nbsp; <br />
　&nbsp; <br />
WEEK(date,first)&nbsp; <br />
对于星期天是一周的第一天的地方，有一个单个参数，返回date的周数，范围在0到52。2个参数形式WEEK()允许 <br />
你指定星期是否开始于星期天或星期一。如果第二个参数是0，星期从星期天开始，如果第二个参数是1， <br />
从星期一开始。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;WEEK('1998-02-20');&nbsp; <br />
-&gt;&nbsp;7&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;WEEK('1998-02-20',0);&nbsp; <br />
-&gt;&nbsp;7&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;WEEK('1998-02-20',1);&nbsp; <br />
-&gt;&nbsp;8&nbsp; <br />
<br />
YEAR(date)&nbsp; <br />
返回date的年份，范围在1000到9999。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;YEAR('98-02-03');&nbsp; <br />
-&gt;&nbsp;1998&nbsp; <br />
<br />
HOUR(time)&nbsp; <br />
返回time的小时，范围是0到23。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;HOUR('10:05:03');&nbsp; <br />
-&gt;&nbsp;10&nbsp; <br />
<br />
MINUTE(time)&nbsp; <br />
返回time的分钟，范围是0到59。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;MINUTE('98-02-03&nbsp;10:05:03');&nbsp; <br />
-&gt;&nbsp;5&nbsp; <br />
<br />
SECOND(time)&nbsp; <br />
回来time的秒数，范围是0到59。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;SECOND('10:05:03');&nbsp; <br />
-&gt;&nbsp;3&nbsp; <br />
<br />
PERIOD_ADD(P,N)&nbsp; <br />
增加N个月到阶段P（以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;PERIOD_ADD(9801,2);&nbsp; <br />
-&gt;&nbsp;199803&nbsp; <br />
<br />
PERIOD_DIFF(P1,P2)&nbsp; <br />
返回在时期P1和P2之间月数，P1和P2应该以格式YYMM或YYYYMM。注意，时期参数P1和P2不是日期值。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;PERIOD_DIFF(9802,199703);&nbsp; <br />
-&gt;&nbsp;11&nbsp; <br />
<br />
DATE_ADD(date,INTERVAL&nbsp;expr&nbsp;type)&nbsp; <br />
　&nbsp; <br />
DATE_SUB(date,INTERVAL&nbsp;expr&nbsp;type)&nbsp; <br />
　&nbsp; <br />
ADDDATE(date,INTERVAL&nbsp;expr&nbsp;type)&nbsp; <br />
　&nbsp; <br />
SUBDATE(date,INTERVAL&nbsp;expr&nbsp;type)&nbsp; <br />
这些功能执行日期运算。对于MySQL&nbsp;3.22，他们是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词。 <br />
在MySQL&nbsp;3.23中，你可以使用+和-而不是DATE_ADD()和DATE_SUB()。（见例子）date是一个指定开始日期的 <br />
DATETIME或DATE值，expr是指定加到开始日期或从开始日期减去的间隔值一个表达式，expr是一个字符串；它可以以 <br />
一个&#8220;-&#8221;开始表示负间隔。type是一个关键词，指明表达式应该如何被解释。EXTRACT(type&nbsp;FROM&nbsp;date)函数从日期 <br />
中返回&#8220;type&#8221;间隔。下表显示了type和expr参数怎样被关联：&nbsp;type值&nbsp;含义&nbsp;期望的expr格式&nbsp; <br />
SECOND&nbsp;秒&nbsp;SECONDS&nbsp; <br />
MINUTE&nbsp;分钟&nbsp;MINUTES&nbsp; <br />
HOUR&nbsp;时间&nbsp;HOURS&nbsp; <br />
DAY&nbsp;天&nbsp;DAYS&nbsp; <br />
MONTH&nbsp;月&nbsp;MONTHS&nbsp; <br />
YEAR&nbsp;年&nbsp;YEARS&nbsp; <br />
MINUTE_SECOND&nbsp;分钟和秒&nbsp;"MINUTES:SECONDS"&nbsp; <br />
HOUR_MINUTE&nbsp;小时和分钟&nbsp;"HOURS:MINUTES"&nbsp; <br />
DAY_HOUR&nbsp;天和小时&nbsp;"DAYS&nbsp;HOURS"&nbsp; <br />
YEAR_MONTH&nbsp;年和月&nbsp;"YEARS-MONTHS"&nbsp; <br />
HOUR_SECOND&nbsp;小时,&nbsp;分钟，&nbsp;"HOURS:MINUTES:SECONDS"&nbsp; <br />
DAY_MINUTE&nbsp;天,&nbsp;小时,&nbsp;分钟&nbsp;"DAYS&nbsp;HOURS:MINUTES"&nbsp; <br />
DAY_SECOND&nbsp;天,&nbsp;小时,&nbsp;分钟,&nbsp;秒&nbsp;"DAYS&nbsp;HOURS:MINUTES:SECONDS"&nbsp; <br />
<br />
MySQL在expr格式中允许任何标点分隔符。表示显示的是建议的分隔符。如果date参数是一个DATE值并且你的计算仅仅 <br />
包含YEAR、MONTH和DAY部分(即，没有时间部分)，结果是一个DATE值。否则结果是一个DATETIME值。&nbsp; <br />
<br />
mysql&gt;&nbsp;SELECT&nbsp;"1997-12-31&nbsp;23:59:59"&nbsp;+&nbsp;INTERVAL&nbsp;1&nbsp;SECOND;&nbsp; <br />
-&gt;&nbsp;1998-01-01&nbsp;00:00:00&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;INTERVAL&nbsp;1&nbsp;DAY&nbsp;+&nbsp;"1997-12-31";&nbsp; <br />
-&gt;&nbsp;1998-01-01&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;"1998-01-01"&nbsp;-&nbsp;INTERVAL&nbsp;1&nbsp;SECOND;&nbsp; <br />
-&gt;&nbsp;1997-12-31&nbsp;23:59:59&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_ADD("1997-12-31&nbsp;23:59:59",&nbsp; <br />
INTERVAL&nbsp;1&nbsp;SECOND);&nbsp; <br />
-&gt;&nbsp;1998-01-01&nbsp;00:00:00&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_ADD("1997-12-31&nbsp;23:59:59",&nbsp; <br />
INTERVAL&nbsp;1&nbsp;DAY);&nbsp; <br />
-&gt;&nbsp;1998-01-01&nbsp;23:59:59&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_ADD("1997-12-31&nbsp;23:59:59",&nbsp; <br />
INTERVAL&nbsp;"1:1"&nbsp;MINUTE_SECOND);&nbsp; <br />
-&gt;&nbsp;1998-01-01&nbsp;00:01:00&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_SUB("1998-01-01&nbsp;00:00:00",&nbsp; <br />
INTERVAL&nbsp;"1&nbsp;1:1:1"&nbsp;DAY_SECOND);&nbsp; <br />
-&gt;&nbsp;1997-12-30&nbsp;22:58:59&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_ADD("1998-01-01&nbsp;00:00:00",&nbsp; <br />
INTERVAL&nbsp;"-1&nbsp;10"&nbsp;DAY_HOUR);&nbsp; <br />
-&gt;&nbsp;1997-12-30&nbsp;14:00:00&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;DATE_SUB("1998-01-02",&nbsp;INTERVAL&nbsp;31&nbsp;DAY);&nbsp; <br />
-&gt;&nbsp;1997-12-02&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;EXTRACT(YEAR&nbsp;FROM&nbsp;"1999-07-02");&nbsp; <br />
-&gt;&nbsp;1999&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;EXTRACT(YEAR_MONTH&nbsp;FROM&nbsp;"1999-07-02&nbsp;01:02:03");&nbsp; <br />
-&gt;&nbsp;199907&nbsp; <br />
mysql&gt;&nbsp;SELECT&nbsp;EXTRACT(DAY_MINUTE&nbsp;FROM&nbsp;"1999-07-02&nbsp;01:02:03");&nbsp; <br />
-&gt;&nbsp;20102&nbsp; <br />
<br />
如果你指定太短的间隔值(不包括type关键词期望的间隔部分)，MySQL假设你省掉了间隔值的最左面部分。例如， <br />
如果你指定一个type是DAY_SECOND，值expr被希望有天、小时、分钟和秒部分。如果你象"1:10"这样指定值， <br />
MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说，"1:10"&nbsp;DAY_SECOND以它等价于"1:10"&nbsp;MINUTE_SECOND <br />
的方式解释，这对那MySQL解释TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期， <br />
结果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且结果日期大于新月份的最大值天数，日子在新月用最大的天调整。&nbsp; <br />
<br />
mysql&gt;&nbsp;select&nbsp;DATE_ADD('1998-01-30',&nbsp;Interval&nbsp;1&nbsp;month);&nbsp; <br />
-&gt;&nbsp;1998-02-28&nbsp; <br />
<br />
注意，从前面的例子中词INTERVAL和type关键词不是区分大小写的。&nbsp; <br />
TO_DAYS(date)&nbsp; <br />
给出一个日期date，返回一个天数(从0年的天数)。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;TO_DAYS(950501);&nbsp; <br />
-&gt;&nbsp;728779&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;TO_DAYS('1997-10-07');&nbsp; <br />
-&gt;&nbsp;729669&nbsp; <br />
<br />
TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。&nbsp; <br />
<br />
FROM_DAYS(N)&nbsp; <br />
给出一个天数N，返回一个DATE值。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;FROM_DAYS(729669);&nbsp; <br />
-&gt;&nbsp;'1997-10-07'&nbsp; <br />
<br />
TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。&nbsp; <br />
<br />
DATE_FORMAT(date,format)&nbsp; <br />
根据format字符串格式化date值。下列修饰符可以被用在format字符串中：&nbsp;%M&nbsp;月名字(January&#8230;&#8230;December)&nbsp; <br />
%W&nbsp;星期名字(Sunday&#8230;&#8230;Saturday)&nbsp; <br />
%D&nbsp;有英语前缀的月份的日期(1st,&nbsp;2nd,&nbsp;3rd,&nbsp;等等。）&nbsp; <br />
%Y&nbsp;年,&nbsp;数字,&nbsp;4&nbsp;位&nbsp; <br />
%y&nbsp;年,&nbsp;数字,&nbsp;2&nbsp;位&nbsp; <br />
%a&nbsp;缩写的星期名字(Sun&#8230;&#8230;Sat)&nbsp; <br />
%d&nbsp;月份中的天数,&nbsp;数字(00&#8230;&#8230;31)&nbsp; <br />
%e&nbsp;月份中的天数,&nbsp;数字(0&#8230;&#8230;31)&nbsp; <br />
%m&nbsp;月,&nbsp;数字(01&#8230;&#8230;12)&nbsp; <br />
%c&nbsp;月,&nbsp;数字(1&#8230;&#8230;12)&nbsp; <br />
%b&nbsp;缩写的月份名字(Jan&#8230;&#8230;Dec)&nbsp; <br />
%j&nbsp;一年中的天数(001&#8230;&#8230;366)&nbsp; <br />
%H&nbsp;小时(00&#8230;&#8230;23)&nbsp; <br />
%k&nbsp;小时(0&#8230;&#8230;23)&nbsp; <br />
%h&nbsp;小时(01&#8230;&#8230;12)&nbsp; <br />
%I&nbsp;小时(01&#8230;&#8230;12)&nbsp; <br />
%l&nbsp;小时(1&#8230;&#8230;12)&nbsp; <br />
%i&nbsp;分钟,&nbsp;数字(00&#8230;&#8230;59)&nbsp; <br />
%r&nbsp;时间,12&nbsp;小时(hh:mm:ss&nbsp;[AP]M)&nbsp; <br />
%T&nbsp;时间,24&nbsp;小时(hh:mm:ss)&nbsp; <br />
%S&nbsp;秒(00&#8230;&#8230;59)&nbsp; <br />
%s&nbsp;秒(00&#8230;&#8230;59)&nbsp; <br />
%p&nbsp;AM或PM&nbsp; <br />
%w&nbsp;一个星期中的天数(0=Sunday&nbsp;&#8230;&#8230;6=Saturday&nbsp;）&nbsp; <br />
%U&nbsp;星期(0&#8230;&#8230;52),&nbsp;这里星期天是星期的第一天&nbsp; <br />
%u&nbsp;星期(0&#8230;&#8230;52),&nbsp;这里星期一是星期的第一天&nbsp; <br />
%%&nbsp;一个文字&#8220;%&#8221;。&nbsp; <br />
<br />
所有的其他字符不做解释被复制到结果中。&nbsp; <br />
<br />
mysql&gt;&nbsp;select&nbsp;DATE_FORMAT('1997-10-04&nbsp;22:23:00',&nbsp;'%W&nbsp;%M&nbsp;%Y');&nbsp; <br />
-&gt;&nbsp;'Saturday&nbsp;October&nbsp;1997'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DATE_FORMAT('1997-10-04&nbsp;22:23:00',&nbsp;'%H:%i:%s');&nbsp; <br />
-&gt;&nbsp;'22:23:00'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DATE_FORMAT('1997-10-04&nbsp;22:23:00',&nbsp; <br />
'%D&nbsp;%y&nbsp;%a&nbsp;%d&nbsp;%m&nbsp;%b&nbsp;%j');&nbsp; <br />
-&gt;&nbsp;'4th&nbsp;97&nbsp;Sat&nbsp;04&nbsp;10&nbsp;Oct&nbsp;277'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;DATE_FORMAT('1997-10-04&nbsp;22:23:00',&nbsp; <br />
'%H&nbsp;%k&nbsp;%I&nbsp;%r&nbsp;%T&nbsp;%S&nbsp;%w');&nbsp; <br />
-&gt;&nbsp;'22&nbsp;22&nbsp;10&nbsp;10:23:00&nbsp;PM&nbsp;22:23:00&nbsp;00&nbsp;6'&nbsp; <br />
MySQL3.23中，在格式修饰符字符前需要%。在MySQL更早的版本中，%是可选的。&nbsp; <br />
<br />
TIME_FORMAT(time,format)&nbsp; <br />
这象上面的DATE_FORMAT()函数一样使用，但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。 <br />
其他修饰符产生一个NULL值或0。&nbsp; <br />
CURDATE()&nbsp; <br />
　&nbsp; <br />
CURRENT_DATE&nbsp; <br />
以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值，取决于函数是在一个字符串还是数字上下文被使用。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;CURDATE();&nbsp; <br />
-&gt;&nbsp;'1997-12-15'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;CURDATE()&nbsp;+&nbsp;0;&nbsp; <br />
-&gt;&nbsp;19971215&nbsp; <br />
<br />
CURTIME()&nbsp; <br />
　&nbsp; <br />
CURRENT_TIME&nbsp; <br />
以'HH:MM:SS'或HHMMSS格式返回当前时间值，取决于函数是在一个字符串还是在数字的上下文被使用。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;CURTIME();&nbsp; <br />
-&gt;&nbsp;'23:50:26'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;CURTIME()&nbsp;+&nbsp;0;&nbsp; <br />
-&gt;&nbsp;235026&nbsp; <br />
<br />
NOW()&nbsp; <br />
　&nbsp; <br />
SYSDATE()&nbsp; <br />
　&nbsp; <br />
CURRENT_TIMESTAMP&nbsp; <br />
以'YYYY-MM-DD&nbsp;HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间，取决于函数是在一个字符串还是在数字的 <br />
上下文被使用。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;NOW();&nbsp; <br />
-&gt;&nbsp;'1997-12-15&nbsp;23:50:26'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;NOW()&nbsp;+&nbsp;0;&nbsp; <br />
-&gt;&nbsp;19971215235026&nbsp; <br />
<br />
UNIX_TIMESTAMP()&nbsp; <br />
　&nbsp; <br />
UNIX_TIMESTAMP(date)&nbsp; <br />
如果没有参数调用，返回一个Unix时间戳记(从'1970-01-01&nbsp;00:00:00'GMT开始的秒数)。如果UNIX_TIMESTAMP()用一 <br />
个date参数被调用，它返回从'1970-01-01&nbsp;00:00:00'&nbsp;GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME <br />
字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;UNIX_TIMESTAMP();&nbsp; <br />
-&gt;&nbsp;882226357&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;UNIX_TIMESTAMP('1997-10-04&nbsp;22:23:00');&nbsp; <br />
-&gt;&nbsp;875996580&nbsp; <br />
<br />
当UNIX_TIMESTAMP被用于一个TIMESTAMP列，函数将直接接受值，没有隐含的&#8220;string-to-unix-timestamp&#8221;变换。&nbsp; <br />
<br />
FROM_UNIXTIME(unix_timestamp)&nbsp; <br />
以'YYYY-MM-DD&nbsp;HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值，取决于函数是在一个字符串 <br />
还是或数字上下文中被使用。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;FROM_UNIXTIME(875996580);&nbsp; <br />
-&gt;&nbsp;'1997-10-04&nbsp;22:23:00'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;FROM_UNIXTIME(875996580)&nbsp;+&nbsp;0;&nbsp; <br />
-&gt;&nbsp;19971004222300&nbsp; <br />
<br />
FROM_UNIXTIME(unix_timestamp,format)&nbsp; <br />
返回表示&nbsp;Unix&nbsp;时间标记的一个字符串，根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条 <br />
目同样的修饰符。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;FROM_UNIXTIME(UNIX_TIMESTAMP(),&nbsp; <br />
'%Y&nbsp;%D&nbsp;%M&nbsp;%h:%i:%s&nbsp;%x');&nbsp; <br />
-&gt;&nbsp;'1997&nbsp;23rd&nbsp;December&nbsp;03:43:30&nbsp;x'&nbsp; <br />
<br />
SEC_TO_TIME(seconds)&nbsp; <br />
返回seconds参数，变换成小时、分钟和秒，值以'HH:MM:SS'或HHMMSS格式化，取决于函数是在一个字符串还是在数字 <br />
上下文中被使用。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;SEC_TO_TIME(2378);&nbsp; <br />
-&gt;&nbsp;'00:39:38'&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;SEC_TO_TIME(2378)&nbsp;+&nbsp;0;&nbsp; <br />
-&gt;&nbsp;3938&nbsp; <br />
<br />
TIME_TO_SEC(time)&nbsp; <br />
返回time参数，转换成秒。&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;TIME_TO_SEC('22:23:00');&nbsp; <br />
-&gt;&nbsp;80580&nbsp; <br />
mysql&gt;&nbsp;select&nbsp;TIME_TO_SEC('00:39:38');&nbsp; <br />
-&gt;&nbsp;2378 <br />
<img src ="http://www.blogjava.net/table/aggbug/256299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2009-02-23 17:41 <a href="http://www.blogjava.net/table/articles/256299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle导入与导出指令</title><link>http://www.blogjava.net/table/articles/246325.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Mon, 15 Dec 2008 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/246325.html</guid><wfw:comment>http://www.blogjava.net/table/comments/246325.html</wfw:comment><comments>http://www.blogjava.net/table/articles/246325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/246325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/246325.html</trackback:ping><description><![CDATA[<p>导出：</p>
<p>exp <a href="mailto:username/passwork@orcl">username/passwork@orcl</a> file=c:\testdb.dmp<br />
exp <a href="mailto:username/passwork@orcl">username/passwork@orcl</a> file=c:\testdb.dmp compress=y</p>
<p>导入：</p>
<p>imp <a href="mailto:username/passwork@orcl">username/passwork@orcl</a> file=c:\testdb.dmp full=y</p>
<img src ="http://www.blogjava.net/table/aggbug/246325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2008-12-15 10:06 <a href="http://www.blogjava.net/table/articles/246325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>