[20250505]建表指定特定的数据文件是否可行.txt
[20250505]建表指定特定的数据文件是否可行.txt
--//测试需要,是否可以实现建表指定特定的数据文件,建立表只能指定表空间,无法指定数据文件,测试看看。
1.环境:
SCOTT@book01p> @ ver2
==============================
PORT_STRING : x86_64/Linux 2.4.xx
VERSION : 21.0.0.0.0
BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID : 0
PL/SQL procedure successfully completed.
2.思路:
--//先在原来的表空间上建立新的数据文件,通过类似如下方式测试看看:
ALTER TABLESPACE USERS
ADD DATAFILE '/u01/oradata/BOOK/book01p/users02.dbf'
SIZE 100M
AUTOEXTEND ON
NEXT 4M
MAXSIZE UNLIMITED;
SCOTT@book01p> select * from dba_data_files where TABLESPACE_NAME='USERS';
FILE_NAME FILE_ID TABLESPACE_NAME BYTES BLOCKS STATUS RELATIVE_FNO AUT MAXBYTES MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS ONLINE_ LOST_WR
------------------------------------- ---------- --------------- ---------- ---------- --------- ------------ --- ---------- ---------- ------------ ---------- ----------- ------- -------
/u01/oradata/BOOK/book01p/users01.dbf 12 USERS 267386880 32640 AVAILABLE 12 YES 3.4360E+10 4194302 160 266338304 32512 ONLINE OFF
/u01/oradata/BOOK/book01p/users02.dbf 15 USERS 104857600 12800 AVAILABLE 15 YES 3.4360E+10 4194302 512 103809024 12672 ONLINE OFF
create table t2 as select * from all_objects where 0=1;
alter table t2 allocate extent ( datafile '/u01/oradata/BOOK/book01p/users02.dbf' size 64K)
3.测试:
--//增加数据文件脚本如上,不再贴出。
SCOTT@book01p> create table t2 as select * from all_objects where 0=1;
Table created.
SCOTT@book01p> column PARTITION_NAME noprint
SCOTT@book01p> select * from dba_extents where segment_name='T2';
no rows selected
--//11g新特性SEGMENT CREATION DEFERRED,这样建立表不存在段的分配。
SCOTT@book01p> alter table t2 allocate extent ( datafile '/u01/oradata/BOOK/book01p/users02.dbf' size 64K);
Table altered.
SCOTT@book01p> select * from dba_extents where segment_name='T2';
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
----- ------------ ------------ --------------- ---------- ---------- ---------- ---------- ---------- ------------
SCOTT T2 TABLE USERS 0 12 176 65536 8 12
SCOTT T2 TABLE USERS 1 15 128 65536 8 15
--//可以发现这种方法不行,会同时建立2个段,分别在2个数据文件上。
SCOTT@book01p> @ seg2 t2 ''
SCOTT@book01p> @ pr
==============================
SEG_MB : 0
SEG_OWNER : SCOTT
SEG_SEGMENT_NAME : T2
SEG_PARTITION_NAME :
SEG_SEGMENT_TYPE : TABLE
SEG_TABLESPACE_NAME : USERS
BLOCKS : 16
HDRFIL : 12
HDRBLK : 178
PL/SQL procedure successfully completed.
--//dba_segments视图仅仅记录1条记录。
4.换一个思路:
--//如果其他数据文件offline,然后在建立表是否可行呢?测试看看。
SCOTT@book01p> drop table t2 purge;
Table dropped.
SCOTT@book01p> alter database datafile '/u01/oradata/BOOK/book01p/users01.dbf' offline ;
alter database datafile '/u01/oradata/BOOK/book01p/users01.dbf' offline
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled
SCOTT@book01p> alter database datafile '/u01/oradata/BOOK/book01p/users01.dbf' offline drop ;
Database altered.
--//注:因为我的测试环境没有打开归档,导致直接offline报错,加入drop没有问题,注意并非真正意思删除。
SCOTT@book01p> recover datafile 12;
Media recovery complete.
--//顺手先1次recover datafile 12;以后可以直接online,这样即使日志覆盖了,online也没有问题。
SCOTT@book01p> create table t2 SEGMENT CREATION IMMEDIATE as select * from all_objects where 0=1;
Table created.
SCOTT@book01p> select * from dba_extents where segment_name='T2';
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
----- ------------ ------------ --------------- ---------- ---------- ---------- ---------- ---------- ------------
SCOTT T2 TABLE USERS 0 15 128 65536 8 15
SCOTT@book01p> @ seg2 T2 ''
SEG_MB OWNER SEGMENT_NAME SEGMENT_TYPE SEG_TABLESPACE_NAME BLOCKS HDRFIL HDRBLK
------ ----- ------------ ------------ ------------------- ---------- ---------- ----------
0 SCOTT T2 TABLE USERS 8 15 130
SCOTT@book01p> alter database datafile '/u01/oradata/BOOK/book01p/users01.dbf' online ;
Database altered.
--//说明这样的方式可行.
5.收尾:
SCOTT@book01p> drop table t2 purge;
Table dropped.
--//删除建立的数据文件/u01/oradata/BOOK/book01p/users02.dbf,这时该数据文件没有分配任何段,可以删除。
alter tablespace "USERS" drop datafile '/u01/oradata/BOOK/book01p/users02.dbf';
--//测试需要,是否可以实现建表指定特定的数据文件,建立表只能指定表空间,无法指定数据文件,测试看看。
1.环境:
SCOTT@book01p> @ ver2
==============================
PORT_STRING : x86_64/Linux 2.4.xx
VERSION : 21.0.0.0.0
BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID : 0
PL/SQL procedure successfully completed.
2.思路:
--//先在原来的表空间上建立新的数据文件,通过类似如下方式测试看看:
ALTER TABLESPACE USERS
ADD DATAFILE '/u01/oradata/BOOK/book01p/users02.dbf'
SIZE 100M
AUTOEXTEND ON
NEXT 4M
MAXSIZE UNLIMITED;
SCOTT@book01p> select * from dba_data_files where TABLESPACE_NAME='USERS';
FILE_NAME FILE_ID TABLESPACE_NAME BYTES BLOCKS STATUS RELATIVE_FNO AUT MAXBYTES MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS ONLINE_ LOST_WR
------------------------------------- ---------- --------------- ---------- ---------- --------- ------------ --- ---------- ---------- ------------ ---------- ----------- ------- -------
/u01/oradata/BOOK/book01p/users01.dbf 12 USERS 267386880 32640 AVAILABLE 12 YES 3.4360E+10 4194302 160 266338304 32512 ONLINE OFF
/u01/oradata/BOOK/book01p/users02.dbf 15 USERS 104857600 12800 AVAILABLE 15 YES 3.4360E+10 4194302 512 103809024 12672 ONLINE OFF
create table t2 as select * from all_objects where 0=1;
alter table t2 allocate extent ( datafile '/u01/oradata/BOOK/book01p/users02.dbf' size 64K)
3.测试:
--//增加数据文件脚本如上,不再贴出。
SCOTT@book01p> create table t2 as select * from all_objects where 0=1;
Table created.
SCOTT@book01p> column PARTITION_NAME noprint
SCOTT@book01p> select * from dba_extents where segment_name='T2';
no rows selected
--//11g新特性SEGMENT CREATION DEFERRED,这样建立表不存在段的分配。
SCOTT@book01p> alter table t2 allocate extent ( datafile '/u01/oradata/BOOK/book01p/users02.dbf' size 64K);
Table altered.
SCOTT@book01p> select * from dba_extents where segment_name='T2';
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
----- ------------ ------------ --------------- ---------- ---------- ---------- ---------- ---------- ------------
SCOTT T2 TABLE USERS 0 12 176 65536 8 12
SCOTT T2 TABLE USERS 1 15 128 65536 8 15
--//可以发现这种方法不行,会同时建立2个段,分别在2个数据文件上。
SCOTT@book01p> @ seg2 t2 ''
SCOTT@book01p> @ pr
==============================
SEG_MB : 0
SEG_OWNER : SCOTT
SEG_SEGMENT_NAME : T2
SEG_PARTITION_NAME :
SEG_SEGMENT_TYPE : TABLE
SEG_TABLESPACE_NAME : USERS
BLOCKS : 16
HDRFIL : 12
HDRBLK : 178
PL/SQL procedure successfully completed.
--//dba_segments视图仅仅记录1条记录。
4.换一个思路:
--//如果其他数据文件offline,然后在建立表是否可行呢?测试看看。
SCOTT@book01p> drop table t2 purge;
Table dropped.
SCOTT@book01p> alter database datafile '/u01/oradata/BOOK/book01p/users01.dbf' offline ;
alter database datafile '/u01/oradata/BOOK/book01p/users01.dbf' offline
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled
SCOTT@book01p> alter database datafile '/u01/oradata/BOOK/book01p/users01.dbf' offline drop ;
Database altered.
--//注:因为我的测试环境没有打开归档,导致直接offline报错,加入drop没有问题,注意并非真正意思删除。
SCOTT@book01p> recover datafile 12;
Media recovery complete.
--//顺手先1次recover datafile 12;以后可以直接online,这样即使日志覆盖了,online也没有问题。
SCOTT@book01p> create table t2 SEGMENT CREATION IMMEDIATE as select * from all_objects where 0=1;
Table created.
SCOTT@book01p> select * from dba_extents where segment_name='T2';
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
----- ------------ ------------ --------------- ---------- ---------- ---------- ---------- ---------- ------------
SCOTT T2 TABLE USERS 0 15 128 65536 8 15
SCOTT@book01p> @ seg2 T2 ''
SEG_MB OWNER SEGMENT_NAME SEGMENT_TYPE SEG_TABLESPACE_NAME BLOCKS HDRFIL HDRBLK
------ ----- ------------ ------------ ------------------- ---------- ---------- ----------
0 SCOTT T2 TABLE USERS 8 15 130
SCOTT@book01p> alter database datafile '/u01/oradata/BOOK/book01p/users01.dbf' online ;
Database altered.
--//说明这样的方式可行.
5.收尾:
SCOTT@book01p> drop table t2 purge;
Table dropped.
--//删除建立的数据文件/u01/oradata/BOOK/book01p/users02.dbf,这时该数据文件没有分配任何段,可以删除。
alter tablespace "USERS" drop datafile '/u01/oradata/BOOK/book01p/users02.dbf';