宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒

发布新日志

  • Oracle数据库导入Buffer不足出现主机蜂鸣

    2010-09-21 11:09:32

        测试新的系统要求把用户的数据库导入在本地测试。由于原数据库比较大有40G。所以计划在本地测试时只要建好数据库,再导出部分数据保证测试的能正常就可以了。

    第一步:在本地建数据库

    1,在cmd窗口中,以管理员登陆数据库:

    sqlplus "/as sysdba"

    2,执行脚本 my_create2.txt,来创建表空间和用户
    注意:表空间的路径需要根据实际情况定义修改

    SQL> @my_create2.txt

    3,切换用户,以avls用户登陆数据库

    SQL>CONNECT AVLS/1;

    4,执行建库脚本 10_20091019.sql//由于是测试数据库,在history表里的表分区部分脚本就不执行了。

    SQL>@10_20091019.sql

    5,导入数据库初始化数据 10数字字典(初始化用).sql

    SQL>@10数字字典(初始化用).sql

    到此,数据库构建已经完成~~!!

    第二:导入数据文件*.dmp有2G左右

    1、在PL/SQL中-tool-import talbes 在import file中输入文件目录

    2、在from user 和 to user中选择对应用户。

    3、按import。

    。。。。。。等待中。

    可是半个小时过去了。在大办公室突然出现了:主机蜂鸣。。。。。。

    一开始以为是别人的机子,还在笑是那个倒霉鬼的内存松了。后来发现是自己的主机在蜂鸣下了一跳。急忙关了机子。

    第二次现导入数据。还是出现主机蜂鸣。。。

    才明白是程序的问题。。。

    最后查出是由于内存不足时报的错。
    在导入数据是不直接用PL/SQL的页面导入。
    用命令行加参数可以解决这个问题。也可以在PL/SQL中把Buffer size调大。
    cd \
    c:\>imp avls/1@orcl file=D:\temp\1.dmp fromuser=avls touser=avls ignore=y rows=y buffer=10000000 commit=y
  • 如何跟踪Oracle中程序调用的SQL语句

    2010-08-23 15:41:40

    在程序测试后数据开发数据库是独立开。常常发生在开发环境中运行正常的程序一转到测试环境就不能用了。如果项目是几个开发人员协同开发的,就常常要把所有的人叫来“三方会诊”才能找到是那个模块的问题。因为不能精确定位BUG在沟通中花了大量的时间。查了半天发现可能是少了某个表、字段、存储过程。这个问题当然可以说通过是数据版本的管理来解决。可如能准确的定位问题,不光能节约时间,还能提高测试人员的威信。在MSsql数据库中有事件查看器可以查看到程序调用的SQL语句。对于这样的问题可以比较快的定位。可是对于oracle数据库没有这样的工具怎么办呢?
    在网上找了N天发现两种办法。第一种办法:用第三方工具查看程序调用的SQL语句。如OraTracer或SQL Monitor。OraTracer是一个小的程序可以看到应用程序调用的SQL语句。这两个对于应用程序都可以跟踪。不过OraTracer对于服务如tomcat就不能查看到了。SQL Monitor有服务的跟踪。可是不是很好用。
    第二种办法:就是用Oracle的系统表V$SQLAREA查看。也就是用管理员用户登陆。运行下SQL语句。
    Select SQL_FULLTEXT From V$SQLAREA
    Where SQL_ID In (
    Select DECODE(SQL_ID,'',PREV_SQL_ID,SQL_ID) From v$session
    Where username= 'XX' And program = 'XXX')
    或是查看oracle的会话中的SQL
    SELECT SE.sid, SE.serial#, PR.spid, SE.status, SUBSTR(SE.program, 1, 10) PROG, 
      SUBSTR(SE.machine, 1, 10) MACH, 
      SQ.sql_text
    FROM v$session SE, v$sqlarea SQ, v$process PR
    WHERE SE.paddr = PR.ADDR(+)
      AND SE.sql_address = SQ.address(+)
      AND schemaname <> 'SYS'
    ORDER BY SE.sid
    当然还有写成日志看看
  • oracle的错误的用户下建了表、序列、存储过程

    2010-07-28 10:11:10

    脑子不清楚没有看清操作说明就随便的运行了oracle建库脚本。

    oracle的错误的在管理员SYS用户下建了表、序列、存储过程。删除的办法。

    Select 'Drop Table ' ||TABLE_NAME||';' From User_Tables
    Where TABLE_NAME Like 'T\_%'
    Escape '\'

    Select * From user_procedures
    Where procedure_name Like 'FN\_%' Or  procedure_name Like 'P\_%'
    Escape '\'

    Select 'DROP PROCEDURE '|| Name ||';' From (
    Select Distinct Name  From USER_SOURCE
    Where  Name Like 'P\_%'
    Escape '\'
    )

     

    Or  Name Like 'P\_%'

    Select 'DROP SEQUENCE '||SEQUENCE_NAME||';' From USER_SEQUENCES
    Where SEQUENCE_NAME Like 'SEQ_%'
    Escape '\'
     

  • 由于计算机名修改引起oracle服务运行不正常

    2010-07-28 09:47:03

    由于计算机名修改引起oracle服务运行不正常,是由计算机名修改后服务 OracleOraDb10g_home1TNSListener 意外停止。

    解决办法:

    1、修改oracle安装目录下的tnsnames.ora中HOST的计算机名

    ORCL =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = *****)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = orcl)
        )
      )

    2、修改oracle安装目录下的listener.ora中HOST的计算机名

    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
          (ADDRESS = (PROTOCOL = TCP)(HOST = *****)(PORT = 1521))
        )
      )

    再到服务中启动LISTENER,或重启计算机。就可以正常登陆。

  • SQL事务

    2008-06-30 12:02:44

    事务

    事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据更改均被清除。

    事务模式

    每条单独的语句都是一个事务。 显示事务每个事务均以begin transaction 语句显示开始,以commit或Rollback语句显示结束。

     

     

  • 数据库缓冲池

    2008-03-08 10:33:44

    一个数据库缓冲池指的是缓存于内存空间中的数据库物理连接,这些数据库连接可以被重复使用。数据库缓冲池对于提高Java 数据库应用程序的性能十分重要,尤其是当这个Java 数据库应用程序运行于中间层服务器环境时。

    数据缓冲池存在于中间层服务器环境当中,可以被不同的Java 应用程序所调用。javax.sql.RowSet 包添加了对缓冲数据源的支持,即可以将缓冲池缓冲的数据库连接看作是一个是实实在在的数据源服务来使用。RowSet 包提供了好几个接口用于处理数据库缓冲池,主要的接口有:
    1、DataSource 接口:DataSource 接口的实例对象代表了存在于中间层服务器中的缓冲数据源服务。使用它可以返还数据库缓冲池中现存的数据库连接,DataSource 接口的实例对象实际上是某个JNDI 服务的提供者,在使用它之前,该JNDI 服务对象必须先在中间层服务器环境中注册,并且和某个服务名绑定在一起,然后它才能被别的Java 应用程序调用。
    2、ConnectionPoolDataSource 接口:该接口可以用于创建一个被缓冲于缓冲池的数据库物理连接,它有可能会被DataSource 接口的实例对象调用。
    3、PooledConnection 接口:该接口代表被缓冲的数据库连接,它定义了一个getConnection()方法使用这个方法可以返回java.sql.Connection 接口的实例对象。
    如何使用RowSet 包定义的类和接口操作数据库缓冲池,下面的JSP 代码段提供了一个简单的不完整的例子



    <%

    Context ctx = new InitialContext();

    DataSource ds = (DataSource)ctx.lookup(“jdbc/EmployeeDB”);

    // First get a Connection. Connection pooling is done

    // internally by the DataSource object.

    Connection con = ds.getConnection(jdbc/webDatabase” "sa” “");

    // Do all the work as a single transaction (optional).

    con.setAutoCommit(false);

    // The actual work (queries and updates) would go here.

    // Work is done using standard JDBC code as defined in the

    // rest of the JDBC API.

    // Commit the transaction.

    con.commit();

    // Close the connection. This returns the underlying physical

    // database connection to the pool.

    con.close();

    %>

    上面的JSP 代码段的运行机理如下

    ???? 1、首先程序代码获取初始化的JNDI 环境并且调用Context.lookup()方法从JNDI服务提供者那里获一个DataSource 对象

    ???? 2、中间层JNDI 服务提供者返回一个DataSource 对象给当前的Java 应用程序这个DataSource 对象代表了中间层服务上现存的缓冲数据源

    ????3、 应用程序调用DataSource 对象的getConnection()方法

    ???? 4、当DataSource 对象的getConnection()方法被调用时中间层服务器将查询数据库连接缓冲池中有没有PooledConnection 接口的实例对象这个PooledConnection对象将被用于与数据库建立物理上的数据库连接

    ???? 5、如果在缓冲池中命中了一个PooledCoonection 对象那么连接缓冲池将简单地更新内部的缓冲连接队列并将该PooledConnection 对象返回如果在缓冲池内没有找到现成的PooledConnection 对象那么ConnectionPoolDataSource 接口将会被用来产生一个新的PooledConnection 对象并将它返回以便应用程序使用

    ???? 6\中间层服务器调用PooledConnection 对象的getConnection()方法以便返还一个java.sql.Connection 对象给当前的Java 应用程序

    ???? 7、当中间层服务器调用PooledConnection 对象的getConnection()方法时JDBC 数据库驱动程序将会创建一个Connection 对象并且把它返回中间层服务器

    ???? 8、中间层服务器将Connection 对象返回给应用程序Java 应用程序可以认为这个Connection 对象是一个普通的JDBC Connection 对象使用它可以和数据库建立事实上的连接与数据库引擎产生交互操作

    ???? 9、当应用程序不需要使用Connection 对象时,可以调用Connection 接口的close()方法。请注意这种情况下close()方法并没有关闭事实上的数据库连接,仅仅是释放了被应用程序占用的数据库连接,并将它还给数据库连接缓冲池,数据库连接缓冲池会自动将这个数据库连接交给请求队列中下一个的应用程序使用。
  • Dual表

    2007-11-26 16:29:17

    Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select中。

    使用方法:
    查看当前连接用户
    SQL> select user from dual;

    USER
    ------------------------------
    SYSTEM


    查看当前日期、时间
    SQL> select sysdate from dual;

    SYSDATE
    ----------
    18-3月 -01


    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

    TO_CHAR(SYSDATE,'YY
    -------------------
    2001-03-18 22:37:56


    当作计算器用
    SQL> select 1+2 from dual;

           1+2
    ----------
             3


    查看序列值
    SQL> create sequence aaa increment by 1 start with 1;
    SQL> select aaa.nextval from dual;

    SQL> select aaa.nextval from dual;

       NEXTVAL
    ----------
             1


    SQL> select aaa.currval from dual;

       CURRVAL
    ----------
             1
  • SQL查询重复记录

    2007-09-10 14:32:59

    SQL:

    select   cust_id,ISDELETED,count(*)   from   VEHICLE   
    group   by   cust_id ,ISDELETED
    having   count(*)>1

    oracle:

    select   rowid,bdsszd   from   TABLEAA   a   where   a.rowid   !=   (select   max(rowid)   from   TABLEAA   b   where   a.bdsszd   =b.bdsszd)     
     

Open Toolbar