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)
|