<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>vondon</title>
    <description></description>
    <link>http://vondon.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>Tomcat5w.exe 监控程序</title>
        <author>vondon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://vondon.javaeye.com">vondon</a>&nbsp;
                    链接：<a href="http://vondon.javaeye.com/blog/165842" style="color:red;">http://vondon.javaeye.com/blog/165842</a>&nbsp;
          发表时间: 2008年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tomcat5w.exe 监控程序<br />Tomcat5w是一个监控和配置Tomcat服务的图形界面应用程序。可用的命令行选项如下：<br /><br />//ES// 编辑服务配置，这是缺省的选项。如果没有提供任何选项，却把tomcat5w.exe重命名为%SERVICE_NAME%.exe运行的话，这个选项就被调用。<br />//MS// 监控服务，讲图标放置到系统托盘中。<br /><br />Tomcat5.exe 服务程序<br />命令行选项<br />每一个命令行指令都形如//XX//ServiceName<br /><br />可用的命令行选项如下：<br /><br />The ServiceName is the name of the executable without exe sufix, meaning Tomcat5 <br />//TS// 控制台应用程序模式运行服务，这是缺省的操作。在没有提供任何选项开关的时候，它被调用。服务名是执行文件没有exe后缀的部分，如Tomat5。<br />//RS// Run Service的缩写，运行服务，在服务管理器(Sevices.msc)中启动服务的时候被调用。<br />//SS// Stop Service的缩写，停止服务，在服务管理器中停止服务时被调用。<br />//US// Update Service的缩写，更新服务参数。<br />//IS// Install service 的缩写，安装服务 。<br />//DS// Delete service的缩写，删除服务，如果服务正在运行，首先删除服务。<br /><br />命令行参数<br />每一个命令行参数以“--”开头。如果命令行以“++”为前缀，则它的值附加到存在的选项上。如果存在和命令行参数有同样的名字，但是以PR_开头的环境变量，它将被优先使用。例如：<br />set PR_CLASSPATH=xx.jar<br />等同于<br />--Classpath=xx.jar <br />作为命令行参数。<br /><br />参数名 缺省值 描述 <br />--Description&nbsp; 服务名描述 (最多1024个字符) <br />--DisplayName ServiceName 服务显示名称<br />--Install procrun.exe //RS//ServiceName 安装服务<br />--Startup&nbsp; manual Service 服务启动模式，可以是自动或者手动，值分别为：auto和manual <br />--DependsOn&nbsp; 列举此服务依赖的所有服务. 被依赖的服务用#或者;分隔。<br />--Environment&nbsp; 列决提供给服务使用的环境变量，形如key=value。多个环境变量之间用#或者;分隔。<br />--User&nbsp; 运行服务使用的用户账号。 只有在运行于没有“作为服务登录”权限下的账户中使用StartMode java 或者作为服务的exe可运行程序选项的情况下才被使用。<br />--Password&nbsp; --User参数中用户的密码<br />--JavaHome JAVA_HOME 定义了JAVA_HOME环境变量时，设置一个不同的JAVA_HOME环境变量<br />--Jvm auto 用auto或指定jvm.dll的全路径。这里可以使用环境变量表达式。<br />--JvmOptions -Xrs&nbsp; 列举形如-D 或 -X 的开关传递给JVM虚拟机。多个选项开关之间用#或者;分隔。<br />--Classpath&nbsp; 设置Java的ClassPath环境变量。<br />--JvmMs&nbsp; 设置初始使用的内存池容量，单位为MB。<br />--JvmMx&nbsp; 设置最大使用的内存池容量，单位为MB。<br />--JvmSs&nbsp; 线程堆栈容量，单位为KB<br />--StartImage&nbsp; 要被运行的可执行文件<br />--StartPath&nbsp; 开始运行可执行文件的工作路径<br />--StartClass&nbsp; 启动时使用的类<br />--StartParams&nbsp; 列决要传递给StartImage 或 StartClass的参数。多个参数之间用#或者;分隔。<br />--StartMethod Main 启动服务调用的方法，如果不是main，这里写上方法名 <br />--StartMode executable 可以是jvm、java或exe 之一<br />--StopImage&nbsp; 停止服务调用的可执行文件<br />--StopPath&nbsp; 停止服务执行的文件的工作路径<br />--StopClass&nbsp; 停止服务调用的类<br />--StopParams&nbsp; 列决要传递给 StopImage 或 StopClass 的参数。多个参数之间用#或者;分隔。<br />--StopMethod Main 停止服务调用的方法，如果不是main，这里写上方法名<br />--StopMode executable 可以是jvm、java或exe 之一<br />--StopTimeout No Timeout 定义一个服务顺利退出的延时，单位为秒。<br />--LogPath 定义日志路径<br />--LogPrefix jakarta_service 定义日志文件名前缀<br />--LogLevel INFO 定义日志等级，可选值：error, info, warn或debug <br />--StdOutput&nbsp; 重定向stdout文件名<br />--StdError&nbsp; 重定向Stderr文件名<br /><br />安装服务<br />手动安装服务最安全的方法就是使用service.bat脚本。<br /><br />使用service.bat安装名字为'Tomcat5'的服务<br />C:\> service.bat install Tomcat5<br /><br />如果使用tomcat5.exe安装名字为'Tomcat5'的服务，你需要使用//IS//参数。<br />C:\> tomcat5 //IS//Tomcat5 --DisplayName="Apache Tomcat 5"&nbsp; --Install="C:\Program Files\Tomcat\bin\tomcat5.exe" --Jvm=auto --StartMode=jvm --StopMode=jvm --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start --StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop<br /><br />更新服务<br />要更新服务的参数，你需要使用tomcat5.exe的//US//参数。<br /><br />更新名字为'Tomcat5的服务<br />C:\> tomcat5 //US//Tomcat5 --Description="Apache Tomcat Server - http://jakarta.apache.org/tomcat "&nbsp; --Startup=auto --Classpath=%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar<br /><br />移除服务<br />要移除服务，你需要使用tomcat5.exe的//DS//参数。如果服务正在运行，将首先关闭然后删除。<br /><br />移除名字为'Tomcat5'的服务<br />C:\> tomcat5 //DS//Tomcat5<br /><br />调试服务<br />如果需要在控制台模式运行服务，应该使用//TS//参数。此时若要关闭服务必须使用CTRL+C 或者 CTRL+BREAK关闭控制台。如果你将tomcat5.exe 更名为 testservice.exe那么你应该运行testservice.exe，命令模式将被缺省运行。<br />在控制台模式下运行命称为'Tomcat5' 的服务<br />C:\> tomcat5 //TS//Tomcat5 [additional arguments]<br />或者简单地运行：<br />C:\> tomcat5
          <br/><br/>
          <span style="color:red;">
            <a href="http://vondon.javaeye.com/blog/165842#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Feb 2008 16:17:12 +0800</pubDate>
        <link>http://vondon.javaeye.com/blog/165842</link>
        <guid>http://vondon.javaeye.com/blog/165842</guid>
      </item>
          <item>
        <title>web.xml配置</title>
        <author>vondon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://vondon.javaeye.com">vondon</a>&nbsp;
                    链接：<a href="http://vondon.javaeye.com/blog/165730" style="color:red;">http://vondon.javaeye.com/blog/165730</a>&nbsp;
          发表时间: 2008年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1 定义头和根元素<br /><br />部署描述符文件就像所有XML文件一样，必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。<br />DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本（如2.2或2.3）并指定管理此文件其余部分内容的语法的DTD(Document Type Definition，文档类型定义)。<br />所有部署描述符文件的顶层（根）元素为web-app。请注意，XML元素不像HTML，他们是大小写敏感的。因此，web-App和WEB-APP都是不合法的，web-app必须用小写。<br /><br />2 部署描述符文件内的元素次序<br /><br />XML 元素不仅是大小写敏感的，而且它们还对出现在其他元素中的次序敏感。例如，XML头必须是文件中的第一项，DOCTYPE声明必须是第二项，而web- app元素必须是第三项。在web-app元素内，元素的次序也很重要。服务器不一定强制要求这种次序，但它们允许（实际上有些服务器就是这样做的）完全 拒绝执行含有次序不正确的元素的Web应用。这表示使用非标准元素次序的web.xml文件是不可移植的。<br />下面的列表给出了所有可直接出现在web-app元素内的合法元素所必需的次序。例如，此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意，所有这些元素都是可选的。因此，可以省略掉某一元素，但不能把它放于不正确的位置。<br />l icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个图像文件的位置。<br />l display-name display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名称。<br />l description description元素给出与此有关的说明性文本。<br />l context-param context-param元素声明应用范围内的初始化参数。<br />l filter 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。<br />l filter-mapping 一旦命名了一个过滤器，就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。<br />l listener servlet API的版本2.3增加了对事件监听程序的支持，事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。<br />l servlet 在向servlet或JSP页面制定初始化参数或定制URL时，必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。<br />l servlet-mapping 服务器一般为servlet提供一个缺省的URL：http://host/webAppPrefix/servlet/ServletName。但是，常常会更改这个URL，以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时，使用servlet-mapping元素。<br />l session-config 如果某个会话在一定时间内未被访问，服务器可以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveInterval方法 明确设置单个会话对象的超时值，或者可利用session-config元素制定缺省超时值。<br />l mime-mapping 如果Web应用具有想到特殊的文件，希望能保证给他们分配特定的MIME类型，则mime-mapping元素提供这种保证。<br />l welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URL时，使用哪个文件。<br />l error-page error-page元素使得在返回特定HTTP状态代码时，或者特定类型的异常被抛出时，能够制定将要显示的页面。<br />l taglib taglib元素对标记库描述符文件（Tag Libraryu Descriptor file）指定别名。此功能使你能够更改TLD文件的位置，而不用编辑使用这些文件的JSP页面。<br />l resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象。<br />l resource-ref resource-ref元素声明一个资源工厂使用的外部资源。<br />l security-constraint security-constraint元素制定应该保护的URL。它与login-config元素联合使用<br />l login-config 用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。<br />l security-role security-role元素给出安全角色的一个列表，这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。<br />l env-entry env-entry元素声明Web应用的环境项。<br />l ejb-ref ejb-ref元素声明一个EJB的主目录的引用。<br />l ejb-local-ref ejb-local-ref元素声明一个EJB的本地主目录的应用。
          <br/><br/>
          <span style="color:red;">
            <a href="http://vondon.javaeye.com/blog/165730#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Feb 2008 13:52:00 +0800</pubDate>
        <link>http://vondon.javaeye.com/blog/165730</link>
        <guid>http://vondon.javaeye.com/blog/165730</guid>
      </item>
          <item>
        <title>Hibernate获取数据方式与缓存使用</title>
        <author>vondon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://vondon.javaeye.com">vondon</a>&nbsp;
                    链接：<a href="http://vondon.javaeye.com/blog/165728" style="color:red;">http://vondon.javaeye.com/blog/165728</a>&nbsp;
          发表时间: 2008年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Hibernate获取数据的方式有不同的几种，其与缓存结合使用的效果也不尽相同，而Hibernate中具体怎么使用缓存其实是我们很关心的一个问题，直接涉及到性能方面。<br />缓存在Hibernate中主要有三个方面：一级缓存、二级缓存和查询缓存；一级缓存在Hibernate中对应的即为session范围的缓存，也就是当 session关闭时缓存即被清除，一级缓存在Hibernate中是不可配置的部分；二级缓存在Hibernate中对应的即为 SessionFactory范围的缓存，通常来讲SessionFactory的生命周期和应用的生命周期相同，所以可以看成是进程缓存或集群缓存，二级缓存在Hibernate中是可以配置的，可以通过class-cache配置类粒度级别的缓存(class-cache在class中数据发生任何变化的情况下自动更新)，同时也可通过collection-cache配置集合粒度级别的缓存(collection-cache仅在 collection中增加了元素或者删除了元素的情况下才自动更新，也就是当collection中元素发生值的变化的情况下它是不会自动更新的)，缓存自然会带来并发的访问问题，这个时候相应的就要根据应用来设置缓存所采用的事务隔离级别，和数据库的事务隔离级别概念基本一样，没什么多介绍的， ^_^；查询缓存在Hibernate同样是可配置的，默认是关闭的，可以通过设置cache.use_ query_cache为true来打开查询缓存。根据缓存的通常实现策略，我们可以来理解Hibernate的这三种缓存，缓存的实现通过是通过key/value的Map方式来实现，在 Hibernate的一级、二级和查询缓存也同样如此，一级、二级缓存使用的key均为po的主键ID，value即为po实例对象，查询缓存使用的则为查询的条件、查询的参数、查询的页数，value有两种情况，如果采用的是select po.property这样的方式那么value为整个结果集，如采用的是from这样的方式那么value为获取的结果集中各po对象的主键ID，这样的作用很明显，节省内存，^_^<br />简单介绍完Hibernate的缓存后，再结合Hibernate的获取数据方式来说明缓存的具体使用方式，在Hibernate中获取数据常用的方式主要有四种：Session.load、Session.get、Query.list、Query.iterator。<br />1、Session.load<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在执行session.load时，Hibernate首先从当前session的一级缓存中获取id对应的值，在获取不到的情况下，将根据该对象是否配置了二级缓存来做相应的处理，如配置了二级缓存，则从二级缓存中获取id对应的值，如仍然获取不到则还需要根据是否配置了延迟加载来决定如何执行，如未配置延迟加载则从数据库中直接获取，在从数据库获取到数据的情况下，Hibernate会相应的填充一级缓存和二级缓存，如配置了延迟加载则直接返回一个代理类，只有在触发代理类的调用时才进行数据库查询的操作。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这样的情况下我们就可以看到，在session一直打开的情况下，要注意在适当的时候对一级缓存进行刷新操作，通常是在该对象具有单向关联维护的时候，在Hibernate中可以使用象session.clear、session.evict的方式来强制刷新一级缓存。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二级缓存则在数据发生任何变化(新增、更新、删除)的情况下都会自动的被更新。<br />2、Session.get<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在执行Session.get时，和Session.load不同的就是在当从缓存中获取不到时，直接从数据库中获取id对应的值。<br />3、Query.list<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在执行Query.list时，Hibernate的做法是首先检查是否配置了查询缓存，如配置了则从查询缓存中查找key为查询语句+查询参数+分页条件的值，如获取不到则从数据库中进行获取，从数据库获取到后Hibernate将会相应的填充一级、二级和查询缓存，如获取到的为直接的结果集，则直接返回，如获取到的为一堆id的值，则再根据id获取相应的值(Session.load)，最后形成结果集返回，可以看到，在这样的情况下，list也是有可能造成N次的查询的。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询缓存在数据发生任何变化的情况下都会被自动的清空。<br />4、Query.iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在执行Query.iterator时，和Query.list的不同的在于从数据库获取的处理上，Query.iterator向数据库发起的是 select id from这样的语句，也就是它是先获取符合查询条件的id，之后在进行iterator.next调用时才再次发起session.load的调用获取实际的数据。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可见，在拥有二级缓存并且查询参数多变的情况下，Query.iterator会比Query.list更为高效。<br /><br />这四种获取数据的方式都各有适用的场合，要根据实际情况做相应的决定，^_^，最好的方式无疑就是打开show_sql选项看看执行的情况来做分析，系统结构上只用保证这种调整是容易实现的就好了，在cache这个方面的调整自然是非常的容易，只需要调整配置文件里的设置，而查询的方式则可对外部进行屏蔽，这样要根据实际情况调整也非常容易。
          <br/><br/>
          <span style="color:red;">
            <a href="http://vondon.javaeye.com/blog/165728#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Feb 2008 13:48:19 +0800</pubDate>
        <link>http://vondon.javaeye.com/blog/165728</link>
        <guid>http://vondon.javaeye.com/blog/165728</guid>
      </item>
          <item>
        <title>Hibernate缓存管理 </title>
        <author>vondon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://vondon.javaeye.com">vondon</a>&nbsp;
                    链接：<a href="http://vondon.javaeye.com/blog/165726" style="color:red;">http://vondon.javaeye.com/blog/165726</a>&nbsp;
          发表时间: 2008年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1. Cache简介：<br />缓存(Cache )是计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库) 之间，其作用是降低应用程序直接读写永久性数据存储源的频率，从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝，应用程序在运行时直接读写缓存中的数据，只在某些特定时刻按照缓存中的数据来同步更新数据存储源。<br />缓存的物理介质通常是内存，而永久性数据存储源的物理介质通常是硬盘或磁盘，应用程序读写内在的速度显然比读写硬盘的速度快，如果缓存中存放的数据量非常大，也会用硬盘作为缓存的物理介质。<br />缓存的实现不仅需要作为物理介质的硬件，同时还需要用于管理缓存的并发访问和过期等策略的软件。因此，缓存是通过软件和硬件共同实现的。<br />1.1. 持久化层的缓存的范围<br />缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围分为三类。<br />1) 事务范围：缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期，当事务结束时，缓存也就结束生命周期。在此范围下，缓存的介质是内存。事务可以是数据库事务或者应用事务，每个事务都有独自的缓存，缓存内的数据通常采用相互关联的对象形式。<br />2) 进程范围：缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存，因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期，进程结束时，缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据，所以存放的介质可以是内存或硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。松散的对象数据形式有点类似于对象的序列化数据，但是对象分解为松散的算法比对象序列化的算法要求更快。<br />3) 集群范围：在集群环境中，缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点，进程间通过远程通信来保证缓存中的数据的一致性，缓存中的数据通常采用对象的松散数据形式。<br />对大多数应用来说，应该慎重地考虑是否需要使用集群范围的缓存，因为访问的速度不一定会比直接访问数据库数据的速度快多少。<br /><br />持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据，还可以到进程范围或集群范围的缓存内查询，如果还是没有查到，那么只有到数据库中查询。事务范围的缓存是持久化层的第一级缓存，通常它是必需的；进程范围或集群范围的缓存是持久化层的第二级缓存，通常是可选的。<br />1.2. 持久化层的缓存的并发访问策略<br />当多个并发的事务同时访问持久化层的缓存的相同数据时，会引起并发问题，必须采用必要的事务隔离措施。<br />在进程范围或集群范围的缓存，即第二级缓存，会出现并发问题。因此可以设定以下四种类型的并发访问策略，每一种策略对应一种事务隔离级别。<br />1) 事务型(Transactional)策略：仅仅在受管理环境中适用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据，可以采用这种隔离类型，因为它可以防止脏读和不可重复读这类的并发问题。<br />2) 读写型(read-write)策略：提供了Read Committed事务隔离级别。仅仅在非集群的环境中适用。对于经常被读但很少修改的数据，可以采用这种隔离类型，因为它可以防止脏读这类的并发问题。<br />3) 非严格读写型(nonstrict-read-write)策略：不保证缓存与数据库中数据的一致性。如果存在两个事务同时访问缓存中相同数据的可能，必须为该数据配置一个很短的数据过期时间，从而尽量避免脏读。对于极少被修改，并且允许偶尔脏读的数据，可以采用这种并发访问策略。<br />4) 只读型策略(read-only)：对于从来不会修改的数据，如参考数据，可以使用这种并发访问策略。<br />事务型并发访问策略是事务隔离级别最高，只读型的隔离级别最低。事务隔离级别越高，并发性能就越低。<br />2. Hibernate中的缓存：<br />Hibernate 中提供了两级Cache，第一级别的缓存是Session级别的缓存，它是属于事务范围的缓存。这一级别的缓存由hibernate管理的，一般情况下无需进行干预；第二级别的缓存是SessionFactory级别的缓存，它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改，并且可以动态加载和卸载。<br />Hibernate还为查询结果提供了一个查询缓存，它依赖于第二级缓存。<br />2.1. 一级缓存和二级缓存的比较：<br />第一级缓存 第二级缓存 <br />存放数据的形式 相互关联的持久化对象 对象的散装数据 <br />缓存的范围 事务范围，每个事务都有单独的第一级缓存 进程范围或集群范围，缓存被同一个进程或集群范围内的所有事务共享 <br />并发访问策略 由于每个事务都拥有单独的第一级缓存，不会出现并发问题，无需提供并发访问策略 由于多个事务会同时访问第二级缓存中相同数据，因此必须提供适当的并发访问策略，来保证特定的事务隔离级别 <br />数据过期策略 没有提供数据过期策略。处于一级缓存中的对象永远不会过期，除非应用程序显式清空缓存或者清除特定的对象 必须提供数据过期策略，如基于内存的缓存中的对象的最大数目，允许对象处于缓存中的最长时间，以及允许对象处于缓存中的最长空闲时间 <br />物理存储介质 内存 内存和硬盘。对象的散装数据首先存放在基于内在的缓存中，当内存中对象的数目达到数据过期策略中指定上限时，就会把其余的对象写入基于硬盘的缓存中。 <br />缓存的软件实现 在Hibernate的Session的实现中包含了缓存的实现 由第三方提供，Hibernate仅提供了缓存适配器(CacheProvider)。用于把特定的缓存插件集成到Hibernate中。 <br />启用缓存的方式 只要应用程序通过Session接口来执行保存、更新、删除、加载和查询数据库数据的操作，Hibernate就会启用第一级缓存，把数据库中的数据以对象的形式拷贝到缓存中，对于批量更新和批量删除操作，如果不希望启用第一级缓存，可以绕过Hibernate API，直接通过JDBC　 API来执行指操作。 用户可以在单个类或类的单个集合的粒度上配置第二级缓存。如果类的实例被经常读但很少被修改，就可以考虑使用第二级缓存。只有为某个类或集合配置了第二级缓存，Hibernate在运行时才会把它的实例加入到第二级缓存中。 <br />用户管理缓存的方式 第一级缓存的物理介质为内存，由于内存容量有限，必须通过恰当的检索策略和检索方式来限制加载对象的数目。Session的evit()方法可以显式清空缓存中特定对象，但这种方法不值得推荐。 第二级缓存的物理介质可以是内存和硬盘，因此第二级缓存可以存放大量的数据，数据过期策略的maxElementsInMemory属性值可以控制内存中的对象数目。管理第二级缓存主要包括两个方面：选择需要使用第二级缓存的持久类，设置合适的并发访问策略：选择缓存适配器，设置合适的数据过期策略。 <br /><br /><br />2.2. 一级缓存的管理：<br />当应用程序调用Session的save()、update()、 savaeOrUpdate()、get()或load()，以及调用查询接口的list()、iterate()或filter()方法时，如果在 Session缓存中还不存在相应的对象，Hibernate就会把该对象加入到第一级缓存中。当清理缓存时，Hibernate会根据缓存中对象的状态变化来同步更新数据库。<br />Session为应用程序提供了两个管理缓存的方法：<br />evict(Object obj)：从缓存中清除参数指定的持久化对象。<br />clear()：清空缓存中所有持久化对象。<br />2.3. 二级缓存的管理：<br />2.3.1. Hibernate的二级缓存策略的一般过程如下：<br />1) 条件查询的时候，总是发出一条select * from table_name where …. （选择所有字段）这样的SQL语句查询数据库，一次获得所有的数据对象。 <br />2) 把获得的所有数据对象根据ID放入到第二级缓存中。 <br />3) 当Hibernate根据ID访问数据对象的时候，首先从Session一级缓存中查；查不到，如果配置了二级缓存，那么从二级缓存中查；查不到，再查询数据库，把结果按照ID放入到缓存。 <br />4) 删除、更新、增加数据的时候，同时更新缓存。<br />　　Hibernate的二级缓存策略，是针对于ID查询的缓存策略，对于条件查询则毫无作用。为此，Hibernate提供了针对条件查询的Query Cache。<br />2.3.2. 什么样的数据适合存放到第二级缓存中？<br />1 很少被修改的数据<br />2 不是很重要的数据，允许出现偶尔并发的数据<br />3 不会被并发访问的数据<br />4 参考数据,指的是供应用参考的常量数据，它的实例数目有限，它的实例会被许多其他类的实例引用，实例极少或者从来不会被修改。<br />2.3.3. 不适合存放到第二级缓存的数据？<br />1 经常被修改的数据<br />2 财务数据，绝对不允许出现并发<br />3 与其他应用共享的数据。<br /><br />2.3.4. 常用的缓存插件<br />Hibernater 的二级缓存是一个插件，下面是几种常用的缓存插件：<br />l EhCache：可作为进程范围的缓存，存放数据的物理介质可以是内存或硬盘，对Hibernate的查询缓存提供了支持。<br />l OSCache：可作为进程范围的缓存，存放数据的物理介质可以是内存或硬盘，提供了丰富的缓存数据过期策略，对Hibernate的查询缓存提供了支持。<br />l SwarmCache：可作为群集范围内的缓存，但不支持Hibernate的查询缓存。<br />l JBossCache：可作为群集范围内的缓存，支持事务型并发访问策略，对Hibernate的查询缓存提供了支持。<br /><br />2.3.5. 配置二级缓存的主要步骤：<br />1) 选择需要使用二级缓存的持久化类，设置它的命名缓存的并发访问策略。这是最值得认真考虑的步骤。<br />2) 选择合适的缓存插件，然后编辑该插件的配置文件。<br />2.4. 使用EhCache配置二级缓存：<br />2.4.1. 配置准备：<br />1) 把ehcache-1.2.3.jar加入到当前应用的classpath中。<br />2) 在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。<br />&lt;!--配置缓存插件 --><br />&lt;property name="hibernate.cache.provider_class"><br />org.hibernate.cache.EhCacheProvider<br />&lt;/property> <br /><br />3) 挎贝ehcache.xml文件到类路径(项目工程的src目录下)，这个文件在Hibernate安装目录的etc下。<br />2.4.2. 配置步骤：<br />Hibernate允许在类和集合的粒度上设置第二级缓存。在映射文件中，&lt;class>和&lt;set>元素都有一个&lt;cache>子元素，这个子元素用来配置二级缓存。<br />示例：以category(产品类别)和product(产品)的映射为例：<br />1) 修改要配置缓存的那个持久化类的对象关系映射文件：<br />Category.hbm.xml<br />&lt;?xml version="1.0" encoding="utf-8"?><br />&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><br /><br />&lt;hibernate-mapping><br />&lt;class name="org.qiujy.domain.cachedemo.Category" table="categories"><br />&lt;!?<br />配置缓存,必须紧跟在class元素后面<br />对缓存中的Category对象采用读写型的并发访问策略<br />--><br />&lt;cache usage="read-write"/><br /><br />&lt;id name="id" type="java.lang.Long"><br />&lt;column name="id" /><br />&lt;generator class="native" /><br />&lt;/id><br />&lt;!-- 配置版本号,必须紧跟在id元素后面 --><br />&lt;version name="version" column="version" type="java.lang.Long" /><br /><br />&lt;property name="name" type="java.lang.String"><br />&lt;column name="name" length="32" not-null="true"/><br />&lt;/property><br /><br />&lt;property name="description" type="java.lang.String"><br />&lt;column name="description" length="255"/><br />&lt;/property><br /><br />&lt;set name="products" table="products" cascade="all" inverse="true"><br />&lt;!-- Hibernate只会缓存对象的简单属性的值,<br />要缓存集合属性,必须在集合元素中也加入&lt;cache>子元素<br />而Hibernate仅仅是把与当前持久对象关联的对象的OID存放到缓存中。<br />如果希望把整个关联的对象的所有数据都存入缓存,<br />则要在相应关联的对象的映射文件中配置&lt;cache>元素<br />--><br />&lt;cache usage="read-write"/><br /><br />&lt;key column="categoryId" not-null="true"/><br />&lt;one-to-many class="org.qiujy.domain.cachedemo.Product"/><br />&lt;/set><br /><br />&lt;/class><br />&lt;/hibernate-mapping><br /><br /><br />Product.hbm.xml<br />&lt;?xml version="1.0" encoding="utf-8"?><br />&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><br /><br />&lt;hibernate-mapping><br />&lt;class name="org.qiujy.domain.cachedemo.Product" table="products"><br /><br />&lt;cache usage="read-write"/><br /><br />&lt;id name="id" type="java.lang.Long"><br />&lt;column name="id" /><br />&lt;generator class="native" /><br />&lt;/id><br />&lt;!-- 配置版本号,必须紧跟在id元素后面 --><br />&lt;version name="version" column="version" type="java.lang.Long" /><br /><br />&lt;property name="name" type="java.lang.String"><br />&lt;column name="name" length="32" not-null="true"/><br />&lt;/property><br /><br />&lt;property name="description" type="java.lang.String"><br />&lt;column name="description" length="255"/><br />&lt;/property><br /><br />&lt;property name="unitCost" type="java.lang.Double"><br />&lt;column name="unitCost" /><br />&lt;/property><br /><br />&lt;property name="pubTime" type="java.util.Date"><br />&lt;column name="pubTime" not-null="true" /><br />&lt;/property><br /><br />&lt;many-to-one name="category" <br />column="categoryId"<br />class="org.qiujy.domain.cachedemo.Category"<br />cascade="save-update"<br />not-null="true"><br />&lt;/many-to-one><br /><br />&lt;/class><br />&lt;/hibernate-mapping><br /><br /><br /><br />2) 编辑ehcache.xml文件：<br />&lt;ehcache><br />&lt;diskStore path="c:\\ehcache\"/> <br />&lt;defaultCache <br />maxElementsInMemory="10000" <br />eternal="false" <br />timeToIdleSeconds="120" <br />timeToLiveSeconds="120" <br />overflowToDisk="true" <br />/><br /><br />&lt;!-- 设置Category类的缓存的数据过期策略 --><br />&lt;cache name="org.qiujy.domain.cachedemo.Category"<br />maxElementsInMemory="100"<br />eternal="true"<br />timeToIdleSeconds="0"<br />timeToLiveSeconds="0"<br />overflowToDisk="false"<br />/><br /><br />&lt;!-- 设置Category类的products集合的缓存的数据过期策略 --><br />&lt;cache name="org.qiujy.domain.cachedemo.Category.products"<br />maxElementsInMemory="500"<br />eternal="false"<br />timeToIdleSeconds="300"<br />timeToLiveSeconds="600"<br />overflowToDisk="true"<br />/><br /><br />&lt;cache name="org.qiujy.domain.cachedemo.Product"<br />maxElementsInMemory="500"<br />eternal="false"<br />timeToIdleSeconds="300"<br />timeToLiveSeconds="600"<br />overflowToDisk="true"<br />/><br /><br />&lt;/ehcache> <br /><br />配置的元素说明：<br />元素或属性 描述 <br />&lt;diskStore> 设置缓存数据文件的存放目录 <br />&lt;defaultCache> 设置缓存的默认数据过期策略 <br />&lt;cache> 设定具体的命名缓存的数据过期策略<br />每个命名缓存代表一个缓存区域，每个缓存区域有各自的数据过期策略。命名缓存机制使得用户能够在每个类以及类的每个集合的粒度上设置数据过期策略。 <br />cache元素的属性 <br />name 设置缓存的名字,它的取值为类的全限定名或类的集合的名字 <br />maxInMemory 设置基于内存的缓存中可存放的对象最大数目 <br />eternal 设置对象是否为永久的,true表示永不过期,此时将忽略timeToIdleSeconds和timeToLiveSeconds属性;<br />默认值是false <br />timeToIdleSeconds 设置对象空闲最长时间,超过这个时间,对象过期。当对象过期时,EHCache会把它从缓存中清除。<br />如果此值为0,表示对象可以无限期地处于空闲状态。 <br />timeToLiveSeconds 设置对象生存最长时间,超过这个时间,对象过期。<br />如果此值为0,表示对象可以无限期地存在于缓存中。 <br />overflowToDisk 设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中 <br /><br /><br />3) 写一测试类：<br />package org.qiujy.test.cache;<br /><br />import java.util.List;<br /><br />import org.hibernate.HibernateException;<br />import org.hibernate.Session;<br />import org.hibernate.Transaction;<br />import org.qiujy.common.HibernateSessionFactory;<br />import org.qiujy.domain.cachedemo.Product;<br /><br />public class TestCache {<br /><br />public static void main(String[] args) {<br /><br />//test cache.........<br />Session session2 = HibernateSessionFactory.getSession();<br />Transaction tx2 =null;<br /><br />try{ <br />tx2 = session2.beginTransaction();<br /><br />List list = session2.createQuery("from Product").list();<br /><br />for(int i = 0 ; i &lt; list.size(); i++){<br />Product prod = (Product)list.get(i);<br />System.out.println(prod.getName());<br />}<br /><br />tx2.commit();<br />}catch(HibernateException e){<br />if(tx2 != null){<br />tx2.rollback();<br />}<br />e.printStackTrace();<br />}finally{<br />HibernateSessionFactory.closeSession();<br />}<br /><br />//-------------------<br />Session session3 = HibernateSessionFactory.getSession();<br />Transaction tx3 =null;<br /><br />try{ <br />tx3 = session3.beginTransaction();<br /><br />Product prod = (Product)session3.get(Product.class, new Long(1));<br />System.out.println("从cache中得到,不执行SQL---" + prod.getName());<br /><br />tx3.commit();<br />}catch(HibernateException e){<br />if(tx3 != null){<br />tx3.rollback();<br />}<br />e.printStackTrace();<br />}finally{<br />HibernateSessionFactory.closeSession();<br />}<br />}<br />} <br /><br />首先数据库插入1000条产品记录和1条类别记录。此1000个产品都属于这一类别。然后执行以上测试类，在Session2中查询所有的产品，输出它的产品名，Session2会把这些数据加载到二级缓存中，由于有1000个对象，而配置中定义内存中只能存放500个，剩下的对象就会写到指定的磁盘目录中缓存起来。所以在磁盘相应位置可看到数据文件：<br />2.5. 查询缓存(Query Cache)：<br />对于经常使用的查询语句，如果启用了查询缓存，当第一次执行查询语句时，Hibernate会把查询结果存放在第二缓存中。以后再次执行该查询语句时，只需从缓存中获得查询结果，从而提高查询性能。<br />2.5.1. 查询缓存适用于以下场合：<br />l 在应用程序运行时经常使用的查询语句。<br />l 很少对与查询语句关联的数据库数据进行插入、删除或更新操作。<br />2.5.2. Hibernate的Query缓存策略的过程如下：<br />1) Hibernate首先根据这些信息组成一个Query Key，Query Key包括条件查询的请求一般信息：SQL， SQL需要的参数，记录范围（起始位置rowStart，最大记录个数maxRows)，等。 <br />2) Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。如果存在，那么返回这个结果列表；如果不存在，查询数据库，获取结果列表，把整个结果列表根据Query Key放入到Query缓存中。 <br />3) Query Key中的SQL涉及到一些表名，如果这些表的任何数据发生修改、删除、增加等操作，这些相关的Query Key都要从缓存中清空。<br />只有当经常使用同样的参数进行查询时，这才会有些用处。 <br />启用查询缓存的步骤：<br />1) 配置二级缓存：<br />Hibernate提供了三种和查询相关的缓存区域：<br />l 默认的查询缓存区域：org.hibernate.cache.StandardQueryCache<br />l 用户自定义的查询缓存区域：<br />l 时间戳缓存区域：org.hibernate.cache.UpdateTimestampCache<br />默认的查询缓存区域以及用户自定义的查询缓存区域都用于存放查询结果。而时间戳缓存区域存放了对与查询结果相关的表进行插入、更新或删除操作的时间戳。 Hibernate通过时间戳缓存区域来判断被缓存的查询结果是否过期。所以，当应用程序对数据库的相关数据做了修改，Hibernate会自动刷新缓存的查询结果。但是如果其他应用程序对数据库的相关数据做了修改，则无法监测，此时必须由应用程序负责监测这一变化，然后手工刷新查询结果。Query接口的setForceCacheRefresh(true)可以手工刷新查询结果。<br />在ehcache.xml中添加如下配置：<br />&lt;!-- 设置默认的查询缓存的数据过期策略 --><br />&lt;cache name="org.hibernate.cache.StandardQueryCache" <br />maxElementsInMemory="50"<br />eternal="false" <br />timeToIdleSeconds="3600" <br />timeToLiveSeconds="7200" <br />overflowToDisk="true"/><br /><br />&lt;!-- 设置时间戳缓存的数据过期策略 --><br />&lt;cache name="org.hibernate.cache.UpdateTimestampsCache" <br />maxElementsInMemory="5000"<br />eternal="true" <br />overflowToDisk="true"/><br /><br />&lt;!-- 设置自定义命名查询缓存customerQueries的数据过期策略 --><br />&lt;cache name="myCacheRegion"<br />maxElementsInMemory="1000"<br />eternal="false"<br />timeToIdleSeconds="300"<br />timeToLiveSeconds="600"<br />overflowToDisk="true"<br />/> <br /><br /><br />2) 打开查询缓存：在hibernate.cfg.xml添加如下配置<br />&lt;!--启用查询缓存 --><br />&lt;property name="cache.use_query_cache">true&lt;/property> <br /><br /><br />3) 在程序中使用：<br />虽然按以上设置好了查询缓存，但Hibernate在执行查询语句语句时仍不会启用查询缓存。对于希望启用查询缓存的查询语句，应该调用Query接口的setCacheeable(true)方法：<br />测试类如下：<br />package org.qiujy.test.cache;<br /><br />import java.util.List;<br /><br />import org.hibernate.HibernateException;<br />import org.hibernate.Query;<br />import org.hibernate.Session;<br />import org.hibernate.Transaction;<br />import org.qiujy.common.HibernateSessionFactory;<br />import org.qiujy.domain.cachedemo.Product;<br /><br />public class TessQueryCache {<br /><br />public static void main(String[] args) {<br />Session session = HibernateSessionFactory.getSession();<br />Transaction tx =null;<br /><br />try{ <br />tx = session.beginTransaction(); <br />Query query = session.createQuery("from Product");<br />//激活查询缓存<br />query.setCacheable(true);<br />//使用自定义的查询缓存区域,若不设置,则使用标准查询缓存区域<br />query.setCacheRegion("myCacheRegion");<br /><br />List list = query.list();<br />for(int i = 0 ; i &lt; list.size(); i++){<br />Product prod = (Product)list.get(i);<br />System.out.println(prod.getName());<br />}<br /><br />tx.commit();<br />}catch(HibernateException e){<br />if(tx != null){<br />tx.rollback();<br />}<br />e.printStackTrace();<br />}finally{<br />HibernateSessionFactory.closeSession();<br />}<br />}<br />}
          <br/><br/>
          <span style="color:red;">
            <a href="http://vondon.javaeye.com/blog/165726#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Feb 2008 13:47:09 +0800</pubDate>
        <link>http://vondon.javaeye.com/blog/165726</link>
        <guid>http://vondon.javaeye.com/blog/165726</guid>
      </item>
          <item>
        <title>Oracle导入程序Imp的使用详解</title>
        <author>vondon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://vondon.javaeye.com">vondon</a>&nbsp;
                    链接：<a href="http://vondon.javaeye.com/blog/164302" style="color:red;">http://vondon.javaeye.com/blog/164302</a>&nbsp;
          发表时间: 2008年02月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Oracle的导入实用程序(Import utility)允许从数据库提取数据，并且将数据写入操作系统文件。imp使用的基本格式：imp[username[/password[@service]]]，以下例举imp常用用法。 <br /><br /><br /><br />1. 获取帮助 <br /><br /> imp help=y<br />2. 导入一个完整数据库<br /><br /> imp system/manager file=bible_db log=dible_db full=y ignore=y<br />3. 导入一个或一组指定用户所属的全部表、索引和其他对象<br /><br /> imp system/manager file=seapark log=seapark fromuser=seapark imp <br /> system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)<br />4. 将一个用户所属的数据导入另一个用户<br /><br /> imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copy<br /> imp system/manager file=tank log=tank fromuser=(seapark,amy)<br /> touser=(seapark1, amy1)<br />5. 导入一个表<br /><br /> imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)<br />6. 从多个文件导入<br /><br /> imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4) <br />log=paycheck, filesize=1G full=y<br />7. 使用参数文件<br /><br /> imp system/manager parfile=bible_tables.par<br />bible_tables.par参数文件：<br /><br /> #Import the sample tables used for the Oracle8i Database Administrator's <br />Bible. fromuser=seapark touser=seapark_copy file=seapark log=seapark_import<br />8. 增量导入<br /><br /> imp system./manager inctype= RECTORE FULL=Y FILE=A<br />Oracle imp/exp C:Documents and Settingsadministrator>exp help=yExport: Release 9.2.0.1.0 - Production on 星期三 7月 28 17:04:43 2004Copyright (c) 1982, 2002, Oracle Corporation.&nbsp; All rights reserved. 通过输入 EXP 命令和用户名/口令，您可以后接用户名/口令的命令:例程: EXP SCOTT/TIGER或者，您也可以通过输入跟有各种参数的 EXP 命令来控制“导出”按照不同参数。要指定参数，您可以使用关键字:格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)例程: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)或 TABLES=(T1: P1,T1: P2)，如果 T1 是分区表USERID 必须是命令行中的第一个参数。关键字&nbsp; 说明(默认)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关键字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明(默认)--------------------------------------------------------------------------USERID&nbsp;&nbsp; 用户名/口令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导出整个文件 (N)BUFFER&nbsp;&nbsp; 数据缓冲区大小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OWNER&nbsp;&nbsp;&nbsp;&nbsp; 所有者用户名列表FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出文件 (EXPDAT.DMP)&nbsp; TABLES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表名称列表COMPRESS&nbsp;&nbsp; 导入到一个区 (Y) RECORDLENGTH IO 记录的长度GRANTS&nbsp; 导出权限 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INCTYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 增量导出类型INDEXES&nbsp;&nbsp;&nbsp; 导出索引 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RECORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 跟踪增量导出 (Y)DIRECT&nbsp;&nbsp;&nbsp;&nbsp; 直接路径 (N)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRIGGERS&nbsp;&nbsp;&nbsp;&nbsp; 导出触发器 (Y)LOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 屏幕输出的日志文件&nbsp; STATISTICS&nbsp;&nbsp; 分析对象 (ESTIMATE)ROWS&nbsp;&nbsp;&nbsp; 导出数据行 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数文件名CONSISTENT 交叉表的一致性 (N) CONSTRAINTS&nbsp; 导出的约束条件 (Y)OBJECT_CONSISTENT&nbsp;&nbsp;&nbsp; 只在对象导出期间设置为读的事务处理 (N)FEEDBACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每 x 行的显示进度 (0)FILESIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个转储文件的最大大小FLASHBACK_SCN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于将会话快照设置回以前状态的 SCNFLASHBACK_TIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于获取最接近指定时间的 SCN 的时间QUERY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于导出表的子集的 select 子句RESUMABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遇到与空格相关的错误时挂起 (N)RESUMABLE_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于标识可恢复语句的文本字符串RESUMABLE_TIMEOUT&nbsp;&nbsp;&nbsp; RESUMABLE 的等待时间TTS_FULL_CHECK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对 TTS 执行完整的或部分相关性检查TABLESPACES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要导出的表空间列表TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)TEMPLATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用 iAS 模式导出的模板名在没有警告的情况下成功终止导出。==================================================C:Documents and Settingsadministrator>imp help=yImport: Release 9.2.0.1.0 - Production on 星期三 7月 28 17:06:54 2004Copyright (c) 1982, 2002, Oracle Corporation.&nbsp; All rights reserved. 可以通过输入 IMP 命令和您的用户名/口令后接用户名/口令的命令:例程: IMP SCOTT/TIGER或者, 可以通过输入 IMP 命令和各种参数来控制“导入”按照不同参数。要指定参数，您可以使用关键字:格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)例程: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N或 TABLES=(T1: P1,T1: P2)，如果 T1 是分区表USERID 必须是命令行中的第一个参数。关键字&nbsp; 说明（默认）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关键字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明（默认）--------------------------------------------------------------------------USERID&nbsp;&nbsp; 用户名/口令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导入整个文件 (N)BUFFER&nbsp;&nbsp; 数据缓冲区大小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROMUSER&nbsp;&nbsp;&nbsp;&nbsp; 所有人用户名列表FILE&nbsp;&nbsp;&nbsp;&nbsp; 输入文件 (EXPDAT.DMP)&nbsp;&nbsp;&nbsp; TOUSER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户名列表SHOW&nbsp;&nbsp;&nbsp;&nbsp; 只列出文件内容 (N) TABLES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表名列表IGNORE&nbsp;&nbsp; 忽略创建错误 (N)&nbsp;&nbsp;&nbsp; RECORDLENGTH&nbsp; IO 记录的长度GRANTS&nbsp; 导入权限 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INCTYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 增量导入类型INDEXES 导入索引 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 提交数组插入 (N)ROWS&nbsp;&nbsp;&nbsp; 导入数据行 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数文件名LOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 屏幕输出的日志文件&nbsp;&nbsp; CONSTRAINTS&nbsp; 导入限制 (Y)DESTROY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 覆盖表空间数据文件 (N)INDEXFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将表/索引信息写入指定的文件SKIP_UNUSABLE_INDEXES&nbsp; 跳过不可用索引的维护 (N)FEEDBACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每 x 行显示进度 (0)TOID_NOVALIDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 跳过指定类型 ID 的验证FILESIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个转储文件的最大大小STATISTICS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 始终导入预计算的统计信息RESUMABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在遇到有关空间的错误时挂起 (N)RESUMABLE_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来标识可恢复语句的文本字符串RESUMABLE_TIMEOUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESUMABLE 的等待时间COMPILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编译过程, 程序包和函数 (Y)STREAMS_CONFIGURATION&nbsp; 导入 Streams 的一般元数据 (Y)STREAMS_INSTANITATION&nbsp; 导入 Streams 的实例化元数据 (N)下列关键字仅用于可传输的表空间TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)TABLESPACES 将要传输到数据库的表空间DATAFILES 将要传输到数据库的数据文件TTS_OWNERS 拥有可传输表空间集中数据的用户成功终止导入，但出现警告。oracle的imp和exp的一些用法- -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle8i/9i EXP/IMP使用经验&nbsp; 一、8i EXP常用选项 1、FULL，这个用于导出整个数据库，在ROWS=N一起使用时，可以导出整个数据库的结构。例如： exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y 2、BUFFER和FEEDBACK，在导出比较多的数据时，我会考虑设置这两个参数。例如： exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT 3、FILL和LOG，这两个参数分别指定备份的DMP名称和LOG名称，包括文件名和目录，例子见上面。 需要说明的是，EXP可以直接备份到磁带中，即使用FILE=/dev/rmt0(磁带设备名)，但是一般我们都不这么做，原因有二：一、这样做的速度会慢很多，二、现在一般都是使用磁带库的，不建议直接对磁带进行操作。至于没有使用磁带库的朋友可以考虑和UNIX的TAR结合使用。 如果你真想使用EXP直接到磁带，你可以参考Metalink文章“EXPORTING TO TAPE ON UNIX SYSTEMS”（文档号：30428.1），该文中有详细解释。 4、COMPRESS参数将在导出的同时合并碎块，尽量把数据压缩到initial的EXTENT里，默认是N，一般建议使用。DIRECT参数将告诉EXP直接读取数据，而不像传统的EXP那样，使用SELECT来读取表中的数据，这样就减少了SQL语句处理过程。一般也建议使用。不过有些情况下DIRECT参数是无法使用的。 5、如何使用SYSDBA执行EXP/IMP？ 这是一个很现实的问题，有时候我们需要使用SYSDBA来执行EXP/IMP，如进行传输表空间的EXP/IMP，以及在9i下用SYS用户来执行EXP/IMP时，都需要使用SYSDBA才可。我们可以使用下面方式连入EXP/IMP： exp "'sys/sys as sysdba'" file=1.dmp tables=gototop.t rows=n 6、QUERY参数后面跟的是where条件，值得注意的是，整个where子句需要使用""括起来，where子句的写法和SELECT中相同，如果是UNIX平台所有"和'都需要使用u26469屏蔽它们的特殊含义： exp gototop/gototop file=1.dmp log=1.log tables=cyx.t query="where c1=20 and c2=gototop" 如果是windows平台，则使用下面的格式： exp c/c@ncn file=c.dmp log=c.log tables=t query="""where id=1 and name='gototop'""" 二、8i IMP常用选项 1、FROMUSER和TOUSER，使用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中。 2、IGNORE、GRANTS和INDEXES，其中IGNORE参数将忽略表的存在，继续导入，这个对于需要调整表的存储参数时很有用，我们可以先根据实际情况用合理的存储参数建好表，然后直接导入数据。而GRANTS和INDEXES则表示是否导入授权和索引，如果想使用新的存储参数重建索引，或者为了加快到入速度，我们可以考虑将INDEXES设为N，而GRANTS一般都是Y。 另外一个EXP/IMP都有的参数是PARFILE，它是用来定义EXP/IMP的参数文件，也就是说，上面的参数都可以写在一个参数文件中，但我们一般很少使用。 三、Oracle9i EXP功能描述 Oracle9i EXP在原有的基础上新增了部分新的参数，按功能主要分为以下几个部分： 1、OBJECT_CONSISTENT - 用于设置EXP对象为只读以保持对象的一致性。默认是N。 2、FLASHBACK_SCN和FLASHBACK_TIME - 用于支持FLASHBACK功能而新增。 3、RESUMABLE、RESUMABLE_NAME和RESUMABLE_TIMEOUT - 用于支持RESUMABLE空间分配而新增。 4、TTS_FULL_CHECK - 用于在传输表空间时使用依赖性检查。 5、TEMPLATE - 用于支持iAS。 6、TABLESPACES - 设置表空间导出模式。个人觉得对于一般用户而言，这个才是新增参数中最实用的一个，可以让用户在原来的FULL、OWNER、TABLES的基础上多了一种选择，使得EXP更加灵活。 四、不同版本的EXP/IMP问题？ 一般来说，从低版本导入到高版本问题不大，麻烦的是将高版本的数据导入到低版本中，在Oracle9i之前，不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决： 1、在高版本数据库上运行底版本的catexp.sql； 2、使用低版本的EXP来导出高版本的数据； 3、使用低版本的IMP将数据库导入到底版本数据库中； 4、在高版本数据库上重新运行高版本的catexp.sql脚本。 但在9i中，上面的方法并不能解决问题。如果直接使用底版本EXP/IMP会出现如下错误： EXP-00008: ORACLE error %lu encountered ORA-00904: invalid column name 这已经是一个公布的BUG，需要等到Oracle10.0才能解决，BUG号为2261，你可以到METALINK上去查看有关此BUG的详细信息。 BUG归BUG，我们的工作还是要做，在没有Oracle的支持之前，我们就自己解决。在Oracle9i中执行下面的SQL重建exu81rls视图即可。 CREATE OR REPLACE view exu81rls&nbsp; (objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)&nbsp; AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,&nbsp; decode(bitand(r.stmt_type,1), 0,'', 'SELECT,')&nbsp; || decode(bitand(r.stmt_type,2), 0,'', 'INSERT,')&nbsp; || decode(bitand(r.stmt_type,4), 0,'', 'UPDATE,')&nbsp; || decode(bitand(r.stmt_type,8), 0,'', 'DELETE,'),&nbsp; r.check_opt, r.enable_flag,&nbsp; DECODE(BITAND(r.stmt_type, 16), 0, 0, 1)&nbsp; from user$ u, obj$ o, rls$ r&nbsp; where u.user# = o.owner#&nbsp; and r.obj# = o.obj#&nbsp; and (uid = 0 or&nbsp; uid = o.owner# or&nbsp; exists ( select * from session_roles where role='SELECT_CATALOG_ROLE')&nbsp; )&nbsp; /&nbsp; grant select on sys.exu81rls to public;&nbsp; /&nbsp; 五、其他问题 本文只讨论了Oracle8i和9i中的EXP/IMP的一些情况，对于之前的版本，在8.0.X中，除了QUERY参数不能用外，其它差别不大。针对没有QUERY的情况，我们可以先在数据库中使用查询条件建立临时中间表，然后使用EXP导出这个中间表即可。至于Oracle7因为目前使用的人较少，gototop不打算在此做详细解释了，如果读者朋友有需求，你可以参考Metalink文档：“Overview of Export and Import in Oracle7”（文档号：61949.1）。关于EXP/IMP的详细参数信息你可以通过EXP/IMP HELP=Y来获得。 另外关于传输表空间的更多信息可以参考下面的Metelink文档，本文不再详述。 [NOTE:77523.1] Transportable Tablespaces -- An Example to setup and use.&nbsp; [NOTE:100698.1] Perform tablespace point-in-time recovery using Transportable Tablespace.&nbsp; 在进行并行EXP/IMP的时候，如果IMP过程建索引的话不建议同时运行5个以上的IMP，如果你想加快速度，可以在IMP的时候不建索引，这样只要内存允许，可以多跑几个，然后是SQL脚本创建需要的索引。 引用http://okone96.itpub.net/post/9033/196742ORACLE数据库有两类备份方法。第一类为物理备份，该方法实现数据库的完整恢复，但数据库必须运行在归挡模式下（业务数据库在非归挡模式下运行），且需要极大的外部存储设备，例如磁带库；第二类备份方式为逻辑备份，业务数据库采用此种方式，此方法不需要数据库运行在归挡模式下，不但备份简单，而且可以不需要外部存储设备。数据库逻辑备份方法ORACLE数据库的逻辑备份分为三种模式：表备份、用户备份和完全备份。表模式备份某个用户模式下指定的对象（表）。业务数据库通常采用这种备份方式。若备份到本地文件，使用如下命令：exp icdmain/icd rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0file=exp_icdmain_csd_yyyymmdd.dmplog=exp_icdmain_csd_yyyymmdd.logtables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo若直接备份到磁带设备，使用如下命令：exp icdmain/icd rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0file=/dev/rmt0log=exp_icdmain_csd_yyyymmdd.logtables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo注：在磁盘空间允许的情况下，应先备份到本地服务器，然后再拷贝到磁带。出于速度方面的考虑，尽量不要直接备份到磁带设备。用户模式备份某个用户模式下的所有对象。业务数据库通常采用这种备份方式。若备份到本地文件，使用如下命令：exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0file=exp_icdmain_yyyymmdd.dmplog=exp_icdmain_yyyymmdd.log若直接备份到磁带设备，使用如下命令：exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0file=/dev/rmt0log=exp_icdmain_yyyymmdd.log注：如果磁盘有空间，建议备份到磁盘，然后再拷贝到磁带。如果数据库数据量较小，可采用这种办法备份。完全模式备份完整的数据库。业务数据库不采用这种备份方式。备份命令为：exp icdmain/icd rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0 full=yfile=exp_fulldb_yyyymmdd.dmp(磁带设备则为/dev/rmt0)log=exp_fulldb_yyyymmdd.log对于数据库备份，建议采用增量备份，即只备份上一次备份以来更改的数据。增量备份命令：exp icdmain/icd rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0 full=y inctype=incrementalfile=exp_fulldb_yyyymmdd.dmp(磁带设备则为/dev/rmt0)log=exp_fulldb_yyyymmdd.log注：关于增量备份必须满足下列条件：1.只对完整数据库备份有效，且第一次需要full=y参数，以后需要inctype=incremental参数。2. 用户必须有EXP_FULL_DATABASE的系统角色。3. 话务量较小时方可采用数据库备份。4. 如果磁盘有空间，建议备份到磁盘，然后再备份到磁带。业务数据库备份方法及周期用EXP进行备份前，先在SYS用户下运行CATEXP.SQL文件（如果以前已运行该文件，则不要执行这个脚本）。没有特殊说明，不允许在客户端执行备份命令。备份命令参照表模式下的备份命令。从磁盘文件备份到磁带如果首先备份到本地磁盘文件，则需要转储到磁带设备上。1. 若需查看主机上配置的磁带设备，使用如下命令：lsdev -Cc tape显示的结果如下例所示：rmt0 Available 30-58-00-2,0 SCSI 4mm Tape Drivermt1 Defined　 30-58-00-0,0 SCSI 4mm Tape Drive标明Available的设备是可用的磁带设备。2. 若需查看磁带存储的内容，使用如下命令：tar -tvf /dev/rmt0显示的结果如下例所示：-rw-r--r-- 300 400 8089600 Jan 11 14:33:57 2001 exp_icdmain_20010111.dmp如果显示类似如下内容，则表示该磁带存储的备份数据是从数据库直接备份到磁带上，而非从本地磁盘转储到磁带的备份文件，因此操作系统无法识别。tar: 0511-193 An error occurred while reading from the media.There is an input or output error.或tar: 0511-169 A directory checksum error on media; -267331077 not equal to25626.3. 对于新磁带或无需保留现存数据的磁带，使用如下命令：tar -cvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp注：A. 该命令将无条件覆盖磁带上的现存数据。　 B. 文件名不允许包含路径信息，如：/backup/exp_icdmain_yyyymmdd.dmp。4. 对于需要保留现存数据的磁带，使用如下命令：tar -rvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp注：该命令将文件exp_icdmain_yyyymmdd.dmp追加到磁带的末端，不会覆盖现存的数据。特别强调：如果备份时是从数据库直接备份到磁带上，则不可再向该磁带上追加复制任何其他文件，否则该备份数据失效。5. 若需将转储到磁带上的备份文件复制到本地硬盘，使用如下命令：A. 将磁带上的全部文件复制到本地硬盘的当前目录tar -xvf /dev/rmt0B. 将磁带上的指定文件复制到本地硬盘的当前目录tar -xvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp备份时间安排由于备份时对系统I/O有较大影响，所以，建议在晚上11点以后进行备份工作。业务数据库Oracle版本的恢复恢复方案需根据备份方案确定。由于业务数据库采用表备份和用户备份相结合的方案，所以业务数据库的恢复需根据实际情况采用表恢复和用户恢复相结合的方案。恢复方案数据库的逻辑恢复分为表恢复、用户恢复、完全恢复三种模式。表模式此方式将根据按照表模式备份的数据进行恢复。A. 恢复备份数据的全部内容若从本地文件恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0file=exp_icdmain_csd_yyyymmdd.dmplog=imp_icdmain_csd_yyyymmdd.log若从磁带设备恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0log=imp_icdmain_csd_yyyymmdd.logB. 恢复备份数据中的指定表若从本地文件恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0file=exp_icdmain_csd_yyyymmdd.dmplog=imp_icdmain_csd_yyyymmdd.logtables=commoninformation,serviceinfo若从磁带设备恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0file=/dev/rmt0log=imp_icdmain_csd_yyyymmdd.logtables=commoninformation,serviceinfo用户模式此方式将根据按照用户模式备份的数据进行恢复。A. 恢复备份数据的全部内容若从本地文件恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0file=exp_icdmain_yyyymmdd.dmplog=imp_icdmain_yyyymmdd.log若从磁带设备恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0log=imp_icdmain_yyyymmdd.logB. 恢复备份数据中的指定表若从本地文件恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0file=exp_icdmain_yyyymmdd.dmplog=imp_icdmain_yyyymmdd.logtables=commoninformation,serviceinfo若从磁带设备恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0log=imp_icdmain_yyyymmdd.logtables=commoninformation,serviceinfo完全模式如果备份方式为完全模式，采用下列恢复方法：若从本地文件恢复，使用如下命令：imp system/manager rows=y indexes=n commit=y buffer=65536feedback=100000 ignore=y volsize=0 full=yfile=exp_icdmain_yyyymmdd.dmplog=imp_icdmain_yyyymmdd.log若从磁带设备恢复，使用如下命令：imp system/manager rows=y indexes=n commit=y buffer=65536feedback=100000 ignore=y volsize=0 full=yfile=/dev/rmt0log=imp_icdmain_yyyymmdd.log参数说明1. ignore参数Oracle在恢复数据的过程中，当恢复某个表时，该表已经存在，就要根据ignore参数的设置来决定如何操作。若ignore=y，Oracle不执行CREATE TABLE语句，直接将数据插入到表中，如果插入的记录违背了约束条件，比如主键约束，则出错的记录不会插入，但合法的记录会添加到表中。若ignore=n，Oracle不执行CREATE TABLE语句，同时也不会将数据插入到表中，而是忽略该表的错误，继续恢复下一个表。2. indexes参数在恢复数据的过程中，若indexes=n，则表上的索引不会被恢复，但是主键对应的唯一索引将无条件恢复，这是为了保证数据的完整性。字符集转换对于单字节字符集（例如US7ASCII），恢复时，数据库自动转换为该会话的字符集（NLS_LANG参数）；对于多字节字符集（例如ZHS16CGB231280），恢复时，应尽量使字符集相同（避免转换），如果要转换，目标数据库的字符集应是输出数据库字符集的超集。恢复方法业务数据库采用表恢复方案。在用IMP进行恢复前，先在SYS用户下运行CATEXP.SQL文件（如果以前已运行该文件，则不要执行这个脚本），然后执行下列命令：IMP ICDMAIN/ICD FILE=文件名 LOG=LOG文件名 ROWS=YCOMMIT=Y BUFFER=Y IGNORE=Y TABLES=表名注：要恢复的表名参照备份的表名　 。恢复是在原表基础上累加数据　 。没有特殊说明，不允许在客户端执行恢复命令将一个数据库的某用户的所有表导到另外数据库的一个用户下面的例子　　exp userid=system/manager owner=username1 file=expfile.dmpimp userid=system/manager fromuser=username1 touser=username2 ignore=y file=expfile.dmp ORACLE数据库有两类备份方法。第一类为物理备份，该方法实现数据库的完整恢复，但数据库必须运行在归挡模式下（业务数据库在非归挡模式下运行），且需要极大的外部存储设备，例如磁带库；第二类备份方式为逻辑备份，业务数据库采用此种方式，此方法不需要数据库运行在归挡模式下，不但备份简单，而且可以不需要外部存储设备。数据库逻辑备份方法ORACLE数据库的逻辑备份分为三种模式：表备份、用户备份和完全备份。表模式备份某个用户模式下指定的对象（表）。业务数据库通常采用这种备份方式。若备份到本地文件，使用如下命令：exp icdmain/icd rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0file=exp_icdmain_csd_yyyymmdd.dmplog=exp_icdmain_csd_yyyymmdd.logtables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo若直接备份到磁带设备，使用如下命令：exp icdmain/icd rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0file=/dev/rmt0log=exp_icdmain_csd_yyyymmdd.logtables=icdmain.commoninformation,icdmain.serviceinfo,icdmain.dealinfo注：在磁盘空间允许的情况下，应先备份到本地服务器，然后再拷贝到磁带。出于速度方面的考虑，尽量不要直接备份到磁带设备。用户模式备份某个用户模式下的所有对象。业务数据库通常采用这种备份方式。若备份到本地文件，使用如下命令：exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0file=exp_icdmain_yyyymmdd.dmplog=exp_icdmain_yyyymmdd.log若直接备份到磁带设备，使用如下命令：exp icdmain/icd owner=icdmain rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0file=/dev/rmt0log=exp_icdmain_yyyymmdd.log注：如果磁盘有空间，建议备份到磁盘，然后再拷贝到磁带。如果数据库数据量较小，可采用这种办法备份。完全模式备份完整的数据库。业务数据库不采用这种备份方式。备份命令为：exp icdmain/icd rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0 full=yfile=exp_fulldb_yyyymmdd.dmp(磁带设备则为/dev/rmt0)log=exp_fulldb_yyyymmdd.log对于数据库备份，建议采用增量备份，即只备份上一次备份以来更改的数据。增量备份命令：exp icdmain/icd rows=y indexes=n compress=n buffer=65536feedback=100000 volsize=0 full=y inctype=incrementalfile=exp_fulldb_yyyymmdd.dmp(磁带设备则为/dev/rmt0)log=exp_fulldb_yyyymmdd.log注：关于增量备份必须满足下列条件：1.只对完整数据库备份有效，且第一次需要full=y参数，以后需要inctype=incremental参数。2. 用户必须有EXP_FULL_DATABASE的系统角色。3. 话务量较小时方可采用数据库备份。4. 如果磁盘有空间，建议备份到磁盘，然后再备份到磁带。业务数据库备份方法及周期用EXP进行备份前，先在SYS用户下运行CATEXP.SQL文件（如果以前已运行该文件，则不要执行这个脚本）。没有特殊说明，不允许在客户端执行备份命令。备份命令参照表模式下的备份命令。从磁盘文件备份到磁带如果首先备份到本地磁盘文件，则需要转储到磁带设备上。1. 若需查看主机上配置的磁带设备，使用如下命令：lsdev -Cc tape显示的结果如下例所示：rmt0 Available 30-58-00-2,0 SCSI 4mm Tape Drivermt1 Defined　 30-58-00-0,0 SCSI 4mm Tape Drive标明Available的设备是可用的磁带设备。2. 若需查看磁带存储的内容，使用如下命令：tar -tvf /dev/rmt0显示的结果如下例所示：-rw-r--r-- 300 400 8089600 Jan 11 14:33:57 2001 exp_icdmain_20010111.dmp如果显示类似如下内容，则表示该磁带存储的备份数据是从数据库直接备份到磁带上，而非从本地磁盘转储到磁带的备份文件，因此操作系统无法识别。tar: 0511-193 An error occurred while reading from the media.There is an input or output error.或tar: 0511-169 A directory checksum error on media; -267331077 not equal to25626.3. 对于新磁带或无需保留现存数据的磁带，使用如下命令：tar -cvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp注：A. 该命令将无条件覆盖磁带上的现存数据。　 B. 文件名不允许包含路径信息，如：/backup/exp_icdmain_yyyymmdd.dmp。4. 对于需要保留现存数据的磁带，使用如下命令：tar -rvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp注：该命令将文件exp_icdmain_yyyymmdd.dmp追加到磁带的末端，不会覆盖现存的数据。特别强调：如果备份时是从数据库直接备份到磁带上，则不可再向该磁带上追加复制任何其他文件，否则该备份数据失效。5. 若需将转储到磁带上的备份文件复制到本地硬盘，使用如下命令：A. 将磁带上的全部文件复制到本地硬盘的当前目录tar -xvf /dev/rmt0B. 将磁带上的指定文件复制到本地硬盘的当前目录tar -xvf /dev/rmt0 exp_icdmain_yyyymmdd.dmp备份时间安排由于备份时对系统I/O有较大影响，所以，建议在晚上11点以后进行备份工作。业务数据库Oracle版本的恢复恢复方案需根据备份方案确定。由于业务数据库采用表备份和用户备份相结合的方案，所以业务数据库的恢复需根据实际情况采用表恢复和用户恢复相结合的方案。恢复方案数据库的逻辑恢复分为表恢复、用户恢复、完全恢复三种模式。表模式此方式将根据按照表模式备份的数据进行恢复。A. 恢复备份数据的全部内容若从本地文件恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0file=exp_icdmain_csd_yyyymmdd.dmplog=imp_icdmain_csd_yyyymmdd.log若从磁带设备恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0log=imp_icdmain_csd_yyyymmdd.logB. 恢复备份数据中的指定表若从本地文件恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0file=exp_icdmain_csd_yyyymmdd.dmplog=imp_icdmain_csd_yyyymmdd.logtables=commoninformation,serviceinfo若从磁带设备恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0file=/dev/rmt0log=imp_icdmain_csd_yyyymmdd.logtables=commoninformation,serviceinfo用户模式此方式将根据按照用户模式备份的数据进行恢复。A. 恢复备份数据的全部内容若从本地文件恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0file=exp_icdmain_yyyymmdd.dmplog=imp_icdmain_yyyymmdd.log若从磁带设备恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0log=imp_icdmain_yyyymmdd.logB. 恢复备份数据中的指定表若从本地文件恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0file=exp_icdmain_yyyymmdd.dmplog=imp_icdmain_yyyymmdd.logtables=commoninformation,serviceinfo若从磁带设备恢复，使用如下命令：imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=ncommit=y buffer=65536 feedback=100000 ignore=n volsize=0 file=/dev/rmt0log=imp_icdmain_yyyymmdd.logtables=commoninformation,serviceinfo完全模式如果备份方式为完全模式，采用下列恢复方法：若从本地文件恢复，使用如下命令：imp system/manager rows=y indexes=n commit=y buffer=65536feedback=100000 ignore=y volsize=0 full=yfile=exp_icdmain_yyyymmdd.dmplog=imp_icdmain_yyyymmdd.log若从磁带设备恢复，使用如下命令：imp system/manager rows=y indexes=n commit=y buffer=65536feedback=100000 ignore=y volsize=0 full=yfile=/dev/rmt0log=imp_icdmain_yyyymmdd.log参数说明1. ignore参数Oracle在恢复数据的过程中，当恢复某个表时，该表已经存在，就要根据ignore参数的设置来决定如何操作。若ignore=y，Oracle不执行CREATE TABLE语句，直接将数据插入到表中，如果插入的记录违背了约束条件，比如主键约束，则出错的记录不会插入，但合法的记录会添加到表中。若ignore=n，Oracle不执行CREATE TABLE语句，同时也不会将数据插入到表中，而是忽略该表的错误，继续恢复下一个表。2. indexes参数在恢复数据的过程中，若indexes=n，则表上的索引不会被恢复，但是主键对应的唯一索引将无条件恢复，这是为了保证数据的完整性。字符集转换对于单字节字符集（例如US7ASCII），恢复时，数据库自动转换为该会话的字符集（NLS_LANG参数）；对于多字节字符集（例如ZHS16CGB231280），恢复时，应尽量使字符集相同（避免转换），如果要转换，目标数据库的字符集应是输出数据库字符集的超集。恢复方法业务数据库采用表恢复方案。在用IMP进行恢复前，先在SYS用户下运行CATEXP.SQL文件（如果以前已运行该文件，则不要执行这个脚本），然后执行下列命令：IMP ICDMAIN/ICD FILE=文件名 LOG=LOG文件名 ROWS=YCOMMIT=Y BUFFER=Y IGNORE=Y TABLES=表名注：要恢复的表名参照备份的表名　 。恢复是在原表基础上累加数据　 。没有特殊说明，不允许在客户端执行恢复命令
          <br/><br/>
          <span style="color:red;">
            <a href="http://vondon.javaeye.com/blog/164302#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Feb 2008 17:02:32 +0800</pubDate>
        <link>http://vondon.javaeye.com/blog/164302</link>
        <guid>http://vondon.javaeye.com/blog/164302</guid>
      </item>
          <item>
        <title>oracle 数据库审计</title>
        <author>vondon</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://vondon.javaeye.com">vondon</a>&nbsp;
                    链接：<a href="http://vondon.javaeye.com/blog/164293" style="color:red;">http://vondon.javaeye.com/blog/164293</a>&nbsp;
          发表时间: 2008年02月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、审计初始化参数：在init文件中添加 AUDIT_TRAIL = DB<br /><br />2、设置审计<br />对象审计：AUDIT DELETE,INSERT,UPDATE ON TABLE (BY USER);<br />SESSION审计：<br />AUDIT SESSION;<br />-- 指定用户<br />AUDIT SESSION BY (USER1,USER2)<br />权限审计：<br />AUDIT DELETE ANY TABLE BY ACCESS WHENEVER NOTSUCCESSFUL;<br />AUDIT DELETE ANY TABLE;<br />AUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE, EXECUTE PROCEDURE<br />BY ACCESS WHENEVER NOT SUCCESSFUL;<br /><br />3、关闭审计NOAUDIT<br /><br />4、清除审计<br />DELETE FROM SYS.AUD$;<br />DELETE FROM SYS.AUD$ WHERE obj$name = 。。。<br /><br />5、相关视图查询：<br />STMT_AUDIT_OPTION_MAP-审计选项类型代码<br />AUDIT_ACTIONS-action代码<br />ALL_DEF_AUDIT_OPTS-对象创建时默认的对象审计选项<br />DBA_STMT_AUDIT_OPTS-当前数据库系统审计选项<br />DBA_PRIV_AUDIT_OPTS-权限审计选项<br />DBA_OBJ_AUDIT_OPTS<br />USER_OBJ_AUDIT_OPTS-对象审计选项<br />DBA_AUDIT_TRAIL<br />USER_AUDIT_TRAIL-审计记录<br />DBA_AUDIT_OBJECT<br />USER_AUDIT_OBJECT-审计对象列表<br />DBA_AUDIT_SESSION<br />USER_AUDIT_SESSION-session审计<br />DBA_AUDIT_STATEMENT<br />USER_AUDIT_STATEMENT-语句审计<br />DBA_AUDIT_EXISTS-使用BY AUDIT NOT EXISTS选项的审计<br />DBA_AUDIT_POLICIES-审计POLICIES<br />DBA_COMMON_AUDIT_TRAIL-标准审计+精细审计
          <br/><br/>
          <span style="color:red;">
            <a href="http://vondon.javaeye.com/blog/164293#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Feb 2008 16:53:35 +0800</pubDate>
        <link>http://vondon.javaeye.com/blog/164293</link>
        <guid>http://vondon.javaeye.com/blog/164293</guid>
      </item>
      </channel>
</rss>