数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle 10G 最佳20位新特性:改善的表空间管理


发布日期:2022年09月18日
 
Oracle 10G 最佳20位新特性:改善的表空间管理

表空间管理得到了重大的改进这可以归因于一个 sparser SYSTEM为用户定义一个默认表空间的支持新的 SYSAUX甚至重命名

您曾经多少次因用户在 SYSTEM 表空间中创建了非 SYS 和 SYSTEM 的段而伤透脑筋?

在 Oraclei Database 之前如果在创建用户时没有指定默认表空间那么它将默认为 SYSTEM 表空间如果用户在创建一个段时没有显式地指定一个表空间那么这个段将在 SYSTEM 中创建—前提是用户在 SYSTEM 表空间中拥有配额(要么显式地授予要么通过系统权限 UNLIMITED TABLESPACE 来授予)Oraclei 允许 DBA 为所有未用显式的临时表空间子句创建的用户指定一个默认的临时表空间从而减少了这个问题

在 Oracle Database g 中您可以类似地为用户指定一个默认表空间在数据库创建期间CREATE DATABASE 命令可以包含子句 DEFAULT TABLESPACE 在创建之后您可以通过发出以下命令来使一个表空间变成默认表空间

ALTER DATABASE DEFAULT TABLESPACE <tsname>;

未用 DEFAULT TABLESPACE 子句创建的所有用户将以 作为它们的默认表空间您可以在任何时候通过这个 ALTER 命令来改变默认表空间从而允许您在不同的节点上将不同的表空间指定为默认表空间

重要注意事项拥有旧的表空间的所有用户的默认表空间都被修改为 即使有些表空间是为某些用户显式指定的例如假定用户 USER 和 USER 的表空间分别是 TS 和 TS — 它们是在用户创建期间显式指定的数据库当前的默认表空间是 TS但之后数据库的默认表空间变为 TS即使 USER 的默认表空间是显式指定为 TS它也将变为 TS小心这种边界效应!

如果在数据库创建期间没有指定默认表空间它将默认为 SYSTEM但您如何才能知道现有的数据库的默认表空间是哪一个?发出以下查询

SELECT PROPERTY_VALUE

FROM DATABASE_PROPERTIES

WHERE PROPERTY_NAME = DEFAULT_PERMANENT_TABLESPACE;

DATABASE_PROPERTIES 视图显示默认表空间之外还显示一些非常重要的信息 — 例如默认临时表空间全局数据库名时区等

非必要模式的默认表空间

几种模式(如智能代理用户 DBSNMP数据挖掘用户 ODM)与用户操作不直接相关但对数据库完整性仍很重要这些模式中的一些曾经用 SYSTEM 作为它们的默认表空间 — 这是在 SYSTEM 表空间内对象增殖的又一个原因

Oracle Database g 引进了一个新的称为 SYSAUX 的表空间它用来保存这些模式的对象这个表空间是在数据库创建期间自动创建的并在本地进行管理唯一允许修改的是数据文件的名称

这种方法在 SYSTEM 损坏需要完整的数据库恢复时为恢复提供支持SYSAUX 中的对象可以被恢复为任意正常的用户对象同时数据库本身保持运行

但如果您想将 SYSAUX 中的这些模式中的一些转移到一个不同的表空间中时该怎么办?例如考虑 LogMiner 使用的对象这些对象的大小经常增长直到最终填满表空间出于可管理性的原因您可能考虑将它们转移到它们自己的表空间中但实现这一目的的最好的方法是什么?

作为一个数据库管理员了解转移这些特殊对象的正确过程对您而言是很重要的幸运的是Oracle Database g 提供了一个新的视图使要凭猜测来做的工作形象化这个视图V$SYSAUX_OCCUPANTS列出了表空间 SYSAUX 中的模式的名称它们的说明当前使用的空间以及如何转移它们(参见表

注意 LogMiner 如何被清楚地显示为占用 KB 的空间它归模式 SYSTEM 所有而要转移对象您需要执行打包的过程 SYSDBMS_LOGMNR_DSET_TABLESPACE不过对于 STATSPACK 对象这个视图推荐使用导入/导出方法而对于流没有转移过程 — 因而您不能容易地将它们从 SYSAUX 表空间中转移出来列 MOVE_PROCEDURE 默认显示 SYSAUX 中存在的几乎所有工具的正确的转移过程也可以逆向使用转移过程来使对象回到 SYSAUX 表空间中

重命名一个表空间

在数据仓库环境中(典型地对于数据中心体系结构)在数据库之间传输表空间是很常见的但源数据库和目标数据库必须不存在拥有相同名称的表空间如果存在两个拥有相同名称的表空间则目标表空间中的段必须转移到一个不同的表空间中然后重新创建这个表空间— 这个任务说起来容易做起来难

Oracle Database g 提供了一个方便的解决方案您可以用以下命令来简单地重命名一个现有的表空间(SYSTEM 和 SYSAUX 除外) — 无论是永久表空间还是临时表空间

ALTER TABLESPACE <oldname> RENAME TO <newname>;

这个功能还将应用在存档过程中假定您有一个按范围分区的表用于记录销售历史数据每个月的这个分区位于按这个月份命名的一个表空间中 — 例如 月份的分区命名为 JAN并位于一个名称为 JAN 的表空间中这样您就拥有了一个将信息保留 个月的策略您将能够存档 月的数据大致的操作流程类似于以下操作

利用 ALTER TABLE EXCHANGE PARTITION 从分区 JAN 中创建一个独立的表 JAN

将表空间重命名为 JAN

为表空间 JAN 创建一个可传输表空间集

将表空间 JAN 重新命名为 JAN

将空的分区交换回表中

步很简单并且不会过度地消耗资源(如重做和撤消空间) 步只是拷贝文件并只为 JAN 输出数据字典信息这也是个非常轻松的过程如果您需要恢复之前存档的分区这个过程也非常简单您只需要将相同的过程反过来就行了

Oracle Database g 在处理这些重命名的方式上相当智能化如果您重命名作为 UNDO 或默认临时表空间的表空间这可能产生混淆但数据库将自动调整必要的记录来反映这种变化例如将默认表空间的名称从 USERS 修改为 USER_DATA 将自动修改视图 DATABASE_PROPERTIES在修改之前查询

select property_value from database_properties

where property_name = DEFAULT_PERMANENT_TABLESPACE;

返回 USERS在运行下面的语句之后

alter tablespace users rename to user_data;

上述查询返回 USER_DATA因为所有对 USERS 的引用都被修改为到 USER_DATA

修改默认临时表空间的情况一样甚至修改 UNDO 表空间的名称也将触发 SPFILE 中的变化如下所示

SQL> select value from v$spparameter where name = undo_tablespace;

VALUE

UNDOTBS

SQL> alter tablespace undotbs rename to undotbs;

Tablespace altered

SQL> select value from v$spparameter where name = undo_tablespace;

VALUE

UNDOTBS

结论

在最近的几个 Oracle 版本演变的过程中对象处理得到了稳定的增强Oraclei 引进了表从一个表空间到另一个表空间的转移Oracle i Database R 引进了列重命名现在 — 在最新的版本中 — 表空间自身的重命名成为可能这些增强显着地减轻了数据库管理员的任务 — 特别是在数据仓库或数据中心环境中

上一篇:用sqlplus为oracle创建用户和表空间

下一篇:实例讲解如何通过Oracle成功发送邮件