表空间的扩展
SQL> create tablespace tbs datafile 'd:\u01\app\oracle\oradata\prod\tbs01.dbf' size 1m;
表空间已创建。
SQL> create table t_1 tablespace tbs as select * from dba_objects;
create table t_1 tablespace tbs as select * from dba_objects
*
第 1 行出现错误:
ORA-01652: 无法通过 8 (在表空间 TBS 中) 扩展 temp 段
SQL>
由于表空间太小,存放不下系统表dba_objects,此时我们要对表空间tbs进行扩展,对表空间扩展,其实就是对数据文件扩展:
SQL> select file_id from dba_data_files where tablespace_name='TBS';
FILE_ID
----------
11
SQL>
SQL> alter database datafile 11 resize 2m;
数据库已更改。
SQL> create table t_1 tablespace tbs as select * from dba_objects;
create table t_1 tablespace tbs as select * from dba_objects
*
第 1 行出现错误:
ORA-01652: 无法通过 128 (在表空间 TBS 中) 扩展 temp 段
可见上面对表空间的扩展还不够大,再扩展到10M:
SQL> alter database datafile 11 resize 10m;
数据库已更改。
SQL> create table t_1 tablespace tbs as select * from dba_objects;
表已创建。
SQL>
此时就可以成功创建表T_1且插入数据了。
查看表空间的大小,可以看到已经扩展到了10M
SQL> select file_id,tablespace_name,bytes from dba_data_files where tablespace_name='TBS';
FILE_ID TABLESPACE_NAME BYTES
---------- -------------------- ----------
11 TBS 10485760
SQL>
一个数据文件,如果是8K的块,最大可以达到32G;当然也和OS有关,WINDOWS FAT32 一个数据文件最大2G,所以它也不可能超过2G。
在创建表空间的时候,给得太小的话,就会报空间不足的错,太大的话,在备份的时候就非常浪费时间,所以最好把表空间设置为自动扩展:
SQL> select file_id,tablespace_name,autoextensible from dba_data_files where tablespace_name='TBS';
FILE_ID TABLESPACE_NAME AUTOEX
---------- -------------------- ------
11 TBS NO
SQL>
在没有打开的情况下字段autoextensible 为NO,下面打开:
SQL> alter database datafile 11 autoextend on;
数据库已更改。
SQL> select file_id,tablespace_name,autoextensible from dba_data_files where tablespace_name='TBS';
FILE_ID TABLESPACE_NAME AUTOEX
---------- -------------------- ------
11 TBS YES
SQL>
打开后字段autoextensible 为YES
在创建数据库的时候,系统自动创建的一些表空间默认为YES,我们自己创建的表空间缺省情况下都是NO。
扩展有一个单位:
SQL> select file_id,tablespace_name,autoextensible,increment_by from dba_data_files where tablespace_name='TBS';
FILE_ID TABLESPACE_NAME AUTOEX INCREMENT_BY
---------- -------------------- ------ ------------
11 TBS YES 1
SQL>
INCREMENT_BY 字段就是扩展的单位,它指的是数据块的数量。这里是1,表示一次扩展1个数据块。这样扩展就比较麻烦,要扩展稍微大点的空间就要扩展很多次,所以我们可以指定一次扩展多少空间,这样做:
SQL> alter database datafile 11 autoextend on next 5m;
数据库已更改。
SQL> select file_id,tablespace_name,autoextensible,increment_by from dba_data_files where tablespace_name='TBS';
FILE_ID TABLESPACE_NAME AUTOEX INCREMENT_BY
---------- -------------------- ------ ------------
11 TBS YES 640
SQL>
一个块8K,640个块正好 是5M,这样,表空间在扩展的时候一次就扩展5M,而不是8K.