你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
oracle 基础(16)
 
2.8 限制表空间份额

背景
用户可以使用表空间内部多大的空间?用户可以写入多少个表空间? 答案取决于可供用户使用的表空间的份额。 可以按如下所示指定份额:

alter user ananda quota 12M on users;

此代码允许用户 ananda 创建总大小不超过 12MB 的存储对象,如表、索引以及物化视图。 要确认或查明用户已经使用的空间大小,请发出以下查询

SQL> col used format 999,999.999 head "Used (MB)"
SQL> col quota format 999,999.999 head "Quota (MB)"
SQL> col tablespace_name format a15
SQL> select username, tablespace_name,
  2  bytes/1024/1024 used,
  3  max_bytes/1024/1024 quota
  4  from dba_ts_quotas
  5  order by username
  6  /

示例输出如下。

USERNAME            TABLESPACE_NAME    Used (MB)   Quota (MB)
------------------- --------------- ------------ ------------
USER1               USERS                   .000      100.000
USER1               APP1_INDEX           504.875        -.000
USER2               USERS                   .125        5.000

我们需要对以上输出进行一下说明。 该输出表明用户 USER1 在表空间 USERS 中的份额为 100MB(显示在列 Quota 的下面)。 而用户未使用该分额中的任何表空间(显示在列 Used 的下面)。 第二行很有趣 - 您可以看到 Quota 列显示“-0”。 它指示用户在该表空间 (APP1_INDEX) 中具有无限的表空间权限。 用户 USER2 在表空间 USERS 中的份额为 5MB,并只使用了其中的 0.125 MB。

您应监视的是无限的表空间。 可以使用以下代码向用户提供无限份额:

alter user ananda quota unlimited on users;

但该操作可能对安全性产生影响;如果常规用户对业务关键的表空间具有无限的表空间份额,则该用户可能会用尽该表空间 - 这一点类似于拒绝服务攻击。

一个更严重的风险是系统权限 UNLIMITED TABLESPACE,它使用户在所有表空间中均具有无限份额,而没有向他们授予特定份额。 请让我再次重申一下: 用户在所有表空间(包括 SYSTEM)中均具有无限的份额,因此用户可以从中创建对象。 这样并不好。

首先,检查 SYSTEM 上的任何显式表空间份额:

select
username,
   bytes/1024/1024 used,
   max_bytes/1024/1024 quota
from dba_ts_quotas
where tablespace_name = 'SYSTEM'
order by username;

如果该查询显示某些内容,则应对其进行评估并在必要情况下撤销该份额。

下一步是标识具有无限表空间系统权限的用户。

select grantee
from dba_sys_privs
where privilege = 'UNLIMITED TABLESPACE';

由于该系统权限也包含 SYSTEM 表空间的权限,因此应对该列表进行仔细评估。

策略
您现在已经标识了所有用户及其表空间份额,下一个任务就是降低它们的风险。 此处有两个任务,一个任务比另一个任务更具破坏性。

首先,尝试删除 SYSTEM 表空间中的无限份额。 执行该操作不会对应用程序造成严重的破坏。 但在执行该操作之前,您需要确保 SYSTEM 表空间不包含 SYS 模式外部的对象。 以下查询可以实现此目的。

select owner, segment_type, segment_name
from dba_segments
where tablespace_name = 'SYSTEM'
and owner not in ('SYS','SYSTEM');
输出如下
OWNER           SEGMENT_TYPE    SEGMENT_NAME
--------------- --------------- --------------
OUTLN           INDEX           OL$HNT_NUM
OUTLN           INDEX           OL$SIGNATURE
OUTLN           INDEX           OL$NAME
OUTLN           TABLE           OL$NODES
OUTLN           TABLE           OL$HINTS
OUTLN           TABLE           OL$

在该示例中,只有 OUTLN 对象位于 SYSTEM 表空间中,这是可以接受的。 如果看到任何其他对象,则应移动它们。

该问题的根本原因可能是

select username
from dba_users
where default_tablespace = 'SYSTEM';

它将只返回以下内容。

USERNAME
----------
SYSTEM
SYS
OUTLN

如果它显示其他用户名,请将该用户更改到其他表空间。 例如,要将用户 SCOTT 的默认表空间更改为 USER_DATA,请发出以下命令

alter user scott default tablespace user_data;

然后将所有对象移出系统表空间。

alter table scott.tab1 move tablespace user_data;

现在,您的下一个任务是确保所有用户在 SYSTEM 表空间中的份额为 0。 份额无限有两个基本原因,其中之一就是直接授予了无限的表空间。 另一个原因是授予了角色 RESOURCE,该角色在 Oracle9i 数据库和更早版本中具有系统权限 UNLIMITED TABLESPACE。 相比之下,Oracle 数据库 10g 并不将系统权限授予 RESOURCE 角色。

对于 Oracle9i 数据库

确保实际上已将 UNLIMITED TABLESPACE 授予 RESOURCE 角色。

SQL> select *
  2  from dba_sys_privs
  3  where grantee = 'RESOURCE';

GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
RESOURCE                       CREATE TYPE                              NO
RESOURCE                       CREATE TABLE                             NO
RESOURCE                       CREATE CLUSTER                           NO
RESOURCE                       CREATE TRIGGER                           NO
RESOURCE                       CREATE OPERATOR                          NO
RESOURCE                       CREATE SEQUENCE                          NO
RESOURCE                       CREATE INDEXTYPE                         NO
RESOURCE                       CREATE PROCEDURE                         NO
RESOURCE                       UNLIMITED TABLESPACE                     NO

如果未列出 UNLIMITED TABLESPACE,则您不必在此阶段执行任何操作。 向前转至“常见任务”。

对于 Oracle 数据库 10g

确保未将 UNLIMITED TABLESPACE 授予 RESOURCE 角色。

SQL> select *
  2  from dba_sys_privs
  3  where grantee = 'RESOURCE';
(编辑:aniston)
  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089