欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Oracle中表空间与数据文件编号的连续性

程序员文章站 2022-03-26 18:58:00
...

表空间被删除时ts$表中并不会删除相关表空间的记录。只是把表空间的状态置为3,即INVALID状态。如果再次创建同名的表空间,则ora

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' - 该文件已是数据库的一部分

Oracle中表空间与数据文件编号的连续性