oracle中表空间编号与数据文件编号都是连续的,不会断号。如果ts$中表空间出现了断号,
oracle在启动时会进行数据字典和控制文件的校验,发现不一致时,数据库不能正常启动。
表空间被删除时ts$表中并不会删除相关表空间的记录。只是把表空间的状态置为3,即invalid状态。
如果再次创建同名的表空间,则oracle会把ts$表中同名表空间的状态由3置为1,online状态。以此
来保证表空间号的连续。
oracle 10g中sql.bsq记录了ts$的online$列与file$的status$列的含义:
ts$
online$ /* 1 = online, 2 = offline, 3 = invalid */
file$
status$ /* 1 = invalid, 2 = available */
connected to oracle database 11g enterprise edition release 11.2.0.1.0
connected as sys
undotbs2,,liang,liang这三个表空间被删除,但ts$中并没有删除相关记录。只是把online$状态置为3(invalid)
sql> select ts#,name ,online$ from ts$;
ts# name online$
--- ----------- -------
0 system 1
1 sysaux 1
2 undotbs1 1
3 temp 1
4 users 1
5 undotbs2 3
6 example 1
7 tbs_report 1
8 liang 3
9 liang 3
10 rows selected
-- 数据文件编号一样不会被删除,将删除的数据文件编号置为1(invalid状态)。
sql> select file#,status$ from file$;
file# status$
----- ------
1 2
2 2
3 2
4 2
5 2
6 2
7 1
7 rows selected
sql> select d.file_id,d.tablespace_name, d.file_name from dba_data_files d
2 order by d.file_id;
file_id tablespace_name file_name
------- ---------------- ----------------------------------------------------
1 system d:\oracle\liangwei\oradata\liangwei\system01.dbf
2 sysaux d:\oracle\liangwei\oradata\liangwei\sysaux01.dbf
3 undotbs1 d:\oracle\liangwei\oradata\liangwei\undotbs01.dbf
4 users d:\oracle\liangwei\oradata\liangwei\users01.dbf
5 example d:\oracle\liangwei\oradata\liangwei\example01.dbf
6 tbs_report d:\oracle\liangwei\oradata\liangwei\tbs_report1.dbf
6 rows selected
sql> create tablespace test datafile 'd:\oracle\test02.dbf' size 10m;
tablespace created
重新创建数据文件时,如果没有状态为1(invalid)的数据文件,oracle会新分配一个数据文件编号。
如果有状态为1(invalid)的数据文件编号,不管新创建的数据文件是否与被删除的数据文件同名。
oracle都会重新利用被设置为状态为1(invalid)的数据文件编号。以保证数据文件编号的连续性。
新创建数据文件后,发现7号数据文件编号被设置为2(available)
sql> select file#,status$ from file$;
file# status$
----- -------
1 2
2 2
3 2
4 2
5 2
6 2
7 2
7 rows selected
sql> select d.file_id,d.tablespace_name, d.file_name from dba_data_files d order by d.file_id;
file_id tablespace_name file_name
------- ------------------ ----------------------------------------------------
1 system d:\oracle\liangwei\oradata\liangwei\system01.dbf
2 sysaux d:\oracle\liangwei\oradata\liangwei\sysaux01.dbf
3 undotbs1 d:\oracle\liangwei\oradata\liangwei\undotbs01.dbf
4 users d:\oracle\liangwei\oradata\liangwei\users01.dbf
5 example d:\oracle\liangwei\oradata\liangwei\example01.dbf
6 tbs_report d:\oracle\liangwei\oradata\liangwei\tbs_report1.dbf
7 test d:\oracle\test02.dbf
7 rows selected
新建表空间时,如果ts$中没有同名,且状态为3的表空间。oracle会重新分配一个连续的表空间编号。
sql> select ts#,name ,online$ from ts$;
ts# name online$
--- ---------- -------
0 system 1
1 sysaux 1
2 undotbs1 1
3 temp 1
4 users 1
5 undotbs2 3
6 example 1
7 tbs_report 1
8 liang 3
9 liang 3
10 test 1
11 rows selected
如果创建同名的表空间,oracle会利用原有状态为3的表空间,同时将状态置为1.
sql> create tablespace liang datafile 'd:\oracle\test01.dbf' size 10m;
tablespace created
创建同名表空间liang后,8号表空间状态由3变为1.
sql> select ts#,name ,online$ from ts$;
ts# name online$
--- ---------- ----------
0 system 1
1 sysaux 1
2 undotbs1 1
3 temp 1
4 users 1
5 undotbs2 3
6 example 1
7 tbs_report 1
8 liang 1
9 liang 3
10 test 1
11 rows selected
新创建的表空间不能与数据库中已有的表空间同名。
sql> create tablespace test datafile 'd:\oracle\test02.dbf' size 10m;
create tablespace test datafile 'd:\oracle\test02.dbf' size 10m
*
第 1 行出现错误:
ora-01543: 表空间 'test' 已存在
新创建的数据文件也不能与数据库中已有的数据文件同名。
sql> create tablespace test2 datafile 'd:\oracle\test02.dbf' size 10m;
create tablespace test2 datafile 'd:\oracle\test02.dbf' size 10m
*
第 1 行出现错误:
ora-01537: 无法添加文件 'd:\oracle\test02.dbf' - 该文件已是数据库的一部分
