怎样删除oracle表空间和临时表空间

怎样删除oracle表空间和临时表空间,第1张

为什么要删呢?人家默认的temp表空间是oralce必须要有的,你实在想删了的话,那你必须要在删除temp之前把你的tempdefault设为默认临时表空间,然后再删,要不你删不掉的。其次temp oralce不建议删除,你如果想让用你现在的临时表空间你可以给你的用户去指定这个临时表空间为他的默认临时表空间

打印出SQL放到PL/SQL Devoloper 执行,报无法通过8(在表空间XXX中)扩展 temp 段,还有一个页面,可以查询出记录,但无法统计数据!

经过分析产生原因可能是:ORACLE临时段表空间不足,因为ORACLE总是尽量分配连续空间,一但没有足够的可分配空间或者分配不连续就会出现上述的现象。

解决方法:知道由于ORACLE将表空间作为逻辑结构-单元,而表空间的物理结构是数据文件,数据文件在磁盘上物理地创建,表空间的所有对象也存在于磁盘上,为了给表空间增加空间,就必须增加数据文件。先查看一下指定表空间的可用空间,使用视图SYSDBA_FREE_SPACE,视图中每条记录代表可用空间的碎片大小:

SQLSelect file_id,block_id,blocks,bytes from sysdba_free_space where tablespace_name=‘XXX’;

返回的信息可初步确定可用空间的最大块,看一下它是否小于错误信息中提到的尺寸,再查看一下缺省的表空间参数:

SQLSELECT INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,PCT_INCREASE FROM SYSDBA_TABLESPACES WHERE TABLESPACE_NAME='XXX';

通过下面的SQL命令修改临时段表空间的缺省存储值:

SQLALTER TABLESPACE name DEFAULT STORAGE (INITIAL64K NEXT 64K);适当增大缺省值的大小有可能解决出现的错误问题,也可以通过修改用户的临时表空间大小来解决这个问题:

SQLALTER USER username TEMPORARY TABLESPACE new_tablespace_name;

使用ALTER TABLESPACE命令,一但完成,所增加的空间就可使用,无需退出数据库或使表空间脱机,但要注意,一旦添加了数据文件,就不能再删除它,若要删除,就要删除表空间。

不喜欢用命令的朋友,也可以通过ORACLE工具 DBA STUDIO 找到出问题库的表空间,具体位置在存储-表空间-XXX,右拦一般信息,可以看到,数据文件使用情况,选择存储,可适当修改,初使大小,和下一个大小,问题可能会解决,然后选种XXX点鼠标右键,选择添加数据文件,适当修改一般信息的文件大小和存储的数据文件已满后自动扩展的增量大小,问题也可以解决!

由于临时表空间使用率过高,达到了百分之百,虽然没有任何的报错,但存在一定的隐患和告警信息,有待解决问题。由于临时表空间主要使用在以下几种情况:

1、order by or group by (disc sort占主要部分);

2、索引的创建和重创建;

3、distinct *** 作;

4、union & intersect & minus sort-merge joins;

5、Analyze *** 作;

6、有些异常也会引起TEMP的暴涨。

通过查询相关的资料,发现解决方案有如下几种:

一、重建临时表空间temp

Temporary tablespace是不能直接drop默认的临时表空间的,不过我们可以通过以下方法达到。

查看目前的Temporary Tablespace

SQL> select name from v$tempfile;

NAME

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

/dev/md/vg_yx_ora1/rdsk/d101

SQL> select username,temporary_tablespace from dba_users;

USERNAME TEMPORARY_TABLESPACE

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

SYS TEMP

SYSTEM TEMP

DBSNMP TEMP

JIFEN TEMP

AIDB TEMP

AIZZDB TEMP

UNIONMON TEMP

TEST TEMP

AISTAT TEMP

AILKSELECT TEMP

AIMON TEMP

USERNAME TEMPORARY_TABLESPACE

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

UNIONMONS TEMP

ACCOUNT TEMP

OFFICE TEMP

ZZDB TEMP

AIGDB TEMP

PERFSTAT TEMP

OUTLN TEMP

WMSYS TEMP

1创建中转临时表空间

create temporary tablespace TEMP1 tempfile '/dev/md/vg_yx_ora1/rdsk/d1017' SIZE 4089M;

2改变缺省临时表空间 为刚刚创建的新临时表空间temp1

alter database default temporary tablespace temp1;

3删除原来临时表空间

drop tablespace temp including contents and datafiles;

4重新创建临时表空间

create temporary tablespace TEMP tempfile '/dev/md/vg_yx_ora1/rdsk/d1016' SIZE 4089M;

5重置缺省临时表空间为新建的temp表空间

alter database default temporary tablespace temp;

6删除中转用临时表空间

drop tablespace temp1 including contents and datafiles;

以上的方法只是暂时释放了临时表空间的磁盘占用空间,是治标但不是治本的方法,真正的治本的方法是找出数据库中消耗资源比较大的sql语句,然后对其进行优化处理。下面是查询在sort排序区使用的执行耗时的SQL:

Select seusername,sesid,suextents,sublocksto_number(rtrim(pvalue))as Space,tablespace,segtype,sql_text

from v$sort_usage su,v$parameter p,v$session se,v$sql s

where pname='db_block_size' and susession_addr=sesaddr and shash_value=susqlhash and saddress=susqladdr order by seusername,sesid;

或是:

Select suusername,suExtents,tablespace,segtype,sql_text

from v$sort_usage su,v$sql s

Where suSQL_ID = sSQL_ID;

注:如果原临时表空间无用户使用(select tablespace_name,current_users,total_blocks,used_blocks,free_blocks,free_blocks/total_blocks from v$sort_segment;),如果是文件系统可以看看文件的时间戳。

二、修改参数(这个方案紧适用于8i及8i以下的版本)

修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。

SQL>alter tablespace temp increase 1;

SQL>alter tablespace temp increase 0;

三、Kill session

1、 使用如下语句a查看一下认谁在用临时段

SELECT seusername, seSID, seserial#, sesql_address, semachine, seprogram, suTABLESPACE,susegtype, suCONTENTS from

v$session se, v$sort_usage su WHERE sesaddr = susession_addr

2、kill正在使用临时段的进程

SQL>Alter system kill session 'sid,serial#';

3、把TEMP表空间回缩一下

SQL>Alter tablespace TEMP coalesce;

注:这处方法只能针对字典管理表空间(Dictionary Managed Tablespace)。于本地管理表空间(LMT:Local Managed Tablespace),不需要整理的。9i以后只能创建本地管理的表空间。

四、查询占用TEMP的SQL语句进行优化

SQL> select text from dba_views where view_name='SM$TS_FREE';

TEXT

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

select tablespace_name, sum(bytes) bytes from dba_free_space group by tables

查询谁在使用临时表空间:

select user,tablespace,blocks from v$sort_usage order by blocks;

哪个语句在使用临时表空间:

select sessusername,

sqlsql_text,

sortblocks

from v$session sess,

v$sqltext sql,

v$sort_usage sort

where sessserial#=sortsession_num

and sortsqladdr= sqladdress

and sortsqlhash = sqlhash_value

and sortblocks >200;

或者:

Select seusername,sesid,suextents,sublocksto_number(rtrim(pvalue))as Space,tablespace,segtype,sql_text

from v$sort_usage su,v$parameter p,v$session se,v$sql s

where pname='db_block_size' and susession_addr=sesaddr and shash_value=susqlhash and saddress=susqladdr

order by seusername,sesid;

总结:

由于查询用户和语句的使用临时表空间的情况,均没有发现问题,所以进行了临时表空间的清理 *** 作。

开发数据库服务器遇到这样的一个问题,使用了一段时间之的后,突然之间数据库就用不了了,现象是新连接连接不上,已经连接的执行sql时,报出tempdb日志满了,无法进行 *** 作的错误,而且控制台无法连接上服务器,所有 *** 作都无法正常进行。

经过上网查询,得知是tempdb日志满了,缺省情况下,tempdb数据库是放置在master设备上,容量为2M,而临时数据库是活动最为平凡的数据库常常被用来排序、创建临时表、重格式化等 *** 作,所以tempdb的优化应该受到特别的关注。安装Sybase的时候就应该把tempdb的空间扩大,并且最好新建一个表空间给它专门用。

正常的时候可以用sp_helpdb tempdb命令查看tempdb,可以看到tempdb占用空间的情况。

如果日志满了,可以执行dump tran tempdb with truncate_only或者dump tran  tempdb with no_log来清除日志,但是现在根本无法执行该语句,因为tempdb已经满了,根本没有空间来执行该语句(如果出现Sybase的服务也无法启动的情况就需要把jsj重启,然后再去启动Sybase的服务),这该怎么办,好像进入了一个死循环里,日志满了要清除,但因为满了又无法清除,看来只能先扩容了,现在已经没有一个空闲的表空间了,控制台根本无法连接上数据库,只能用语句来新建一个表空间,下面是新建表空间的语句:

执行disk init命令必须先执行use master命令。

disk init

name="tempdblog",

physname="D:/Sybase/tempdblog.dat",

vdevno=11,

size= 409600

go

新建好表空间后,将该空间分配给tempdb存放日志用如下命令:

alter database tempdb log on tempdblog=800

注执行上面的语句之前执行sp_helpdb tempdb命令发现db_size为12MB,执行完上面的语句后db_size变为812MB。alter database tempdb on tempdbdata=1024dump tran tempdb with truncate_only

或者 dump tran tempdb with no_log

如果不想占用master的空间,可以执行如下语句将master上为tempdb的空间删除:

sp_dropsegment "default",tempdb,master

sp_dropsegment logsegment,tempdb,master 还可以将临时数据库与高速缓冲进行绑定

tempdb数据库是活动最为平凡的数据库,常常被用来排序、创建临时表、重格式化等 *** 作,它会频繁地使用数据缓存,所以应为临时数据库创建高速缓存,从而可以使其常驻内存并有助于分散I/O,根据服务器的实际情况,我们为tempdb数据库创建100M的高速缓存,实现方法如下:

创建命名高速缓存

sp_cacheconfig “tempdb_cache”,”100m”,”mixed”

go

2、重新启动server

3、捆绑临时数据库到tempdb_cache高速缓存

sp_bindcache “tempdb_cache”, tempdb

go

以上就是关于怎样删除oracle表空间和临时表空间全部的内容,包括:怎样删除oracle表空间和临时表空间、ORACLE 临时表空间TEMP 满了怎么办、oracle 临时表空间使用过高怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/sjk/9833938.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存