dba一些常用的管理语句(不断更新)

------------------UNDO----------

oracle会在修改数据的时候把这条数据存一份到undo段中(没修改之前的状态)

select * from v$rollname;           ------在线的回滚段

select segment_name,OWNER,tablespace_name,status from dba_rollback_segs;    ------所有的回滚段


select XIDUSN from v$transaction;    ------当前事物用到的回滚段的USN


SELECT SUM(undoblks) / SUM((end_time - begin_time) * 86400)FROM v$undostat;     -----计算平均1秒产生多少个undo块。


create  rollback segment  r1 tablespace undo2;                  ------手工创建一个新的回滚段  (undo_management=manual 才能使用)

alter rollback segment r1online;

drop rollback segment r1 ;

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

SQL> select * from v$rollname;
 
       USN NAME
---------- ------------------------------
         0 SYSTEM
         1 _SYSSMU1_812862839$
         2 _SYSSMU2_2273225004$
         3 _SYSSMU3_98857225$
         4 _SYSSMU4_2159844899$
         5 _SYSSMU5_3361858080$
         6 _SYSSMU6_1796026529$
         7 _SYSSMU7_1608419395$
         8 _SYSSMU8_1178788706$
         9 _SYSSMU9_2880222061$
        10 _SYSSMU10_2611178102$

SQL> select segment_name,extent_id,file_id,block_id,blocks,tablespace_name from dba_extents where segment_name='_SYSSMU1_812862839$';
 
SEGMENT_NAME                                                                      EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS TABLESPACE_NAME
-------------------------------------------------------------------------------- ---------- ---------- ---------- ---------- ------------------------------
_SYSSMU1_812862839$                                                                       0          3        128          8 UNDOTBS1
_SYSSMU1_812862839$                                                                       1          3        288          8 UNDOTBS1
_SYSSMU1_812862839$                                                                       2          3       2432        128 UNDOTBS1
_SYSSMU1_812862839$                                                                       3          3       2560        128 UNDOTBS1

SQL> select owner,SEGMENT_NAME,BLOCKS,EXTENTS from dba_segments where SEGMENT_NAME='_SYSSMU1_812862839$';
 
OWNER                          SEGMENT_NAME                                                                         BLOCKS    EXTENTS
------------------------------ -------------------------------------------------------------------------------- ---------- ----------
SYS                            _SYSSMU1_812862839$                                                                     272          4
 


Undo段中区的状态

free
expired
inactive
active

显示UNDO区信息
SELECT extent_id, bytes, status FROM dba_undo_extents
WHERE segment_name='_SYSSMU1_812862839$';

 EXTENT_ID      BYTES STATUS
---------- ---------- ---------
         0      65536 EXPIRED
         1      65536 EXPIRED
         2    1048576 EXPIRED
         3    1048576 UNEXPIRED



undo_retention这个参数保留commit的undo信息(或者说undo段中的inactive的extent)
alter tablespace undotbs1 retention guarantee              -----保证undo_retention的时间内inactive的extent(提交了的undo信息)不被覆盖
alter tablespace undotbs1 retention noguarantee         ----不保证,默认

select tablespace_name ,retention from dba_tablespaces;


--------------闪回--------------

flashback database to scn ###### (归档模式下、flashback_on打开、mount下)

闪回数据库的3个参数:db_recovery_file_dest、db_recovery_file_dest_size、db_flashback_retention_target

flashback table t1 to scn #####(闪回DML操作,flashback_on不需要打开)

flashback table t1 to before drop (从recyclebin里闪回来,flashback_on不需要打开)


闪回版本查询(可以找出undo_sql)

1、 select versions_starttime, versions_endtime, versions_xid,versions_operation, sal

from t1

versions between timestamp minvalue and maxvalue

order by VERSIONS_STARTTIME;

2、  SELECT UNDO_SQL FROM FLASHBACK_TRANSACTION_QUERY  WHERE XID = '08001100C7010000';

------------------临时表空间-----------------

create temporary tablespace temp2 tempfile'........' size 20M reuse;             ----建新的

drop tablespace temp2 including contents and datafiles;                              ----删老的

alter database defalut temporary tablespace temp2;                                      -----改默认


------------------临时表----------------------

create global temporary table tmp1 on commit preserve rows as select * from emp;      -----SYS$session  会话级,会话结束表才清空

create global temporary table tmp2 on commit delete rows as select * from emp;          ------SYS$transaction 事物级 ,事物结束清空  

