第一篇:课题_ORACLE编译失效对象小结
ORACLE编译失效对象小结
在日常数据库维护过程中,我们会发现数据库中一些对象(包Package、存储过程Procedure、函数Function、视图View、同义词.....)会失效,呈现无效状态(INVALID)。有时候需要定期检查数据库中存在哪些失效对象,对于存在异常的对象需要重新编译,有些自动失效的对象,一般会在下次调用的时候,会被重新编译,所以这些不需要人工干预。那么为什么对象突然会失效呢?又如何快速、高效的编译失效对象呢?哪些失效的对象不需要我们去重新编译呢?
数据库对象失效原因
数据库对象失效的原因很多,下面大致归纳了一些常见的原因(有些漏掉的,希望大家补充): 1: 当被引用对象的结构变更时,都会使得相关的依赖对象转变为INVALID状态。
数据库中的对象(存储过程,函数,包,视图,触发器),它们往往需要直接或者间接的引用其它对象,对象的依赖包括直接和间接二种,其中直接依赖是指存储对象直接依赖于被引用对象,而间接依赖是指对象间接依赖于被引用对象
要查看被引用的对象,可以通过下面SQL查看
select * from dba_dependencies where name='&objectname';
select * from all_dependencies where name='&objectname';
select * from user_dependencies where name='&objectname';举个简单例子,视图V_TEST引用了表TEST,TEST表修改了表结构时,会导致视图V_TEST变为无效对象。
SQL> CREATE TABLE TEST(ID NUMBER(10));
Table created.SQL> CREATE VIEW V_TEST AS SELECT * FROM TEST;
View created.SQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
-----------------------------------
V_TEST VALID
--修改表结构,增加一个字段NAME后,视图V_TEST变为无效
SQL> ALTER TABLE TEST ADD NAME VARCHAR(12);
Table altered.SQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
-----------------------------------
V_TEST INVALID
--查询视图V_TEST后,数据库会重新编译视图
SQL> SELECT * FROM V_TEST;
no rows selected
SQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
-----------------------------------
V_TEST VALID
其实不管视图,像存储过程,函数、包等,如果代码本身没有什么错误,只是引用的对象发生了变化。也会失效。但并不影响调用,因为ORACLE在调用时会自动重新编译的,如果其它对象变化后导致编译有错误。这时调用时重新编译后也是错误并处于失效状态,所以调用会出错。2:发布SQL脚本时(包、存储过程、函数等),没有充分测试,编译时出错,这时对象变为无效。3: 数据库升级、迁移时,出现大量无效对象(本质原因,个人臆测归结为原因1)。
4: 诸如此类各种情况:例如,Oracle 会自动维护分区索引,对于全局索引,如果在对分区表操作时,没有指定update index,则会导致全局索引失效,需要重建。
编译失效对象的方法统计失效的对象:
select owner, object_type, status, count(*)
from dba_objects
where status='INVALID'
group by owner, object_type, status
order by owner, object_type
查看具体失效对象
col owner for a20;
col object_name for a32;
col object_type for a16
col status for a8
select owner, object_name, object_type, status
from dba_objects
where status='INVALID'
order by 1, 2,3;
第二篇:ORACLE审计小结
1、什么是审计
审计(Audit)用于监视用户所执行的数据库操作,并且Oracle会将审计跟踪结果存放到OS文件(默认位置为$ORACLE_BASE/admin /$ORACLE_SID/adump/)或数据库(存储在system表空间中的SYS.AUD$表中,可通过视图dba_audit_trail查 看)中。默认情况下审计是没有开启的。
不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接Instance;启动数据库;关闭数据库。
2、和审计相关的两个主要参数
Audit_sys_operations:
默认为false,当设置为true时,所有sys用户(包括以sysdba,sysoper身份登录的用户)的操作都会被记录,audit trail不会写在aud$表中,这个很好理解,如果数据库还未启动aud$不可用,那么像conn /as sysdba这样的连接信息,只能记录在其它地方。如果是windows平台,audti trail会记录在windows的事件管理中,如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中。
Audit_trail:
None:是默认值,不做审计;
DB:将audit trail 记录在数据库的审计相关表中,如aud$,审计的结果只有连接信息;
DB,Extended:这样审计结果里面除了连接信息还包含了当时执行的具体语句; OS:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;
XML:10g里新增的。
注:这两个参数是static参数,需要重新启动数据库才能生效。
3、审计级别
当开启审计功能后,可在三个级别对数据库进行审计:Statement(语句)、Privilege(权限)、object(对象)。
Statement:
按语句来审计,比如audit table 会审计数据库中所有的create table,drop table,truncate table语句,alter session by cmy会审计cmy用户所有的数据库连接。
Privilege:
按权限来审计,当用户使用了该权限则被审计,如执行grant select any table to a,当执行了audit select any table语句后,当用户a 访问了用户b的表时(如select * from b.t)会用到select any table权限,故会被审计。注意用户是自己表的所有者,所以用户访问自己的表不会被审计。
Object:
按对象审计,只审计on关键字指定对象的相关操作,如aduit alter,delete,drop,insert on cmy.t by scott;这里会对cmy用户的t表进行审计,但同时使用了by子句,所以只会对scott用户发起的操作进行审计。注意Oracle没有提供对schema中所有 对象的审计功能,只能一个一个对象审计,对于后面创建的对象,Oracle则提供on default子句来实现自动审计,比如执行audit drop on default by access;后,对于随后创建的对象的drop操作都会审计。但这个default会对之后创建的所有数据库对象有效,似乎没办法指定只对某个用户创建的对象有效,想比 trigger可以对schema的DDL进行“审计”,这个功能稍显不足。
4、审计的一些其他选项
by access / by session:
by access 每一个被审计的操作都会生成一条audit trail。
by session 一个会话里面同类型的操作只会生成一条audit trail,默认为by session。
whenever [not] successful:
whenever successful 操作成功(dba_audit_trail中returncode字段为0)才审计, whenever not successful 反之。省略该子句的话,不管操作成功与否都会审计。
5、和审计相关的视图
dba_audit_trail:保存所有的audit trail,实际上它只是一个基于aud$的视图。其它的视图 dba_audit_session,dba_audit_object,dba_audit_statement都只是dba_audit_trail 的一个子集。
dba_stmt_audit_opts:可以用来查看statement审计级别的audit options,即数据库设置过哪些statement级别的审计。dba_obj_audit_opts,dba_priv_audit_opts视图功能与之类似
all_def_audit_opts:用来查看数据库用on default子句设置了哪些默认对象审计。
6、取消审计
将对应审计语句的audit改为noaudit即可,如audit session whenever successful对应的取消审计语句为noaudit session whenever successful;7、10g中的审计告知一切
Oracle 数据库 10g 审计以一种非常详细的级别捕获用户行为,它可以消除手动的、基于触发器的审计。
假定用户 Joe 具有更新那张表的权限,并按如下所示的方式更新了表中的一行数据:
update SCOTT.EMP set salary = 12000 where empno = 123456;您如何在数据库中跟踪这种行为呢?在 Oracle 9i 数据库及其较低版本中,审计只能捕获“谁”执行此操作,而不能捕获执行了“什么”内容。例如,它让您知道 Joe 更新了 SCOTT 所有的表EMP,但它不会显示他更新了该表中员工号为 123456 的薪水列。它不会显示更改前的薪水列的值 — 要捕获如此详细的更改,您将不得不编写您自己的触发器来捕获更改前的值,或使用 LogMiner 将它们从存档日志中检索出来。
细粒度审计(FGA),是在 Oracle 9i 中引入的,能够记录 SCN 号和行级的更改以重建旧的数据,但是它们只能用于 select 语句,而不能用于 DML,如 update、insert 和delete 语句。因此,对于 Oracle 数据库 10g 之前的版本,使用触发器虽然对于以行级跟踪用户初始的更改是没有吸引力的选择,但它也是唯一可靠的方法。
8、实例讲解
8.1、激活审计
SQL> conn /as sysdba SQL> show parameter audit NAME TYPE VALUE----------------------------------------------audit_file_dest string /u01/app/oracle/admin/ORCL/adump audit_sys_operations boolean FALSE audit_syslog_level string audit_trail string NONE
SQL> alter system set audit_sys_operations=TRUE scope=spfile;--审计管理用户(以sysdba/sysoper角色登陆)SQL> alter system set audit_trail=db,extended scope=spfile;SQL> startup force;SQL> show parameter audit NAME TYPE VALUE----------------------------------------------audit_file_dest string /u01/app/oracle/admin/ORCL/adump audit_sys_operations boolean TRUE audit_syslog_level string audit_trail string DB, EXTENDED
8.2、开始审计
SQL> conn /as sysdba SQL> audit all on t_test;SQL> conn u_test SQL> select * from t_test;SQL> insert into u_test.t_test(c2,c5)values('test1','2');SQL> commit;SQL> delete from u_test.t_test;SQL> commit;SQL> conn /as sysdba SQL> col DEST_NAME format a30 col OS_USERNAME format a15 col USERNAME format a15 col USERHOST format a15 col TERMINAL format a15 col OBJ_NAME format a30 col SQL_TEXT format a60 SQL> select OS_USERNAME,username,USERHOST,TERMINAL,TIMESTAMP,OWNER,obj_name,ACTION_NAME,sessionid,os_process,sql_text from dba_audit_trail;
sql> audit select table by u_test by access;如果在命令后面添加by user则只对user的操作进行审计,如果省去by用户,则对系统中所有的用户进行审计(不包含sys用户).例:
AUDIT DELETE ANY TABLE;--审计删除表的操作
AUDIT DELETE ANY TABLE WHENEVER NOT SUCCESSFUL;--只审计删除失败的情况
AUDIT DELETE ANY TABLE WHENEVER SUCCESSFUL;--只审计删除成功的情况 AUDIT DELETE,UPDATE,INSERT ON user.table by test;--审计test用户对表user.table的delete,update,insert操作
8.3、撤销审计
SQL> noaudit all on t_test;
9、审计语句
多层环境下的审计:appserve-应用服务器,jackson-client AUDIT SELECT TABLE BY appserve ON BEHALF OF jackson;审计连接或断开连接: AUDIT SESSION;AUDIT SESSION BY jeff, lori;--指定用户
审计权限(使用该权限才能执行的操作):
AUDIT DELETE ANY TABLE BY ACCESS WHENEVER NOT SUCCESSFUL;AUDIT DELETE ANY TABLE;AUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE, EXECUTE PROCEDURE BY ACCESS WHENEVER NOT SUCCESSFUL;
对象审计:
AUDIT DELETE ON jeff.emp;AUDIT SELECT, INSERT, DELETE ON jward.dept BY ACCESS WHENEVER SUCCESSFUL;
取消审计:
NOAUDIT session;NOAUDIT session BY jeff, lori;NOAUDIT DELETE ANY TABLE;NOAUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE,EXECUTE PROCEDURE;NOAUDIT ALL;--取消所有statement审计
NOAUDIT ALL PRIVILEGES;--取消所有权限审计 NOAUDIT ALL ON DEFAULT;--取消所有对象审计
10、清除审计信息
DELETE FROM SYS.AUD$;DELETE FROM SYS.AUD$ WHERE obj$name='EMP';
11、审计视图
STMT_AUDIT_OPTION_MAP--审计选项类型代码 AUDIT_ACTIONS--action代码
ALL_DEF_AUDIT_OPTS--对象创建时默认的对象审计选项 DBA_STMT_AUDIT_OPTS--当前数据库系统审计选项 DBA_PRIV_AUDIT_OPTS--权限审计选项 DBA_OBJ_AUDIT_OPTS USER_OBJ_AUDIT_OPTS--对象审计选项 DBA_AUDIT_TRAIL USER_AUDIT_TRAIL--审计记录 DBA_AUDIT_OBJECT USER_AUDIT_OBJECT--审计对象列表 DBA_AUDIT_SESSION USER_AUDIT_SESSION--session审计 DBA_AUDIT_STATEMENT USER_AUDIT_STATEMENT--语句审计
DBA_AUDIT_EXISTS--使用BY AUDIT NOT EXISTS选项的审计 DBA_AUDIT_POLICIES--审计POLICIES DBA_COMMON_AUDIT_TRAIL--标准审计+精细审计
12、将审计结果表从system表空间里移动到别的表空间上
实际上sys.aud$表上包含了两个lob字段,并不是简单的move table就可以。下面是具体的过程: alter table sys.aud$ move tablespace users;alter table sys.aud$ move lob(sqlbind)store as(tablespace USERS);alter table sys.aud$ move lob(SQLTEXT)store as(tablespace USERS);alter index sys.I_AUD1 rebuild tablespace users;
--End--
第三篇:编译原理各章小结
1.编译程序是一个翻译程序,将高级语言的源程序翻译成低级语言的程序。
2.整个编译过程可以划分为五个阶段以及编译各阶段的任务;另外还有两个处理过程。
3.不会有很多人会从事设计和编写编译程序的工作的,但编译技术会应用在很多领域。
1.已知文法G,判断VN=?,VT=?,判断某个符号串是否为该文法描述的句子。
2.已知文法G,写出它定义的语言描述;
3.已知文法G,给出其句子的各种形式的推导,会画出语法树;
4.文法二义性的判断——利用语法树:在文法G中去寻找某一个句子,能够给它画出两个不同的语法树。
1.词法分析的任务。
2.单词的概念与单词的分类以及输出方式。
3.弄懂一些重要的概念:
正规文法G、正规式r和确定有限自动机DFA和不确定有限自动机NFA。
4.会画出FA对应的状态转换图。
5.弄懂词法分析器的自动生成原理:
1.语法分析的任务;
2.确定的自顶向下语法分析方法的基本思想,存在的问题是:左递归和回溯;
3.分析方法:预测分析法。
1.自底向上语法分析方法的基本思想;
2.短语、直接短语和句柄底定义,以及如何利用语法树来寻找某个句型的所有的短语、直接短语和句柄;
3.自底向上语法分析方法:
①算符优先分析法:基本原理,识别句柄的方法,最左素短语。
②LR分析法:活前缀,LR(0)项目,LR(0)分析法,SLR(1)分析法。
语义分析与中间代码生成的任务。
弄清属性文法的概念。
弄清语法制导翻译的概念。
掌握常用的中间代码形式:逆波兰式和四元式。
掌握一般语法成分,如赋值语句,条件语句,循环语句和简单说明语句等结构的翻译。
数据空间的内容;
数据空间的三种分配策略;
临时变量的存储分配。
优化的分类;
常用的代码优化技术;
局部优化。
1.目标代码的形式 ;
2.目标机的指令系统;
3.代码生成算法。
第四篇:Oracle JOB 用法小结
Oracle JOB 用法小结时间:2004-10-20 08:00来源:中国网管联盟 作者:BitsCN整理 点击:24528次
一、设置初始化参数 job_queue_processes
sql> alter system set job_queue_processes=n;(n>0)
job_queue_processes最大值为1000
查看job queue 后台进程
sql>select name,description from v$bgprocess;
二,dbms_job package 用法介绍
包含以下子过程:
Broken()过程。
change()过程。
Interval()过程。
Isubmit()过程。
Next_Date()过程。
Remove()过程。
Run()过程。
Submit()过程。
User_Export()过程。
What()过程。
1、Broken()过程更新一个已提交的工作的状态,典型地是用来把一个已破工作标记为未破工作。
这个过程有三个参数:job、broken与next_date。
PROCEDURE Broken(job
IN binary_integer,Broken
IN boolean,next_date IN date :=SYSDATE)
job参数是工作号,它在问题中唯一标识工作。
broken参数指示此工作是否将标记为破——TRUE说明此工作将标记为破,而FLASE说明此工作将标记为未破。网管联盟www.xiexiebang.com.com
创建测试表
SQL> create table TEST(a date);
表已创建。
创建一个自定义过程
SQL> create or replace procedure MYPROC as
begin
insert into TEST values(sysdate);
end;
/
过程已创建。
创建JOB
SQL> variable job1 number;
SQL>
SQL> begin
dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');即一分钟运行test过程一次end;
/
PL/SQL 过程已成功完成。
运行JOB
SQL> begin
dbms_job.run(:job1);
end;
/
PL/SQL 过程已成功完成。
SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss')时间 from TEST;
时间
-------------------
--每天1440分钟,2001/01/07 23:51:21 2001/01/07 23:52:22 2001/01/07 23:53:24
删除JOB SQL> begin 2 dbms_job.remove(:job1);3 end;4 / 网管网bitsCN.com
PL/SQL 过程已成功完成。www.xiexiebang.com】
【转自
第五篇:Oracle Apps DBA工作小结
Oracle Apps DBA工作小结
开始Oracle Apps DBA的工作到现在差不多有2周了,为了清理思路作个小的总结。
日常需要做的工作包括:
1。Oracle Apps的克隆,复制,因为有各个省份的生产环境,测试环境,开发环境,所以克隆,复制的需求量很大,这是个熟能生巧的事情,同时也是个比较无聊的工作,没什么技术含量。
2。Oracle Apps的troubleshooting,通过对Oracle Forms做trace,再加上反应不算快速的Metalink支持,基本上也可以应付。但是看见旁边的同事疲于应付各种求助,感觉上也有些烦躁。
3。数据库的备份,使用HP OpenView Storage Data Protector+RMAN,以前没有用过omni,但是仍然属于熟能生巧的事情,而且有HP工程师作技术支持,也不是什么问题。目前需要做的是备份策略还没有完全测试过,这是这周的主要工作。
4。编写文档,文档的模版比较正规,但是内容仍然需要改善,各个省份的文档都是Ctl+C, Ctl+V,然后全局替换的产物。
5。SQL Tuning,一般是对于客户化开发功能的SQL调优,目前我对于应用还很不熟悉,所以这部分工作还没有开始。
需要接触的技术:
HP主机 + Oracle数据库 + Oracle Apps 11i + HP OpenView Storage Data Protector
工作之外需要进一步学习IT管理。
PS;本文档由北大青鸟广安门收集自互联网,仅作分享之用。