现在的位置: 首页 > 综合 > 正文

打造最小的oracle数据库

2018年02月02日 ⁄ 综合 ⁄ 共 5287字 ⁄ 字号 评论关闭
 

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中放不下时),将会报错

 

抱歉!评论已关闭.