select table_name,LOGGING,TEMPORARY,DURATION from user_tables;
                    TMP2       NO                 Y             SYS$TRANSACTION
                    TMP1       NO                 Y             SYS$SESSION

临时表存在排序段中(sort_segment),排序段在临时表空间,所以说临时表的数据存储在临时表空间里

 select tablespace_name,total_blocks,used_blocks,free_blocks,current_users from v$sort_segment;

-----------------move、shrink-------------------------------

alter table t1 move tablespace users;                 消除碎片(delete掉的数据),降低高水位,释放空间( 单位是extent),消除行迁移,改变了rowid,索引失效需重建  

----move 就相当于咵咵咵把数据揉实了,然后找个新的空间放进去。

 alter table t1 shrink space (compact);           消除碎片,降低高水位,释放空间,索引不失效,产生大量的undo和redo。

-----shrink 就相当于把数据用小锤子夯实了,还在原来的地方。


碎片:

表空间的碎片------>分配新的范围所致,会有一些分散的,较小的空间被跳过-------->碎片是extent级的--------->影响:空间利用率差 

解决办法:手动合并alter tablespace XXX coalesce;      貌似LMT的表空间就不用管它了,系统会自动帮你合并表空间的碎片


表的碎片--------->delete等DML操作所致,HWM以下产生了一下空块或不满的块----------->碎片是block级的 -------->影响:导致全表扫描效率低,因为HWM是全表扫描的终点

解决办法:move,shrink等

-----------------------------------------------sqlldr---------------------------------------------------------------------------

load data

(infile '/bk/1.txt')

(append/ replace /truncate)

into table t1

fields terminated by ','   (optionally enclosed by '"')

(deptno,dname,loc,createdate DATE "yyyy-mm-dd hh24:mi:ss")


sqlldr scott/tiger control=/bk/2.txt discard=/bk/dis.txt bad=/bk/bad.txt (data=/bk/1.txt) log=/bk/log.txt

----------------------------外部表的使用--------------

grant create any directory to scott

create directory bk as '/bk'

select * from dba_directories;

CREATE TABLE t1 (
DEPTno NUMBER, Dname CHAR(20), LOC CHAR(20))
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER 
DEFAULT DIRECTORY bk 
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
BADFILE 'bad.txt'
LOGFILE 'log.txt'
FIELDS TERMINATED BY ' '
(DEPTno CHAR,
Dname CHAR,
LOC CHAR))
LOCATION ('1.txt'))
PARALLEL 5 
REJECT LIMIT unlimited;


1.txt的内容是:

10 ACCOUNTING NEWYORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON


--------------------处理挂起的事物(resumable)------

