细粒度审计FGA存储过程含义
看看DBMS_FGA.ADD_POLICY存储过程的含义DBMS_FGA.ADD_POLICY( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2, audit_condition VARCHAR2, audit_column VARCHAR2, handler_schema VARCHAR2, handler_module VARCHAR2, enable BOOLEAN, statement_types VARCHAR2, audit_trail BINARY_INTEGER IN DEFAULT, audit_column_opts BINARY_INTEGER IN DEFAULT);object_schema 如果不设置默认为当前登陆用户的schema;object_na
LSNCTL NL-00051报错分析
有时候会遇到下面的这个错误LSNRCTL> save_configConnecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))NL-00051: internal error code, arguments: [302], [1], [], [], [], [], []原因为没有listener.ora文件导致.出现问题的过程如下:[oracle:/home/oracle#]lsnrctlLSNRCTL for Linux: Version 10.2.0.1.0 - Production on 16-4?? -2011 15:02:14Copyright (c) 1991, 2005, Oracle. All rights reserved.Welcome to LSNRCTL, type "help" for information.LSNRCTL> startStarting /opt/ora10g/product/10.2.0/db_
SQL中copy命令使用
Oracle SQL中可以使用copy命令来进行数据的复制.只需要知道源端和目标端数据库的sqlplus登陆方式,就可以进行表中数据的复制,相对来说也比较灵活.如下,我们知道两个数据库的sqlplus登陆方式sqlplus UATDB7/UATDB7@UAT2sqlplus charsi/charsi@BMCTST9I现在我们要将UATDB7/UATDB7@UAT2中一部分all_objects表中的数据insert到charsi/charsi@BMCTST9I数据库中的test_tbl表中.可以使用下面的命令SQL> copy from UATDB7/UATDB7@UAT2 to charsi/charsi@BMCTST9I insert test_tbl using select * from all_objects where rownum <1001;Array
Oracle中查找阻塞与被阻塞SID的方法
在Oracle中,会经常遇到阻塞与被阻塞的情况.查找阻塞与被阻塞的方法主要有下面几种:一.通过查找v$lock和v$locked_object这是最常用的也是最直接的方法SQL> select sid,block from v$lock where block=1; SID BLOCK---------- ---------- 252 1SQL>SQL> select object_id,session_id from v$locked_object where object_id in (select object_id from v$locked_object where session_id=252); OBJECT_ID SESSION_ID---------- ---------- 63833 252 63833 269SQL>由上面第一条
Oracle外部表学习
外部表即保存在Oracle数据库外部的表.实际上是Oracle提供的一种能够通过驱动接口访问外部文件的一种形式.到Oracle 10G以后,有两种驱动方式可以使用外部表.第一种是ORACLE_LOADER.这是一种传统的方式,与SQLLDR很相似,里面的命令参数也大致相同.下面是君三思书<涂抹Oracle>中提供的例子create directory testdir as '/home/oracle/testdb/testdir';grant read,write on directory testdir to charsi;create table ext_case1(ename varchar2(10),job varchar2(20),sal number)organization external(type oracle_loaderdefault directo
tnsnames.ora文件的查找路径
我们有时候会遇到,明明在$ORACLE_HOME/network/admin/tnsnames.ora文件中添加了数据库的连接配置,但是在执行tnsping的时候就是报无法解析的错误/oravl01/oracle/9.2.0/network/admin > tnsping SP9DB1TNS-03505: Failed to resolve name对于这种问题,排除添加的配置格式错误后.可能原因是读取的tnsnames.ora路径根本就不是$ORACLE_HOME/network/admintnsnames.ora文件的查找路径顺序为$HOME => $TNS_ADMIN => /etc => $ORACLE_HOME/network/admin/我们从下面可以看出tnsnames.ora文件的查找路径顺序:[oracle:/oracle#][oracl
Oracle 10G中spool新增加的方法
使用Oracle的时候,我们经常使用spool这个工具,来看看10G和9i中,SPOOL的用法:10G中SQL> help spool SPOOL ----- Stores query results in a file, or optionally sends the file to a printer. In iSQL*Plus, use the Preferences screen to direct output to a file. SPO[OL] [file_name[.ext] [CRE[ATE] | REP[LACE] | APP[END]] | OFF | OUT] Not available in iSQL*PlusSQL> select * from v$version;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 1
对使用dblink的10046事件跟踪
如果网络带宽不够大的情况下,使用dblink导数据就会非常的慢,我们使用10046事件来跟踪一下两边数据库的等待事件,来推测下dblink慢的原因.在源短执行建表语句create table xx_test as (select * from yy_test@to_remote_db);远端表yy_test@to_remote_db的大小约为9G,上面的语句执行一段时间后将它中止,我们来看看两边的trace文件.源端的trace数据:call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------Parse 0
关于db_file_multiblock_read_count参数的设置
我们在遇到数据库IO问题的时候,有时候会设置db_file_multiblock_read_count参数.对于这个参数,从Oracle10gR2之后,数据库会根据系统的情况自动调整,但是在9i的时候还需要手动来设置.对于10G中,我们来看看它的参数.数据库版本10.2.0.1SQL> select * from v$version where rownum <2;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod当前这个参数是非默认的SQL> select name,type,value,isdefault from v$parameter where name='db_
使用批处理脚本或SHELL配合SQL脚本
有时候我们在写一些数据库脚本的时候,通过SQLPLUS设置变量可能很麻烦.此时可以利用操作系统的脚本.比如当系统为*NIX时可以使用SHELL脚本,当系统为Windows时可以通过批处理脚本配合使用.下面是两种平台的两个示例:(1)UNIX或Linux平台下面这个脚本,是通过在系统中取得当前时间的年月,然后传递给SQLPLUS拼成表的分区,可以用来优化SQLTESTDB /oravl01/oracle/charsi> cat xx_test.shCUR_MONTH=`date +%Y%m`sqlplus charsi/charsi@testdb <<EOFset timing onselect count(1) from test_parti_table partition (month_${CUR_MONT
设置autotrace的报错问题解决
我们在Oracle session中设置autotrace的时候,经常会遇到下列的问题:SQL> set autotrace onSP2-0613: 无法验证 PLAN_TABLE 格式或实体SP2-0611: 启用EXPLAIN报告时出错这是由于这个用户下没有PLAN_TABLE这个表的原因,可以执行ORACLE的sql来创建该表ORACLE给的SQL在$ORACLE_HOME/rdbms/admin/utlxplan.sql中,执行该校本就可以了.比如我的$ORACLE_HOME为C:oracleora92那么我就执行下面的语句然后就可以了.SQL> @C:oracleora92rdbmsadminutlxplan.sql表已创建。SQL> 表已经创建,那么有时候还会遇到权限的问题,提示错误信息如下:
绑定变量就一定好么
通常在OLTP系统中,我们尽可能的使用绑定变量,因为可以减少硬解析.那么有个问题,使用绑定变量就一定好么?我们来看一个试验:SQL> desc t 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- ID NUMBER DESCRI VARCHAR2(20) SQL> select id,count(1) from t group by id; ID COUNT(1)---------- ---------- 1 65536
RBO的规则
Rank Access Path---- --------------------------------1 Single row by ROWID2 Single row by cluster join3 Single row by hash cluster key with unique or primary key4 Single row by unique or primary key5 Cluster join6 Hash cluster key7 Indexed cluster key8 Composite index9 Single-column index10 Bounded range search on indexed columns11 Unbounded range search on indexed columns12 Sort-merge join13 MAX or MIN of indexed column14 ORDER BY on indexed column15 Ful
在全面评估后再使用Oracle并行
Oracle中,使用并行的目的一般是为了能够提高语句的执行效率。但是并不是所有的语句只要加上并行就能提高效率,有时候可能会起到相反的作用。因此在使用并行的时候,首先需要查清楚,我当前数据库的瓶颈是在哪里.[@more@]下面是两个使用并行后语句执行效率降低的例子.(1)并行查询表的记录数SQL>SQL> select count(1) from xx_test;COUNT(1)----------13926144已用时间: 00: 00: 24.16SQL>可以看到不加并发的情况下,执行查询语句的时间是24sSQL> select event from v$session_wait where sid in (select sid from v$session w
最近在看<让Oracle跑得更快>一书
最近在看谭怀远写的《让Oracle跑得更快》一书.书的封皮风格有点像O'relly的书,上面也是一个动物,不过这本书中的应该是麒麟.内容介绍了大量的数据库优化思路,主要是SQL优化比较多一些.语言比较通俗,分析得都比较细致,很多东西都是实际工作经验凝集而成的,读起来也比较轻松.对这块内容以前学习得不是很深入,这本书可以作为一本不错的中文资料.[@more@]
测试磁盘的读写IO速度
有时候我们在做维护的时候,总会遇到类似于IO特别高,但不能判定是IO瓶颈还是软件参数设置不当导致热盘的问题.这时候通常希望能知道磁盘的读写速度,来进行下一步的决策.下面是两种测试方法:(1)使用hdparm命令 这是一个是用来获取ATA/IDE硬盘的参数的命令,是由早期Linux IDE驱动的开发和维护人员 Mark Lord开发编写的( hdparm has been written by Mark Lord <mlord@pobox.com>, the primary developer and maintainer of the (E)IDE driver for Linux, with suggestions from many netfolk).该命令应该也是仅用于Linux系统,对于UN
insert的时候使用append会不会影响到表的大小
我们在insert表的时候,经常会使用append的方式来提高效率.append的会将insert的数据直接加到表的最后,而不会在表的空闲块中插入数据.无论是归档模式还是非归档模式,append会减少产生的日志,产生的UNDO也比较少。append属于direct insert,因此会提高insert的效率.那么insert使用append与不使用append,表的大小会不会不同呢?我简单做了个试验:(1)在没有做insert之前的表的select * from dba_segments where tablespace_name='TS_CHARIS';HEADER_BLOCK BYTES BLOCKS45835 1342177280 163840原表数据占用163840个块(2)执行insert(不使用appe
优化数据库EXP的效率
如何提高EXP文件的效率?有时候我们可能会遇到这类的问题首先,我们通常的做法是提高buffer,如下,我设置了10M的bufferexp charsi/charsi tables=tst_exp file=tst_exp.dmp log=tst_exp.log buffer=10240000开始时间:Mon Nov 8 10:09:26 CST 2010结束时间:Mon Nov 8 10:09:35 CST 2010如下,我测试一个70M的表使用exp花了9秒的时间.当然可以将buffer设置的再大一些可能还会提高一些效率,但是当buffer设置到一定大的时候,再往大设置就不能起作用了.其次,还可以设置另外一个参数DIRECT和RECORDLENGTH需要注意的是,如果同时设置direct和b
同时多个SQL命令执行的方法
我们有时候会遇到类似这种情况:需要对不同的表上创建索引,有很多创建索引的语句,但是把它们都在一个窗口执行的话,它只是串行的去处理,如果能够让他们同时执行呢?有两种方法:1.写多个脚本文件,同时运行及同时写成多个脚本,每个脚本都可以独立运行,然后将这些脚本都同时后台执行,就可以达到同时执行的效果了.示例单个脚本的方法:sqlplus charsi/charsi <<EOF >/dev/nullselect * from dual;EOF2.脚本里面后台执行程序如下,使用类似echo "select * from dual;"|sqlplus charsi/charsi的命令,只是对一个语句执行一
增加数据库SGA的方法
数据库版本10.2.0.1.1.如果数据库库使用的是pfile 修改pfile文件,记住sga_max_size的值必须大于sga_target的值. 修改完成后重启数据库.*.sga_max_size=251M*.sga_target=242MSQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> SQL> SQL> startupORACLE instance started.Total System Global Area 264241152 bytesFixed Size 1218892 bytesVariable Size 96470708 bytesDatabase Buffers 163577856 bytesRedo Buffers 2