Chinaunix首页 | 论坛 | 博客
  • 博客访问: 632931
  • 博文数量: 825
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 4980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-27 14:19
文章分类

全部博文(825)

文章存档

2011年(1)

2008年(824)

我的朋友

分类:

2008-10-27 14:27:20


  在数据库中,管理tablespaces通常很难实现从SQL查询得到数据的可视化。一种实现tablespaces可视化且更加容易管理的方法是建立类似于碎片重组功能(defragmentation utilities)的分段使用映射(block usage maps)。
  
  不需要任何图表或者图形功能,你可以使用简单的由Oracelmodplsql包产生的HTML,而modplsql包可在安装8i和9i时安装。
  
  这其中也包含着风险,因为这一程序必须由一个DBA帐号来运行,所以DBA帐号必须将使用权限赋予每一个操作计划,而操作计划必须包含在wdbsvr.app文件中。为了保护这一文件,你必须确保这一文件只能被Oracle用户和DBA组查阅。如果你愿意把这一程序编写成一个JSP页或者servlet,你也应该非常小心,以防止外部能够使用DBA帐号。
  
  DBA视不能在一个PL/SQL查询,所以你必须将PL/SQL安装为SYS,然后将使用权限分配给允许运行PL/SQL的帐号:
  
  connect sys/
  @blkmap.sql
  grant execute on blkmap to system;
  connect system/
  create synonym blkmap for sys.blkmap;
  
  在这个例子中,我们建立一个名为blkmap包,这一blkmap包具有两个入口点。其中一个是显示tablespaces列表的一个菜单,另一个是实际使用的tablespace分段映射:
  
      create or replace package blkma
  
  as
  procedure ts_menu;
  procedure ts_map(p_name varchar2);
  
  end blkmap;
  
  /
  
  show errors;
  
  Tablespace菜单的代码可以是一个与分段映射(block map)页关联的tablespaces列表:
  
  procedure ts_menu
  is
  begin
    htp.p('');
    htp.p('');
    htp.p('

Tablespaces

');
    htp.p('');
    htp.p(' ');
    htp.p('');
  end ts_menu;
  
  对于tablespace映射,可以生成一个tablespace名称,并请求包含tablespace的每一文件的分段映射。
  
  procedure ts_map(p_name varchar2)
  is
  begin
    page_open;          -- open the page
    htp.p('Tablespace: '||p_name);
    htp.p('
');
    for file in
    (
      select file_id
       from dba_data_files
       where tablespace_name = p_name
       order by file_id
    )
    loop
      filemap(file.file_id);  -- generate a block map for the file
      htp.p('
');
    end loop;
    info_form;          -- generate a form for segment info
    legend;           -- generate a legend for color mappings
    page_close;         -- close the page
  end ts_map;
  
  对于实际使用的分段映射,我们通常需要显示一个“block”并用颜色表示。使用标签比较复杂。一个更好的方法是生成字符次序,即一段时间之后是间隔,这一间隔允许在任何位置给文本以颜色化。
  
  为了使得分段映射更加有用,我们想列出鼠标位置的block信息,并且突出组成这一片段的block,我们可以使用标签。首先,生成一个指定a和a:hover的类型,然后建立每一Oracle数据库段的类型:
  
  
  
  我们可以列出有关鼠标位置的block使用者、名称、类型、block数量、以及片段的长度。为了实现这一目的,我们需要两个Script函数,包含以上信息的这两个函数被调用,并传递到表单的域内:
  
  
  . . .
  

  

  

  

  

  

  

  
Owner:
Name:
Type:
Block#:
Length:

  
  
  对于每一片段,我们需要建立一个block的
标签。最后,建立一个显示不同颜色含义的图表:
  
  
  Legend
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
. Free Space
. Cache
. Cluster
. Index
. LobIndex
. LobSegment
. Rollback
. Temporary
. Table
. Other

  
  以下是完整代码:
  
  create or replace package blkmap
    authidcurrent_user
  as
    procedure ts_menu;
    procedure ts_map(p_name varchar2);
  end blkmap;
  /
  show errors;
  
  create or replace package body blkmap
  as
    procedure page_open;
    procedure info_form;
    procedure filemap(p_id number);
    procedure legend;
    procedure page_close;
    --
    procedure ts_menu
    is
    begin
      htp.p('');
      htp.p('');
      htp.p('

Tablespaces

');
      htp.p('
');
      htp.p('');
      htp.p('');
    end ts_menu;
    --
    procedure ts_map(p_name varchar2)
    is
    begin<
【责编:admin】
--------------------next---------------------

阅读(313) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~