这个功能主要是防止空间不够导致session failed  (参见:http://blog.163.com/yanenshun@126/blog/static/1283881692012917102016513/)

例如你create一个很大index,三天三夜后,完成了99%,这时候表空间用完了(autoextent off)导致create失败,那只能吐血了

有了resumable session后,他会等待一段时间,等你有了空间后继续

当事物缺少某些资源不能运行的时候,会有两种处理方法:①自动的回滚当前语句(默认) ②将事物挂起,等待新的资源

Alter session enable resumable (timeount 3600);      ------开启挂起的特性

                 select  sid from v$mystat where rownum=1;   ----看当先的session id

select dbms_resumable.get_session_timeout(159) from dual;  -----看159会话的挂起时间


                select event from v$session_wait where sid=159;    ---看看159的等待事件

select * from dba_resumable;              ----检查被挂起的事物的原因




---------------------------索引--------------------------------------

user_indexes、user_ind_columns

create index i_t1_empno on t1(empno);

analyze index i_t1_empno validate structure;     ------分析索引

select height,blocks,br_blks,lf_blks,lf_rows,del_lf_rows from index_stats;


alter index i_t1_empno coalesce;                  ------只是合并枝干内的叶子,不会改变索引的结构和高度,不释放段所拥有的空间,可以有事物

alter index i_ti_empno rebuild (online)        --------将老的抛弃,重新建立一个新的,降低高度改变结构,有事物的话会报错,online的话事物挂起


挂起以后咱们可以用下面的语句去看看等待事件

select event from v$session_wait where sid=159;

EVENT
-----------------------------
enq: TM – contention                           ------行级锁争用

*******************************************************

顺带脚说说锁吧

可以通过DBA_blockers,DBA_waiters 这两个字典找出哪个session占用了锁,哪个在等待锁

也可以这样:select  sid from v$lock where request<>0;         ------被阻塞的sid

                        select  sid from v$lock where block<>0;              -------阻塞方的sid(block=1就是阻塞方)


ok~~ 找到了sid我们也就能找到serial# ,然后杀了它:alter system kill session 'sid,serial#';

*******************************************************

号外号外~~~~

①主键对应的唯一索引是不能被单独删除的(会报错的!),换句话说就是:有主键/唯一约束必定有对应的唯一索引,而有唯一索引不一定有对应的主键/唯一约束(这里我说个情况,当时只有sb才会这么做,就是我先手工建立一个非唯一的索引,然后建立主键/唯一约束,然后主键/唯一约束和这个非唯一索引也能对应上,就和第一条相违背了

②我们在删除主键约束时可以保留唯一索引:alter table t1 drop constraint pk_t1_empno keep index


******************监控索引的使用情况***************

alter index pk_emp monitoring usage;

alter index pk_emp nomonitoring usage;   

select * from v$object_usage;

索引名称              表名称          被监视否           使用过否         开始监视时间                   结束监视时间

INDEX_NAME    TABLE_NAME    MONITO     USED       START_MONITORING      END_MONITORING
----------                ---------------           ------           ------         -------------------------              -------------------
PK_EMP                EMP                     YES            NO          10/13/2006 23:20:04


select 'alter index '||index_name||' monitoring usage;' from user_indexes;      ------这个看得懂吧

alter index PK_EMP monitoring usage;
alter index I_T1_EMPNO monitoring usage;
alter index PK_DEPT monitoring usage;

我们运行这些sql就会监视该用户下的所有index

在程序运行一段时间后,我们看看那个索引没有used,然后给它删了,当然主键的唯一索引删除要考虑一下喽~~


--------------------------------约束constraint-------------------------------------

select table_name,constraint_name,constraint_type,status,validated,deferrable,deferred from user_constraints;                    -----查看约束的状态


*************延迟约束****************

alter table t1 add constraint u_t1 unique(EMPNO) initially deferreddeferrable;                 ------建立一个初始状态为延迟可延迟约束

*alter table t2 modify (empno number constraint u_t1 unique initially deferred deferrable);                                 ------同上


如果一个约束是可延迟约束

当前会话的属性决定约束是否延迟

alter session set constraint=immediate       ------可延迟的约束立即检查

alter session set constraint=deferred           ------可延迟的约束会延迟

alter session set constraint=default              ------约束初始状态是什么就是什么 (就看deferred字段了)

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

   唯一约束和主键约束都会自动创建唯一索引   ,其他约束不创建索引

㈡    想把一个非延迟的约束改为延迟约束:只能删除这个约束再重新建立

㈢    延迟约束,会导致建立的索引是非唯一(主键约束、唯一约束)

㈣    停掉约束后,约束自带的索引(索引和约束同名)被删除   (延迟约束自带的索引不会被删除)     (如果是先手动建立的索引,停掉约束,索引不删除)

*㈤  延迟约束比较特殊,自带的索引不会随着约束的删除\停掉而被删除

*㈥  事先手工建立的索引,不会随着对应约束的删除\停掉而被删除

-------控制约束的状态--------

alter table t1disable constraint u_t1;               ------------停掉约束后,约束自带的索引被删除  延迟约束自带的索引不会被删除

select table_name,constraint_name,constraint_type,status,validated,deferrable,deferred from user_constraints;      ---- 看约束的状态

TABLE_NAME                     CONSTRAINT_NAME                C       STATUS         VALIDATED                DEFERRABLE                 DEFERRED

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

T2                                               U_T2                                      U      DISABLED    NOT VALIDATED     NOT DEFERRABLE         IMMEDIATE

select table_name,index_name,index_type,uniqueness from user_indexes;          ----看看索引


alter table t1 enable constraint u_t1;              -------------启用约束后,索引重新建立



**************约束的容错方法*******************

当为了加速批量插入数据的速度 把表上的约束disable掉,插入的有违反约束的行,enable时 起不来,为了让数据库能立即上线 不能立即去处理数据            怎么办?

使用约束容错方法:

①约束不带有唯一索引(外键 非空 check)

alter table t1 enable novalidate constraint x                           -------novalidate对表中已有数据不作检测 但新录入做检测

②约束带有唯一索引 (唯一 主键)

要先建立一个非唯一性的索引:create index IND_NAME on t1(column_name);

alter table t1 enable novalidate constraint x using index IND_NAME;

(索引变成了非唯一索引,搜索时多了一步范围扫描)

####等有时间了,把违反约束的行找出来,剔除掉


***********找出违反约束的列***************

oracle提供一种简单方法 利用约束启动时的检测过程 将违反的约束行存起来

SQL> @?/rdbms/admin/utlexpt1.sql     ----创建一个exceptions表

alter table t1 enable constraint u_t1 exceptions into exceptions;          -----将违反约束的行存起来

select * from exceptions                          ----可以查到rowid




-----------------------------------------用户相关-----------------------------------------------------------

dba_users   ------看用户相关的属性

alter user u1 quota 1m on users;      ----限制用户在users表空间的磁盘配额

alter user u1 quota 0 on users          ----配额为零,不再分配新的空间,现有的可以继续使用

select * from dba_ts_quotas             ----查看用户的配额情况


***************profile*****************

profile 是限制用户使用资源的一种手段(密码管理策略限制会话的资源

数据库初始有两个profile:default、MONITORING_PROFILE;

create profile p1 limit failed_login_attempts 2;  

alter profile p1 limit PASSWORD_LOCK_TIME 2;

drop profile p1 cascade

select * from dba_profiles;                  ----看看现在有几个profile

alter user u1 profile p1;                        ----把p1赋予u1

select username,profile from dba_users;

密码管理策略:                                                                      

PASSWORD_VERIFY_FUNCTION
PASSWORD_REUSE_MAX
FAILED_LOGIN_ATTEMPTS
PASSWORD_LOCK_TIME
PASSWORD_LIFE_TIME 30
PASSWORD_GRACE_TIME 3
PASSWORD_REUSE_TIME
以上都是限制密码的,time单位是天

限制会话的资源:

LOGICAL_READS_PER_CALL
LOGICAL_READS_PER_SESSION
CPU_PER_CALL
CPU_PER_SESSION
PRIVATE_SGA
COMPOSITE_LIMIT
IDLE_TIME
CONNECT_TIME
SESSIONS_PER_USER

以上是限制会话资源的,生效的前提是alter system set resource_limit=true;


*************权限的管理***************

权限这块总结了挺多,看似很乱~!其实你把:系统权限、对象权限、角色之间的关系弄明白了,就清楚了!(重点看紫底儿的)

系统权限就是系统权限、对象权限就是对象权限、角色中既能有系统权限也能有对象权限     ----不是废话~~记住~!

 系统中有166个权限

 select * from session_privs     -------查看当前用户拥有的系统权限(包括系统权限和角色中的系统权限,像select on scott.emp这样的权限看不见)

想看一个用户下的所有权限:① 系统权限:select * from session_privs;   +    ②对象权限:select * from user_tab_privs;      这两条加起来就是所有权限

 

 select * from dba_sys_privs where grantee='SCOTT';    ------查看用户和角色的系统权限授予情况


授权的级联

①with admin option权限回收无级联、适用系统权限角色     eg:grant select any table to u1 with admin option;

②with grant option  权限回收有级联、适用于对象权限                eg:  grant select on scott.t1 to u1 with grant option;

是否级联可以查看相应的字典:

dba_sys_privs    查看系统权限的授予了哪些用户或角色:select * from dba_sys_privs where grantee in ('U1','U2');

㈡dba_role_privs   查看角色的授予情况:select * from dba_role_privs where GRANTEE in ('U1','U2');

㈢dba_tab_privs    查看普通表的权限的授予情况:select * from dba_TAB_privs where GRANTEE in ('U1','U2');

   *dba_col_privs

我要查看一个角色中有哪些权限

SELECT * FROM dba_sys_privs WHERE grantee IN('CONNECT','RESOURCE');

select  * from dba_role_privs where grantee in ('connect','resource');

select * from dba_tab_privs where grantee in ('connect','resource');

以上三个结果的总和就是角色的权限


*Resource 角色被授予后用户自动有UNLIMITED TABLESPACE 的系统权限。UNLIMITED TABLESPACE 就是你可以再任意表空间建立表


************自定义角色************

 select * from dba_roles      ----数据库内所有的角色

默认角色是针对用户而言的,角色本身并没有默认不默认(从dba_role_privs 中看):就是用户登录后这个角色你就能用,不是默认角色的话,你需要激活这个角色          ---这个了解即可,应该不怎么用

给角色加上密码:

create role r1 identified by r1;

alter role r1 identified by r1;


指定某个用户的某个角色为默认角色(实际上就是我可以将某个用户的角色给关掉


u1 现在有两个角色:connect和resource

conn /as sysdba

ALTER USER U1 DEFAULT ROLE NONE;     ------我把u1的所有角色都关了,他啥角色都不能用了,把所有角色都置成非默认

alter user u1 default role connect ;                    -------我把u1的connect角色开了,把connect置成默认


conn u1/u1

set role resource (identified by XXX)           --------u1登录后自己把resource角色激活,如果这个角色在创建的时候有密码就用到括号里的了



---------------------------------备份----------------------------------------------------

expdp\impdp(数据泵)

比如我从win的pc上导出linux服务器上的数据

PC(win):

conn /as sysdba

create directory ok as 'E:\bk';

create public database link testlk connect to system identified by managerconfig using 'testyd';

select * from scott.t1@testlk;

expdp system/managerconfig full=y directory=ok dumpfile=full.dmp network_link=testlk


********************

热备

备份数据文件:①alter tablespace users begin backup;

    ②cp  ......

    ③alter tablespace users end backup;

select * from v$backup;

备份控制文件:①热备份控制文件的建立脚本到udump下:

alter database backup controlfile to trace;

    ②热备份当前的控制文件:

alter database backup controlfile to 'c:\bk\control.bak';


热备份中几个常用的命令: 

说白了啊,热备份就三步   ①定位那个文件坏了②cp ③recover      然后再琢磨琢磨下面这5个绿底的命令

1、select name,checkpoint_change# from v$datafile;                        -----控制文件中的信息

2、select name,checkpoint_change# from v$datafile_header;        ------数据文件头的信息

3、select name,status from v$datafile;                                                 -------数据文件的状态:(online,recover,offline)

4、select * from v$recover_file;                                                              ------需要恢复的数据文件

5、select * from v$recovery_log;

6、alter tablespace users offline(online);


-------------------无备份的恢复--------------------------------------

⒈ alter database create datafile '/u01/app/oracle/oradata/tt/ly.dbf' (as '/bk/ly.dbf');   

⒉ alter database rename file '/u01/app/oracle/oradata/tt/ly.dbf' to '/bk/ly.dbf';

1和2的关系:其实没什么关系......2就是给数据文件改名字,1就是根据控制文件从新建立一个新的空的数据文件(就和最初刚建立这个数据文件的时候一样),一般用于无备份的恢复,新建完了跑归档。


select name,creation_change# from v$datafile;         -----看一数据个文件的创建时的SCN

select name,first_change# from v$arcived_log;         ------归档的信息

--------------------恢复索引表空间-------------------------------------------------------

一句话:取创建索引的元数据,删除表空间,然后从新建立表空间,用元数据创建索引!(也可以cp后recover那么恢复)


-----------------这笔账怎么算-----------------------------

rowid

AAAMfP      AAE      AAAAAg   AAA
对象代码    文件        块             行

dbms_rowid.rowid_object(rowid)  object#

dbms_rowid.rowid_relative_fno(rowid)  file#

dbms_rowid.rowid_block_number(rowid) block#

dbms_rowid.rowid_row_number(rowid) row#


select segment_name,extent_id,file_id,block_id,blocks from dba_extents where segment_name='T1';                -----3 ID


 select dbms_rowid.rowid_block_number(rowid),count(*) from t1 group by dbms_rowid.rowid_block_number(rowid);        -------每个块里对应的行数


analyze table t1 compute statistics

select table_name,blocks,empty_blocks,avg_space,num_freelist_blocks from dba_tables where table_name='T1';          ----avg_space是所用使用的块里的平均剩余空间,num_freelist_blocks是空闲列表指向了几个块,blocks是用了的块,

empty_blocks是没用的块              ||这里面的blocks和empty_blocks我现在只能用来看个大大概数,分不清哪个算用了的,哪个算没用的?


***************字符集************

select * from nls_database_parameters;        -----这个是库的

PARAMETER                                    VALUE
------------------------------              --------------------------------------------------
NLS_LANGUAGE                              AMERICAN                                                  -----oracle的错误提示、时期的字符集(simplified chinese)
NLS_TERRITORY                             AMERICA             ------oracle的货币的字符集

NLS_CHARACTERSET                   ZHS16GBK                                                  ----数据库字符集

NLS_NCHAR_CHARACTERSET   AL16UTF16    ----国家语言字符集

NLS_DATE_FORMAT                       DD-MON-RR

select * from v$nls_parameters;                      -----这个是当前session的


NLS_LANG=language_territory.characterset

**NLS_LANG的字符集要和客户端的操作系统一样(linux命令locate,win命令chcp)



-----转化当前session的错误提示、日期、货币的输出字符集

 alter session set NLS_LANGUAGE='simplified chinese';                       -----设置后,当前会话的提示、日期就是中文的了

alter session set NLS_TERRITORY=china                                                 ------设置后,当前会话的货币格式就是中国的了

也可以这样:set NLS_LANG=simplified chinese_china.zhs16gbk  (windos)

export NLS_LANG='simplified chinese_china.zhs16gbk'   (linux)


********取元数据**************

set long 10000

select dbms_metadata.get_ddl('TABLE','EMP','SCOTT') from dual;         ------表的

select dbms_metadata.get_ddl('INDEX','PK_EMP') from dual;                    ---索引的

select dbms_metadata.get_ddl('SEQUENCE','SYSTEM_GRANT','SYS') from dual;            ----序列的

select dbms_metadata.get_ddl('TABLESPACE','UNDOTBS1') from dual;                          ---表空间的


select
'select dbms_metadata.get_ddl('||''''||'TABLE'||''''||','||''''||table_name||''''||') from dual;'
||chr(10)
||'select '||''''||'/'||''''|| ' from dual;' from user_tables;                                                          ---- 批量生成元数据


*********DBlINK*********

create public database link TTLK connect to scott identified by tiger using 'TT';

select * from dba_db_links;

select * from emp@ttlk

alter session close database link ttlk;                        ----关闭

drop public database link ttlk;


***************SCN********************

select checkpoint_change# from v$database;                   ------存在控制文件中

select name,checkpoint_change# from v$datafile;           ------存在控制文件中

select name,checkpoint_change# from v$datafile_header;       -----存在数据文件的头


select * from v$recover_file;

select * from v$recovery_log;


*************日志挖掘*****************

alter database add supplemental log data;               --------开启后,会额外记录DML的信息,你才能挖到DML操作

alter database drop supplemental log data;             --------关闭后,就只能挖到DDL操作了

select SUPPLEMENTAL_LOG_DATA_MIN from v$database;


--日志中加入额外的信息

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) columns;
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) columns;
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA 
select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI
from v$database; 


exec dbms_logmnr.add_logfile('.....');

select filename from v$logmnr_logs;                        ----查看正在挖哪些日志

exec dbms_logmnr.start_logmnr(options=>16);     /       exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

select ..... from v$logmnr_contents where ...;

exec dbms_logmnr.end_logmnr;

*******************碰巧遇到一个小问题****************************

select * from v$flash_recovery_area_usage;                -----这个不是内存这块的,碰巧看见,查看闪回区的使用情况。  我的归档路径是默认的,在闪回区,我发现我切换不了用户了,报错:ORA-00257:archiver error.Connect internal only, until freed,原来是闪回区的归档日志满了 。从查询到的结果能看到

    FILE_TYPE    PERCENT_SPACE_USED         PERCENT_SPACE_RECLAIMABLE              NUMBER_OF_FILES
------------             ------------------                                   -------------------------                                              ---------------
CONTROLFILE                   0                                         0                                                        0
ONLINELOG                     0                                            0                                                       0
ARCHIVELOG                99.42                                        0                                                    49
BACKUPPIECE                   0                                        0              0
IMAGECOPY                     0                                            0              0
FLASHBACKLOG                  0                                      0               0                     

删除一些日志或者扩大闪回日志文件的最大大小

alter system set DB_RECOVERY_FILE_DEST_SIZE=10g


*************内存相关*************************

一、shared_pool

share pool分为两个部分

1、library cache(库高速缓存): 加速解析 减少语句重解析,曾经使用的SQL,PL/SQL 的语句和执行计划

2、data dictionary cache 又叫rowcache(数据字典高速缓存):加速sql的解析,使用过的字典 就会缓存在这里 再次使用这个字典就直接从内存获取,这些统计的信息在 v$rowcache中记录

v$sgastat  ----查看sga的状态

select * from v$sgastat where pool='shared pool' and name='free memory';        -----查看sga中shared_pool的空余空间;

select sum(pinhits)/sum(pins) from v$librarycache;                              ----查看librarycache的sql命中率

如果sql的命中率在90%一下就有点低了,这是我们就要想办法优化了。

1、加大 shared_pool_size 的大小,但也不要太大,太大会增加管理的额外费用(这条是在sga手动管理的情况下)

2、编写程序的时候使用变量传入,而不是使用常量(对dba有点不实际,对开发人员说的~!)

3、将大的包定在内存中

4、修改初始化参数 cursor_sharing(这个我们重点说一下)

可以做一个试验:① create table t1 as select * from emp ;建立一个10W行左右的表,然后让修改empno这一列,让第一行位2000,剩下的都为1000,然后在empno上建立索引

② 修改参数cursor_sharing的值,打开执行计划,观察各种情况下select *  from t1 where empno=1000; 和select * from t1 where empno=2000;下有什么不同

完成上面的试验,总结得到:

1、强制匹配(force)命中高:将where的条件都用变量来处理,提高了命中率,但是不能区分列值的敏感性,会导致部分sql的语句的执行计划不正确!

上面试验empno=2000的情况,拿到了empno=1000的执行计划,走了全表扫描,而没走索引!

2、近似匹配(similar):将where 条件都用变量来处理,提高了SQL 的命中率,但可以区分列值的数据敏感性,既保证了语句的复用,又提高的命中率,又可以区分列的条件差异。但oralce 有的时候会有bug,导致美好的东西变成了泡影,所以我们改了以后要测试一下性能。

上面试验empno=2000的情况,走了索引,没用empno=1000的执行计划!

3、精确匹配(exact)命中低:原语句不处理,是什么就是什么,降低了sql的命中,但是保证执行计划是正确的。oracle默认值

试验中empno2000,走索引,empno=1000,走全表扫描!

写到这里我有一个疑问,如果我的程序都用的是绑定变量,那么,我的sql语句也可能会拿到不正确的执行计划吧?


***********************************************************

查看数据库中那些表的物理读最多:

select * from
(select object_name,statistic_name,statistic#,value from v$segment_statistics where statistic_name='physical reads' order by value desc)
where rownum<=10
/

查看emp表的统计:

select object_name,statistic_name,statistic#,value from v$segment_statistics where object_name='EMP';

OBJECT_NAME                    STATISTIC_NAME                 STATISTIC#      VALUE
------------------------------ ------------------------------ ---------- ----------
EMP                            logical reads                           0         16
EMP                            buffer busy waits                       1          0
EMP                            gc buffer busy                          2          0
EMP                            db block changes                        3          0
EMP                            physical reads                          4         12
EMP                            physical writes                         5          0
EMP                            physical reads direct                   6          0
EMP                            physical writes direct                  7          0
EMP                            gc cr blocks received                   9          0
EMP                            gc current blocks received             10          0
EMP                            ITL waits                              11          0
EMP                            row lock waits                         12          0
EMP                            space used                             14          0
EMP                            space allocated                        15          0
EMP                            segment scans                          17          0


********************************收集统计信息*****************************************************

统计信息对执行计划有决定性影响:

execute dbms_stats.gather_database_stats;      ----全收集

execute dbms_stats.gather_database_stats_job_proc;    ----gather_stats_job调度任务的跑的存储过程

execute dbms_stats.gather_schema_stats('SCOTT',dmbs_stats.auto_sample_size);

execute dbms_stats.gather_table_stats('SCOTT','EMP');


*******************************sys用户的登陆验证*****************************************

1, remote_login_passwordfile 是用来控制能否以as sysdba来连接到数据库. 如果为exclusive, 则远程可通过conn sys/***@*** as sysdba来登陆; 如果为None, 则远程可通过conn sys/***@*** as sysdba来登陆时会提示用户名密码错误(其实是不能以as sysdba登陆的原因).
2,sqlnet.ora文件中SQLNET.AUTENTICATION_SERVICES是用来控制在本机中以as sysdba登陆时,是不是需要输入sys/****. 如果SQLNET.AUTHENTICATION_SERVICES=(NONE), 则要以conn sys/*** as sysdba登陆; 如果SQLNET.AUTHENTICATION_SERVICES=(NTS), 以conn /as sysdba即可.


******************************硬解析过多的危害******************************************************

1、慢,优选执行计划的时候消耗cpu资源

2、会造成shared pool latch

3、使free空间中产生大量的碎片(小chunk)      





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值