一、表空间管理指南
表空间是将相关逻辑结构组合在一起的数据库存储单元。数据库数据文件存储在表空间中。
1.使用多个表空间
使用多个表空间可以更灵活地执行数据库操作。
当一个数据库有多个表空间时,你可以:
- 将用户数据与数据字典数据分离以减少i/o争用。
- 为了避免在某个表空间必须脱机时影响多个应用,建议将不同应用之间的数据进行分离。
- 将不同表空间的数据文件存储在不同的磁盘驱动器上,以减少i/o争用。
- 将个别表空间脱机,而其他表空间保持联机,从而提供更好的整体可用性。
- 通过为特定类型的数据库(例如高更新活动、只读活动或临时段存储)预留一个表空间来优化表空间使用。
- 备份单个表空间。
有些操作系统限制了能够同时打开的文件数量。这样的限制可能会影响可以同时联机的表空间的数量。为了避免超出操作系统的限制,请有效地规划表空间。只创建足够的表空间来满足您的需要,并使用尽可能少的文件创建这些表空间。如果必须增加表空间的大小,那么添加一个或两个大的数据文件,或者创建启用自动扩展的数据文件,而不是创建许多小的数据文件。
2.为用户分配表空间配额
为将要创建表、集群、物化视图、索引和其他对象的用户授予创建对象的权限,并在用于保存对象段的表空间中授予配额(空间限额或限制)。
说明:对于包、过程、函数等pl/sql对象,用户只需要拥有创建这些对象的权限。创建这些pl/sql对象不需要显式的表空间配额。
二、创建表空间
创建表空间是为了将相关的逻辑结构(如表和索引)聚集在一起。数据库数据文件存储在表空间中。
1.关于创建表空间
要创建一个新的表空间,请使用sql语句create tablespace或create temporary tablespace。创建表空间必须具有create tablespace系统权限。
在创建表空间之前,必须创建一个数据库来包含它。任何数据库的主要表空间都是system表空间,它包含数据库服务器运行的基本信息,如数据字典和系统回滚段。system表空间是创建数据库时创建的第一个表空间。它像其他表空间一样管理,但需要更高级别的特权,并且在某些方面受到限制。例如,您不能重命名或删除system表空间或使其脱机。
sysaux表空间作为system表空间的辅助表空间,也总是在创建数据库时创建。它包含各种oracle产品和特性使用的模式,因此这些产品不需要自己的表空间。和system表空间一样,sysaux表空间的管理需要更高级别的安全性,不能重命名或删除它。
创建表空间的步骤因操作系统而异,但第一步总是使用操作系统创建一个目录结构,将在其中分配数据文件。在大多数操作系统上,当您创建新的表空间或通过添加数据文件来更改现有表空间时,指定数据文件的大小和完全指定的文件名。无论是创建新的表空间还是修改已有的表空间,数据库都会自动分配和格式化指定的数据文件。
你也可以使用create undo tablespace语句来创建一个特殊类型的表空间,称为undo表空间,它是专门用来包含undo记录的。这些是由数据库生成的记录,用于回滚或撤消对数据库的更改,以实现恢复、读取一致性或 rollback 语句的请求。
可以使用alter tablespace或alter database语句修改表空间。您必须具有相应的alter tablespace或alter database系统权限。
2.本地管理表空间
本地管理的表空间使用存储在每个数据文件中的位图来管理区(extent)。
(1)关于本地管理的表空间
本地管理的表空间通过使用位图跟踪表空间本身中的所有区信息。
本地管理的表空间提供了以下好处:
- 快速、并发的空间操作。空间分配和释放会修改本地管理的资源(存储在头文件中的位图)。
- 增强性能
- 允许使用可读的备用数据库,因为本地管理的临时表空间不会生成任何撤销(undo)或重做(redo)。
- 空间分配被简化了,因为当指定autoallocate子句时,数据库会自动选择适当的区大小。
- 用户对数据字典的依赖降低了,因为必要的信息存储在文件头和位图块中。
- 对于本地管理的表空间,合并空闲区是不必要的。
所有表空间,包括system表空间,都可以进行本地托管。
dbms_space_admin包提供本地托管的表空间的维护过程。
(2)创建本地管理的表空间
通过在create tablespace语句的extent management子句中指定local创建本地管理的表空间。
这是新的永久表空间的默认值,但是您必须指定extent management local子句来指定autoallocate子句或uniform子句。您可以使用autoallocate子句(默认值)让数据库自动管理区,也可以指定表空间使用特定大小的统一区(uniform)进行管理。
如果您希望表空间包含各种大小的对象,且这些对象需要许多具有不同区大小的区,那么autoallocate是最佳选择。如果对空间分配和释放的大量控制对您来说并不重要,autoallocate也是一个不错的选择,因为它简化了表空间管理。使用此设置可能会浪费一些空间,但是让oracle数据库管理空间的好处很可能超过这个缺点。
如果您希望精确地控制未使用的空间,并且可以准确地预测为一个或多个对象分配的空间以及区的数量和大小,那么uniform是一个不错的选择。此设置确保在表空间中永远不会有不可用的空间。
当您没有明确指定区管理的类型时,oracle数据库将按照如下方式确定区管理:
- 如果create tablespace语句省略了default 存储子句,则数据库将创建一个本地管理的自动分配表空间。
- 如果create tablespace语句包含一个default 存储子句,那么数据库会考虑以下情况:
– 如果指定了minimum extent子句,数据库将评估minimum extent、initial和next的值是否相等,pctincrease的值是否为0。如果是,数据库将创建一个本地管理的统一表空间,其extent size = initial。如果minimum extent、initial和next参数不相等,或者pctincrease不为0,则数据库将忽略您可能指定的任何区存储参数,并创建一个本地管理的自动分配表空间。
– 如果没有指定minimum extent子句,则数据库只评估initial和next的存储值是否相等,pctincrease是否为0。如果是,则表空间是本地管理和统一的。否则,表空间是本地管理和自动分配的。
# 1.授予用户create tablespace权限
sys@orcl> grant create tablespace to zb;
grant succeeded.
# 2.下面的语句创建了一个名为lmtbsb的本地管理表空间,并指定了autoallocate:
zb@orcl> create tablespace lmtbsb datafile '/u01/app/oracle/oradata/orcl/lmtbsb01.dbf' size 50m
extent management local autoallocate;
tablespace created.
# 3.注意:如果不是dba用户或拥有创建表空间权限,则创建表空间会报如下错:
ora-01031: insufficient privileges
# 4.下面的示例创建一个具有统一128k区的表空间。(在一个有2k块的数据库中,每个区相当于64个数据库块)。
## 每个128k区由该文件区位图中的一位表示。
zb@orcl> create tablespace lmtbsa datafile '/u01/app/oracle/oradata/orcl/lmtbsa01.dbf' size 50m
extent management local uniform size 128k;
tablespace created.
autoallocate使表空间由系统管理,最小区大小为64k。
autoallocate的替代方案是uniform。它指定用统一大小的区管理表空间。您可以在uniform的size子句中指定该大小。如果忽略size,则默认大小为1m。
当显式指定extent management local时,不能指定default存储子句、minimum extent或temporary。要创建一个本地管理的临时表空间,请使用create temporary tablespace语句。
说明:当您为本地管理的表空间分配数据文件时,您应该为用于空间管理的元数据(区位图或空间头段)留出空间,这些元数据是用户空间的一部分。例如,如果在extent management子句中指定uniform子句,但省略了size参数,则默认区大小为1mb。在这种情况下,为数据文件指定的大小必须大于1mb(至少多一个块加上位图的空间)。
(3)在本地管理的表空间中指定段空间管理
在本地管理的表空间中,oracle数据库可以使用两种方法来管理段空间:自动和手动。
手动段空间管理使用被称为“空闲列表”的链表来管理段中的空闲空间,而自动段空间管理使用位图。自动段空间管理是更高效的方法,并且是所有新的本地管理的永久表空间的默认方法。
自动段空间管理提供了比手动段空间管理更好的空间利用率。它也是自调优的,因为它随着用户或实例数量的增加而扩展。在oracle真实应用程序集群环境中,自动段空间管理允许空间与实例的动态关联。此外,对于许多标准工作负载,使用自动段空间管理的应用程序性能要优于使用手动段空间管理的调优应用程序的性能。
虽然自动段空间管理是所有新的本地管理的永久表空间的默认设置,但是您可以通过segment space management auto子句显式地启用它。
# 1.下面的语句创建使用自动段空间管理的表空间lmtbsb1:
zb@orcl> create tablespace lbtbsb1 datafile '/u01/app/oracle/oradata/orcl/lmtbsb1.dbf' size 50m
extent management local
segment space management auto;
tablespace created.
segment space management manual子句禁用自动段空间管理。
在创建表空间时指定的段空间管理适用于随后在表空间中创建的所有段。不能修改表空间的段空间管理方式。
注意:
- 如果将区管理设置为local uniform,则必须确保每个区至少包含5个数据库块。
- 如果您将区管理设置为local autoallocate,并且如果数据库块大小为16k或更大,那么oracle通过创建最小大小为5个块的区来管理段空间。
- 不能为system表空间指定自动段空间管理。
3.大文件表空间(bigfile tablespace)
大文件表空间可以增加数据库的存储容量,并减轻管理许多数据文件和临时文件的负担。
(1)关于大文件表空间
大文件表空间是一个表空间,它有一个单独的,但可能非常大(最多4g块)的数据文件。相比之下,传统的小文件表空间可以包含多个数据文件,但这些文件不能那么大。
大文件表空间的优势如下:
- 一个8k块的大文件表空间可以包含一个32tb的数据文件。一个32k块的大文件表空间可以包含一个128tb的数据文件。oracle数据库中数据文件的最大数量是有限的(通常为64k个文件)。因此,大文件表空间可以显著提高oracle数据库的存储容量。
- 大文件表空间可以减少数据库所需的数据文件数量。另一个好处是,可以调整create database和create controlfile语句的db_files初始化参数和maxdatafiles参数,以减少数据文件信息所需的sga空间量和控制文件的大小。
- 大文件表空间通过提供数据文件透明性简化了数据库管理。alter tablespace语句的sql语法允许您对表空间执行操作,而不是对底层的单个数据文件执行操作。
大文件表空间只支持本地管理的自动段空间管理表空间,只有三个例外:本地管理的undo表空间、临时表空间和system表空间。
说明:
- 大文件表空间旨在与自动存储管理(asm)或其他支持条带化或raid的逻辑卷管理器以及动态扩展的逻辑卷一起使用。
- 避免在不支持条带化的系统上创建大文件表空间,因为这会对并行查询执行和rman备份并行化产生负面影响。
- 不建议在不支持大文件大小的平台上使用大文件表空间,这会限制表空间的容量。有关支持的最大文件大小的信息,请参阅您的操作系统特定文档。
(2) 创建大文件表空间
要创建大文件表空间,在create tablespace语句中指定bigfile关键字(create bigfile tablespace…)。
oracle数据库会自动创建本地管理的表空间,并自动进行段空间管理。您可以(但不需要)在此语句中指定extent management local和segment space management auto。但是,如果指定了extent management dictionary或segment space management manual,则数据库将返回一个错误。语句的其余语法与 create tablespace语句相同,但只能指定一个数据文件。例如:
zb@orcl> create bigfile tablespace bigtbs datafile '/u01/app/oracle/oradata/orcl/bigtbs01.dbf' size 50m;
tablespace created.
可以以千字节(k)、兆字节(m)、千兆字节(g)或兆兆字节(t)为单位指定size。
如果创建数据库时默认表空间类型被设置为bigfile,则在create tablespace语句中不需要指定关键字bigfile。系统默认创建bigfile表空间。
如果在创建数据库时默认的表空间类型被设置为bigfile,但你想创建一个传统的(小文件)表空间,那么指定create smallfile tablespace语句来覆盖你正在创建的表空间的默认表空间类型。
(3)如何辨认大文件表空间
您可以查询一组数据字典视图以获取大文件表空间的信息。
以下视图包含一个bigfile列,该列将表空间标识为大文件表空间:
- dba_tablespaces
- user_tablespaces
- v$tablespace
您还可以通过其单个数据文件的相对文件号来识别大文件表空间。这个数字在大多数平台上是1024,但在os/390上是4096。
# 1.通过数据字典视图识别大文件表空间
zb@orcl> select name,bigfile from v$tablespace;
name big
------------------------------ ---
sysaux no
system no
undotbs1 no
users no
temp no
lmtbsb no
lmtbsa no
lbtbsb1 no
bigtbs yes
## bigfile列显示yes,表示该表空间为大文件表空间
# 2.通过表空间对应的数据文件的相对文件号识别
zb@orcl> select d.rfile#,t.name from v$datafile d, v$tablespace t where d.ts#=t.ts#;
rfile# name
---------- ------------------------------
3 sysaux
1 system
4 undotbs1
7 users
5 lmtbsb
2 lmtbsa
8 lbtbsb1
1024 bigtbs
## 在当前平台下相对文件号为1024表示该表空间为大文件表空间
4.具有默认压缩属性的表空间
创建表空间时,可以指定在表空间中创建的所有表和索引(或其分区)默认情况下都是压缩的。
(1)关于具有默认压缩属性的表空间
创建表空间时,可以为表空间中创建的所有表和索引指定默认的数据压缩。默认的压缩级别也适用于组成表空间的分区。压缩数据可以减少磁盘使用。
(2)创建具有默认压缩属性的表空间
在创建表空间时,可以使用default关键字指定表压缩的类型,然后使用包含压缩类型的表压缩子句。还可以使用default关键字,后跟索引压缩子句和索引压缩类型指定索引压缩的类型。
# 1.下面的语句表示在表空间中创建的所有表和分区都将使用高级行压缩,除非另有指定:
zb@orcl> create tablespace rctbs datafile '/u01/app/oracle/oradata/orcl/rctbs.dbf' size 20m default row store compress advanced;
tablespace created.
## 在该表空间中创建表或分区时,可以覆盖默认的表空间压缩规范。
# 2.下面的语句表明在表空间中创建的所有索引都将使用高水平的高级索引压缩,除非另有说明:
zb@orcl> create tablespace ictbs datafile '/u01/app/oracle/oradata/orcl/ictbs.dbf' size 20m default index compress advanced high;
tablespace created.
## 在该表空间中创建索引时,可以覆盖默认的表空间压缩规范。
5.加密的表空间
您可以加密任何永久表空间以保护敏感数据。
(1)关于加密的表空间
加密的表空间主要通过数据库以外的方式保护您的数据免受未经授权的访问。例如,当加密的表空间被写入备份介质以从一个oracle数据库传输到另一个数据库或传输到一个场外设施进行存储时,它们仍然是加密的。
此外,加密的表空间可以保护数据,防止用户试图绕过数据库的安全特性,直接通过操作系统文件系统访问数据库文件。表空间加密对于应用程序是完全透明的,因此不需要对应用程序进行任何修改。
表空间加密不能解决所有安全问题。例如,它不提供来自数据库内部的访问控制。任何被授予对存储在加密表空间中的对象的特权的用户都可以访问这些对象,而无需提供任何类型的额外密码或密钥。
加密表空间时,所有的表空间块都会被加密。所有段类型都支持加密,包括表、集群、索引、lobs (basicfile和securefile)、分区表和分区索引等等。
说明:不需要对存储在加密表空间中的securefile lob使用lob加密。
为了最大限度地提高安全性,加密表空间中的数据在写入undo表空间、重做日志和任何临时表空间时都会自动加密。但是,从oracle database 12c release 2(12.2)开始,您可以选择加密undo表空间和临时表空间。
对于不同分区在不同表空间中的分区表和分区索引,允许在同一个表或索引中同时使用加密和非加密表空间。
表空间加密使用oracle数据库的透明数据加密(tde,transparent data encryption)特性,该特性要求您创建一个密钥存储库来存储数据库的主加密密钥。在创建加密表空间和存储或检索加密数据之前,必须打开密钥存储库。当您打开密钥存储库时,它对所有会话都是可用的,并且它将保持打开状态,直到显式地关闭它或数据库关闭为止。
透明数据加密支持行业标准加密算法,包括aes (advanced encryption standard)和3des (triple data encryption standard)加密算法:
- advanced encryption standard (aes)
- aria
- ghost
- seed
- triple data encryption standard (3des)
加密密钥长度由算法名称隐含。例如aes128算法使用128位密钥。在创建表空间时指定要使用的算法,不同的表空间可以使用不同的算法。虽然理论上更长的密钥长度可以提供更高的安全性,但 cpu 开销需要权衡。如果您没有在create tablespace语句中指定算法,则aes128是默认算法。加密表空间不需要磁盘空间开销。
创建加密表后,可以使用alter tablespace语句对其解密或更改其密钥。还可以使用alter tablespace语句对未加密的表空间进行加密。
加密表空间的限制如下:
- 加密的表空间在传输到另一个数据库时受到限制。
- 在恢复使用加密表空间的数据库时(例如在shutdown abort或灾难性错误导致数据库实例关闭之后),必须在数据库挂载之后、在数据库打开之前打开密钥存储库,以便恢复过程可以解密数据块和重做。
(2)创建加密的表空间
您可以创建加密的表空间来保护数据免受未经授权的访问。
要加密表空间,必须将compatible初始化参数设置为11.2.0或更高。任何具有创建表空间权限的用户都可以创建加密表空间。
# 1.设置参数wallet_root和tde_configuration
## 创建wallet_root目录对象
[oracle@oracle4 ~]$ mkdir /u01/app/oracle/tde
sys@orcl> create directory tde as '/u01/app/oracle/tde/';
directory created.
## sys用户登录,并设置参数
sqlplus / as sysdba
sys@orcl> alter system set wallet_root = 'tde' scope=spfile;
system altered.
sys@orcl> alter system set tde_configuration='keystore_configuration=file';
system altered.
# 2.创建受密码保护的软件密钥库
## (1)以已被授予administer key management或syskm权限的用户登录数据库实例
### 授权
grant administer key management to zb;
### 登录
sqlplus zb as syskm
## (2)运行administer key management sql语句创建密钥库
syskm@orcl> administer key management create keystore identified by zb1234;
keystore altered.
### 会在wallet_root目录下创建tde目录
[oracle@oracle4 /u01/app/oracle/tde]$ ll tde/
total 4
-rw------- 1 oracle dba 2555 dec 16 11:54 ewallet.p12
# 3.查看compatible参数的值
sys@orcl> show parameter compatible;
name type value
------------------------------------ ----------- ------------------------------
compatible string 19.0.0
# 4.设置表空间tde主加密密钥
## (1)以已被授予administer key management或syskm权限的用户登录数据库实例
### 登录
sqlplus zb/zb1234 as syskm
## (2)确保数据库打开模式为读写模式
zb@orcl> select open_mode from v$database;
open_mode
--------------------
read write
## (3)设置tde主加密密钥
administer key management set key
using tag 'zb'
force keystore
identified by zb1234
with backup using 'zb';
keystore altered.
# 5.使用默认加密算法创建加密表空间:
sqlplus zb/zb1234
zb@orcl> create tablespace securespace datafile '/u01/app/oracle/oradata/orcl/securespace01.dbf' size 20m encryption encrypt;
tablespace created.
# 6.下面的语句使用aes256算法创建表空间
zb@orcl> create tablespace aestbs datafile '/u01/app/oracle/oradata/orcl/aestbs01.dbf' size 20m encryption using 'aes256' encrypt;
tablespace created.
# 6.打开密钥存储库的方法
## 使用如下命令打开密钥存储库
sys@orcl> administer key management set keystore open identified by zb1234;
keystore altered.
## 查看密钥存储库的状态
sys@orcl> select status from v$encryption_wallet;
status
------------------------------
open
## 如果当前密钥存储库没有打开,当你访问加密的表空间中的数据时候,会报如下错:
ora-28365: wallet is not open
## 注意wallet_root设置要正确
(3)查看加密表空间的相关信息
您可以查询dba_tablespaces和user_tablespaces数据字典视图以获取加密表空间的相关信息。
dba_tablespaces和user_tablespaces数据字典视图包括一个名为encrypted的列。如果是加密表空间那么该列的值为yes。
视图v$encrypted_tablespaces列出了当前所有加密的表空间。加密表空间的名称和加密算法如下:
zb@orcl> select t.name,e.encryptionalg from v$tablespace t,v$encrypted_tablespaces e where t.ts# = e.ts#;
name encrypt
------------------------------ -------
securespace aes128
aestbs aes256
## 通过dba_tablespaces数据字典视图,查看表空间是否为加密的表空间
zb@orcl> select tablespace_name,encrypted from dba_tablespaces where tablespace_name in ('securespace','aestbs');
tablespace_name enc
------------------------------ ---
aestbs yes
securespace yes
说明:您可以将已有的表空间转换为加密的表空间。
6.临时表空间
临时表空间可以提高不适合在内存中的多个排序操作的并发性。这些表空间还提高了排序期间空间管理操作的效率。
(1)关于临时表空间
临时表空间包含只在会话期间存在的临时数据。临时表空间可以提高不适合内存的多个排序操作的并发性,并可以提高排序期间空间管理操作的效率。
临时表空间用于存储以下内容:
- 中间排序结果
- 临时表和临时索引
- 临时lob
- 临时b树
在临时表空间中,特定实例的所有排序操作共享一个单一的排序段,并且每个执行需要临时空间的排序操作的实例都存在一个排序段。排序段由数据库启动后第一个使用临时表空间进行排序的语句创建,仅在关闭时释放。
默认情况下,每个新的oracle数据库安装都会创建一个临时表空间temp。您可以使用create tablespace语句创建额外的临时表空间。可以使用create user或alter user语句为每个数据库用户分配临时表空间。一个临时表空间可以被多个用户共享。
不能显式地在临时表空间中创建对象。
说明:上述语句的例外是临时表。创建临时表时,它的行存储在默认临时表空间中,除非在新的临时表空间中创建该表。
从oracle database 12c release 2(12.2)开始,本地临时表空间是可用的。本地临时表空间为每个数据库实例存储独立的、非共享的临时文件。本地临时表空间仅用于溢出 sql 语句的临时结果,例如涉及排序、哈希聚合和连接的查询。这些结果只能在实例中访问。 相反,共享临时表空间位于共享磁盘上,对所有实例可用。要创建一个本地临时表空间,使用create local temporary tablespace语句。共享临时表空间在oracle数据库以前的版本中可用,被称为“临时表空间”。术语“临时表空间”指的是共享临时表空间,除非另有说明。
- 默认临时表空间
没有显式分配临时表空间的用户使用数据库默认的临时表空间,对于新安装来说是temp。
# 1.要确定数据库当前的默认临时表空间,运行以下查询:
sys@orcl> select property_name,property_value from database_properties where property_name = 'default_temp_tablespace';
property_name property_value
------------------------------ ------------------------------
default_temp_tablespace temp
# 2.可以使用以下命令修改数据库的默认临时表空间:
sys@orcl> alter database default temporary tablespace temp1;
database altered.
- 临时表空间的空间分配
你可以使用vsort_segment视图查看临时表空间排序段的空间分配和释放。vtempseg_usage视图标识了这些段中的当前排序用户。
当使用临时空间的排序操作完成时,在排序段中分配的区不会被释放;它们只是被标记为空闲并可重用。dba_temp_free_space视图显示每个临时表空间中已分配和空闲的总空间。
(2)创建本地管理的临时表空间
因为在本地管理的表空间中,空间管理要简单得多,效率也更高,所以它们非常适合临时表空间。
本地管理的临时表空间使用临时文件,这些文件不会修改临时表空间之外的数据,也不会为临时表空间数据生成任何重做。因此,它们使您能够在只读或备用数据库中执行磁盘排序操作。
还可以使用不同的视图查看临时文件的信息,而不是查看数据文件的信息。 vtempfile和dba_temp_files视图类似于vdatafile和dba_data_files视图。
要创建本地管理的临时表空间,您可以使用create temporary tablespace语句,这要求您具有create tablespace系统权限。
# 1.下面的语句创建一个临时表空间,其中每个区为16m。每个16m区(当标准块大小为2k时,相当于8000个块)由文件位图中的一位表示。
## 登录连接数据库
sqlplus zb/zb1234
## 创建临时表空间
zb@orcl> create temporary tablespace temp1 tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' size 20m reuse extent management local uniform size 16m;
tablespace created.
区管理子句对于临时表空间是可选的,因为所有临时表空间都是使用统一大小的本地管理区创建的。如果区大小在extent size子句中指定,则使用它。如果没有指定,那么oracle数据库将使用表空间大小和文件大小来确定默认的区段大小。
说明:在某些操作系统上,数据库在实际访问临时文件块之前不会为临时文件分配空间。这种空间分配上的延迟会导致更快地创建和调整临时文件的大小,但它要求在以后使用临时文件时有足够的磁盘空间可用。
(3)创建大文件临时表空间
与常规表空间一样,您可以创建单文件(大文件)临时表空间。
# 1.执行create bigfile temporary tablespace语句创建一个单临时文件表空间。
zb@orcl> create bigfile temporary tablespace bigtemp1 tempfile '/u01/app/oracle/oradata/orcl/bigtemp01.dbf' size 20m;
tablespace created.
(4)查看临时表空间的空间使用情况
dba_temp_free_space字典视图包含关于每个临时表空间使用情况的信息。
zb@orcl> select * from dba_temp_free_space;
tablespace_name tablespace_size allocated_space free_space shared inst_id
------------------------------ --------------- --------------- ---------- ------------- ----------
bigtemp1 20971520 1048576 19922944 shared
temp 134217728 134217728 133169152 shared
temp1 20971520 20971520 16777216 shared
7.临时表空间组
临时表空间组是为数据库分配的默认临时表空间组。
(1)多个临时表空间:使用表空间组
表空间组允许用户使用多个表空间中的临时空间。使用一个表空间组,而不是一个临时表空间,可以缓解由于一个表空间不足以保存排序结果而引起的问题,特别是在有多个分区的表上。表空间组允许并行执行服务器在一个并行操作中使用多个临时表空间。
表空间组具有以下特征:
- 至少包含一个表空间。对于一个组中所包含的表空间的最大数量没有明确的限制。
- 它共享表空间的命名空间,因此它的名称不能与表空间相同。
- 在为数据库分配默认临时表空间或为用户分配临时表空间时,可以在表空间名称出现的任何位置指定表空间组名称。
无法显式创建表空间组。相反,它是在将第一个临时表空间分配给组时隐式创建的。当该组所包含的最后一个临时表空间从该组中移除时,该组将被删除。
视图dba_tablespace_groups列出了表空间组及其成员表空间。
(2)创建表空间组
当在create temporary tablespace或alter tablespace语句中包含了tablespace group子句,而指定的表空间组当前不存在时,就隐式创建了表空间组。
# 1.使用create temporary tablespace 创建表空间组
zb@orcl> create temporary tablespace temp2 tempfile '/u01/app/oracle/oradata/orcl/temp2.dbf' size 20m tablespace group group1;
tablespace created.
# 2.使用alter tablespace 创建表空间组
sys@orcl> alter tablespace temp1 tablespace group group2;
tablespace altered.
# 3.查看验证
sys@orcl> select * from dba_tablespace_groups;
group_name tablespace_name
------------------------------ ------------------------------
group2 temp1
group1 temp2
# 4.从组中移除一个表空间,如下所示:
sys@orcl> alter tablespace temp1 tablespace group '';
tablespace altered.
(3)更改表空间组成员
通过在create temporary tablespace或alter tablespace语句的tablespace group子句中指定现有表空间组的名称,可以将表空间添加到已有的表空间组中。
(4)分配默认临时表空间组
使用alter database…default temporary tablespace语句,指定一个表空间组作为数据库的默认临时表空间。
# 1.例如
sys@orcl> alter database default temporary tablespace group1;
database altered.
任何没有显式分配临时表空间的用户现在都将使用表空间temp2。
如果表空间组被指定为默认临时表空间,则不能删除其中的任何成员表空间。请先将该表空间从表空间组中移除。同样,只要一个临时表空间是默认的临时表空间,就不能删除它。
# 1.尝试删除默认临时表空间组中的成员表空间
sys@orcl> drop tablespace temp2;
drop tablespace temp2
*
error at line 1:
ora-10921: cannot drop tablespace belonging to default temporary tablespace group
三、考虑将表空间存储在内存列式存储中
您可以在创建表空间时或通过修改表空间启用内存列式存储的表空间。当启用内存列式存储的表空间时,默认情况下表空间中的所有表都是启用内存列式存储的。
说明:此功能从 oracle 数据库 12c 版本 1 (12.1.0.2) 开始提供。
内存列式存储是系统全局区域(sga)的一个可选部分,用于存储表、表分区和其他数据库对象的副本,这些副本是为快速扫描而优化的。在内存列式存储中,表数据在sga中按列而不是按行存储。
四、为表空间指定非标准块大小
您可以创建块大小不同于标准数据库块大小的表空间,标准数据库块大小由db_block_size初始化参数指定。该特性允许您在数据库之间传输不同块大小的表空间。
创建一个块大小不同于数据库标准块大小的表空间:
- 使用create tablespace语句的blocksize子句。
为了使blocksize子句成功,您必须已经设置了db_cache_size和至少一个db_nk_cache_size初始化参数。此外,在blocksize子句中指定的整数必须与db_nk_cache_size参数设置对应。尽管冗余,但允许将blocksize指定为标准块大小(由db_block_size初始化参数指定)。
# 1.创建具有16k块大小的表空间tbs16k
## (1)设置db_16k_cache_size初始化参数
sys@orcl> alter system set db_16k_cache_size = 20m;
system altered.
### 如果没有设置就直接创建具有16k块大小的表空间会报如下错:
ora-29339: tablespace block size 16384 does not match configured block sizes
## (2)创建具有16k块大小的表空间
zb@orcl> create tablespace tbs16k datafile '/u01/app/oracle/oradata/orcl/tbs16k.dbf' size 20m extent management local uniform size 128k blocksize 16k;
tablespace created.
五、控制重做记录的写入
对于一些数据库操作,可以控制数据库是否生成重做记录。
没有重做,没有介质恢复是可能的。然而,抑制重做生成可以提高性能,并且可能适用于易于恢复的操作。这样的操作的一个例子是create table…as select语句,在数据库或实例故障时可以重复使用。
当对表空间内的对象执行这些操作时抑制重做:
- 在create tablespace语句中指定nologging子句。
如果你没有包含这个子句,或者你指定了logging,那么当对表空间中的对象进行更改时,数据库会生成重做。无论日志属性是什么,都不会为临时段或临时表空间生成重做。
在表空间级别指定的日志属性是在表空间中创建的对象的默认属性。您可以通过在模式对象级别指定logging或nologging来覆盖这个默认的日志记录属性——例如,在create table语句中。
如果您有备用数据库,nologging模式会导致备用数据库的可用性和准确性出现问题。要克服这个问题,可以指定force logging模式。当你在create tablespace语句中包含force logging子句时,你会强制为所有改变表空间对象的操作生成重做记录。这将覆盖在对象级别上所做的任何规范。
如果您将处于force logging模式的表空间传输到另一个数据库,新的表空间将不会保持force logging模式。
六、修改表空间的可用性
您可以将联机的表空间脱机,使其暂时不可用于一般用途。数据库的其余部分保持开放,供用户访问数据。相反,您可以使脱机的表空间联机,以使表空间内的模式对象可供数据库用户使用。数据库必须打开才能改变表空间的可用性。
要改变表空间的可用性,请使用alter tablespace语句。您必须具有alter tablespace或manage tablespace系统权限。
1.表空间脱机
使表空间脱机将使其无法进行正常访问。
由于以下原因,您可能希望使表空间脱机:
- 使数据库的一部分不可用,同时允许对数据库的其余部分进行正常访问
- 执行脱机表空间备份(即使表空间可以联机和使用时进行备份)
- 在更新或维护应用程序时,使应用程序及其表组暂时不可用
- 重命名或重新定位表空间数据文件
使表空间脱机:
- 运行带有offline子句的alter tablespace语句。
当一个表空间脱机时,数据库将使所有相关文件脱机。
以下表空间不能脱机:
- system
- undo表空间
- 临时表空间
在使表空间脱机之前,请考虑更改已将该表空间分配为默认表空间的任何用户的表空间分配。这样做是明智的,因为当表空间脱机时,这些用户将无法访问表空间中的对象。
您可以指定以下任何参数作为alter tablespace…offline 语句的一部分。
子句 | 描述 |
---|---|
normal | 如果表空间对应的数据文件不存在错误条件,则表空间可以正常脱机。 由于写错误,表空间中的任何数据文件当前都不能脱机。 当您指定offline normal时,数据库在将表空间的所有数据文件脱机时对它们执行检查点。normal是默认值。 |
temporary | 即使表空间中的一个或多个文件出现错误,表空间也可以临时脱机。当您指定offline temporary时,数据库将使尚未脱机的数据文件脱机,并在执行此操作时对它们进行检查点。如果没有文件脱机,但使用了temporary子句,则不需要介质恢复来使表空间恢复联机。但是,如果表空间中的一个或多个文件由于写错误而脱机,并且您临时使表空间脱机,那么在使表空间联机之前,需要对其进行恢复。 |
immediate | 表空间可以立即脱机,而不需要数据库在任何数据文件上设置检查点。当您指定offline immediate时,在表空间联机之前,需要对表空间进行介质恢复。如果数据库运行在noarchivelog模式,则不能立即使表空间脱机。 |
说明:如果必须使表空间脱机,尽可能使用normal子句(默认值)。该设置保证表空间在恢复联机时不需要恢复,即使在不完全恢复之后,使用alter database open resetlogs语句重置重做日志序列。
只有当表空间不能正常脱机时,才指定temporary。在这种情况下,只有由于错误而脱机的文件才需要恢复,然后表空间才能联机。只有在尝试了正常和临时设置后才指定immediate。
# 1.下面的例子使表空间lbtbsb1正常脱机
## (1)授予用户zb相关权限
sys@orcl> grant alter tablespace to zb;
grant succeeded.
## (2)使表空间lbtbsb1正常脱机
zb@orcl> alter tablespace lbtbsb1 offline normal;
tablespace altered.
## (3)表空间立即脱机
zb@orcl> alter tablespace lmtbsa offline immediate;
tablespace altered.
## (4)查看
zb@orcl> select tablespace_name,status from dba_tablespaces where tablespace_name in ('lmtbsa','lbtbsb1');
tablespace_name status
------------------------------ ---------
lbtbsb1 offline
lmtbsa offline
2.表空间联机
当数据库处于打开状态时,您可以使oracle数据库中的任何表空间联机。表空间通常处于联机状态,因此数据库用户可以使用其中包含的数据。
如果需要联机的表空间没有被干净地脱机(所谓干净地脱机是说,使用alter tablespace offline语句的normal子句),在使表空间联机之前,必须首先对表空间执行介质恢复。否则,数据库将返回一个错误,并且表空间保持离线状态。
# 1.使正常脱机的表空间联机
zb@orcl> alter tablespace lbtbsb1 online;
tablespace altered.
# 2.使立即脱机的表空间联机
## (1)如果没有对表空间执行介质恢复,报如下错:
ora-01113: file 2 needs media recovery
ora-01110: data file 2: '/u01/app/oracle/oradata/orcl/lmtbsa01.dbf'
## (2)对表空间对应的数据文件执行介质恢复(使用有权限的用户执行,这里使用sys用户)
sys@orcl> recover datafile '/u01/app/oracle/oradata/orcl/lmtbsa01.dbf';
media recovery complete.
## (3)使表空间联机(切换为zb用户执行,随你)
zb@orcl> alter tablespace lmtbsa online;
tablespace altered.
七、只读表空间
表空间可以设置为只读模式。这可以防止存储在其中的任何数据被更新。
1.关于只读表空间
将表空间设置为只读,可以阻止对表空间中的数据文件进行写操作。
只读表空间的主要目的是消除对数据库的大型静态部分执行备份和恢复的需求。只读表空间还提供了一种保护历史数据的方法,这样用户就不能修改它。将表空间设置为只读可以阻止用户对表空间中的所有表进行更新,无论用户的更新权限级别如何。
您可以从只读表空间中删除表或索引等项,但不能在只读表空间中创建或更改对象。您可以执行语句更新数据字典中的文件描述,例如alter table…add或alter table…modify,但是在表空间被读写之前,您将不能使用新的描述。注意,在修改表定义时不能添加数据类型为blob的列。
只读表空间可以传输到其他数据库。而且,由于只读表空间永远不能更新,它们可以驻留在cd-rom或worm(write once-read many,写一次读多次)设备上。
2.设置表空间为只读
可以使用带有read only子句的alter tablespace语句将表空间设置为只读。
所有表空间最初都是按读/写创建的。您必须具有alter tablespace或manage tablespace系统权限。
要使表空间只读,必须满足以下条件:
- 表空间必须是联机的。确保没有必须应用到表空间的undo信息是必要的。
- 表空间不能是活动的undo表空间或system表空间。
- 表空间当前不能参与在线备份,因为备份结束时会更新表空间中所有数据文件的头文件。
- 表空间不能为临时表空间。
# 1.例如,下面的语句将lmtbsa表空间设置为只读:
zb@orcl> alter tablespace lmtbsa read only;
tablespace altered.
## 如果表空间是脱机的,那么会报如下错:
ora-01539: tablespace 'rctbs' is not online
为了在访问只读表空间中的数据时获得更好的性能,可以在将表空间设置为只读之前发出一个查询,该查询访问表空间中的所有表块。对每个表执行一个简单的查询,例如select count(*),可以确保表空间中的数据块随后可以最有效地访问。这消除了数据库检查最近修改区块的事务状态的需要。
当数据库正在处理事务时,你可以发出alter tablespace…read only语句。发出语句后,将表空间置于过渡只读模式,alter命令会等待现有事务完成(通过提交或回滚)。不允许对表空间进行进一步的dml操作,如果dml语句试图进一步更改,则返回错误。
alter tablespace…read only语句在返回前等待以下事务提交或回滚:对表空间有挂起或未提交更改的事务,并且在发出语句之前已经启动。如果在语句保持活动之前启动的事务回滚到保存点,回滚对表空间的更改,则语句不再等待此活动事务。
如果您发现alter tablespace语句需要很长时间才能完成,那么您可以识别出阻止只读状态生效的事务。如果必要的话,您可以通知这些事务的所有者,并决定是否终止事务。
# 1.以下示例标识 alter tablespace ... read only 语句的事务条目并显示其会话地址 (saddr):
select sql_text, saddr
from v$sqlarea,v$session
where v$sqlarea.address = v$session.sql_address
and sql_text like 'alter tablespace%';
每个活动事务的开始scn存储在v$ transaction视图中。显示按升序开始scn排序的视图时,会按执行顺序列出事务。按开始scn升序排序显示视图时,会按执行顺序列出事务。从前面的例子中,你已经知道了只读语句的事务条目的会话地址,现在你可以在v$ transaction视图中找到它。所有开始scn较小的事务(这表明执行较早)都可能导致表空间处于静默状态和随后的只读状态。
select ses_addr, start_scnb
from v$transaction
order by start_scnb;
# 现在可以找到阻塞事务的所有者:
select t.ses_addr, s.username, s.machine
from v$session s, v$transaction t
where t.ses_addr = s.saddr
order by t.ses_addr;
设置表空间为只读后,建议立即备份。只要表空间保持只读状态,就不需要对表空间进行进一步备份,因为不能对它进行任何更改。
3.使只读表空间可写
将只读表空间设置为可写,可以对表空间中的数据文件进行写操作。
您必须具有alter tablespace或manage tablespace系统权限。
使表空间读写的先决条件是表空间中的所有数据文件以及表空间本身必须在线。使用alter database语句的datafile…online子句使数据文件联机。v$datafile视图列出了数据文件的当前状态。
# 1.例如,下面的语句使lmtbsa表空间可写:
zb@orcl> alter tablespace lmtbsa read write;
tablespace altered.
将只读表空间设置为可写将更新数据文件的控制文件条目,这样您就可以使用数据文件的只读版本作为恢复的起点。
4.在worm设备上创建只读表空间
可以在cd-rom或worm (write once-read many)设备上创建只读表空间。
如下是在cd-rom或worm设备上创建只读表空间的操作步骤:
- 在其他设备上创建可写表空间。创建属于表空间的对象并插入数据。
- 修改表空间为只读。
- 将表空间数据文件拷贝到worm设备上。使用操作系统命令复制文件。
- 使表空间脱机。
- 重命名数据文件,使其与复制到worm设备上的数据文件名称一致。使用带有rename datafile子句的alter tablespace语句。重命名数据文件将更改它们在控制文件中的名称。
使表空间重新联机。
5.延迟打开只读表空间中的数据文件
您可以延迟打开只读表空间的数据文件,直到有人试图访问它们。
当一个非常大的数据库的大部分存储在位于慢速访问设备或分层存储上的只读表空间中时,您应该考虑将read_only_open_delayed初始化参数设置为true。这加快了某些操作(主要是打开数据库)的速度,因为只有当试图读取存储在只读表空间中的数据时,才会第一次访问只读表空间中的数据文件。
设置read_only_open_delayed=true有以下副作用:
- 在打开时不会检测到丢失或损坏的只读文件。只有在试图访问它时才会发现它。
- alter system check datafiles不检查只读文件。
- alter tablespace…online 和alter database datafile…online不检查只读文件。它们只在第一次访问时进行检查。
- vrecover_file、vbackup、v$datafile_header不访问只读文件。只读文件在结果列表中显示为错误“delayed open”,其他列的值为零。
- v$datafile不访问只读文件。只读文件的大小为“0”。
- v$recovery_log不访问只读文件。恢复时可能需要的日志不会添加到列表中。
- alter database noarchivelog不访问只读文件。即使存在需要恢复的只读文件,它也会继续进行。
说明:
- 无论参数值如何,recover database和alter database open resetlogs将继续访问所有只读数据文件。为了避免在这些操作中访问只读文件,请将这些文件脱机。
- 如果使用备份控制文件,部分文件的只读状态可能不准确。这可能导致某些操作返回意想不到的结果。在这种情况下应该小心。
八、修改和维护表空间
1.增加表空间的大小
增加表空间的大小可以通过增加表空间中数据文件的大小或增加一个数据文件来实现。
此外,您还可以为数据文件和大文件表空间启用自动文件扩展(autoextend)。
# 1.更改数据文件的大小
sys@orcl> alter database datafile '/u01/app/oracle/oradata/orcl/securespace01.dbf' resize 30m;
database altered.
# 2.为表空间添加一个数据文件
sys@orcl> alter tablespace securespace add datafile '/u01/app/oracle/oradata/orcl/securespace02.dbf' size 20m;
tablespace altered.
# 3.为数据文件启用自动扩展
sys@orcl> alter database datafile '/u01/app/oracle/oradata/orcl/securespace02.dbf' autoextend on;
database altered.
2.修改本地管理的表空间
您可以向本地管理的表空间添加数据文件,更改其可用性,使其只读或读/写,重命名它,或启用/禁用自动扩展。
不能将本地管理的表空间更改为本地管理的临时表空间,也不能更改其段空间管理方法。对于本地管理的表空间,合并空闲区是不必要的。但是,您可以在本地管理的表空间上使用alter tablespace语句进行一些操作,包括以下操作:
- 增加数据文件,例如:
alter tablespace lmtbsb
add datafile '/u02/oracle/data/lmtbsb02.dbf' size 1m;
- 改变表空间可用性(online/offline)。
- 设置表空间为只读或读写。
- 重命名数据文件,或启用或禁用表空间中数据文件大小的自动扩展。
3.修改大文件表空间
你可以为大文件表空间调整大小或启用自动扩展。
当你使用大文件表空间时,alter tablespace语句中的两个子句支持数据文件透明:
- resize: resize子句允许您将大文件表空间中的单个数据文件大小调整为绝对大小,而无需提及数据文件。例如:
alter tablespace bigtbs resize 80g;
- autoextend(在add datafile子句之外使用):
对于大文件表空间,可以在add datafile子句之外使用autoextend子句。例如:
alter tablespace bigtbs autoextend on next 20g;
4.修改本地管理的临时表空间
您可以更改本地管理的临时表空间以添加临时文件、使临时文件脱机或使临时文件联机。
说明:不能使用带有temporary关键字的alter tablespace语句将本地管理的永久表空间更改为本地管理的临时表空间。必须使用create temporary tablespace语句创建本地管理的临时表空间。
您可以使用alter tablespace添加一个临时文件,使一个临时文件脱机,或使一个临时文件联机,如下面的例子所示:
# 1.为临时表空间添加临时文件
sys@orcl> alter tablespace temp1 add tempfile '/u01/app/oracle/oradata/orcl/temp02.dbf' size 20m reuse;
tablespace altered.
# 2.使临时文件脱机
sys@orcl> alter tablespace temp1 tempfile offline;
tablespace altered.
# 3.使临时文件联机
sys@orcl> alter tablespace temp1 tempfile online;
tablespace altered.
说明:临时表空间不能脱机。相反,您可以将其临时文件脱机。视图v$tempfile显示临时文件的联机状态。
alter database语句可用于修改临时文件:
# 1.下面的语句使临时文件脱机并联机。它们的行为与前面示例中的最后两个alter tablespace语句相同。
sys@orcl> alter database tempfile '/u01/app/oracle/oradata/orcl/temp2.dbf' offline;
database altered.
sys@orcl> alter database tempfile '/u01/app/oracle/oradata/orcl/temp2.dbf' online;
database altered.
# 2.下面的语句调整临时文件的大小:
sys@orcl> alter database tempfile '/u01/app/oracle/oradata/orcl/temp2.dbf' resize 20m;
database altered.
# 3.下面的语句删除一个临时文件并删除它的操作系统文件:
sys@orcl> alter database tempfile '/u01/app/oracle/oradata/orcl/temp02.dbf' drop including datafiles;
database altered.
删除表空间的临时文件,这个临时文件所属的表空间仍然存在。在警报日志中会写入一条消息以指示临时文件已被删除。如果操作系统错误阻止了文件的删除,该语句仍然成功,但是将一条描述错误的消息写入警报日志。
[oracle@oracle4 /u01/app/oracle/diag/rdbms/orcl/orcl/trace]$ tail alert_orcl.log
2023-01-06t10:27:35.518954 08:00
alter database tempfile '/u01/app/oracle/oradata/orcl/temp02.dbf' drop including datafiles
2023-01-06t10:27:35.634049 08:00
deleted file /u01/app/oracle/oradata/orcl/temp02.dbf
completed: alter database tempfile '/u01/app/oracle/oradata/orcl/temp02.dbf' drop including datafiles
还可以使用alter database语句启用或禁用现有临时文件的自动扩展,并重命名临时文件。
说明:要重命名临时文件,需要将临时文件脱机,使用操作系统命令重命名或重新定位临时文件,然后使用alter database rename file命令更新数据库控制文件。操作如下:
# 1.临时文件脱机
sys@orcl> alter database tempfile '/u01/app/oracle/oradata/orcl/temp2.dbf' offline;
database altered.
# 2.操作系统命令修改文件名
[oracle@oracle4 /u01/app/oracle/oradata/orcl]$ mv temp2.dbf temp22.dbf
# 3.使用alter database rename file命令更新数据库控制文件
sys@orcl> alter database rename file '/u01/app/oracle/oradata/orcl/temp2.dbf' to '/u01/app/oracle/oradata/orcl/temp22.dbf';
database altered.
# 4.临时文件联机
sys@orcl> alter database tempfile '/u01/app/oracle/oradata/orcl/temp22.dbf' online;
database altered.
5.收缩本地管理的临时表空间
您可以收缩本地管理的临时表空间并释放未使用的空间。
数据库执行的大规模的排序操作可能会导致临时表空间增长并占用大量磁盘空间。在排序操作完成后,额外的空间不会被释放;它只是被标记为空闲的和可重用的。因此,单个大型排序操作可能在排序操作完成后会导致大量已分配的临时空间仍未使用。出于这个原因,数据库允许您收缩本地管理的临时表空间并释放未使用的空间。
缩小一个临时表空间:
- 使用alter tablespace语句的shrink space子句。
收缩临时表空间的具体临时文件:
- 使用alter tablespace语句的shrink tempfile子句。
收缩可以在保持表空间或临时文件的其他属性的同时释放尽可能多的空间。可选的keep子句定义了表空间或临时文件的最小大小。
收缩是一种在线操作,这意味着如果需要,用户会话可以继续分配排序区,并且已经运行的查询不会受到影响。
# 1.下面的示例缩小本地管理的临时表空间temp1,同时确保最小大小为18m。
sys@orcl> alter tablespace temp1 shrink space keep 18m;
tablespace altered.
# 2.下面的示例收缩本地管理的临时表空间temp2的临时文件temp22.dbf。
# 由于省略了keep子句,数据库试图将临时文件缩小到尽可能小的大小。
sys@orcl> col file_name for a40;
sys@orcl> select tablespace_name,file_name,bytes/(1024*1024) from dba_temp_files where tablespace_name = 'temp2';
tablespace_name file_name bytes/(1024*1024)
------------------------------ ---------------------------------------- -----------------
temp2 /u01/app/oracle/oradata/orcl/temp22.dbf 20
# 收缩
sys@orcl> alter tablespace temp2 shrink tempfile '/u01/app/oracle/oradata/orcl/temp22.dbf';
tablespace altered.
# 查看
sys@orcl> select tablespace_name,file_name,bytes/(1024*1024) from dba_temp_files where tablespace_name = 'temp2';
tablespace_name file_name bytes/(1024*1024)
------------------------------ ---------------------------------------- -----------------
temp2 /u01/app/oracle/oradata/orcl/temp22.dbf 5.9921875
九、重命名表空间
使用alter tablespace的rename to子句,可以重命名一个永久或临时表空间。
# 1.如下的例子将temp2表空间重命名为temp22
sys@orcl> alter tablespace temp2 rename to temp22;
tablespace altered.
重命名表空间时,数据库会更新数据字典、控制文件和(在线)数据文件头中对该表空间名称的所有引用。数据库不会更改表空间id,因此,例如,如果这个表空间是用户的默认表空间,那么重命名的表空间将在dba_users视图中显示为该用户的默认表空间。
以下情况会影响该语句的操作:
- 如果被重命名的表空间是system表空间或sysaux表空间,那么它将不会被重命名,并引发一个错误。
- 如果表空间中的任何数据文件脱机,或者表空间脱机,则表空间不会重命名,并引发错误。(注意:临时表空间中的临时文件即使脱机可以正常执行重命名操作)
- 如果表空间为只读,则数据文件头不会更新。这不应该被视为损坏;相反,它会将一条消息写入警报日志,表明数据文件头未重命名。数据字典和控制文件会被更新。如下:
sys@orcl> alter tablespace lmtbsb read only;
tablespace altered.
sys@orcl> alter tablespace lmtbsb rename to lmtbsbnew;
tablespace altered.
# 查看警报日志
2023-01-09t16:36:58.467822 08:00
tablespace 'lmtbsb' is renamed to 'lmtbsbnew'.
tablespace name change is not propagated to file headersbecause the tablespace is read only.
completed: alter tablespace lmtbsb rename to lmtbsbnew
- 如果表空间是默认的临时表空间,那么数据库属性表中的相应条目将被更新,database_properties视图将显示新的名称。
- 如果表空间是undo表空间,并且满足以下条件,则表空间名称将在服务器参数文件(spfile)中更改为新的表空间名称。
– 该服务器参数文件被用于启动数据库。
– 对于任何实例,表空间名称都指定为undo_tablespace。
如果正在使用传统的初始化参数文件(pfile),则将一条消息写入警报日志,以说明必须手动更改初始化参数文件。
十、删除表空间
如果不再需要某个表空间及其内容,可以从数据库中删除该表空间及其内容(表空间中包含的段)。
删除表空间必须具有drop tablespace系统权限。
说明:一旦一个表空间被删除,表空间中的数据就不能恢复。因此,请确保要删除的表空间中包含的所有数据在将来不再被使用。此外,在从数据库中删除表空间之前和之后立即备份数据库。强烈建议这样做,以便在错误地删除表空间时恢复数据库,或者在删除表空间后数据库将来遇到问题时恢复数据库。
删除表空间时,关联数据库的控制文件中的文件指针将被删除。您可以直接命令oracle数据库删除构成被删除表空间的操作系统文件(数据文件)。如果您没有指示数据库在删除表空间的同时删除数据文件,那么稍后必须使用操作系统的适当命令来删除它们。
不能删除包含任何活动段的表空间。例如,如果表空间中的某个表正在被使用,或者表空间包含回滚未提交事务所需的undo数据,则不能删除该表空间。表空间可以联机也可以脱机,但是最好在删除表空间之前将其脱机。
删除表空间:
- 使用drop tablespace语句。
# 1.赋权
sys@orcl> grant drop tablespace to zb;
grant succeeded.
# 2.使用zb用户登录,下面的语句删除lbtbsb1表空间,包括表空间中的段:
# 该语句并不会删除与表空间相关的操作系统文件,需要使用操作系统命令删除
zb@orcl> drop tablespace lbtbsb1 including contents;
tablespace dropped.
# 3.下面的语句删除lmtbsa表空间及其相关的数据文件:
zb@orcl> drop tablespace lmtbsa including contents and datafiles;
tablespace dropped.
如果表空间为空(不包含任何表、视图或其他结构),则不需要指定include contents子句。使用cascade constraints子句从表空间外的表中删除所有引用完整性约束,这些约束引用待删除表空间内表的主键和唯一键。
要在删除表空间的同时删除与表空间相关的数据文件,请使用include contents and datafiles子句。
对于每个被删除的数据文件,都会向警报日志中写入一条消息。如果操作系统错误阻止了文件的删除,则drop tablespace语句仍然成功,但是将一条描述错误的消息写入警报日志。
2023-01-10t11:12:09.309275 08:00
drop tablespace lbtbsa including contents and datafiles
ora-959 signalled during: drop tablespace lbtbsa including contents and datafiles...
2023-01-10t11:12:31.202129 08:00
drop tablespace lmtbsa including contents and datafiles
2023-01-10t11:12:33.592385 08:00
deleted file /u01/app/oracle/oradata/orcl/lmtbsa01.dbf
completed: drop tablespace lmtbsa including contents and datafiles
十一、使用影子表空间管理丢失写入保护
当i/o子系统确认块写入已完成,但在持久存储中没有发生写入时,就会发生数据块丢失写入。影子丢写保护可以防止丢写。
1.关于影子写丢失保护(shadow lost write protection)
当i/o子系统承认块写入完成,即使写入没有发生,或者当块的前一个映像覆盖当前映像时,会发生数据块丢失写入。影子丢失写保护可以防止表空间或单个数据文件丢失写入。
影子丢失写入保护提供快速检测和立即响应丢失写。使用影子丢失写入保护可以最小化数据丢失和修复数据库所需的时间。
若要使用影子丢失写保护功能,必须启用数据库的影子丢失写保护功能,并创建一个或多个影子表空间。影子表空间是一个特殊用途的大文件表空间,它仅包含用于跟踪数据文件的系统更改号(scn)。可以通过在create tablespace语句中包含lost write protection子句来创建影子表空间。
当从磁盘读取一个被跟踪的数据块时,影子丢失写保护可以通过对比影子表空间中该数据块的scn与最近一次写入正在读的数据块中的scn来检测是否丢失写。如果影子条目的scn大于正在读取的数据块的scn,则发生了写丢失。当检测到写丢失时,将返回一个错误。
未检测到的写入丢失可能导致数据损坏,因为不正确的数据可能被其他dml事务使用。影子丢写保护在写数据被消耗之前,对写数据进行检测,防止数据损坏。您可以针对特定的表空间和数据文件启用影子丢写保护。因此,您可以选择仅对最重要的数据启用它。您不需要使用它来跟踪您的所有数据。此外,影子表空间非常灵活。您可以用另一个影子表空间替换一个影子表空间以更改其配置或位置。
启用影子丢写保护后,一般dml操作、sql*loader常规路径加载和直接路径加载操作均启用影子丢写保护。它也为恢复管理器(rman)备份启用。rman备份检查正在读取的块是否丢失写入,如果发现这样的块则引发错误。
当表空间或数据文件启用影子丢写保护后,如果需要停止收集新的写丢失信息和检查写丢失信息,可以暂停影子丢写保护。当影子丢写保护被暂停时,跟踪数据保存在影子表空间中,可以重新启用影子丢写保护。如果移除数据文件或表空间的影子丢写保护,则其跟踪数据将被删除,并且不再可重用。
通过在alter tablespace语句中包含lost write protection子句,可以启用表空间的影子丢写保护功能;通过在alter database data_file_name语句中包含lost write protection子句,可以启用数据文件的影子丢写保护功能。当表空间启用影子丢失写保护时,该表空间当前和将来的所有数据文件都将启用影子丢失写保护。
oracle数据库会自动为具体的影子表空间分配跟踪数据文件。无法为特定的数据文件指定使用哪个影子表空间。影子表空间的空间量应至少为启用影子丢写保护的数据文件所使用空间的2%。
说明:
- 如果您增加了跟踪数据文件的大小,那么影子丢写保护将尝试调整相应的影子表空间中的跟踪数据的大小。如果没有足够的空间来跟踪所有的数据,那么shadow lost write protection会在日志中插入一条警告消息,并继续跟踪它可以使用可用的shadow空间的数据。
- 数据库闪回会导致影子丢写保护数据被删除。闪回后,影子丢写保护会在重新填充数据时跟踪数据,并在块更新发生时对影子跟踪数据进行更新。
- 影子丢写保护与db_lost_write_protect初始化参数配置的丢写保护和备用数据库无关。
2.创建影子表空间
发出一个带有lost write protection子句的create bigfile tablespace语句,创建一个影子表空间用于影子丢写保护。
任何启用了影子丢写保护的表空间或数据文件都可以使用影子表空间。影子表空间的容量至少为启用影子丢写保护的数据文件所使用空间的2%。影子表空间必须是大文件表空间。
说明:为了创建影子表空间,数据库兼容性级别必须为18.0.0或更高。
sys@orcl> show parameter compatible
name type value
------------------------------------ ----------- ------------------------------
compatible string 19.0.0
在数据库中创建一个影子表空间:
# 本例创建shadow_lwp1表空间作为影子表空间,用于影子丢写保护。
## 使用具有create tablespace系统权限的用户连接执行
zb@orcl> create bigfile tablespace shadow_lwp1 datafile '/u01/app/oracle/oradata/orcl/shadow_lwp1.dbf' size 10m lost write protection;
tablespace created.
3.数据库启用影子丢写保护
要为多租户容器数据库(cdb)或非cdb启用影子丢写保护,请使用带有enable lost write protection子句的alter database语句。要为可插数据库(pdb)启用阴影丢失写保护,请使用带有enable lost write protection子句的alter pluggable database语句。
在为各个表空间和数据文件启用影子丢写保护之前,必须至少创建一个阴影表空间,并且必须为包含它的数据库启用影子丢写保护。在此之后,您可以使用alter tablespace语句启用表空间的影子丢写保护,并可以使用alter database语句启用数据文件的影子丢写保护。
说明:
- 为了启用数据库影子丢写保护,数据库兼容性级别必须为18.0.0及以上,且至少存在一个影子表空间。
- 启用或禁用cdb根容器的影子丢写保护不影响pdb的影子丢写保护。因此,即使禁用了cdb根容器的影子丢写保护,也可以启用pdb的影子丢写保护。
- 当数据库启用影子丢写保护时,系统会自动为其分配一个影子表空间。
启用数据库的影子丢写保护:
# 0.如果在启用数据库影子丢写保护之前,没有创建一个影子表空间,则会报如下错:
sys@cdbtest> alter pluggable database enable lost write protection;
alter pluggable database enable lost write protection
*
error at line 1:
ora-65491: a lost write bigfile tablespace must exist before attempting to enable lost write
# 1.在sql*plus中,使用具有所需权限的用户连接数据库实例:
## (1)在非cdb或cdb根容器下,以具有alter database系统权限的用户连接。
### 授权
sqlplus / as sysdba
sys@orcl> grant alter database to zb;
grant succeeded.
### 切换到zb用户执行
conn zb/zb123
## (2)在应用程序根容器、pdb或应用程序pdb中,使用具有alter database系统权限的用户进行连接。
### 补充:pdb里创建用户
#### 唯一的区别就是在根容器(cdb$root)下创建用户,需要在用户名前面加c##
### 授权
sqlplus / as sysdba
sys@cdbtest> show pdbs;
con_id con_name open mode restricted
---------- ------------------------------ ---------- ----------
2 pdb$seed read only no
3 zb_test read write no
sys@cdbtest> alter session set container = zb_test;
session altered.
sys@cdbtest> grant alter database to zb container = current;
grant succeeded.
### 切换到zb用户执行(注意:对于pdb请记得为pdb配置tns)
sys@cdbtest> conn zb/zb1234@zb_test
connected.
# 2.对于非cdb或cdb根容器,发出带有enable lost write protection子句的alter database语句。
zb@orcl> alter database enable lost write protection;
database altered.
# 3.为一个pdb启用影子丢写保护
zb@zb_test> alter pluggable database enable lost write protection;
pluggable database altered.
4.为表空间和数据文件启用影子丢写保护
要为表空间启用影子丢写保护,可以执行带有enable lost write protection子句的alter tablespace语句。要启用数据文件的影子丢写保护,发出一个带有enable lost write protection子句的alter database data_file_name语句。当为表空间启用影子丢写保护时,该表空间下的所有数据文件都启用影子丢写保护,表空间新增的任何数据文件都启用影子丢写保护。
说明:
- 若要为表空间或数据文件启用的影子丢写保护功能,数据库必须启用了影子丢写保护功能,且至少存在一个影子表空间。
- 当对某个表空间或数据文件启用影子丢写保护时,系统会自动为其分配一个影子表空间。
如果您为表空间启用影子丢写保护,那么请以具有alter tablespace权限的用户连接。如果您为数据文件启用影子丢写保护,然后以具有alter database权限的用户连接。
# 1.本例为tbsu1表空间启用丢失写保护:
zb@orcl> alter tablespace lmtbsbnew enable lost write protection;
tablespace altered.
## 验证
zb@orcl> select tablespace_name,lost_write_protect from dba_tablespaces where tablespace_name = upper('lmtbsbnew');
tablespace_name lost_wr
------------------------------ -------
lmtbsbnew enabled
# 2.本例为tbs16k.dbf数据文件启用影子丢写保护。
zb@orcl> alter database datafile 14 enable lost write protection;
database altered.
## 验证
zb@orcl> col file_name for a40;
zb@orcl> select file_id,file_name,lost_write_protect from dba_data_files where file_id = 14;
file_id file_name lost_wr
---------- ---------------------------------------- -------
14 /u01/app/oracle/oradata/orcl/tbs16k.dbf enabled
# 3.如果是application root, a pdb, or an application pdb,则使用alter pluggable database data_file_name语句来禁用数据文件的
# 影子丢写保护功能,例如:
alter pluggable database datafile 'dfile2.df' enable lost write protection;
5.禁用数据库的影子丢写保护
要为多租户容器数据库(cdb)或非cdb禁用影子丢写保护,可以发出带有disable lost write protection子句的alter database语句。要禁用pdb (pluggable database)的影子丢写保护功能,可以发出带有disable lost write protection子句的alter pluggable database语句。
禁用数据库的影子丢写保护功能后,数据库中的所有表空间和数据文件都不受影子丢写保护功能的保护。
说明:
- 禁用影子丢写保护不会删除现有影子表空间中的数据,但这些数据不再被更新或被检查。如果你想删除影子表空间中的数据,那么你可以使用带有include contents子句的drop tablespace语句删除影子表空间。
- 启用或禁用cdb根容器的影子丢写保护不影响pdb的影子丢写保护。
命令执行用户需要具有alter database权限。
# 1.禁用非cdb或cdb根容器的影子丢写保护
zb@orcl> alter database disable lost write protection;
database altered.
# 2.禁用pdb的影子丢写保护
sys@cdbtest> alter pluggable database disable lost write protection;
pluggable database altered.
6.移除或暂停影子丢写保护
当某个表空间或数据文件不再需要影子丢写保护时,您可以选择以下两种方式:
- 您可以移除影子丢写保护。该选项将从影子表空间中删除表空间或数据文件的跟踪信息。此选项还将停止收集并停止检查表空间或数据文件的新丢失的写信息。
- 您可以暂停影子丢写保护。此选项还将停止收集并停止检查表空间或数据文件的新丢失的写信息。但是,旧的丢失的写信息仍然保留在影子表空间中。如果重新为表空间或数据文件启用影子丢写保护,则它们可以使用旧的丢失写信息。
移除或暂停表空间的影子丢写保护,将移除或暂停该表空间下所有数据文件的阴影丢写保护。
要移除或暂停表空间的影子丢写保护,可以分别执行带有remove lost write protection子句或suspend lost write protection子句的alter tablespace语句。
要移除或暂停非cdb或cdb根容器使用的数据文件的影子丢写保护,可以分别执行带有emove lost write protection子句或suspend lost write protection子句 的alter database datafile data_file_name语句,并将data_file_name替换为具体数据文件的名称。对于application root, pdb, 或 application pdb使用的数据文件需要使用alter pluggable database语句
移除或暂停某个表空间或数据文件的影子丢写保护:
# 1.使用具有相关权限的用户连接数据库并执行相关命令
## 对于表空间:需具有 alter tablespace权限
## 对于数据文件我:需具有alter database权限
sqlplus zb/zb1234
## or
sqlplus zb/zb1234@zb_test
# 2.这个例子移除lmtbsbnew表空间的丢写保护。
zb@orcl> alter tablespace lmtbsbnew remove lost write protection;
tablespace altered.
## 验证执行结果
zb@orcl> select tablespace_name,lost_write_protect from dba_tablespaces where tablespace_name = upper('lmtbsbnew');
tablespace_name lost_wr
------------------------------ -------
lmtbsbnew off
# 3.本示例暂停非cdb使用的tbs16k.dbf数据文件的影子丢写保护
zb@orcl> alter database datafile '/u01/app/oracle/oradata/orcl/tbs16k.dbf' suspend lost write protection;
database altered.
## 验证
zb@orcl> col file_name for a40;
zb@orcl> select file_name,lost_write_protect from dba_data_files where file_id = 14;
file_name lost_wr
---------------------------------------- -------
/u01/app/oracle/oradata/orcl/tbs16k.dbf suspend
# 4.暂停pdb使用的数据文件的影子丢写保护
alter pluggable database datafile 'dfile2.df' suspend lost write protection;
7.删除影子表空间
可以使用drop tablespace语句删除影子表空间。如果使用带有include contents子句的drop tablespace语句,那么影子表空间会连同它的内容一起被删除。如果使用没有带有include contents子句的drop tablespace语句,那么在删除影子表空间之前,如果存在另一个影子表空间并且有足够的空闲空间,它的内容会被移动到另一个影子表空间。
zb@zb_test> drop tablespace shadow_lwp1 including contents;
tablespace dropped.
十二、管理sysaux表空间
sysaux表空间是在创建数据库时作为system表空间的辅助表空间安装的。以前创建和使用单独表空间的一些数据库组件现在占用sysaux表空间。
如果sysaux表空间变得不可用,核心数据库功能将保持正常运行。使用sysaux表空间的数据库特性可能会失败,或者功能受限。
1.监控sysaux表空间的占用者
可以通过查询v$sysaux_occupants视图监视sysaux表空间的占用者。
这个视图列出了sysaux表空间占用者的以下信息:
- 占用者的名称
- 占用者的描述信息
- 模式名
- 移动存储过程(move procedure)
- 当前空间使用情况
sys@orcl> select * from v$sysaux_occupants;
occupant_name
----------------------------------------------------------------
occupant_desc
----------------------------------------------------------------
schema_name
----------------------------------------------------------------
move_procedure
----------------------------------------------------------------
move_procedure_desc space_usage_kbytes con_id
---------------------------------------------------------------- ------------------ ----------
logmnr
logminer
system
sys.dbms_logmnr_d.set_tablespace
move procedure for logminer 11072 0
2.将占用者移出或移入sysaux表空间
vsysaux_occupants视图为sysaux表空间的每个占有者提供了一个移动过程。
在组件安装时,您可以选择不希望组件驻留在sysaux中。另外,如果稍后决定将组件重新定位到指定的表空间中,可以使用vsysaux_occupants视图中指定的该组件的移动过程来执行移动。
移动过程还允许将组件从另一个表空间移动到sysaux表空间。
# 1.例如:将组件logmnr移动到表空间users中
sys@orcl> exec sys.dbms_logmnr_d.set_tablespace('users');
pl/sql procedure successfully completed.
3.控制sysaux表空间的大小
sysaux表空间由几个数据库组件占用,其总大小由这些组件所消耗的空间决定。组件所消耗的空间反过来又取决于所使用的特性或功能以及数据库工作负载的性质。
sysaux表空间的最大部分由自动工作负载存储库(automatic workload repository, awr)占据。awr所消耗的空间由几个因素决定,包括任意时刻系统中活动的会话数、快照间隔和历史数据保留期。一个平均有10个并发活动会话的典型系统可能需要大约200 mb到300 mb的awr数据空间。通过修改快照间隔和历史数据保留时间,可以控制awr的大小。
sysaux表空间的另一个主要占用者是嵌入式oracle enterprise manager cloud control存储库。这个存储库被cloud control用来存储元数据。此存储库的大小取决于数据库活动和存储库中存储的与配置相关的信息。
sysaux表空间中的其他数据库组件只有在它们的相关特性(例如,oracle text和oracle streams)被使用时才会增加大小。如果不使用这些特性,那么这些组件对sysaux表空间的大小没有任何显著影响。
下表根据系统配置和预期负载提供了sysaux表空间大小的参考:
parameter/recommendation | small | medium | large |
---|---|---|---|
number of cpus | 2 | 8 | 32 |
number of concurrently active sessions | 10 | 20 | 100 |
number of user objects: tables and indexes | 500 | 5,000 | 50,000 |
estimated sysaux size at steady state with default configuration | 500 mb | 2 gb | 5 gb |