1.引子
记得刚入职的时候,各位师傅们考过我一个问题:
如果要保证数据库可以启来,最少需要哪几个表空间.
现在回过头来再考虑这个问题还是有些意思,
以下就主要针对oracle 9i版本和oracle 8i版本对这个问题做简要说明.
2.针对9i版本
2.1具体版本
jcq0> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production
2.2 dbca建库
2.2.1 只选system表空间
建库的语句如下:
CREATE DATABASE small
MAXINSTANCES 1
MAXLOGHISTORY 1
MAXLOGFILES 5
MAXLOGMEMBERS 3
MAXDATAFILES 100
DATAFILE 'D:/oracle/oradata/small/system01.dbf' SIZE 250M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE null TEMPFILE
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16
LOGFILE GROUP 1 ('D:/oracle/oradata/small/redo01.log') SIZE 102400K,
GROUP 2 ('D:/oracle/oradata/small/redo02.log') SIZE 102400K,
GROUP 3 ('D:/oracle/oradata/small/redo03.log') SIZE 102400K;
此时由于没有指定临时表空间和临时文件,建库时将会报错
2.2.2 选择system和temp表空间
建库成功
2.2.3 尝试删除temp表空间
jcq0> drop tablespace temp;
drop tablespace temp
*
ERROR 位于第 1 行:
ORA-12906: 不能删除默认的临时表空间
在oracle 9i中引入了系统默认临时表空间特性.
数据库必须指定默认临时表空间,而且所指定的默认临时表空间不能删除.
jcq0> select PROPERTY_NAME, PROPERTY_VALUE from database_properties
2 where property_name = 'DEFAULT_TEMP_TABLESPACE';
PROPERTY_NAME PROPERTY_V
------------------------- ----------
DEFAULT_TEMP_TABLESPACE TEMP
虽然默认的临时表空间不能drop,但是临时表空间对应的数据文件是可以drop滴
jcq0> alter database tempfile 1 drop including datafiles;
数据库已更改。
此时,临时文件没有了,但是临时表空间还在
jcq0> select * from v$tempfile;
未选定行
jcq0> select tablespace_name from dba_tablespaces where contents='TEMPORARY';
TABLESPACE_NAME
------------------------------
TEMP
2.2.4 测试
2.2.4.1 回滚
虽然没有建undo表空间,但是在system表空间中存在系统回滚段
所以回滚操作是可以正常进行的
jcq0> select a.name,b.status from v$rollname a,v$rollstat b where a.usn=b.usn;
NAME STATUS
------------------------------ ---------------
SYSTEM ONLINE
jcq0> create table test(id number);
表已创建。
jcq0> insert into test values(1);
已创建 1 行。
jcq0> rollback;
回退已完成。
jcq0> select * from test;
未选定行
2.2.4.2排序
进行排序时,oracle首先会在pga中申请空间进行排序
如果内存中的排序空间不足,将会使用临时表空间
如果进行较大的排序
jcq0> select * from dba_objects order by 1,2,3;
select * from dba_objects order by 1,2,3
*
ERROR 位于第 1 行:
ORA-25153: 临时表空间为空
2.2.5 最小数据库的大小
2.2.5.1 数据文件大小
jcq0> select sum(bytes)/1024/1024 from dba_segments;
SUM(BYTES)/1024/1024
--------------------
184.0625
2.2.5.2 重做日志大小
如果使用最少的两个重做日志文件(每个日志组一个日志文件)
jcq0> alter database add logfile 'D:/ORACLE/ORADATA/SMALL/REDO01.log' size 2k;
数据库已更改。
我的操作系统的block大小为512Bytes,至少需要4个操作系统的block
2.2.5.3 控制文件大小
如果最少的一个控制文件,我的控制文件大小约1576k
当然控制文件的大小还和控制文件本身的参数(如最大数据文件数 最大日志组数 最大日志成员数有关)
D:/oracle/oradata/small>dir c*
驱动器 D 中的卷是 PROC
卷的序列号是 243B-0BC1
D:/oracle/oradata/small 的目录
2009-01-15 11:21 1,613,824 CONTROL01.CTL
2009-01-15 11:21 1,613,824 CONTROL02.CTL
2009-01-15 11:21 1,613,824 CONTROL03.CTL
3 个文件 4,841,472 字节
0 个目录 479,293,440 可用字节
jcq0> CREATE CONTROLFILE REUSE DATABASE "SMALL" RESETLOGS NOARCHIVELOG
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 2
4 MAXLOGMEMBERS 1
5 MAXDATAFILES 1
6 MAXINSTANCES 1
7 MAXLOGHISTORY 0
8 LOGFILE
9 GROUP 1 'D:/ORACLE/ORADATA/SMALL/REDO01.LOG' SIZE 2k,
10 GROUP 2 'D:/ORACLE/ORADATA/SMALL/REDO02.LOG' SIZE 2k
11 -- GROUP 3 'D:/ORACLE/ORADATA/SMALL/REDO03.LOG' SIZE 100M,
12 -- GROUP 4 'D:/ORACLE/ORADATA/SMALL/REDO04.LOG' SIZE 2K
13 -- STANDBY LOGFILE
14 DATAFILE
15 'D:/ORACLE/ORADATA/SMALL/SYSTEM01.DBF'
16 CHARACTER SET ZHS16GBK
17 ;
Control file created.
D:/oracle/oradata/small>dir c*
驱动器 D 中的卷是 PROC
卷的序列号是 243B-0BC1
D:/oracle/oradata/small 的目录
2009-01-15 12:49 647,168 CONTROL01.CTL
2009-01-15 12:49 647,168 CONTROL02.CTL
2009-01-15 12:49 647,168 CONTROL03.CTL
3 个文件 1,941,504 字节
0 个目录 482,168,832 可用字节
重建后的控制文件为632k
184.0625M+2k*2+632k
所以最小应该不会超过190M
3. 针对8i版本
3.1 具体版本
jcq0> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
PL/SQL Release 8.1.7.0.0 - Production
CORE 8.1.7.0.0 Production
TNS for 32-bit Windows: Version 8.1.7.0.0 - Production
NLSRTL Version 3.4.1.0.0 - Production
3.2 临时表空间
临时表空间可以drop
jcq0> drop tablespace temp including contents;
表空间已丢弃。
由于默认临时表空间是9i版本的新特性,8i中的临时表空间是可以删除的
3.3 回滚段
jcq0> drop tablespace rbs;
drop tablespace rbs
*
ERROR 位于第 1 行:
ORA-01546: 表空间包含活动回退段'RBS0'
需要先将回滚段offline,再进行drop
jcq0> alter rollback segment RBS0 offline;
重算段已修改。
jcq0> alter rollback segment RBS1 offline;
重算段已修改。
jcq0> alter rollback segment RBS2 offline;
重算段已修改。
jcq0> alter rollback segment RBS3 offline;
重算段已修改。
jcq0> alter rollback segment RBS4 offline;
重算段已修改。
jcq0> alter rollback segment RBS5 offline;
重算段已修改。
jcq0> alter rollback segment RBS6 offline;
重算段已修改。
jcq0> drop tablespace rbs including contents;
表空间已丢弃。
3.4 需要的表空间和数据文件
只需要系统表空间
jcq0> select tablespace_name from dba_tablespaces;
TABLESPACE_NAME
------------------------------
SYSTEM
jcq0> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
E:/ORACLE/ORADATA/SMALL8I/SYSTEM01.DBF
3.5 最小数据库的大小
jcq0> select sum(bytes)/1024/1024 from dba_segments;
SUM(BYTES)/1024/1024
--------------------
54.4453125
类似9i
加上一个控制文件和两个重做日志文件,其大小不会超过60M
4.结论
在oracle 9i下建立最小的数据库需要system和temp两个表空间
但temp表空间对应的数据文件可以为空,所以只需要一个数据文件(也就是system表空间对应的数据文件).
其占用的空间最小约为190M.
在oracle 8i下建立最小的数据库需要system这一个表空间
也只需要一个数据文件(system对应的数据文件)
其占用的空间最小约为60M.
当然这样的配置仅限于对能够启动打开数据库来说的,
如果进行大型的dml操作将会对system表空间中的系统回滚段造成争用
如果进行大的排序操作(pga中放不下时),将会报错