6.1 Oracle 引入逻辑结构的目的
主要是为了跨平台
6.2 Oracle数据库中存储结构之间的关系
l 每个数据库是由一个或多个表空间组成(至少一个)。
l 每个表空间基于一个或多个操作系统的数据文件(至少一个)。
l 每个表空间中可以存放一个或多个段(segment)。
l 每个段是由一个或多个区段(extent)所组成。
l 每个区段是由一个或多个连续的Oracle数据块所组成。
l 每个Oracle数据块是由一个或多个连续的操作系统数据块所组成。
l 每个操作系统数据文件是由一个或多个区段(extent)所组成
l 每个操作系统数据文件是由一个或多个操作系统数据块所组成
6.3
表空间分为系统(system)表空间和非系统(non-system)表空间
6.4 Tablespace 的磁盘空间管理
早的版本磁盘空间管理是由数据字典来管理的。系统要管理一切。
后来推去了本地空间管理,是用位图(bitmap)的方式来管理。
6.5 创建数据字典管理的表空间
SQL> create tablespace jinlian1
2 datafile 'D:\Disk2\moon\jinlian01.DBF' size 50 M,
3 'D:\Disk4\moon\jinlian02.DBF' size 50 M
4 Minimum extent 50K extent management dictionary
5 default storage (initial 50K next 50K maxextents 100 pctincrease 0);
SQL> select tablespace_name,block_size,extent_management,segment_space_management from dba_tablespaces;
TABLESPACE_NAME BLOCK_SIZE EXTENT_MAN SEGMEN
------------------------------ ---------- ---------- ------
SYSTEM 8192 LOCAL MANUAL
UNDOTBS1 8192 LOCAL MANUAL
SYSAUX 8192 LOCAL AUTO
TEMP 8192 LOCAL MANUAL
USERS 8192 LOCAL AUTO
JINLIAN_INDEX 8192 LOCAL AUTO
JINLIAN_UNDO 8192 LOCAL MANUAL
JINLIAN_TEMP 8192 LOCAL MANUAL
PIONEER_DATA 8192 LOCAL AUTO
PIONEER_INDX 8192 LOCAL AUTO
PIONEER_UNDO 8192 LOCAL MANUAL
TABLESPACE_NAME BLOCK_SIZE EXTENT_MAN SEGMEN
------------------------------ ---------- ---------- ------
PIONEER_TEMP 8192 LOCAL MANUAL
已选择12行。
SQL> col file_name for a50
SQL> select file_id,file_name,tablespace_name
2 from dba_data_files
3 order by file_id;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- -------------------------------------------------- ---------------
1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF SYSTEM
2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DB UNDOTBS1
F
3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF SYSAUX
4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF USERS
5D:\DISK6\ORCL\JINLIAN_INDEX.DBF JINLIAN_INDEX
6D:\DISK7\ORCL\JINLIAN_UNDO.DBF JINLIAN_UNDO
7D:\DISK2\ORCL\PIONEER_DATA.DBF PIONEER_DATA
8D:\DISK4\ORCL\PIONEER_INDX.DBF PIONEER_INDX
9D:\DISK6\ORCL\PIONEER_UNDO.DBF PIONEER_UNDO
FILE_ID FILE_NAME TABLESPACE_NAME
---------- -------------------------------------------------- ---------------
10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF JINLIAN_UNDO
已选择10行。
6.6 创建本地管理的表空间
SQL> create tablespace jinlian_index
2 datafile 'D:\disk6\moon\jinlian_index.dbf'
3 size 50M
4 extent management local
5 uniform size 1M;
6.7 还原表空间
SQL> create undo tablespace jinlian_undo
2 datafile 'D:\Disk7\moon\jinlian_undo.DBF'
3 size 20 M;
6.8 临时表空间
SQL> create temporary tablespace jinlian_temp
2 tempfile 'D:\Disk8\moon\jinlian_temp.dbf'
3 size 10M
4 extent management local
5 uniform size 2 M;
SQL> select f.file#,t.ts#,f.name,t.name from v$tempfile f,v$tablespace t where f.ts#= t.ts#;
NOTE:
l 临时数据文件的状态不能置为只读。
l 不能将临时数据文件重新命名。
l 临时数据文件总是置为NOLOGGING状态。
l 不能使用ALTER DATABASE命令创建临时数据文件。
l 以只读方式运行的数据库需要临时数据文件。
l 介质恢复是不能恢复临时数据文件的。
NOTE: uniform size 设为 SORT_AREA_SIZE(PGA中排序区的大小)参数的整数倍。
6.9 默认临时表空间
在Oracle中如果没有设置默认临时表空间,他将使用system表空间做为排序区,这将使system表空间碎片化,从而使数据库系统的效率下降。如果在创建一个数据库时没有设定默认临时表空间,Oracle服务器将把system表空间是默认临时表空间的报警信息写入报警文件。
查看当前默认临时表空间:
SQL> col property_name for a25
SQL> col property_value for a16
SQL> col description for a38
SQL> select * from database_properties where property_name like 'DEFAULT_TEMP_TABLESPACE%';
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------- ---------------- --------------------------------------
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace
SQL> alter database default temporary tablespace jinlian_temp;
数据库已更改。
SQL> select * from database_properties where property_name like 'DEFAULT_TEMP_TABLESPACE%';
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------- ---------------- --------------------------------------
DEFAULT_TEMP_TABLESPACE JINLIAN_TEMP Name of default temporary tablespace
NOTE:
默认临时表空间不可以设置成脱机。
6.10 设置表空间为脱机
表空间的维护工作:
l 在数据库处于打开状态下移动数据文件。
l 在数据库打开的状态下恢复一个表空间或一个数据文件
l 执行对表空间的脱机备份(虽然对表空间可以进行联机备份).
l 使数据库的一部分不可以被访问,而其他的部分可以被正常访问
脱机表空间的数据不可以被访问,用户试图访问会收到出错信息。表空间的脱机联机设置会记录到数据字典、控制文件和报警文件中。
以下表空间不可以设置为脱机:
l 系统(System)表空间
l 上面有活动的还原/回滚段的表空间
l 默认临时表空间
6-30
SQL> set line 150
SQL> select tablespace_name,status,contents
2 from dba_tablespaces
3 where tablespace_name like 'JIN%';
TABLESPACE_NAME STATUS CONTENTS
------------------------------ --------- ---------
JINLIAN_INDEX ONLINE PERMANENT
JINLIAN_TEMP ONLINE TEMPORARY
JINLIAN_UNDO ONLINE UNDO
SQL> col name for a55
SQL> select file#,name,status
2 from v$datafile
3 where file# >= 8;
FILE# NAME STATUS
---------- ------------------------------------------------------- -------
8 D:\DISK4\ORCL\PIONEER_INDX.DBF ONLINE
9 D:\DISK6\ORCL\PIONEER_UNDO.DBF ONLINE
10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF ONLINE
SQL> alter tablespace jinlian_undo offline;
表空间已更改。
SQL> select tablespace_name,status,contents
2 from dba_tablespaces
3 where tablespace_name like 'JIN%';
TABLESPACE_NAME STATUS CONTENTS
------------------------------ --------- ---------
JINLIAN_INDEX ONLINE PERMANENT
JINLIAN_TEMP ONLINE TEMPORARY
JINLIAN_UNDO OFFLINE UNDO
SQL> select file#,name,status
2 from v$datafile
3 where file# >= 8;
FILE# NAME STATUS
---------- ------------------------------------------------------- -------
8 D:\DISK4\ORCL\PIONEER_INDX.DBF ONLINE
9 D:\DISK6\ORCL\PIONEER_UNDO.DBF ONLINE
10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF OFFLINE
SQL> alter tablespace jinlian_undo online;
表空间已更改。
SQL> select tablespace_name,status,contents
2 from dba_tablespaces
3 where tablespace_name like 'JIN%';
TABLESPACE_NAME STATUS CONTENTS
------------------------------ --------- ---------
JINLIAN_INDEX ONLINE PERMANENT
JINLIAN_TEMP ONLINE TEMPORARY
JINLIAN_UNDO ONLINE UNDO
SQL> select file#,name,status
2 from v$datafile
3 where file# >= 8;
FILE# NAME STATUS
---------- ------------------------------------------------------- -------
8 D:\DISK4\ORCL\PIONEER_INDX.DBF ONLINE
9 D:\DISK6\ORCL\PIONEER_UNDO.DBF ONLINE
10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF ONLINE
6.11 只读(Read - Only)表空间
当表空间的数据不再需要改变的时候,我们应该将表空间设置成只读,因为只读表空间的数据不会发生变化,就不需要重做日志保护,所以操作只读表空间上的数据就不会产生重做操作。只读表空间的数据只需要做一次备份就好了,从而减少了数据库系统的维护工作量。
将表空间变成只读状态的时候,一开始处于中间状态,等没有提交的事务完成后,表空间就被置为只读状态。
将表空间的状态改为只读时,Oracle会产生检查点。可以删除只读表空间中对象,如表和索引,这是因为删除对象的命令是DDL语句,它们只修改数据字典而不是数据文件。
Step 1:
SQL> alter tablespace jinlian read only;
Step 2:
SQL> select tablespace_name,status,contents from dba_tablespaces where tablespace_name like 'JIN%';
Step 3:
SQL> alter tablespace jinlian read write;
查看报警文件:
没有找到
6.12 改变表空间的存储
Step 1:
SQL> alter tablespace jinlian minimum extent 100K;
Step 2:
SQL> alter tablespace jinlian default storage (initial 100K next 100K maxextents 200);
Step 3:
SQL> select tablespace_name,initial_extent,next_extent,
2 max_extents,pct_increase,min_extlen
3 from dba_tablespace
4 where tablespace_name like 'JIN%';
6.13 重置表空间的大小
SQL> col file_name for a40;
SQL> col tablespace_name for a15;
SQL> select file_id,tablespace_name,file_name,autoextensible
2 from dba_data_files
3 where file_id >= 8;
FILE_ID TABLESPACE_NAME FILE_NAME AUT
---------- --------------- ---------------------------------------- ---
8 PIONEER_INDX D:\DISK4\ORCL\PIONEER_INDX.DBF NO
9 PIONEER_UNDO D:\DISK6\ORCL\PIONEER_UNDO.DBF NO
10 JINLIAN_UNDO D:\DISK8\ORCL\JINLIAN2_UNDO.DBF NO
SQL> alter database datafile
2 'D:\Disk2\orcl\Jinlan_index.DBF' autoextend on
3 next 1M;
6.14 手动重置数据文件的大小
SQL> select file_id,file_name, tablespace_name,
2 bytes/(1024*1024) MB
3 from dba_data_files
4 where tablespace_name like 'JIN%'
5 order by tablespace_name;
FILE_ID FILE_NAME TABLESPACE_NAME MB
---------- ---------------------------------------- --------------- ----------
5 D:\DISK6\ORCL\JINLIAN_INDEX.DBF JINLIAN_INDEX 50
10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF JINLIAN_UNDO 25
6 D:\DISK7\ORCL\JINLIAN_UNDO.DBF JINLIAN_UNDO 50
SQL> alter database datafile 'D:\Disk2\orcl\Jianlian01.DBF' resize 100M;
SQL> alter tablespace jinlian
2 add datafile 'D:\Disk6\orcl\jinlian03.DBF'
3 size 80M;
6.15 移动数据文件的方法
有时某个磁盘的I/O可能过于繁忙,这可能影响到Oracle数据库整体效率,此时就应该将一个或几个数据文件移动到其他的磁盘上以平衡I/O。有时某个磁盘可能已经毁损,此时为了能使数据库系统继续运行,也可能要将一个或几个数据文件移动到其他的磁盘上,Oracle一共提供了两条移动数据文件的语句。
第一条移动数据文件语句的格式如下:
ALTER TABLESPACE 表空间名
RENAME DATAFILE ’文件名’[,‘文件名’]….
TO ‘文件名’[,’文件名’]….
这条语句只适用于上面没有活动的还原数据或临时段的非系统表空间中的数据文件。要求在使用这条语句时,表空间一下为脱机状态而目标数据必须存在。因为该语句只修改文件中指向数据文件的指针(地址)。
移动数据文件或重要命名数据文件的步骤如下:
(1)使用数据字典获取所需的空间和数据文件的相关信息。
(2)将表空间置为脱机。
(3)使用操作系统命令移动或复制要移动的数据文件。
(4)执行ALTER TABLESPACE RENAME DATAFILE 命令。
(5)将表空间置为联机。
(6)使用数据字典获取所需的表空间和数据文件的相关信息。
(7)如果需要,使用操作系统命令删除无用的数据文件。
第二条移动数据文件语句的格式如下:
ALTER DATABASE [数据库名]
RENAME FILE ‘文件名’[,’文件名’]…
TO ‘文件名’[,‘文件名’]…
这条语句适用于系统表空间和不能置为联机的表空间的数据文件。要求在使用这条语句坟,数据训必须运行加载(mount)状态而且目标数据文件必须存在。因为该语句只修改文件中指向数据文件的指针(地址)。
移动数据文件或重新命名数据文件的步骤如下:
(1)使用数据字典获取所需的表空间和数据文件的相关信息。
(2)关闭数据库系统。
(3)使用操作系统命令移动或复制要移动的数据文件。
(4)将数据库置罚加载(mount)状态。
(5)执行ALTER DATABASE RENAME FILE 命令。
(6)打开数据库系统。
(7)使用数据字典获取所需的表空间和数据文件的相信信息。
(8)如果需要,使用操作系统命令删除无用的数据文件。通过以睥讨论您是否已经掌握了如何移动数据文件的方法?如果不觉得不十分理解,下面再勇冠一个实际的例子来演示一下移动数据文件依法的全过程。
6.16 移动数据文件的应用实例
SQL> col file_name for a55
SQL> set line 150
SQL> select file_id,file_name,tablespace_name
2 from dba_data_files
3 where file_name like '%ORADATA%'
4 order by file_id;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- ------------------------------------------------------- ---------------
1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF SYSTEM
2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBFUNDOTBS1
3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF SYSAUX
4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF USERS
SQL> select tablespace_name,status,contents
2 from dba_tablespaces
3 where tablespace_name not like '%JIN%';
TABLESPACE_NAME STATUS CONTENTS
--------------- --------- ---------
SYSTEM ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
SYSAUX ONLINE PERMANENT
TEMP ONLINE TEMPORARY
USERS ONLINE PERMANENT
PIONEER_DATA ONLINE PERMANENT
PIONEER_INDX ONLINE PERMANENT
PIONEER_UNDO ONLINE UNDO
PIONEER_TEMP ONLINE TEMPORARY
已选择9行。
SQL> alter tablespace users offline;
表空间已更改。
SQL> alter tablespace indx offline;
SQL> select tablespace_name,status,contents
2 from dba_tablespaces
3 where tablespace_name not like '%JIN%';
TABLESPACE_NAME STATUS CONTENTS
--------------- --------- ---------
SYSTEM ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
SYSAUX ONLINE PERMANENT
TEMP ONLINE TEMPORARY
USERS OFFLINE PERMANENT
PIONEER_DATA ONLINE PERMANENT
PIONEER_INDX ONLINE PERMANENT
PIONEER_UNDO ONLINE UNDO
PIONEER_TEMP ONLINE TEMPORARY
已选择9行。
SQL> host copy C:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF D:\Disk2\ORADATA
已复制 1 个文件。
SQL> alter tablespace users rename
2 datafile 'C:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF'
3 to 'D:\Disk2\ORADATA\USERS01.DBF';
SQL> alter tablespace users online;
表空间已更改。
SQL> select tablespace_name,status,contents
2 from dba_tablespaces
3 where tablespace_name not like '%JIN%';
TABLESPACE_NAME STATUS CONTENTS
--------------- --------- ---------
SYSTEM ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
SYSAUX ONLINE PERMANENT
TEMP ONLINE TEMPORARY
USERS ONLINE PERMANENT
PIONEER_DATA ONLINE PERMANENT
PIONEER_INDX ONLINE PERMANENT
PIONEER_UNDO ONLINE UNDO
PIONEER_TEMP ONLINE TEMPORARY
已选择9行。
SQL> select file_id,file_name,tablespace_name
2 from dba_data_files
3 where file_name like '%ORADATA%'
4 order by file_id;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- ------------------------------------------------------- ---------------
1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF SYSTEM
2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBFUNDOTBS1
3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF SYSAUX
4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF USERS
SQL> connect system/password as sysdba
已连接。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 243272580 bytes
Database Buffers 360710144 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL> host copy C:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF D:\Disk2\ORADATA
已复制 1 个文件。
SQL> alter tablespace users rename
2 datafile 'C:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF'
3 to 'D:\Disk2\ORADATA\USERS01.DBF';
SQL> alter database open;
数据库已更改。
SQL> select file_id,file_name,tablespace_name
2 from dba_data_files
3 where file_name like '%ORADATA%'
4 order by file_id;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- ------------------------------------------------------- ---------------
1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF SYSTEM
2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBFUNDOTBS1
3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF SYSAUX
4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF USERS
6.17 迁移数据字典和本地管理的表空间
SQL> connect system/password as sysdba
SQL> show user;
USER 为 "SYS"
SQL> select tablespace_name,status,contents
2 from dba_tablespaces
3 where tablespace_name not like '%JIN%';
SQL> execute dbms_space_admin.tablespace_migrate_to_local('jinlian');
SQL> select tablespace_name,status,contents
2 from dba_tablespaces
3 where tablespace_name not like '%JIN%';
SQL> execute dbms_space_admin.tablespace_migrate_from_local('jinlian');
SQL> select tablespace_name,status,contents
2 from dba_tablespaces
3 where tablespace_name not like '%JIN%';
6.18 删除表空间
SQL> select file_id,file_name,tablespace_name
2 from dba_data_files
3 where file_id > 5
4 order by file_id;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- ------------------------------------------------------- ---------------
6 D:\DISK7\ORCL\JINLIAN_UNDO.DBF JINLIAN_UNDO
7 D:\DISK2\ORCL\PIONEER_DATA.DBF PIONEER_DATA
8 D:\DISK4\ORCL\PIONEER_INDX.DBF PIONEER_INDX
9 D:\DISK6\ORCL\PIONEER_UNDO.DBF PIONEER_UNDO
10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF JINLIAN_UNDO
SQL> drop tablespace jinlian;
只是删除了控制文件中指向数据文件的指针。
SQL> drop tablespace jinlian including contents and datafiles;
包括数据文件都删除掉
SQL> select file_id,file_name,tablespace_name
2 from dba_data_files
3 where file_id > 5
4 order by file_id;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- ------------------------------------------------------- ---------------
6 D:\DISK7\ORCL\JINLIAN_UNDO.DBF JINLIAN_UNDO
7 D:\DISK2\ORCL\PIONEER_DATA.DBF PIONEER_DATA
8 D:\DISK4\ORCL\PIONEER_INDX.DBF PIONEER_INDX
9 D:\DISK6\ORCL\PIONEER_UNDO.DBF PIONEER_UNDO
10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF JINLIAN_UNDO
SQL> select f.file#, t.ts#,f.name "File",t.name "Tablespace"
2 from v$tempfile f, v$tablespace t
3 where f.ts# = t.ts#;