`
teamojiao
  • 浏览: 343846 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ORACLE之常用FAQ V1.0 整理版之三

阅读更多

第四部分、性能调整
[Q]
如果设置自动跟踪
[A]
system登录
执行$ORACLE_HOME/rdbms/admin/utlxplan.sql创建计划表
执行$ORACLE_HOME/sqlplus/admin/plustrce.sql创建plustrace角色
如果想计划表让每个用户都能使用,则
SQL>create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public;
如果想让自动跟踪的角色让每个用户都能使用,则
SQL> grant plustrace to public;
通过如下语句开启/停止跟踪
SET AUTOTRACE ON |OFF
| ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN

[Q]
如果跟踪自己的会话或者是别人的会话
[A]
跟踪自己的会话很简单
Alter session set sql_trace true|false
Or
Exec dbms_session.set_sql_trace(TRUE);
如果跟踪别人的会话,需要调用一个包
exec dbms_system.set_env(sid,serial#,true|false)
跟踪的信息在user_dump_dest 目录下可以找到或通过如下脚本获得文件名称(适用于Win环境,如果是unix需要做一定修改)
Select p1.value||’\’||p2.value||’_ora_’||p.spid||’.ora’  filename
    FROM
        v$process p,
        v$session s,
        v$parameter p1,
        v$parameter p2
    Where p1.name = ‘user_dump_dest’
    AND p2.name = ‘db_name’
    AND p.addr = s.paddr
    AND s.audsid = USERENV (‘SESSIONID’)
最后,可以通过Tkprof来解析跟踪文件,如
Tkprof
原文件 目标文件 sys=n


[Q]
怎么设置整个数据库系统跟踪

[A]
其实文档上的alter system set sql_trace=true是不成功的
但是可以通过设置事件来完成这个工作,作用相等
alter system set events
  ’10046 trace name context forever,level 1’;
如果关闭跟踪,可以用如下语句
alter system set events
  ’10046 trace name context off’;
其中的level 1与上面的8都是跟踪级别
level 1
:跟踪SQL语句,等于sql_trace=true
level 4
:包括变量的详细信息

level 8
:包括等待事件
level 12
:包括绑定变量与等待事件

[Q]
怎么样根据OS进程快速获得DB进程信息与正在执行的语句
[A]
有些时候,我们在OS上操作,象TOP之后我们得到的OS进程,怎么快速根据OS信息获得DB信息呢?
我们可以编写如下脚本:
$more whoit.sh
#!/bin/sh
sqlplus /nolog <<EOF      
connect / as sysdba
col machine format a30
col program format a40
set line 200
select sid,serial# ,username,osuser,machine,program,process,to_char(logon_time,’yyyy/mm/dd hh24:mi:ss’)  
          from v\$session where paddr in
          ( select addr from v\$process where spid in($1));
            
  select sql_text from v\$sqltext_with_newlines
                  where hash_value in
                  (select SQL_HASH_VALUE from v\$session where
                    paddr in (select addr from v\$process where spid=$1)
                    )
                    order by piece;
  
exit;
EOF
然后,我们只要在OS环境下如下执行即可
$./whoit.sh Spid

[Q]
怎么样分析表或索引
[A]
命令行方式可以采用analyze命令
Analyze table tablename compute statistics;
Analyze index|cluster indexname estimate statistics;
ANALYZE TABLE tablename COMPUTE STATISTICS
FOR TABLE
    FOR ALL [LOCAL] INDEXES
    FOR ALL [INDEXED] COLUMNS;
ANALYZE TABLE tablename Delete STATISTICS
ANALYZE TABLE tablename VALIDATE REF Update
ANALYZE TABLE tablename VALIDATE STRUCTURE
[CASCADE]|[INTO TableName]
ANALYZE TABLE tablename LIST CHAINED ROWS [INTO TableName]  
等等。

如果想分析整个用户或数据库,还可以采用工具包,可以并行分析
Dbms_utility(8i
以前的工具包)
Dbms_stats(8i
以后提供的工具包
)

dbms_stats.gather_schema_stats(User,estimate_percent=>100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);
这是对命令与工具包的一些总结
1
、对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句。
a)  
可以并行进行,对多个用户,多个
Table
b)  
可以得到整个分区表的数据和单个分区的数据。

c)  
可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区

d)  
可以倒出统计信息

e)  
可以用户自动收集统计信息

2
DBMS_STATS的缺点

a)  
不能
Validate Structure
b)  
不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,这两个仍旧需要使用Analyze语句。

c)  DBMS_STATS  
默认不对索引进行Analyze,因为默认CascadeFalse,需要手工指定为
True
3
、对于oracle 9里面的External TableAnalyze不能使用,只能使用DBMS_STATS来收集信息。


[Q]
怎么样快速重整索引
[A]
通过rebuild语句,可以快速重整或移动索引到别的表空间
rebuild
有重建整个索引数的功能,可以在不删除原始索引的情况下改变索引的存储参数
语法为
alter index index_name rebuild tablespace ts_name
       storage(……);
如果要快速重建整个用户下的索引,可以用如下脚本,当然,需要根据你自己的情况做相应修改
SQL> set heading off
SQL> set feedback off
SQL> spool d:\index.sql
SQL> Select ‘alter index ‘ || index_name || ‘ rebuild ‘
||’tablespace INDEXES storage(initial 256K next 256K pctincrease 0);’
FROM all_indexes
Where ( tablespace_name != ‘INDEXES’
OR next_extent != ( 256 * 1024 )
)
AND owner = USER
SQL>spool off
另外一个合并索引的语句是
alter index index_name coalesce
,这个语句仅仅是合并索引中同一级的leaf block
消耗不大,对于有些索引中存在大量空间浪费的情况下,有一些作用。


[Q]
如何使用Hint提示
[A]
select/delete/update后写/*+ hint */
select /*+ index(TABLE_NAME INDEX_NAME) */ col1...
注意/*+之间不能有空格

如用hint指定使用某个索引

  select /*+ index(cbotab) */ col1 from cbotab;
  select /*+ index(cbotab cbotab1) */ col1 from cbotab;
  select /*+ index(a cbotab1) */ col1 from cbotab a;
  
其中
   TABLE_NAME
是必须要写的,且如果在查询中使用了表的别名,在hint也要用表的别名来代替表名;
INDEX_NAME
可以不必写,Oracle会根据统计值选一个索引
;
   
如果索引名或表名写错了,那这个hint就会被忽略
;

[Q]
怎么样快速复制表或者是插入数据

[A]
快速复制表可以指定Nologging选项
如:Create table t1 nologging
as select * from t2;
快速插入数据可以指定append提示,但是需要注意

noarchivelog
模式下,默认用了append就是nologging模式的。
archivelog下,需要把表设置程Nologging模式。

insert /*+ append */ into t1
           select * from t2
注意:如果在9i环境中并设置了FORCE LOGGING,则以上操作是无效的,并不会加快,当然,可以通过如下语句设置为NO FORCE LOGGING

Alter database no force logging;
是否开启了FORCE LOGGING,可以用如下语句查看
SQL> select force_logging from v$database;

[Q]
怎么避免使用特定索引
[A]
在很多时候,Oracle会错误的使用索引而导致效率的明显下降,我们可以使用一点点技巧而避免使用不该使用的索引,如:
test,有字段a,b,c,d,在a,b,c上建立联合索引inx_a(a,b,c),在b上单独建立了一个索引Inx_b(b)
在正常情况下,where a=? and b=? and c=?会用到索引inx_a
where b=?
会用到索引inx_b
但是,where a=? and b=? and c=? group by b会用到哪个索引呢?在分析数据不正确(很长时间没有分析)或根本没有分析数据的情况下,oracle往往会使用索引inx_b。通过执行计划的分析,这个索引的使用,将大大耗费查询时间。

当然,我们可以通过如下的技巧避免使用inx_b,而使用inx_a
where a=? and b=? and c=? group by b||’’  --
如果b是字符
where a=? and b=? and c=? group by b+0  --
如果b是数字
通过这样简单的改变,往往可以是查询时间提交很多倍
当然,我们也可以使用no_index提示,相信很多人没有用过,也是一个不错的方法:
select /*+ no_index(t,inx_b) */ * from test t
               where a=? and b=? and c=? group by b

[Q]Oracle
什么时候会使用跳跃式索引扫描
[A]
这是9i的一个新特性跳跃式索引扫描(Index Skip Scan).
例如表有索引index(a,b,c),当查询条件为

where b=?
的时候,可能会使用到索引index(a,b,c)
如,执行计划中出现如下计划:

INDEX (SKIP SCAN) OF ‘TEST_IDX’ (NON-UNIQUE)
Oracle
的优化器(这里指的是CBO)能对查询应用Index Skip Scans至少要有几个条件:
1
优化器认为是合适的。

2
索引中的前导列的唯一值的数量能满足一定的条件(如重复值很多)。
3
优化器要知道前导列的值分布(通过分析/统计表得到)
4
合适的SQL语句
等。

[Q]
怎么样创建使用虚拟索引
[A]
可以使用nosegment选项,如
create index virtual_index_name on table_name(col_name) nosegment;
如果在哪个session需要测试虚拟索引,可以利用隐含参数来处理
alter session set "_use_nosegment_indexes" = true;
就可以利用explain plan for select ……来看虚拟索引的效果
利用@$ORACLE_HOME/rdbms/admin/utlxpls查看执行计划
最后,根据需要,我们可以删除虚拟索引,如普通索引一样
drop index virtual_index_name;
注意:虚拟索引并不是物理存在的,所以虚拟索引并不等同于物理索引,不要用自动跟踪去测试虚拟索引,因为那是实际执行的效果,是用不到虚拟索引的。

[Q]
怎样监控无用的索引
[A]Oracle 9i
以上,可以监控索引的使用情况,如果一段时间内没有使用的索引,一般就是无用的索引
语法为:
开始监控:alter index index_name monitoring usage;
检查使用状态:
select * from v$object_usage;
停止监控:
alter index index_name nomonitoring usage;
当然,如果想监控整个用户下的索引,可以采用如下的脚本:

set heading off
set echo off
set feedback off
set pages 10000
spool start_index_monitor.sql
Select ‘alter index ‘||owner||’.’||index_name||’ monitoring usage;’
FROM dba_indexes
Where owner = USER;
spool off
set heading on
set echo on
set feedback on
------------------------------------------------
set heading off
set echo off
set feedback off
set pages 10000
spool stop_index_monitor.sql
Select ‘alter index ‘||owner||’.’||index_name||’ nomonitoring usage;’
FROM dba_indexes
Where owner = USER;
spool off
set heading on
set echo on
set feedback on

[Q]
怎么样能固定我的执行计划
[A]
可以使用OUTLINE来固定SQL语句的执行计划
用如下语句可以创建一个OUTLINE
Create oe replace outline OutLn_Name on
  Select Col1,Col2 from Table
      where ……
如果要删除Outline,可以采用

Drop Outline OutLn_Name;
对于已经创建了的OutLine,存放在OUTLN用户的OL$HINTS表下面
对于有些语句,你可以使用update outln.ol$hints来更新outline
update outln.ol$hints(ol_name,’TEST1’,’TEST2’,’TEST2’,’TEST1)
          where ol_name in (‘TEST1’,’TEST2’);
这样,你就把Test1 OUTLINETest2 OUTLINE互换了

如果想利用已经存在的OUTLINE,需要设置以下参数
Alter system/session set Query_rewrite_enabled = true
Alter system/session set use_stored_outlines = true

[Q]v$sysstat
中的class分别代表什么
[A]
统计类别
1
代表事例活动
2
代表Redo buffer活动
4
代表锁
8
代表数据缓冲活动
16
代表OS活动
32
代表并行活动
64
代表表访问
128
代表调试信息

[Q]
怎么杀掉特定的数据库会话
[A] Alter system kill session ‘sid,serial#’;
或者
alter system disconnect session ‘sid,serial#’ immediate;
win上,还可以采用oracle提供的orakill杀掉一个线程(其实就是一个Oracle进程)
Linux/Unix上,可以直接利用kill杀掉数据库进程对应的OS进程

[Q]
怎么快速查找锁与锁等待
[A]
数据库的锁是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。
这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。
可以通过alter system kill session ‘sid,serial#’来杀掉会话
Select /*+ rule */ s.username,
decode(l.type,’TM’,’TABLE LOCK’,
              ’TX’,’ROW LOCK’,
              NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
Where l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待
以下的语句可以查询到谁锁了表,而谁在等待。
Select /*+ rule */ lpad(‘ ‘,decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
       o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
Where l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN

[Q]
如何有效的删除一个大表(extent数很多的表)

[A]
一个有很多(100k)extent的表,如果只是简单地用drop table的话,会很大量消耗CPUOracle要对fet$uet$数据字典进行操作),可能会用上几天的时间,较好的方法是分多次删除extent,以减轻这种消耗:
1. truncate table big-table reuse storage;
2. alter table big-table deallocate unused keep 2000m (
原来大小的n-1/n);
3. alter table big-table deallocate unused keep 1500m ;
  ....
4. drop table big-table;

[Q]
如何收缩临时数据文件的大小

[A]9i
以下版本采用
Alter DATABASE DATAFILE ‘file name’ RESIZE 100M
类似的语句
9i
以上版本采用
Alter DATABASE TEMPFILE ‘file name’ RESIZE 100M
注意,临时数据文件在使用时,一般不能收缩,除非关闭数据库或断开所有会话,停止对临时数据文件的使用。

[Q]
怎么清理临时段
[A]
可以使用如下办法
1
、 使用如下语句查看一下认谁在用临时段
Select username,sid,serial#,sql_address,machine,program,
      tablespace,segtype, contents
FROM v$session se,v$sort_usage su
Where se.saddr=su.session_addr      
2
   那些正在使用临时段的进程
SQL>Alter system kill session ‘sid,serial#’;
3
、把TEMP表空间回缩一下
SQL>Alter tablespace TEMP coalesce;
还可以使用诊断事件
1
、 确定TEMP表空间的ts#
SQL> select ts#, name FROM v$tablespace;
TS# NAME
-----------------------
0 SYSYEM
1 RBS
2 USERS
3* TEMP
……
2
、 执行清理操作

alter session set events ‘immediate trace name Drop_SEGMENTS level TS#+1’
说明:
temp
表空间的TS#
3*, So TS#+ 1= 4
如果想清除所有表空间的临时段,则

TS# = 2147483647

[Q]
怎么样dump数据库内部结构,如上面显示的控制文件的结构

[A]
常见的有
1
、分析数据文件块,转储数据文件n的块m
alter system dump datafile n block m
2
、分析日志文件

alter system dump logfile logfilename;
3
、分析控制文件的内容
alter session set events ‘immediate trace name CONTROLF level 10’
4
、分析所有数据文件头
alter session set events ‘immediate trace name FILE_HDRS level 10’
5
、分析日志文件头
alter session set events ‘immediate trace name REDOHDR level 10’
6
、分析系统状态,最好每10分钟一次,做三次对比
alter session set events ‘immediate trace name SYSTEMSTATE level 10’
7
、分析进程状态
alter session set events ‘immediate trace name PROCESSSTATE level 10’
8
、分析Library Cache的详细情况
alter session set events ‘immediate trace name library_cache level 10’

[Q]
如何获得所有的事件代码
[A]
事件代码范围一般从10000 to 10999,以下列出了这个范围的事件代码与信息
SET SERVEROUTPUT ON
DECLARE
      err_msg VARCHAR2(120);
BEGIN
      dbms_output.enable (1000000);
      FOR err_num IN 10000..10999
      LOOP
        err_msg := SQLERRM (-err_num);
        IF err_msg NOT LIKE ‘%Message ‘||err_num||’ not found%’ THEN
          dbms_output.put_line (err_msg);
        END IF;
      END LOOP;
END;
/
Unix系统上,事件信息放在一个文本文件里
$ORACLE_HOME/rdbms/mesg/oraus.msg
可以用如下脚本查看事件信息

    event=10000
    while [ $event -ne 10999 ]
    do
        event=`expr $event + 1`
        oerr ora $event
    done
对于已经确保的/正在跟踪的事件,可以用如下脚本获得

SET SERVEROUTPUT ON
    DECLARE
        l_level NUMBER;
    BEGIN
        FOR l_event IN 10000..10999
        LOOP
            dbms_system.read_ev (l_event,l_level);
            IF l_level > 0 THEN
                dbms_output.put_line (‘Event ‘||TO_CHAR (l_event)||
                ‘ is set at level ‘||TO_CHAR (l_level));
            END IF;
        END LOOP;
    END;
    /

[Q]
什么是STATSPACK,我怎么使用它?
[A]Statspack
Oracle 8i以上提供的一个非常好的性能监控与诊断工具,基本上全部包含了BSTAT/ESTAT的功能,更多的信息
可以参考附带文档$ORACLE_HOME/rdbms/admin/spdoc.txt
安装
Statspack:
         cd $ORACLE_HOME/rdbms/admin
         sqlplus "/ as sysdba" @spdrop.sql        --
卸载,第一次可以不需要

         sqlplus "/ as sysdba" @spcreate.sql        --
需要根据提示输入表空间名
使用Statspack:
         sqlplus perfstat/perfstat
         exec statspack.snap;            --
进行信息收集统计,每次运行都将产生一个快照号

         --
获得快照号,必须要有两个以上的快照,才能生成报表
         select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;
         @spreport.sql                                --
输入需要查看的开始快照号与结束快照号
其他相关脚本s:
spauto.sql -
利用dbms_job提交一个作业,自动的进行STATPACK的信息收集统计

sppurge.sql -
清除一段范围内的统计信息,需要提供开始快照与结束快照号

sptrunc.sql -
清除(truncate)所有统计信息

 

第五部分、ORACLE网络与安全
[Q]
如何限定特定IP访问数据库
[A]
可以利用登录触发器、cmgw或者是在$OREACLE_HOME/network/admin下新增一个protocol.ora文件(有些os可能是. protocol.ora),9i可以直接修改sqlnet.ora
增加如下内容:
tcp.validnode_checking=yes
#
允许访问的ip
tcp.inited_nodes=(ip1,ip2,……)
#
不允许访问的
ip
tcp.excluded_nodes=(ip1,ip2,……)

[Q]
如何穿过防火墙连接数据库

[A]
这个问题只会在WIN平台出现,UNIX平台会自动解决。
解决方法:
在服务器端的SQLNET.ORA应类似
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
TRACE_LEVEL_CLIENT = 16
注册表的HOME0[HKEY_LOCAL_MACHINE]
USE_SHARED_SOCKET=TRUE

[Q]
如何利用hostname方式连接数据库

host name
方式只支持tcp/ip协议的小局域网
修改listener.ora中的如下信息
(SID_DESC =
      (GLOBAL_DBNAME = ur_hostname)   --
你的机器名
      (ORACLE_HOME = E:\oracle\ora92)    --oracle home
      (SID_NAME = orcl)                --sid name
    )
然后在客户端
sqlnet.ora中,确保有
NAMES.DIRECTORY_PATH= (HOSTNAME)
你就可以利用数据库服务器的名称访问数据库了

[Q]dbms_repcat_admin
能带来什么安全隐患
[A]
如果一个用户能执行dbms_repcat_admin包,将获得极大的系统权限。
以下情况可能获得该包的执行权限:
1
、在sysgrant execute on dbms_repcat_admin to public[|user_name]
2
、用户拥有execute any procedure特权(仅限于9i以下,9i必须显示授权)

如果用户通过执行如下语句:
exec sys.dbms_repcat_admin.grant_admin_any_schema(‘user_name’);
该用户将获得极大的系统特权
可以从user_sys_privs中获得详细信息

[Q]
在不知道用户密码的时候,怎么样跳转到另外一个用户执行操作后并不影响该用户?
[A]
我们通过如下的方法,可以安全使用该用户,然后再跳转回来,在某些时候比较有用
需要Alter user权限或DBA权限:
SQL> select password from dba_users where username=‘SCOTT’;
     PASSWORD
     -----------------------------
     F894844C34402B67
SQL> alter user scott identified by lion;
     User altered.
SQL> connect scott/lion
     Connected.
REM Do whatever you like...
SQL> connect system/manager
     Connected.
SQL> alter user scott identified by values ‘F894844C34402B67’;
     User altered.
SQL> connect scott/tiger
     Connected.

[Q]
如何加固你的数据库
[A]
要注意以下方面
1.  
修改sys, system的口令。
2.  Lock
,修改,删除默认用户: dbsnmp,ctxsys等。

3.  
REMOTE_OS_AUTHENT改成False,防止远程机器直接登陆。

4.  
O7_DICTIONARY_ACCESSIBILITY改成False

5.  
把一些权限从PUBLIC Role取消掉。

6.  
检查数据库的数据文件的安全性。不要设置成666之类的。检查其他dba 用户。

7.  
把一些不需要的服务(比如ftp, nfs等关闭掉)
8.  
限制数据库主机上面的用户数量。

9.  
定期检查Metalink/OTN上面的security Alert。比如:
http://otn.oracle.com/deploy/security/alerts.htm
10.  
把你的数据库与应用放在一个单独的子网中,要不然你的用户密码很容易被sniffer去。或者采用advance security,对用户登录加密。
11.  
限止只有某些ip才能访问你的数据库。

12.  lsnrctl
要加密码,要不然别人很容易从外面关掉你的listener

13.  
如果可能,不要使用默认1521端口


[Q]
如何检查用户是否用了默认密码
[A]
如果使用默认密码,很可能就对你的数据库造成一定的安全隐患,那么可以使用如下的查询获得那些用户使用默认密码

select username "User(s) with Default Password!"
from dba_users
where password in
(‘E066D214D5421CCC’, -- dbsnmp
‘24ABAB8B06281B4C’, -- ctxsys
‘72979A94BAD2AF80’, -- mdsys
‘C252E8FA117AF049’, -- odm
‘A7A32CD03D3CE8D5’, -- odm_mtr
‘88A2B2C183431F00’, -- ordplugins
‘7EFA02EC7EA6B86F’, -- ordsys
‘4A3BA55E08595C81’, -- outln
‘F894844C34402B67’, -- scott
‘3F9FBD883D787341’, -- wk_proxy
‘79DF7A1BD138CF11’, -- wk_sys
‘7C9BA362F8314299’, -- wmsys
‘88D8364765FCE6AF’, -- xdb
‘F9DA8977092B7B81’, -- tracesvr
‘9300C0977D7DC75E’, -- oas_public
‘A97282CE3D94E29E’, -- websys
‘AC9700FD3F1410EB’, -- lbacsys
‘E7B5D92911C831E1’, -- rman
‘AC98877DE1297365’, -- perfstat
‘66F4EF5650C20355’, -- exfsys
‘84B8CBCA4D477FA3’, -- si_informtn_schema
‘D4C5016086B2DC6A’, -- sys
‘D4DF7931AB130E37’) -- system
/

[Q]
如何修改默认的XDB监听端口
[A] oracle9i
默认的XML DBHTTP的默认端口设为8080,这是一个太常用的端口了,很多别的WebServer都会使用这个端口,

如果我们安装了它,最好修改一下,避免冲突,如果不使用呢,就最好不要安装
提供三种修改的方法
1.dbca
,选择你的数据库,然后Standard Database Features->Customize->Oracle XML DB option,进入这个画面你应该就知道怎么改了。
2.OEM console
,在XML Database 的配置里面修改

3.
oracle提供的包:

--
HTTP/WEBDAV端口从8080改到
8081
SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),
‘/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()’,8081))
/
--
FTP端口从2100改到
2111
SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),
‘/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()’,2111))
/
SQL> commit;
SQL> exec dbms_xdb.cfg_refresh;
--
检查修改是否已经成功

SQL> select dbms_xdb.cfg_get from dual;

[Q]
怎么捕获用户登录信息,如SIDIP地址等

[A]
可以利用登录触发器,如
Create or REPLACE TRIGGER tr_login_record
AFTER logon ON DATABASE
DECLARE
miUserSid NUMBER;
mtSession v$session%ROWTYPE;
CURSOR cSession(iiUserSid IN NUMBER) IS
   Select * FROM v$session
      Where sid=iiUserSid;
BEGIN
  Select sid INTO miUserSid FROM v$mystat Where rownum<=1;
  OPEN cSession(miUserSid);
  FETCH cSession INTO mtSession;
  --if user exists then insert data
  IF cSession%FOUND THEN
     Insert INTO log$information(login_user,login_time,ip_adress,ausid,terminal,
                     osuser,machine,program,sid,serial#)
              VALUES(ora_login_user,SYSDATE,SYS_CONTEXT (‘USERENV’,’IP_ADDRESS’),
                      userenv(‘SESSIONID’),
                      mtSession.Terminal,mtSession.Osuser,
                      mtSession.Machine,mtSession.Program,
                      mtSession.Sid,mtSession.Serial#);
  ELSE
  --if user don’t exists then return error
      sp_write_log(‘Session Information Error:’||SQLERRM);
      CLOSE cSession;
      raise_application_error(-20099,’Login Exception’,FALSE);
  END IF;
  CLOSE cSession;
EXCEPTION
  WHEN OTHERS THEN
    sp_write_log(‘Login Trigger Error:’||SQLERRM);
END tr_login_record;
在以上触发器中需要注意以下几点
1
、该用户有v_$sessionv_$mystat的对象查询权限,可以在sys下对该拥护显式授权。
2
sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。
3
、必须在创建该触发器之前创建一个log$information的表记录登录信息。

[Q]
怎么捕获整个数据库的DDL语句或者是说对象结构变化与修改
[A]
可以采用DDL触发器,如
Create or REPLACE TRIGGER tr_trace_ddl
AFTER DDL ON DATABASE
DECLARE
  sql_text ora_name_list_t;
  state_sql ddl$trace.ddl_sql%TYPE;
BEGIN
   FOR i IN 1..ora_sql_txt(sql_text) LOOP
      state_sql := state_sql||sql_text(i);
   END LOOP;
   Insert INTO ddl$trace(login_user,ddl_time,ip_address,audsid,
                    schema_user,schema_object,ddl_sql)
        VALUES(ora_login_user,SYSDATE,userenv(‘SESSIONID’),
               sys_context(‘USERENV’,’IP_ADDRESS’),
               ora_dict_obj_owner,ora_dict_obj_name,state_sql);
EXCEPTION
   WHEN OTHERS THEN
      sp_write_log(‘Capture DDL Excption:’||SQLERRM);
END tr_trace_ddl;
在创建以上触发器时要注意几点
1
、必须创建一个ddl$trace的表,用来记录ddl的记录
2
sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。

[Q]
怎么捕获表上的DML语句(不包括select)语句)
[A]
可以采用dml触发器,如
Create or REPLACE TRIGGER tr_capt_sql
BEFORE Delete or Insert or Update
   ON manager.test
DECLARE
sql_text ora_name_list_t;
state_sql capt$sql.sql_text%TYPE;
BEGIN
FOR i IN 1..ora_sql_txt(sql_text) LOOP
    state_sql := state_sql || sql_text(i);
END LOOP;
    Insert INTO capt$sql(login_user,capt_time,ip_address,audsid,owner,table_name,sql_text)
        VALUES(ora_login_user,sysdate,sys_context(‘USERENV’,’IP_ADDRESS’),
               userenv(‘SESSIONID’),’MANAGER’,’TEST’,state_sql);
EXCEPTION
     WHEN OTHERS THEN
       sp_write_log(‘Capture DML Exception:’||SQLERRM);
END tr_capt_sql;
在创建以上触发器时要注意几点
1
、必须创建一个capt$sql的表,用来记录ddl的记录
2
sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。

第六部分、OS相关与其它
[Q]
怎么样生成日期格式的文件
[A]
LINUX/UNIX上,使用`date +%y%m%d` (`这个是键盘上~所在的那个键) $(date +%y%m%d),如:
touch exp_table_name_`date +%y%m%d`.dmp
DATE=$(date +%y%m%d)
或者
DATE=$(date +%Y%m%d --date ‘1 days ago’)  #
获取昨天或多天前的日期
Windows
上,使用%date:~4,10%,其中4是开始字符,10是提取长度,表示从date生成的日期中,提取从4开始长度是10的串。你可以改成其它你需要的数字,如:
Echo %date:~4,10%
如果想得到更精确的时间,win上面还可以使用time

[Q]
测试磁盘与阵列性能

[A]
用类似如下的方法测试写能力
time dd if=/dev/zero of=/oradata/biddb/testind/testfile.dbf bs=1024000 count=1000
期间系统IO 使用可以用(unix):
iostat -xnp 2
显示Busy程度


[Q]
怎么配置SSH密匙
[A]
可以防止"中间人"的进攻方式
1
ssh-keygen ssh-keygen -d(ssh 2.x)生成钥匙
2
、然后拷贝公匙到你想登录的服务器,改名为authorized_keys,如果是3.0以下版本,需要改为authorized_keys2
3
、还可以利用config文件进一步简化操作


Host *bj
HostName
机器名或IP
User
用户名

有了这个配置文件,你就可以利用ssh bj来访问指定的机器了,也就可以利用scpsftp来传送文件了。

[Q]FTP
怎么在脚本中自动上传/下载
[A]
可以把FTP写到shell脚本中,如
ftp -n

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics