oracle 数据表空间管理与维护

oracle 数据表空间管理与维护

2、 表空间的日常操作与维护管理

-----------------------------------------------------------------------

--2.1. 表空间创建

先查看目前的文件路径和空间使用情况:

select name from v$datafile;

asm: asmcmd lsdg

df -h

_asm_hbeatiowait

创建数据表空间:

CREATE TABLESPACE 表空间名 DATAFILE '数据文件' EXTENT MANAGEMENT {LOCAL{AUTOALLOCATE|UNIFORM [SIZE INTETER [KlM]]}}]

--ASM:58

CREATE TABLESPACE xxtbs01 DATAFILE '+dgdata01' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 30720MLOGGING ONLINE PERMANENT EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 16K SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;

CREATE TABLESPACE xxtbs02 DATAFILE '+dgdata02' SIZE 100M AUTOEXTEND OFF;
SQL> select name from v$datafile;

另外还有一个参数:

PERMANENT

该选项主要用于指定表空间的类型,permanent表示永久的,不写默认就是永久。

如果是其他类型,则写temporary或者undo

如果创建sysaux表空间,则必须指定extend managent类型和segment space management类型。

select * from dba_tablespaces where tablespace_name in('xxtbs01','xxtbs02');
SQL> select name from v$datafile;
CREATE TABLESPACE xxtbs01 DATAFILE '/oradata/xxdb/xxtbs0101.dbf' SIZE 100M AUTOEXTEND ON NEXT 10MMAXSIZE 30720M LOGGING ONLINE PERMANENT EXTENT MANAGEMENT LOCAL AUTO ALLOCATE

--BLOCKSIZE 16K

SEGMENT SPACE MANAGEMENT AUTO

FLASHBACK ON;
CREATE TABLESPACE xxtbs02 DATAFILE '/oradata/xxdb/xxtbs0201.dbf' SIZE100M AUTOEXTEND OFF;
SQL> select name from v$datafile;

创建多个文件的表空间:

create tablespace xxtbs04 datafile
'/oradata/xxdb/xx0401.dbf' size 20m autoextend off,
'/oradata/xxdb/xx0402.dbf' size 20m autoextend off,
'/oradata/xxdb/xx0403.dbf' size 20M autoextend off;

#创建临时表空间

create temporary tablespace temp1 tempfile '/oradata/xxdb/temp1.dbf' size 10m autoextend off;

#创建undo表空间

create undo tablespace xxundo1 datafile '/oradata/xxdb/xxundo1.dbf' size 10m autoextend off;

#创建大文件表空间

create bigfile tablespace xxbig datafile '/oradata/xxdb/xxbig01.dbf' size 10M;

--2.2 表空间相关视图

表空间与数据文件相关视图:

V$TABLESPACE 表空间的标号和信息

DBA_TABLESPACE 表空间的标号和信息

USER_TABLESPACE 表空间的标号和信息

DBA_SEGMENT 表空间段的信息

USER_SEGMENT 表空间段的信息

DBA_EXTENTS 表空间的数据区的信息

USER_EXTENTS 表空间的数据区的信息

DBA_FREE_SPACE 表空间的空闲信息

USER_FREE_SPACE 表空间的空闲信息

V$DATAFILE 数据文件以及所属表空间的信息

DBA_DATA_FILES 数据文件以及所属表空间的信息

V$TEMPFILE 临时文件以及临时表空间的信息

DBA_TEMP_FILES 临时文件以及临时表空间的信息

V$TEMP_SPACE_HEADER 临时文件的空闲信息

V$SORT_SEGMENT 每个排序段的信息

V$SORT_USER 用户使用的临时排序信息

#查看表空间:

--动态视图。信息存在contraolfile中。信息在mount就能查询。

SQL> select * from v$tablespace;

--静态视图。

select tablespace_name,status from dba_tablespaces;

STATUS:Tablespace status:

ONLINE

OFFLINE

READ ONLY

ALLOCATION_TYPE

Type of extent allocation in effect for the tablespace:

SYSTEM

UNIFORM

USER

tablespace name

INCLUDED_IN_DATABASE_BACKUP指示使用backup database rman命令(是)或(否)在完整数据库备份中是否包含表空间。

FLASHBACK_ON 指示表空间是否参与闪回数据库惭怍(是)或(否)

ENCRYPT_IN_BACKUP YES加密在表空间级别开启

system:一旦设定该值,next_extent 将为空,只有 extents 值。该值是默认值。这个选项的最小是 64K

uniform:将标明所有的 extent 的大小将一致,temp 表空间只能采用这个方式;

以上两个情况的 extent 的大小将不一致;uniform 中的默认值为1M

user:一旦设定该值,就允许我们可以控制 next_extent 了。只有两种情况出现 users:一是该 ts 是数据字典管理的;另外一个是该ts 是从数据字典管理转移到 local 的如果是图片库比较 大,建议uniform size 1M --uniform 设 置 extent 每 次 分 配 的 大 小统一为1M( 如果是db_block_size=8k)

当自动分配时,发现开始第一个区分配 8 个块(64K), 到 17 区开始, 每个区分配 128个块(大小 1M).

  1. ORACLE 通过强制性的手段使本地管理表空间中的所有 Extent 是同样大小的, 尽管可能自定义了不同的存储参数.
  2. 在自动分配的本地管理的表空间中, 区间尺寸可能由以下尺寸组成 64K, 1M, 8M,64M 甚至是 256M.

但是不管多大, 都有一个通用尺寸 64k, 所以 64K 就是该表空间的位大小.

让数据库自动使用 AUTOALLOCATE 子句(缺省值 system)管理扩展数据块,也可以指定使用特定大小的统一扩展数据块来管理表空间(UNIFORM)。比如:

CREATE TABLESPACE xxtbs06 DATAFILE '/oradata/xxdb/xxtbs0601.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 30720M LOGGING ONLINE PERMANENT EXTENT MANAGEMENT LOCAL

--AUTOALLOCATE

uniform size 1M

BLOCKSIZE 8K

SEGMENT SPACE MANAGEMENT AUTO

FLASHBACK ON;

SEGMENT_SPACE_MANAGEMENT

(MANUAL) or bitmaps (AUTO)

Segment 管理方式有两种:(-segment 中的 block 管理)

  1. MSSM(Manual Segment Space Management)
  2. ASSM(Auto Systemt Space Management)
  3. MSSM(Manual Segment Space Management)

通过在 segment 的段头分配自由列表(freelist)来管理 block

通过两个参数 pctfree pctused 来管理 block 如何进出 freelist

pctfree 值表示预留多少%的 block 空间用于更新

pctused 值表示低于这个值是,block 会重新加入到 freelist 上通过 dba_tables,dba_indexes 查看 freelist,pctfree,pctused 等参数的设置

select * from dba_tables;

  1. ASSM(Auto Systemt Space Management)

#查看每个表空间有那些数据文件

#查看详细数据文件


set pagesize 200
col FILE_NAME format a60;
col TABLESPACE_NAME format a20;
select tablespace_name,file_name from dba_data_files;

--2.3 表空间的维护

1.表空间状态有下面几种状态:online,offline,read only,read write

select tablespace_name,status from dba_tablespaces;
select file#, ts#,name,status, enabled from v$datafile;

2.设置为脱机状态

alter tablespace xxtbs04 offline immediate; --默认
alter database datafile 10 offline
alter database datafile 10 offline drop --需要进行 recover 后才可以 online,非归档模式

脱机状态

正常模式(NORMAL):

进入脱机时,必须保证该表空间的数据文件处于联机,ORACLE 会执行一个 CHECKPOINT,以便 SGA 区中的脏数据都能写入数据文件中。然后在关闭表空间的所有文件。下一次启动时候就不用进行数据库恢复了。

临时模式(TEMPORARY):

不须保证该表空间的数据文件处于联机,如果某个数据文件不可用,则回忽略错误,进入 TEMPORARY 模式,ORACLE 会执行一个 CHECKPOINT,下一次启动时候可能需要进行数据库恢复

立即模式(IMMEDIATE):

ORACLE 会执行一个 CHECKPOINT,直接将该表空间的所有数据文件都设置为脱机状态,恢复为联机时必须进行数据库恢复

recover datafile 4;
recover datafile 10;
recover datafile 11;
recover datafile 12;

用于恢复模式(FOR RECOVER):

如果要对表空间进行基于时间的恢复,可以使用这模式,

3.设置为联机状态

alter tablespace xxtbs04 online;
alter tablespace xxtbs03 online;
alter tablespace xxtbs02 online;
alter database datafile 10 online

4.设置为只读状态

只读read-only 任何人无法写入数据,无法修改数据。

sql>alter tablespace xxtbs02 read only;
sql>alter tablespace xxtbs02 read write;

6.修改表空间名称

在oracle10g之前,表空间的名称是不能被修改的。

在oracle11g中,通过alter tablespace语句中使用rename子句,数据库管理员可以修改表空间的名称。

SQL> alter tablespace xxtbs02 rename to xxtbs022;
SQL> alter tablespace xxtbs022 rename to xxtbs02;

不能对system和sysaux表空间进行重命名,也不能对已经处于offine状态的表空间进行重命名。

7.修改表空间自动扩展打开

alter database datafile '/oradata/xxdb/xxtbs0201.dbf' autoextend on;

08.修改表空间自动扩展关闭

alter database datafile '/oradata/xxdb/xxtbs0201.dbf' autoextend off;

09.修改表空间的数据库文件大小

select name,bytes/1024/1024 from v$datafile;
select name,bytes/1024/1024 from v$tempfile;
alter database datafile '/oradata/xxdb/xxtbs0201.dbf' resize 25m;
alter database tempfile '/oradata/xxdb/temp01.dbf' resize 50M;

10.新增表空间的一个数据库文件

alter tablespace xxtbs02 add datafile '/oradata/xxdb/xxtbs0202.dbf' size 25m autoextend off;
alter tablespace TEMP1 add tempfile '/oradata/xxdb/temp012.dbf' size 25M autoextend off;

11.修改用户缺省表空间

SQL> alter user uxx default tablespace xxtbs02;

12.表空间配额查看

表空间不足与用户配额不足是两种概念。

表空间的大小是指的是实际的用户表空间的大小,而配额大小指的是用户指定使用表空间的大小

查看用户和表空间配额

查看所有用户表空间的配额情况

col USERNAME format a30
SELECT * FROM DBA_TS_QUOTAS;

查看当前用户表空间的配额情况

SELECT * FROM USER_TS_QUOTAS;

13.查询表空间空间使用情况sql脚本

ORA-01653: unable to extend table xxtbs by 128 in tablespace xx

脚本1:

set pagesize 200
col TS-name for a15
col f.tablespace_name format a15
col d.tot_grootte_mb format a10
col ts-per format a8

select upper(f.tablespace_name) "TS-name",
d.tot_grootte_mb "TS-bytes(m)",
d.tot_grootte_mb - f.total_bytes "TS-used (m)",
f.total_bytes "TS-free(m)",
to_char(round((d.tot_grootte_mb - f.total_bytes) / d.tot_grootte_mb *100,2),'990.99') "TS-per"
from (select tablespace_name,round(sum(bytes) / (1024 * 1024), 2) total_bytes,round(max(bytes) / (1024 * 1024), 2) max_bytes
from sys.dba_free_space
group by tablespace_name) f,
(select dd.tablespace_name,
round(sum(dd.bytes) / (1024 * 1024), 2) tot_grootte_mb from sys.dba_data_files dd
group by dd.tablespace_name) d
where d.tablespace_name= f.tablespace_name
order by 5 desc;

脚本2:

set lin 200
col TABLESPACE_NAME format a20
col FREE_SPACE format a20

SELECT D.TABLESPACE_NAME,
SPACE "SUM_SPACE(M)",
BLOCKS SUM_BLOCKS,SPACE - NVL(FREE_SPACE, 0) "USED_SPACE(M)",ROUND((1 - NVL(FREE_SPACE, 0) / SPACE) * 100, 2) "USED_RATE(%)",FREE_SPACE "FREE_SPACE(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE,SUM(BLOCKS) BLOCKS
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES) / (1024 * 1024), 2) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME= F.TABLESPACE_NAME(+)
UNION ALL --if have tempfile
SELECT D.TABLESPACE_NAME,
SPACE "SUM_SPACE(M)",
BLOCKS SUM_BLOCKS,
USED_SPACE "USED_SPACE(M)",
ROUND(NVL(USED_SPACE, 0) / SPACE * 100, 2) "USED_RATE(%)",
NVL(FREE_SPACE, 0) "FREE_SPACE(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE,
SUM(BLOCKS) BLOCKS
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES_USED) / (1024 * 1024), 2) USED_SPACE,ROUND(SUM(BYTES_FREE) / (1024 * 1024), 2) FREE_SPACE FROM V$TEMP_SPACE_HEADER
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME= F.TABLESPACE_NAME(+)
ORDER BY 5 DESC;

脚本3:查看临时表空间空间大小

select d.tablespace_name,
space "sum_space(m)",
blocks sum_blocks,
used_space "used_space(m)",
round(nvl(used_space, 0) / space * 100, 2) "used_rate(%)",
nvl(free_space, 0) "free_space(m)"
from (
select tablespace_name,
round(sum(bytes) / (1024 * 1024), 2) space,
sum(blocks) blocks
from dba_temp_files
group by tablespace_name) d,
(select tablespace_name,round(sum(bytes_used) / (1024 * 1024), 2) used_space,round(sum(bytes_free) / (1024 * 1024), 2) free_space from v$temp_space_header
group by tablespace_name) f
where d.tablespace_name= f.tablespace_name(+);

14.删除表空间

drop tablespace xxtbs04;
drop tablespace xxtbs04 including contents
drop tablespace xxtbs04 including contents and datafiles;
drop tablespace xxBIG including contents and datafiles cascade constraints;

15.表空间数据安全选项LOGGING与nologging

logging这个是默认的参数,指定表,视图,索引等的logging属性。

该数据行针对undo和temporary表空间不起作用。

在表空间级别设置的logging属性可以被表等对象自身的属性覆盖。

CREATE TABLESPACE xxtbs05 DATAFILE '/oradata/xxdb/xxtbs0501.dbf' SIZE 50M AUTOEXTEND ON NEXT 10M MAXSIZE 20G LOGGING
--nologging 不写重做日志文件
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
alter tablespace xxtbs05 logging;
alter tablespace xxtbs05 nologging;
select tablespace_name,logging from dba_tablespaces;

nologging针对insert,update,delete无效,不管开不开,都要重写日志。

针对一般的dml也是忽略的。

以下内容是不用写重做日志的。

针对以下的dml有效。

direct path insert statements

direct path sql*loader

同时对以下ddl操作有效

create table ... as select ....
alter table ... move...
alter table ... add/merge/split/move/modify partition
create index
alter index ... rebuild

物化视图的操作

CREATE MATERIALIZED VIEW
ALTER MATERIALIZED VIEW ... MOVE
CREATE MATERIALIZED VIEW LOG
ALTER MATERIALIZED VIEW LOG ... MOVE

16.表空间性能与非标准快大小的表空间创建

默认情况下创建的表空间使用的数据块大小是8K,数据库默认的数据块大小由db_block_size参数决定。

如果我们想要创建的表空间超出这个块大小,首先需要调整数据库的参数db_nk_cache_size。

以创建数据库块大小为32K的表空间为例,展示一下这个调整过程。

create tablespace xxtbs06 datafile '/oradata/xxdb/xxtbs0601.dbf' size 20mautoextend off nologging;
alter tablespace xxtbs06 logging;

查看当前的数据库大小
SQL> show parameter db_block_size
NAME TYPE VALUE
------------------------------------ -----------------------------------------
db_block_size integer 8192

SQL> show parameter cache_size
NAME TYPE VALUE
------------------------------------ -----------------------------------------
db_16k_cache_size big integer 0
db_2k_cache_size big integer 0
db_32k_cache_size big integer 0
db_4k_cache_size big integer 0
db_8k_cache_size big integer 0
db_cache_size big integer 0

创建数据库高速缓存区
alter system set db_32k_cache_size=1M scope=both;
show parameter db_32k_cache_size
create tablespace xxtbs08 datafile '/oradata/xxdb/xx0801.dbf' size 10mautoextend off blocksize 32K;
set long 100000
select dbms_metadata.get_ddl('TABLESPACE','xxtbs08') from dual

ERROR at line 1:
ORA-29339: tablespace block size 32768 does not match configured block sizescreate tablespace xxtbs09 datafile '/oradata/xxdb/xx0901.dbf' size 10mautoextend off blocksize 16K;

-----------------------------------------------------------------------

3.表空间与数据文件的迁移

-----------------------------------------------------------------------

--3.1 移动表空间中数据文件的路径

01.在线操作:

1.首先确定数据文件的状态要为offline

select tablespace_name,status,contents from dba_tablespaces;
select file_id,file_name,tablespace_name from dba_data_files where file_name like '%xxdb%' order by file_id;

--通过该语句查询数据文件的路径

2.将该表空间修改offline

alter tablespace xxtbs08 offline;
select tablespace_name,status,contents from dba_tablespaces;

--查看表空间状态确定修改成功

3.移动数据文件

--win

host copy c:\oradata\xxdb\xx01.dbf d:\oradata\xxdb\xx001.dbf

--unix/linux

host cp /oradata/xxdb/xx0801.dbf /oradata/xxdb/xx08001.dbf

.重新命名 该表空间的路径和名称

alter tablespace xxtbs08 rename datafile '/oradata/xxdb/xx0801.dbf' to '/oradata/xxdb/xx08001.dbf';

5.修改表空间的状态为online

alter tablespace xxtbs08 online;

6.检查表空间使用情况

select tablespace_name,status,contents from dba_tablespaces;
select file_id,file_name,tablespace_name from dba_data_files wheretablespace_name='xxtbs08';

方法2:

1.关闭db,启动到mount

shutdown immediate;
startup mount;

2.host copy/cp移动数据文件

#rm /oradata/xxdb/xx0801.dbf
host cp /oradata/xxdb/xx08001.dbf /oradata/xxdb/xx0801.dbf

3.通过alter database宠幸命名信息

alter database rename file '/oradata/xxdb/xx08001.dbf' to '/oradata/xxdb/xx0801.dbf';

4.打开数据库

alter database open;

5.检查状态

select file_id,file_name,tablespace_name,STATUS,ONLINE_STATUS fromdba_data_files where tablespace_name='xxtbs08';

--3.2 移动表或对象到别的表空间

a.检查信息与状态

b.移动对象(表)到另一个表空间

c.检查信息

d.通过重建索引的方法移动索引到另一个表空间

e.再检查确认

将xx迁移到xx01

create user xx identified by xx;
grant dba to xx;
create table xx.xxtable01(id number(12),c_data date);
insert into xx.xxtable01 values (1,sysdate);
insert into xx.xxtable01 values (2,sysdate);
insert into xx.xxtable01 values (3,sysdate);
insert into xx.xxtable01 values (4,sysdate);
insert into xx.xxtable01 values (5,sysdate);
commit;
create index xx.idx_xxtable01_id on xx.xxtable01('id');

--2.检查相关信息

col SEGMENT_NAME format a30
col TABLESPACE_NAME format a30
select segment_name,tablespace_name,extents,blocks from dba_segments where owner='xx';

查询索引或者表存放在那个表空间

col OBJECT_NAME format a30
col OBJECT_TYPE format a30
select object_id,object_name,object_type,status,created from dba_objectswhere owner='xx';
select index_name,table_name,tablespace_name,status from dba_indexes whereowner='xx';


--tbs:
select * from dba_segments where owner='xx' and segment_name in('xxtable01','IDX_xxtable01_ID')
select * from dba_indexes where owner='xx' andindex_name='IDX_xxtable01_ID';


--type:index and table
select * from dba_objects where owner='xx' and object_name in('xxtable01','IDX_xxtable01_ID')
alter table xx.xxtable01 move tablespace xxtbs02;
alter index xx.IDX_xxtable01_ID rebuild tablespace xxtbs02;
alter table xx.xxtable01 move lob(data) store as (tablespace xxtbs02);

select * from dba_segments where owner='xx' and segment_name in('xxtable01','IDX_xxtable01_ID')
select * from dba_indexes where owner='xx' andindex_name='IDX_xxtable01_ID';
select * from dba_objects where owner='xx' and object_name in('xxtable01','IDX_xxtable01_ID')

-----------------------------------------------------------------------

4.Oracle OMF管理数据文件

-----------------------------------------------------------------------

01.关于omf介绍

Oracle managed file 的缩写,简单的理解,就是 oracle 自己管理自己的文件

如果使用 Oracle 管理的文件,则不需要直接管理 Oracle DB 中的操作系统文件。可按照数据库对象而不是文件名指定操作。

数据库将根据需要,在内部使用标准文件系统接口创建或删除下列数据库结构的文件:

表空间

重做日志文件

控制文件

归档日志

块更改跟踪文件

闪回日志

RMAN 备份

02.如何查看当前系统是否使用了omf

show parameter db_create;

参数的值是空的,说明没有使用omf。

03.开始omf:

一共有3个参数

DB_CREATE_FILE_DEST 定义数据文件和临时文件默认文件系统目录的位置

DB_CREATE_ONLINE_LOG_DEST_n 定义重做日志文件和控制文件的创建位置

DB_RECOVERY_FILE_DEST 快速恢复区的默认位置

host mkdir -p /oracle/app/oracle/oradata2
alter system set db_create_file_dest='/oracle/app/oracle/oradata2';

04.使用omf方式

--asm:

oracle asm 默认就是采用了omf文件管理方式

create tablespace xxtbs08 datafile '+dgdata01' size 2m autoextend off;

--fs:

create tablespace xxomf01;
CREATE TABLESPACE xxomf02 datafile size 1M;
select tablespace_name,file_name,bytes/1024/1024 M from dba_data_files where tablespace_name='xxomf01';
select tablespace_name,file_name,bytes/1024/1024 M from dba_data_files where tablespace_name='xxomf02';

使用omf的数据库也可以按照正常的方式添加数据文件

alter tablespace xxomf02 add datafile '/oradata/xxdb/xxomf02.dbf' size 1M;
select tablespace_name,file_name,bytes/1024/1024 M from dba_data_files where tablespace_name='xxomf02';

05.恢复标准的文件管理方式

alter system set db_create_file_dest=' ';
create tablespace xxomf03;

5.system与sysaux表空间满了怎么办?

-----------------------------------------------------------------------

方案1:扩展表空间

向表空间中添加数据文件

方案2:分析问题

4.1 syste表空间满了怎么办?

--检查非sys,system用户的数据是否存在system表空间

--报错

select * from dba_segments where tablespace_name='SYSTEM' and owner not in('SYS','SYSTEM') order by owner;

--2.存在业务用户的数据

--3.查询占用这个表空间最大的对象

--all

select bytes / 1024 / 1024, segment_name, segment_type, owner from dba_segments where tablespace_name='SYSTEM' order by bytes / 1024 / 1024 desc-- top 10

--top10

select * from (select bytes / 1024 / 1024, segment_name, segment_type, owner from dba_segments where tablespace_name='SYSTEM' order by bytes / 1024 / 1024 desc) where rownum <11

--5.扩大tablespace

alter tablespace system add datafile '/oradata/xxdb/system02.dbf' size 10mautoextend off;
alter tablespace system add datafile '/oradata/xxdb/system03.dbf' size 200mautoextend off;
select upper(f.tablespace_name) "TS-name",
d.tot_grootte_mb "TS-bytes(m)",
d.tot_grootte_mb - f.total_bytes "TS-used (m)",
f.total_bytes "TS-free(m)",
to_char(round((d.tot_grootte_mb - f.total_bytes) / d.tot_grootte_mb *100,2),'990.99') "TS-per"
from (select tablespace_name,
round(sum(bytes) / (1024 * 1024), 2) total_bytes,
round(max(bytes) / (1024 * 1024), 2) max_bytes
from sys.dba_free_space
group by tablespace_name) f,
(select dd.tablespace_name,
round(sum(dd.bytes) / (1024 * 1024), 2) tot_grootte_mb from sys.dba_data_files dd
group by dd.tablespace_name) d
where d.tablespace_name= f.tablespace_name
order by 5 desc;

5.2 sysaux表空间满了怎么办

--1.查看占用空间大的对象

select * from (select bytes / 1024 / 1024, segment_name, segment_type, owner from dba_segments where tablespace_name='SYSAUX' order by bytes / 1024 / 1024 desc) where rownum <11
select * from dba_segments where tablespace_name='SYSTEM' and owner not in('SYS','SYSTEM') order by owner;

--2.检查非sys,system用户的数据是否存在sysaux表空间

select * from dba_segments where tablespace_name='SYSAUX' and segment_name like '%MNR%'

可以使用v$sysaux_occupants视图来查看sysaux表空间里的组件信息

select * from v$sysaux_occupants where occupant_name='LOGMNR'

--2.移动

举例:

将logminer从sysaux表空间,迁移到users表空间,在还原回来

exec sys.dbms_logmnr_d.set_tablespace('USERS')

--3.验证

--注意,这里占空的空间变成了0,数据迁移到了users表空间

select OCCUPANT_NAME,OCCUPANT_DESC,SCHEMA_NAME,MOVE_PROCEDURE,SPACE_USAGE_KBYTESfrom v$sysaux_occupants where occupant_name='LOGMNR';
select * from dba_segments where tablespace_name='SYSAUX' and segment_namelike '%MNR%'
select * from dba_segments where segment_name like '%MNR%'

--4.还原

exec sys.dbms_logmnr_d.set_tablespace('SYSAUX')
select OCCUPANT_NAME,OCCUPANT_DESC,SCHEMA_NAME,MOVE_PROCEDURE,SPACE_USAGE_KBYTESfrom v$sysaux_occupants where occupant_name='LOGMNR';
--大小又变回来了。
SQL> drop tablespace SYSAUX including contents and datafiles;
drop tablespace SYSAUX including contents and datafiles
*
ERROR at line 1:
ORA-13501: Cannot drop SYSAUX tablespace B.SYSAUX 不能重命名
SQL> alter tablespace SYSAUX rename to DAVE;
alter tablespace SYSAUX rename to DAVE
*
ERROR at line 1:
ORA-13502: Cannot rename SYSAUX tablespace C.不能将 SYSAUX 改成只读
SQL> alter tablesapce SYSAUX read only;
alter tablesapce SYSAUX read only
*
ERROR at line 1:
ORA-00940: invalid ALTER command

-----------------------------------------------------------------------

6.临时表空间满时的处理方法

-----------------------------------------------------------------------

001.增加临时文件

alter tablespace temp add tempfile '/oradata/xxdb/temp02.dbf' size 10mautoextend off;

002.修改临时文件

alter database tempfile '/oradata/xxdb/temp02.dbf' resize 12m;

Locally Managed:

--当排序操作完成, 占用的空间并没有释放,仅仅是将它标记为空闲,并可重用。

--可以使用 shrink 来释放没有使用的空间

-- shrink 是一个 online 的操作,不影响其他的查询。

alter tablespace temp shrink space keep 200m;
alter tablespace temp shrink tempfile '/oradata/xxdb/temp02.dbf';

-----------------------------------------------------------------------

7.默认临时表空间temp过大的处理办法

-----------------------------------------------------------------------

select * from dba_temp_free_space;

--1.检查信息与状态

select d.tablespace_name,
space "sum_space(m)",
blocks sum_blocks,
used_space "used_space(m)",
round(nvl(used_space, 0) / space * 100, 2) "used_rate(%)",
nvl(free_space, 0) "free_space(m)"
from (select tablespace_name,
round(sum(bytes) / (1024 * 1024), 2) space,
sum(blocks) blocks
from dba_temp_files
group by tablespace_name) d,
(select tablespace_name,
round(sum(bytes_used) / (1024 * 1024), 2) used_space,round(sum(bytes_free) / (1024 * 1024), 2) free_spacefrom v$temp_space_header
group by tablespace_name) f
where d.tablespace_name= f.tablespace_name(+);

select * from dba_tablespaces where contents='TEMPORARY';
select username, temporary_tablespace from dba_users;
select name from v$tempfile;

--2.创建一个新的临时表空间

create temporary tablespace temp2 tempfile '/oradata/xxdb/temp2.dbf' size 200m;

--3.修改默认的temp表空间为新的临时表空间

alter database default temporary tablespace temp2;
--alter user xx temporary tablespace temp2;

--4.检查信息与状态


select * from dba_tablespaces where contents='TEMPORARY';
select username, temporary_tablespace from dba_users;
select name from v$tempfile;

--5.删除原来的默认临时表空间

drop tablespace temp including contents and datafiles;

--6.检查信息与状态

select * from dba_tablespaces where contents='TEMPORARY';

--7.重建默认temp表空间

create temporary tablespace temp tempfile '/oradata/xxdb/temp01.dbf' size 200m;

--8.还原默认temp表空间

alter database default temporary tablespace temp;
--alter user xx temporary tablespace temp;

--9.检查状态和信息

select username, temporary_tablespace from dba_users;
select * from dba_tablespaces where contents='TEMPORARY';


select d.tablespace_name,
space "sum_space(m)",
blocks sum_blocks,
used_space "used_space(m)",
round(nvl(used_space, 0) / space * 100, 2) "used_rate(%)",
nvl(free_space, 0) "free_space(m)"
from (select tablespace_name,
round(sum(bytes) / (1024 * 1024), 2) space,
sum(blocks) blocks
from dba_temp_files
group by tablespace_name) d,
(select tablespace_name,
round(sum(bytes_used) / (1024 * 1024), 2) used_space,round(sum(bytes_free) / (1024 * 1024), 2) free_spacefrom v$temp_space_header
group by tablespace_name) f
where d.tablespace_name= f.tablespace_name(+);

--10.删除中间转换的临时表空间

drop tablespace temp2 including contents and datafiles;

如果出现:

ERROR at line 1:

ORA-60100: dropping temporary tablespace with tablespace ID number (tsn) 3 isblocked due to sort segments

--sql

select se.username,
se.sid,
se.serial#,
su.extents,
su.blocks * to_number(rtrim(p.value)) as space,
tablespace,
segtype,
sql_text
from v$sort_usage su, v$parameter p, v$session se, v$sql s
where p.name='db_block_size'
and su.session_addr= se.saddr
and s.hash_value= su.sqlhash
and s.address= su.sqladdr
order by se.username, se.sid;

alter system kill session '2276,41013';
alter system kill session '3413,42903';
select * from dba_tablespaces where contents='TEMPORARY'
posted @ 2024-02-29 17:32  寻梦99  阅读(143)  评论(0)    收藏  举报