如何自动获取Oracle数据库启动时在Shared pool里面的对象(翻译)

oracle|对象|数据|数据库

主题:本文说明在数据库启动的时候,如何自动获取Shared Pool里最常用的过程和包等对象。

正文:  下面用实例来演示Startup之后和Shutdown之前,如何用Triger来完成自动管理的任务。

1.创建一个供Triger调用的Procedure

a.创建一个用来保存Procedure和Package的名称的Table(list_tab)

    SQL>create table sys.list_tab (owner varchar2(64),NAME VARCHAR2(100));

   Table created.

     b.创建一个Procedure(proc_pkgs_list)来保存Shared Pool里面的对象名

SQL> create or replace PROCEDURE proc_pkgs_list AS

2                           own varchar2(64);

     3         nam varchar2(100);

     4      cursor pkgs is

     5         select owner,name

     6         from SYS.v_$db_object_cache

     7         where type in ('PACKAGE','PROCEDURE')

     8         and   (loads > 1 or KEPT='YES');

     9  BEGIN

    10        delete from sys.list_tab;

    11        commit;

    12         open pkgs;

    13         loop

    14         fetch pkgs into own, nam;

    15         exit when pkgs%notfound;

    16       insert into sys.list_tab values (own , nam);

    17    commit;

    18    end loop;

19             end;

20             /

    Procedure created.

c.创建Procedure(proc_pkgs_keep)用来保存调用dbms_shared_pool包的结果(注:如果没有dbms_shared_pool包,可以用dbmspool.sql脚本生成)

   SQL> CREATE OR REPLACE PROCEDURE sys.proc_pkgs_keep AS

     2   own varchar2(64);

     3   nam varchar2(100);

     4   cursor pkgs is

     5   select owner ,name

     6   from sys.list_tab;

     7  BEGIN

     8   open pkgs;

     9   loop

    10   fetch pkgs into own, nam;

    11   exit when pkgs%notfound;

    12   SYS.dbms_shared_pool.keep(''|| own || '.' || nam || '');

    13   end loop;

    14   sys.dbms_shared_pool.keep('SYS.STANDARD');

    15   sys.dbms_shared_pool.keep('SYS.DIUTIL');

    16  END;

    17  /

   Procedure created.

 

2.编译、测试Procedure

   SQL> execute sys.proc_pkgs_list;

   PL/SQL procedure successfully completed.

 

   SQL> execute sys.proc_pkgs_keep;

   PL/SQL procedure successfully completed.

3.创建Triger

a.  在Instance shutdown之前的triger

   SQL> CREATE OR REPLACE TRIGGER db_shutdown_list

     2   BEFORE SHUTDOWN ON DATABASE

     3  BEGIN

     4   sys.proc_pkgs_list;

     5  END;

     6  /

   Trigger created.

 

b.  在Instance startup之后的triger

   SQL> CREATE OR REPLACE TRIGGER db_startup_keep

     2   AFTER STARTUP ON DATABASE

     3  BEGIN

     4   sys.proc_pkgs_keep;

     5  END;

     6  /

   Trigger created.

 

检查alter.log文件,查看Triger是否成功。如果不成功,则在数据库关闭或者启动的时候会看到如下提示*** SHUTDOWN

 

Shutting down instance (immediate)

License high water mark = 2

Mon May 22 12:31:45 2000

ALTER DATABASE CLOSE NORMAL

Mon May 22 12:31:45 2000

SMON: disabling tx recovery

Mon May 22 12:31:46 2000

Errors in file /8i/ora815/admin/hp11_815/udump/ora_12624.trc:

ORA-04098: trigger 'DB_SHUTDOWN_LIST' is invalid and failed re-validation

SMON: disabling cache recovery

Mon May 22 12:31:47 2000

Thread 1 closed at log sequence 16579

Mon May 22 12:31:47 2000

Completed: ALTER DATABASE CLOSE NORMAL

Mon May 22 12:31:47 2000

ALTER DATABASE DISMOUNT

Completed: ALTER DATABASE DISMOUNT

 

 

*** STARTUP

Example 1:

 

Starting ORACLE instance (normal)

LICENSE_MAX_SESSION = 0

...

SMON: enabling tx recovery

Tue Apr 18 10:21:38 2000

Errors in file /8i/ora815/admin/hp11_815/udump/ora_7291.trc:

ORA-04098: trigger 'DB_STARTUP_KEEP' is invalid and failed re-valid

ation

Tue Apr 18 10:21:38 2000

Completed: alter database open

 

Tue Apr 18 10:21:30 2000

Starting ORACLE instance (normal)

LICENSE_MAX_SESSION = 0

 

Example 2:

 

SMON: enabling tx recovery

Tue Apr 18 11:12:41 2000

Errors in file /8i/ora815/admin/hp11_815/udump/ora_7562.trc:

ORA-00604: error occurred at recursive SQL level 1

ORA-00931: missing identifier

ORA-06512: at "SYS.DBMS_UTILITY", line 68

ORA-06512: at "SYS.DBMS_SHARED_POOL", line 43

ORA-06512: at "SYS.DBMS_SHARED_POOL", line 51

ORA-06512: at "SYS.PROC_PKGS_KEEP", line 13

ORA-06512: at line 2

Tue Apr 18 11:12:41 2000

Completed: alter database open

 

In the /8i/ora815/admin/hp11_815/udump/ora_7562.trc file:

 

Error in executing triggers on STARTUP

*** 2000.04.18.11.12.41.052

ksedmp: internal or fatal error

ORA-00604: error occurred at recursive SQL level 1

ORA-00931: missing identifier

ORA-06512: at "SYS.DBMS_UTILITY", line 68

ORA-06512: at "SYS.DBMS_SHARED_POOL", line 43

ORA-06512: at "SYS.DBMS_SHARED_POOL", line 51

ORA-06512: at "SYS.PROC_PKGS_KEEP", line 13

ORA-06512: at line 2

以上Procedure和Triger必须在sys的模式下执行,并且保证表list_tab的存在。

时间: 2024-11-01 07:47:43

如何自动获取Oracle数据库启动时在Shared pool里面的对象(翻译)的相关文章

服务器-oracle数据库启动时卡死

问题描述 oracle数据库启动时卡死 IBM3650M3服务器坏了一个硬盘,系统崩溃了,换了新硬盘,rebuild后,oracle数据库startup后卡在数据库加载完毕,数据库已打开死活不出来.有大神知道是什么情况么? 解决方案 怀疑你oracle数据库已经不完整,建议重新安装oracle,然后把数据导入 解决方案二: 先把数据库停了.执行命令ipcs看看oracle sga是否存在,存在则先删除,再启动.

Linux/Unix shell 自动导入Oracle数据库

      使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linux 下使用 shell 脚本来实现自动导入Oracle数据库.        Linux Shell以及导入导出的相关参考:        Linux/Unix shell 脚本中调用SQL,RMAN脚本        Linux/Unix shell sql 之间传递变量       

Linux下通过脚本自动备份Oracle数据库并删除指定天数前的备份_oracle

说明: Oracle数据库服务器 操作系统:CentOS IP:192.168.0.198 端口:1521 SID:orcl Oracle数据库版本:Oracle11gR2 具体操作: 1.root用户登录服务器 mkdir -p /backup/oracledata #新建Oracle数据库备份目录 chown -R oracle:oinstall /backup/oracledata -R #设置目录权限为oinstall用户组的oracle用户(用户oracle与用户组oinstall是在

自动备份Oracle数据库_oracle

正在看的ORACLE教程是:自动备份Oracle数据库.相信为数不少的系统管理员每天都在做着同一样的工作--对数据进行备份.一旦哪一天疏忽了,而这一天系统又恰恰发生了故障,需要进行数据恢复,那么此时就无能为力了.假如每天设定一个固定的时间,系统自动进行备份,那该多好啊!下面笔者结合实践经验,谈一谈UNIX环境下Oracle数据库的自动备份,以起到抛砖引玉的作用.  我们计划让数据库在晚上23点做export导出备份,在凌晨2点将备份文件拷贝到磁带上,在凌晨4点将备份文件拷贝到另一台UNIX机器上

使用Oracle数据库登录时被告知用户被锁怎么解决_oracle

在登陆时被告知test用户被锁 1.用dba角色的用户登陆,进行解锁,先设置具体时间格式,以便查看具体时间 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; Session altered. 2.查看具体的被锁时间 SQL> select username,lock_date from dba_users where username='TEST'; USERNAME LOCK_DATE --------------

servlet ajax-怎么用servlet获取oracle数据库信息后传递到jquery的ajax上进行验证

问题描述 怎么用servlet获取oracle数据库信息后传递到jquery的ajax上进行验证 package com.ibm.ajax.app1.entity; public class WebUser { private String uname; public WebUser(String uname){ this.uname=uname; } public String getUname() { return uname; } public void setUname(String u

Linux 自动备份oracle数据库详解_oracle

Linux 自动备份oracle数据: 曾经有个同事,来回操作开发和生产的数据库,结果误删了生产的数据库,那种心情我想不是一般人能理解的,虽然说oracle可以有方法还原,但并不是彻底的. 所以,在工作中,不管是开发还是维护,备份数据库是非常有必要. 简单实用的晚间自动备份数据库小案例 步骤一.创建备份脚本,暂且命名为orabak.sh #路径名,指定备份的路径 FILEPATH = /oracle/orabak #根据指定日期格式,定义备份数据库文件名 FILENAME = `date + %

数据库启动时丢失数据文件的模拟实验

1.查询数据库状态,MOUNTED SYS@ bys001>select status,startup_time from v$instance; STATUS       STARTUP_TIME ------------ ------------------- MOUNTED      2013/07/16 16:54:36 2.重命令一个数据文件,模拟文件丢失. SYS@ bys001>host [oracle@oel-01 oradata]$ cd bys001/ [oracle@oe

Oracle数据库移植时字符集问题的解决

对于Oracle数据库之间的移植采用Oracle的导入导出工具(Import/Export)是一个比较好的策略.虽也可以利用第三方软件如Sybase 的Power designer中的Reverse Engineering 进行数据库结构重建,然后在进行较复杂的数据导入过程,但对于作业队列.快照等则不得不用手工来创建.而Export能将整个数据库.指定用户.指定表和相关的数据字典进行输出,Export输出的输出转存二进制文件包括了完全重建所有被选对象所需的命令. 本人在为某电厂MIS(Oracl