zoukankan      html  css  js  c++  java
  • Oracle小知识_长期总结

     更新时间:2018年7月16日 11:22:28

    一、 系统

    1. 打开防火墙后 Oracle 无法链接

       新建1521端口规则。

    二、知识

    A. 序列

    1. nextval

    -----------------------------------

    select seq_device_dztx.nextval from dual; 每查询一次序列的 nextval ,该值就增加一次。注意仅仅是查询序列,序列就会自增一次。

    所以,很有趣的就是

    select seq_device_dztx.nextval from dual;
    select seq_device_dztx.currval from dual;

    他们一起运行的结果永远都是一样的。

    ---------------------------------------

    但是这里的 seq_no 和 party_id 却会是一样的。 

    insert into student (seq_no , party_id ) select x_seq.nextval as seq_no , x_seq.nextval as party_id  FROM person

    参考

    ---------------------------------------

     B. 日志

         Oracle数据库的最常用问题定位日志是alert日志,Oracle数据库的日志文件alert_$ORACLE_SID.log记录了重作日志的转换,数据库启动和关闭,数据库结构的改变,回退段的修改,死锁,内部错误等信息。 

        Oracle老版本路径是$ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log

        Oracle 11g 日志文件在$ORACLE_BASE/diag/rdbms下面

    三、技巧

    A. 导出表结构.用于注释

        直接将oralce中表结构导出 Word 很复杂,网上流传的 DBExportDoc ,这玩意需要两个前提才能工作:1. 主机已经安装有OleDB 驱动(即需要安装oracle)2. 主机要有Office(含VBA,WPS个人版无VBA)。这里有简单但是需要手工的办法。

        使用Oralce SQL Developer,在SQL窗口中输入如下SQL语句,然后“运行语句”(Ctrl+Enter)(注意不是点击“运行脚本”,否则很难复制到Excel中),发现会出现整体的表格。

    SELECT t.table_name,
           t.colUMN_NAME,
           t.DATA_TYPE || '(' || t.DATA_LENGTH || ')',
           t1.COMMENTS
      FROM User_Tab_Cols t, User_Col_Comments t1
    WHERE t.table_name = t1.table_name
        AND t.column_name = t1.column_name;

        将查询结果导出或者复制到Excel 中,删掉系统表和视图,剩下的自己整理即可。这比网上搜索半天下载个无用软件省事。

    B. Oralce无法删除表,ORA-00054:资源正忙,要求指定NOWAIT 错误

    原因分析:    

    1:创建索引时会产生的锁

    2:dml 语句会产生的锁

    3:索引创建时加上关键字 online时产生的锁

       解决办法:

    --这是注释
    --1:找出所有被锁的对象,定位出哪个回话占用
    select l.session_id,o.owner,o.object_name
    from v$locked_object l,dba_objects o
    where l.object_id=o.object_id;
    
    --2:找出所有照成锁的会话
    select t2.username,t2.sid,t2.serial#,t2.logon_time
    from v$locked_object t1,v$session t2
    where t1.session_id=t2.sid order by t2.logon_time;
    
    --3.kill 所有占用资源的会话
    --命令形式:alter system kill session 'sid,serial#';
    alter system kill session '498,583';

       参考 

    C. 含有CLOB类型的表数据导出与导入

    当表结构中含有 CLOB 字段时,一般的图形化导出为 insert SQL文件和 XLS 文件时,CLOB 字段的值是无法导出的。

    只能使用 dmp/imp 命令。

    当需要导出部分表时,使用 tables = tablename1,tablename2 参数:

    exp username/pwd@sid file=C:\xxx.dmp tables=mytable1,mytable2

    当导入时,使用 imp ,参数类似:

    imp username/pwd@sid file=C:\xxx.dmp tables=mytable1,mytable2

    如果目标数据库中已经有该表存在,或者创建表时表空间不一致,导致数据无法导入。

    这时可以使用  ignore=y  参数,这样会忽略表存在和表空间不一致错误,继续导入数据。

    imp username/pwd@sid file=C:\xxx.dmp tables=mytable1,mytable2 ignore=y

    Oracle 11g 亲测有效,本方法可以很方便的导出导入 CLOB 类型数据。

    后面也遇到部分表无法导出CLOB数据,我采用将该表的数据导出为 Excel 的 xls 格式,然后在用图形化工具或其它工具导入即可。

    四、排错

    1. ORA-01000: 超出打开游标的最大数(解决及原因)

    修改Oracle最大游标数:

    查看最大游标数: show parameter open_cursors; 

    查看当前打开游标数: select count(*) from v$open_cursor; 

    修改最大游标数: alter system set open_cursors=1000 scope=both; 

    修改代码:

    这样的错误很容易出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和 conn.prepareStatement()的时候,

    实际上都是相当与在数据库中打开了一个cursor。尤其是,如果你的 createStatement和prepareStatement是在一个循环里面的话,

    就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。

    另外:

    有一个问题说明 connection 与 prepareStatement 进行 close 的关系, 但这里只是说明了直接 close connection, 而没有说明直接 close prepareStatement.。

    二者是不同。

    问:

    用CONNECTION 创建了 PREPAREDSTATEMENT ,用完了 PREPAREDSTATEMENT 后,没有关闭PREPAREDSTATEMENT ,而是直接 CLOSE CONNECTION ,这么做有什么隐患吗?

    答:

    如果没有使用数据库连接池,而是每次创建物理连接,然后释放的话,没有什么问题。close Connection的时候已经把数据库资源完全释放掉了,PreparedStatement占用的数据库游标也会随即释放。 但是大部分情况读写数据库都会采用数据库连接池来提高连接效率,在这种情况下有潜在的隐患。 因为数据库连接池中拿到一个Connection,close的时候不是真正关闭连接,释放数据库资源,而是把连接归还给连接池。因此在这种情况下,close了Connection,但是PreparedStatement并没有被释放掉,占用的数据库游标仍然处于打开状态。因此在大数据访问量的情况下很容易出现数据库游标使用到最大,无法分配游标错误。

    五、高级玩法:优化

    《Oracle 性能优化求生指南》  人民邮电出版社  Guy Harrision 著

    ---------------------------------------------------------------------------------

    每一条SQL语句在客户端都表现为一个游标。P12

    在Java的JDBC中,一个游标等价于一个 Statement 或者 Prepared Statement 对象。P13

    SQL 语句必须完全一致才能在共享池中找到匹配项。(博主注:应在SQL语句中使用绑定变量,而不是使用字面量值)。 P14

  • 相关阅读:
    Http方法:Get请求与Post请求的区别
    udev和rules使用规则
    c++中的动态内存分配
    c++中重载运算符
    c++中静态成员函数
    c++中值传递,址传递,引用传递
    c++中实现单例模式singleton class
    [Windows篇] 在windows 10上源码编译gtest 并编写CMakeLists.txt
    [Ubuntu篇] 在ubuntu上源码编译gtest,编写gtest-config.cmake并测试
    使用boost data_time模块来获取毫秒级时间并转换为string字符串
  • 原文地址:https://www.cnblogs.com/muyun/p/6946512.html
Copyright © 2011-2022 走看看