ORACLE 临时表空间使用率过高的原因及解决方案(转)
- 格式:doc
- 大小:48.50 KB
- 文档页数:6
Oracle:Ora-01652⽆法通过128(在temp表空间中)扩展temp段的过程-解决步骤现象:查询select * from v$sql时提⽰“Ora-01652⽆法通过128(在temp表空间中)扩展temp段的过程”临时⽂件是不存储的,可以将数据库重启,重启后重建临时表空间;shutdown immediate;--关库startup;--启库alter pluggable database db_**open;--打开alter session set container=db_**;--切到⽬的数据库select*from v$tempfile;--查看临时⽂件状态或者⼿动创建临时⽂件。
下⾯是⼿动创建临时⽂件的步骤:解决步骤1、查询当前临时表空间的信息select*from dba_temp_filesFILE_NAME FILE_ID TABLESPACE_NAME BYTES BLOCKS STATUS RELATIVE_FNO AUTOEXTENSIBLE MAXBYTES MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS SHARED INST_ID --------- ------- --------------- ------ ------ ------- ------------ -------------- -------- --------- ------------ ---------- ----------- ------ -------(null) 3TEMP (null) (null) OFFLINE (null) (null) (null) (null) (null) (null) (null) SHARED (null)发现数据库并没有临时表空间2、查询库中的临时⽂件状态select name,status from v$tempfile;NAME STATUS-------------------------------------------------------------------------------------------- -------/oradata/cdbtest/CDB_TEST/91C8CF1A0C80626CE0535465A8C0455F/datafile/o1_mf_temp_gq1852yy_.dbf OFFLINE临时⽂件处于OFFLINE状态3、给临时表空间增加临时⽂件alter tablespace temp add tempfile '/oradata/cdbtest/CDB_TEST/temp/datafile/temp_clear_01.dbf' size 1024M此时需注意,数据库中需要存在⽬录“/oradata/cdbtest/CDB_TEST/temp/datafile/”,临时⽂件添加成功⾄于为什么在“/oradata/cdbtest"⽬录下,是通过show parameter db_create_file_dest参数,查看value值获得的。
Oracle 常见错误使用ORACLE的过程过,我们会经常遇到一些ORACLE产生的错误,对于初学者而言,这些错误可能有点模糊,而且可能一时不知怎么去处理产生的这些错误,本人就使用中出现比较频繁的错误代码一一做出分析,希望能够帮助你找到一个合理解决这些错误的方法,同时也希望你能够提出你的不同看法。
毕竟作为一种交流的手段,个人意见难免过于偏颇,而且也必定存在着不足,出错之处在所难免。
写这篇文章的目的就是想通过相互之间的交流共同促进,共同进步。
ORA-01650:unable to extend rollback segment NAME by NUM intablespace NAME产生原因:上述ORACLE错误为回滚段表空间不足引起的,这也是ORACLE数据管理员最常见的ORACLE错误信息。
当用户在做一个非常庞大的数据操作导致现有回滚段的不足,使可分配用的回滚段表空间已满,无法再进行分配,就会出现上述的错误。
解决方式:使用“ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size_of_file”命令向指定的数据增加表空间,根据具体的情况可以增加一个或多个表空间。
当然这与还与你主机上的裸盘设备有关,如果你主机的裸盘设备已经没有多余的使用空间,建议你不要轻意的增加回滚段表空间的大小,可使用下列的语句先查询一下剩余的tablespace 空间有多少:Select user_name,sql_text from V$open_cursor where user_name=‟‟;如果多余的空间比较多,就可以适当追加一个大的回滚段给表空间使用,从而避免上述的错误。
你也可以用以下语句来检测一下rollback segment的竞争状况:Select class,count from V$waitstat where calss in(‘system undo header’,’system undo block’,’undo header’,’undo block’);和Select sum(value) from V$sysstat where name in (…db_block_gets‟,‟consistents gets‟);如果任何一个class in count/sum(value)大于1%,就应该考虑增加rollback segment。
千里之行,始于足下。
oracle优化方法总结Oracle优化是提高数据库性能和响应能力的重要步骤。
本文总结了一些常见的Oracle优化方法。
1. 使用索引:索引是提高查询性能的主要方法。
通过在表中创建适当的索引,可以加快查询速度,并减少数据访问的开销。
但是要注意不要过度使用索引,因为过多的索引会增加写操作的开销。
2. 优化查询语句:查询语句的效率直接影响数据库的性能。
可以通过合理地编写查询语句来提高性能。
例如,使用JOIN来替代子查询,尽量避免使用通配符查询,使用LIMIT来限制结果集的大小等。
3. 优化表结构:表的设计和结构对数据库的性能也有很大的影响。
合理的表设计可以减少数据冗余和不必要的数据存储,提高查询速度。
例如,适当地使用主键、外键和约束,避免过多的数据类型和字段等。
4. 优化数据库参数设置:Oracle有很多参数可以用来调整数据库的性能。
根据具体的应用场景和需求,可以根据情况调整参数的值。
例如,调整SGA和PGA的大小,设置合适的缓冲区大小,调整日志写入方式等。
5. 使用分区表:当表的数据量很大时,可以考虑将表分成多个分区。
分区表可以加速查询和维护操作,提高数据库的性能。
可以按照时间、地域、业务等来进行分区。
6. 优化存储管理:Oracle提供了多种存储管理选项,如表空间和数据文件管理。
合理地分配存储空间和管理数据文件可以提高数据库的性能。
例如,定期清理无用的数据文件,使用自动扩展表空间等。
第1页/共2页锲而不舍,金石可镂。
7. 数据压缩:对于大量重复数据或者冷数据,可以考虑使用Oracle的数据压缩功能。
数据压缩可以减少磁盘空间的使用,提高IO性能。
8. 使用并行处理:对于大型计算或者批处理任务,可以考虑使用Oracle的并行处理功能。
并行处理可以将任务分成多个子任务,并行执行,提高处理能力和效率。
9. 数据库分区:对于大型数据库,可以考虑将数据库分成多个独立的分区。
数据库分区可以提高数据的并行处理能力,减少锁竞争和冲突,提高数据库的性能。
oracle sql 优化技巧(实用版3篇)目录(篇1)1.Oracle SQL 简介2.优化技巧2.1 减少访问数据库次数2.2 选择最有效率的表名顺序2.3 避免使用 SELECT2.4 利用 DECODE 函数2.5 设置 ARRAYSIZE 参数2.6 使用 TRUNCATE 替代 DELETE2.7 多使用 COMMIT 命令2.8 合理使用索引正文(篇1)Oracle SQL 是一款广泛应用于各类大、中、小微机环境的高效、可靠的关系数据库管理系统。
为了提高 Oracle SQL 的性能,本文将为您介绍一些优化技巧。
首先,减少访问数据库的次数是最基本的优化方法。
Oracle 在内部执行了许多工作,如解析 SQL 语句、估算索引的利用率、读数据块等,这些都会大量耗费 Oracle 数据库的运行。
因此,尽量减少访问数据库的次数,可以有效提高系统性能。
其次,选择最有效率的表名顺序也可以明显提升 Oracle 的性能。
Oracle 解析器是按照从右到左的顺序处理 FROM 子句中的表名,因此,合理安排表名顺序,可以减少解析时间,提高查询效率。
在执行 SELECT 子句时,应尽量避免使用,因为 Oracle 在解析的过程中,会将依次转换成列名,这是通过查询数据字典完成的,耗费时间较长。
DECODE 函数也是一个很好的优化工具,它可以避免重复扫描相同记录,或者重复连接相同的表,提高查询效率。
在 SQLPlus 和 SQLForms 以及 ProC 中,可以重新设置 ARRAYSIZE 参数。
该参数可以明显增加每次数据库访问时的检索数据量,从而提高系统性能。
建议将该参数设置为 200。
当需要删除数据时,尽量使用 TRUNCATE 语句替代 DELETE 语句。
执行 TRUNCATE 命令时,回滚段不会存放任何可被恢复的信息,所有数据不能被恢复。
因此,TRUNCATE 命令执行时间短,且资源消耗少。
在使用 Oracle 时,尽量多使用 COMMIT 命令。
SYSAUX表空间满对数据库的影响以及解决措施转载最后发布于2018-01-01 22:59:25 阅读数 681 收藏1.概要SYSAUX表空间满了,会影响登录嘛?会影响数据库正常运⾏吗?怎么处理呢?容易的想到,增加空间,删除被耗的空间,⾸先恢复⽣产业务为重。
对于排查消耗SYSAUX空间⼤的对象,⽆论哪个版本,都⼀样,查看是否存放较⼤的业务表,或者个⼈的中间表。
对于12C来说,更加关注的⼀个就是:数据库的audit_trail审计参数是否为开启的,如果该参数值为DB,则关注ausdsys模式下的audsys组件,即audsys.CLI_SWP$459d3b9$1$1表的lob段SYS_LOB0000091784C00014$$的⼤⼩。
如果为NONE,则和10G与11G的排查⼀样的思路去排查SYSAUX⾥的⼤对象。
2.案例分析1、备份检查在⽇常的备份维护当中,从备份检查集中采集的结果发现,多个库的归档备份失败。
2、检查归档备份或者全库的备份的⽇志输出3、检查catalog库的audit_trail参数values=’DB’.4、查看该库的alert⽇志:5、查看消耗SYSAUX表空间⼤的对象(段):其中,audsys组件的lob段占了31.5G。
6、尝试使⽤sys⽤户对该lob段对应的表进⾏truncate:发现sys⽤户也没有权限。
7、使⽤存储过程执⾏清理:begindbms_audit_mgmt.clean_audit_trail(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,use_last_arch_timestamp => FALSE);end;/附:oracle官⽹提供的清理⽅法,查看:1>.exec DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP ( -AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, -LAST_ARCHIVE_TIME => sysdate);2>.exec DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL( -AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, -USE_LAST_ARCH_TIMESTAMP => TRUE);8、检查sysaux表空间释放,调整审计参数audit_trail参数values=’NONE’。
ORACLE 数据库故障解决方案引言概述:ORACLE 数据库是目前企业常用的一种数据库管理系统,但在使用过程中难免会遇到各种故障。
本文将介绍一些常见的 ORACLE 数据库故障,并提供相应的解决方案,帮助读者更好地应对数据库故障。
一、数据库连接问题1.1 连接超时:当数据库连接超时时,可以通过增加连接超时时间的方式解决。
在 ORACLE 数据库中,可以通过修改 sqlnet.ora 文件中的SQLNET.INBOUND_CONNECT_TIMEOUT 参数来设置连接超时时间。
1.2 连接被拒绝:如果数据库连接被拒绝,可能是由于数据库实例未启动、监听器未启动或者网络故障等原因导致。
解决方案包括启动数据库实例、启动监听器以及检查网络连接是否正常。
1.3 连接池问题:当数据库连接池达到最大连接数时,新的连接请求会被拒绝。
解决方案包括增加连接池的最大连接数、释放闲置连接以及优化数据库连接的使用。
二、数据丢失问题2.1 意外删除数据:当数据被意外删除时,可以通过数据库备份和恢复的方式解决。
可以使用RMAN 工具进行数据库备份,并在需要时使用备份进行恢复操作。
2.2 数据库文件损坏:当数据库文件损坏时,可以使用 RMAN 工具进行数据库文件的修复。
RMAN 提供了诊断和修复数据库文件的功能,可以帮助解决数据库文件损坏的问题。
2.3 数据库坏块:当数据库出现坏块时,可以使用 RMAN 工具进行坏块的修复。
RMAN 提供了坏块检测和修复的功能,可以帮助解决数据库坏块问题。
三、性能问题3.1 慢查询:当数据库查询变慢时,可以通过优化查询语句、创建索引、增加硬件资源等方式解决。
可以使用 Explain Plan 工具来分析查询语句的执行计划,找出慢查询的原因,并进行相应的优化。
3.2 死锁:当数据库出现死锁时,可以通过锁等待超时、死锁检测和解锁等方式解决。
可以使用 V$LOCK 和 V$SESSION 视图来查看当前的锁信息,并根据情况进行相应的解锁操作。
O r a c l e常见错误及解决方案问题1:Oracle服务器进入PL/SQL Developer时报ora-01033:oracle initialization or shutdown in progress 错误提示,应用系统无法连接Oracle服务。
解决方法如下:⑴进入CMD,执行set ORACLE_SID=fbms,确保连接到正确的SID;⑵运行sqlplus "/as sysdba"SQL>shutdown immediate停止服务SQL>startup启动服务,观察启动时有无数据文件加载报错,并记住出错数据文件标号SQL>shutdown immediate再次停止服务SQL>startup mountSQL> recover datafile 2恢复出错的数据文件SQL>shutdown immediate再次停止服务SQL>startup启动服务,此次正常。
⑶进入PL/SQL Developer检查,没有再提示错误。
问题2:Oracle密码忘记了怎么办?解决方法有很多种,这里讲述以下三种:⑴打开cmd,输入sqlplus /nolog,回车;输入“conn / as sysdba”;输入“alter user sys identified by 新密码”。
注意:新密码最好以字母开头,否则可能出现错误Ora-00988。
有了这个方法后,只要自己对oracle 服务器有管理员权限,Oracle密码忘记了也不用着急,可以随意修改密码。
⑵在命令行执行如下命令:sqlplus "/@服务名as sysdba"然后在sqlplus中运行以上命令即可修改密码:alter user sys identified by 新密码;alter user system identified by 新密码;⑶运行到C盘根目录输入:SET ORACLE_SID = 你的SID名称输入:sqlplus/nolog输入:connect/as sysdba输入:alert user sys identified by sys输入:alert user system identified by system完成以上5步,则密码更改完成,密码是Oracle数据库的初始密码。
sysaux表空间增⼤的⼏种情况及解决办法sysaux表空间会因为多种情况⽽增⼤,以下介绍⼏种情况及解决办法1、由于设置了awr快照基线导致awr⽆法purge--查看sysaux表空间内容占⽤情况SELECT occupant_name "Item",space_usage_kbytes / 1048576 "Space Used (GB)",schema_name "Schema",move_procedure "Move Procedure"FROM v$sysaux_occupantsORDER BY 1 ;--查询sysaux表空间排名前20的⼤段对象select owner, segment_name, segment_type, bytes / 1024 / 1024from (select *from dba_segmentswhere tablespace_name = 'SYSAUX'order by bytes desc)where rownum < 20;--查看awr的保留属性select * from dba_hist_wr_control;--查看awr的最⼤、最⼩快照号select max(snap_id), min(snap_id) from sys.WRM$_SNAPSHOT;--查看数据库dbidselect dbid from v$database;--查看awr相关的基线情况select * from dba_hist_baseline_details;--删除指定的基线EXECUTE DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(baseline_name => 'test_baseline');--清理指定范围的awr快照begindbms_workload_repository.drop_snapshot_range(low_snap_id => 4217,high_snap_id => 4218,dbid => 2513064869);end;/2、WRH A CTIVE S ESSION H ISTORY表未⾃动purge参考MOS:WRH_ACTIVE_SESSION_HISTORY Does Not Get Purged Based Upon the Retention Policy (⽂档 ID 387914.1)--检查WRH$_ACTIVE_SESSION_HISTORY表的分区情况SELECT owner,segment_name,partition_name,segment_type,bytes/1024/1024/1024 Size_GBFROM dba_segmentsWHERE segment_name='WRH$_ACTIVE_SESSION_HISTORY';--⼿⼯为WRH$_ACTIVE_SESSION_HISTORY表进⾏分区,可重复执⾏alter session set "_swrf_test_action" = 72;--检查WRH$_ACTIVE_SESSION_HISTORY表的分区情况SELECT owner,segment_name,partition_name,segment_type,bytes/1024/1024/1024 Size_GBFROM dba_segmentsWHERE segment_name='WRH$_ACTIVE_SESSION_HISTORY';之后oracle内部调⽤⾃动清理作业会purge该表的相关分区3、WRH S QL P LAN表未⾃动purge参考MOS:HowtoPurgeWRH_SQL_PLAN Table in AWR Repository, Occupying Large Space in SYSAUX Tablespace. (⽂档 ID 1478615.1)⽅法1:可能⽆效--查看WRH$_SQL_PLAN表总⾏数select count(*) from sys.wrh$_sql_plan;--查看数据库dbidSELECT dbid FROM v$database;--清理WRH$_SQL_PLAN表(官⽅⽂档未记录该函数)exec dbms_workload_repository.purge_sql_details(1000, &dbid);--查看WRH$_SQL_PLAN表总⾏数select count(*) from sys.wrh$_sql_plan;⽅法2:--查看WRH$_SQL_PLAN表记录的最⼩时间戳select min(TIMESTAMP) from wrh$_sql_plan;--⼿⼯清理WRH$_SQL_PLAN表,删除dba_hist_snapshot记录时间戳范围外的数据(耗时随数据量增加⽽延长,注意undo空间使⽤情况)delete from wrh$_sql_plan where trunc(TIMESTAMP) < (select min(BEGIN_INTERVAL_TIME) from dba_hist_snapshot);--查看WRH$_SQL_PLAN表总⾏数select count(*) from sys.wrh$_sql_plan;4、WRI$_OPTSTAT_TAB_HISTORY表未⾃动purge参考MOS:SYSAUX Grows Because Optimizer Stats History is Not Purged (⽂档 ID 1055547.1)原因:由于oracle内部⾃动purge WRIO PTSTAT T AB H ISTORY表的JOB存在5分钟的窗⼝限制,因此5分钟内未清理完成则JOB失败,该MOS提供的清理⽅式未必⽣效,建议定位到_OPTSTAT_TAB_HISTORY表的sql,⼿⼯进⾏清理--查看sysaux表空间内容占⽤情况SELECT occupant_name "Item",space_usage_kbytes / 1048576 "Space Used (GB)",schema_name "Schema",move_procedure "Move Procedure"FROM v$sysaux_occupantsORDER BY 1 ;--查询sysaux表空间排名前20的⼤段对象select owner, segment_name, segment_type, bytes / 1024 / 1024from (select *from dba_segmentswhere tablespace_name = 'SYSAUX'order by bytes desc)where rownum < 20;--通过awr、ash排查问题时间段⾃动purge的sql--追溯sql的执⾏计划,建⽴合适的索引后,⼿⼯执⾏purge sql--降低删除历史信息数据表的⾼⽔位线,并重建索引注:move表前,导出表的所有对象定义(索引、约束、触发器等),move前、后检查所有对象的可⽤状态是否⼀致--检查I_WRI$_OPTSTAT_IND_OBJ#_ST索引状态select status from dba_indexes where index_name='I_WRI$_OPTSTAT_IND_OBJ#_ST';--导出索引定义,最好get_ddl和PLSQL的查看sql定义都导出select dbms_metadata.get_ddl('INDEX','I_WRI$_OPTSTAT_TAB_ST','SYS') from dual;--move WRI$_OPTSTAT_TAB_HISTORY表,降低⾼⽔位alter table WRI$_OPTSTAT_TAB_HISTORY move;--重建索引alter index sys.I_WRI$_OPTSTAT_TAB_ST rebuild;--检查I_WRI$_OPTSTAT_IND_OBJ#_ST索引状态select status from dba_indexes where index_name='I_WRI$_OPTSTAT_IND_OBJ#_ST';Processing math: 100%。
ora表空间压缩Oracle数据库提供了多种方法来压缩表空间以减小存储空间的使用。
以下是一些常见的方法:表压缩:Oracle提供了基于列的表压缩功能,通过使用COMPRESS 子句来减小表的存储空间。
例如:ALTER TABLE your_table COMPRESS FOR OLTP;FOR OLTP 是一种压缩级别,适用于在线事务处理系统。
你还可以选择其他压缩级别,如 FOR QUERY LOW、FOR QUERY HIGH 等,具体取决于你的需求。
分区表压缩:如果你的表是分区的,可以对表的分区进行压缩。
例如:ALTER TABLE your_partitioned_table MODIFY PARTITION your_partition COMPRESS;LOB(Large Object)压缩:对包含大对象(LOB)的表进行压缩。
LOB压缩需要使用 COMPRESS 选项。
例如:ALTER TABLE your_table MODIFY LOB(your_lob_column) (COMPRESS);表空间压缩:对整个表空间进行压缩。
可以使用ALTER TABLESPACE 语句来启用表空间压缩。
例如:ALTER TABLESPACE your_tablespace COMPRESS;请注意,表空间压缩可能需要额外的许可证。
在执行这些压缩操作之前,请务必在生产环境之外的测试环境中进行测试,以确保没有意外的影响。
压缩操作可能会导致表的性能提升,但也可能对一些特定的查询造成影响。
因此,在应用压缩之前,建议仔细评估你的应用和系统需求。
请记住,在压缩表或表空间之前,最好对表和索引进行适当的分析,以确保压缩是有益的,并且不会对性能产生负面影响。
数据库服务器CPU占用率太高原因分析及后续改进措施一.原因分析本次正式数据库服务器CPU占用率太高导致应用无法连接数据库无法链接主要有以下两个方面的原因:1.作为维护人员责任心不够,未能及时发现数据库存在的问题导致问题积累以致系统无法响应。
2.在开发过程中还是存在部分SQL语句不规范以及索引未创建或者创建不合理的问题。
二.改进措施1.数据库日常监控在日常维护工作中增加对数据库服务器CPU及内存占用情况的监控,定期抽取占用CPU及内存较大的SQL语句基于以下两个原则进行优化:1.1、因未创建索引或者因索引创建不合理导致为起到应有作用原因导致的占用CPU或内存较高或运行时间较长的SQL,在找到原因后直接进行处理以达到解决问题的目的。
1.2、如因SQL本身不够优化导致占用CPU或内存较高或运行时间较长的,提取出后将SQL发给相关开发人员,由开发人员在应用中进行修改。
2.增加性能及压力测试与甘工沟通后,就公司后期项目特别是B/S类项目,在项目正式上线前增加性能及压力测试,同时在数据库方面尽量模拟系统实际上线后的环境,以便通过性能及压力测试及时发现数据库方面的瓶颈,及时发现不够合理的SQL并进行优化。
3.在日常开发中SQL优化方面注意的问题SQL Select语句完整的执行顺序:1、from子句组装来自不同数据源的数据;2、where子句基于指定的条件对记录行进行筛选;3、group by子句将数据划分为多个分组;4、使用聚集函数进行计算;5、使用having子句筛选分组;6、计算所有的表达式;7、使用order by对结果集进行排序。
SQL优化方面注意问题1、ORACLE采用自下而上的顺序解析WHERE子句根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.2、FROM子句中的表明采用从右往左的的顺序处理,因此在FROM子句中写在最后的表(基础表)最先被处理。
ora-01652⽆法通过128(在表空间temp中)扩展temp段问题描述:今天建索引的时候报:ora-01652⽆法通过128(在表空间temp中)扩展temp段1.查看表空间是⾃动增长,且建表空间时是没有设表空间最⼤值的。
2.查看了⼀下表空间剩余多少竟然只有14M,感觉很奇怪,为什么没有⾃动增长呢?3.查看表空间⽂件已经快32G,这样就明⽩了。
原因是:oracle中⼀个数据⽂件的最⼤值(⾮lob)为32G,如果你的数据⽂件已经达到32G, 那么不管你是插⼊数据,建索引,都会报“解决ora-01652⽆法通过128(在表空间temp中)扩展temp段”解决⽅法: 再加⼀个数据⽂件,脚本如下: ALTER TABLESPACE "表空间名"ADDDATAFILE 'D:\oracle\product\11.2.0\ORADATA\FLW2.DBF' SIZE 5000M⽤oracle 管理器,在存储-表空间,⾥同样可以设。
表空间路径:'D:\oracle\product\11.2.0\ORADATA\FLW2.DBF'表空间初始值:5000M查看表空间还有多少⼤⼩语句:Select a.Tablespace_Name, Total, Free, Total - Free UsedFrom (Select Tablespace_Name, Sum(Bytes) / 1024 / 1024 TotalFrom Dba_Data_Files group By Tablespace_Name) a, (Select Tablespace_Name, Sum(Bytes) / 1024 / 1024 FreeFrom Dba_Free_Space group By Tablespace_Name) b where a.Tablespace_Name = b.Tablespace_Name;查看⼀个表空间是否允许⾃动增长语句:SELECT FILE_NAME, TABLESPACE_NAME, AUTOEXTENSIBLE FROM DBA_DATA_FILES;。
SYSTEM表空间满,解决⽅法SYSTEM表空间是Oracle创建数据库时候⾃动创建的,每个都会有SYSTEM表空间,⽽且SYSTEM表空间总是要保持在联机模式下,因为其包含了数据库运⾏所要求的基本信息,如:、联机求助机制、所有回退段、临时段和⾃举段、所有的⽤户数据库实体、其它ORACLE软件产品要求的表等等。
设置⽅法在建⽴数据库的时候,SYSTEM表空间⼀般都写在磁盘最开始的位置,这就埋下了问题的隐患。
如:误操作导致的格式化,ASM出现故障等等⼀系列的问题,他都会从最开始的地⽅写起,这样就会导致SYSTEM表空间没有办法进⾏。
但是,如果在建⽴数据库的时候,把最开始的位置“让”出来,这样就会使得很多故障轻能⽽易举的解决,也让DBA在管理数据库、恢复数据库的时候能轻松⼀些。
查询Oracle表空间剩余⼤⼩---查询Oracle表空间使⽤情况--SELECT-- '表空间名称'a.tablespace_name as "表空间名称",-- 表空间总⼤⼩(byte)total as "表空间总⼤⼩(byte)",-- 表空间剩余⼤⼩(byte)free as "表空间剩余⼤⼩(byte)",-- 表空间已使⽤⼤⼩(byte)(total - free) as "表空间已使⽤⼤⼩(byte)",-- 表空间总⼤⼩(G)total / (1024 * 1024 * 1024) as "表空间总⼤⼩(G)" ,-- 表空间剩余⼤⼩(G)free / (1024 * 1024 * 1024) as "表空间剩余⼤⼩(G)",-- 表空间已使⽤⼤⼩(G)(total - free) / (1024 * 1024 * 1024) as "表空间已使⽤⼤⼩(G)" ,round((total - free) / total, 4) * 100 as "Usage Rate(%)"FROM (SELECT tablespace_name, SUM(bytes) free FROM dba_free_space GROUP BY tablespace_name) a,(SELECT tablespace_name, SUM(bytes) total FROM dba_data_files GROUP BY tablespace_name) bWHERE a.tablespace_name = b.tablespace_name;这⾥的system使⽤率达到了99.27%,接下来登⼊数据库服务器为system添加表空间Linux系统下使⽤SQLPLUS命令登⼊Oracle1. 输⼊: su oracle // 必须使⽤oracle ⽤户说明: 直接进⼊的⽬录是 /home/oraccle[root@crb-db1 ~]# su - oracleLast login: Tue May 11 10:47:23 CST 2021 on pts/0[oracle@crb-db1 ~]$ sqlplus as / sysdbaSQL*Plus: Release 11.2.0.4.0 ProductionCopyright (c) 1982, 2013, Oracle. All rights reserved.使⽤ SQL*Plus 执⾏ SQL, PL/SQL 和 SQL*Plus 语句。
解决Oracle CPU高度消耗(100%)的数据库问题1、首先我们通过top命令来查看:$ topload averages: 1.61, 1.28, 1.25 HSWAPJSDB 10:50:44172 processes: 160 sleeping, 1 running, 3 zombie, 6 stopped, 2 on cpuCPU states: % idle, % user, % kernel, % iowait, % swap Memory: 4.0G real, 1.4G free, 1.9G swap in use, 8.9G swap freePID USERNAME THR PR NCE SIZE RES STATE TIME FLTS CPU COMMAND20521 oracle 1 40 0 1.8G 1.7G run 6:37 0 47.77% oracle20845 oracle 1 40 0 1.8G 1.7G cpu02 0:41 0 40.98% oracle20847 oracle 1 58 0 1.8G 1.7G sleep 0:00 0 0.84% oracle20780 oracle 1 48 0 1.8G 1.7G sleep 0:02 0 0.83% oracle15828 oracle 1 58 0 1.8G 1.7G sleep 0:58 0 0.53% oracle20867 root 1 58 0 4384K 2560K sleep 0:00 0 0.29% sshd220493 oracle 1 58 0 1.8G 1.7G sleep 0:03 0 0.29% oracle20887 oracle 1 48 0 1.8G 1.7G sleep 0:00 0 0.13% oracle20851 oracle 1 58 0 1.8G 1.7G sleep 0:00 0 0.10% oracle20483 oracle 1 48 0 1.8G 1.7G sleep 0:00 0 0.09% oracle20875 oracle 1 45 0 1064K 896K sleep 0:00 0 0.07% sh20794 oracle 1 58 0 1.8G 1.7G sleep 0:00 0 0.06% oracle20842 jiankong 1 52 2 1224K 896K sleep 0:00 0 0.05% sadc20888 oracle 1 55 0 1712K 1272K cpu00 0:00 0 0.05% top19954 oracle 1 58 0 1.8G 1.7G sleep 84:25 0 0.04% oracle注释:现在你可以发现在进程列表里,存在两个高CPU耗用的Oracle进程,他们分别消耗了47.77%和40.98%的CPU资源。
oracle扩展表空间的三种方法一、Oracle扩展表空间的三种方法1、使用SQL语句ALTER TABLESPACE来扩展表空间当表空间上的数据文件已经被使用完毕,而且还需要更多的存储空间,我们就需要对表空间进行扩展,此时可以使用SQL语句ALTER TABLESPACE来扩展表空间。
使用ALTER TABLESPACE 扩展表空间的具体步骤如下:A. 增加一个新的数据文件:CREATE DATAFILE 'C:\oradata\data02.dbf' SIZE 500M;B. 将新建立的数据文件添加到表空间中:ALTER TABLESPACE USERS ADD DATAFILE'C:\oradata\data02.dbf';C. 重新启动数据库:SHUTDOWN IMMEDIATE;STARTUP;2、使用SQL语句ALTER DATABASE来扩展表空间在使用ALTER TABLESPACE 来扩展表空间的过程中,有时可能会出现报错,比如文件系统空间不够等情况,此时就可以使用SQL语句ALTER DATABASE来扩展表空间。
使用ALTER DATABASE 扩展表空间的具体步骤如下:A. 增加一个新的数据文件:CREATE DATAFILE 'C:\oradata\data02.dbf' SIZE 500M;B. 将新建立的数据文件添加到表空间中:ALTER DATABASE ADD DATAFILE'C:\oradata\data02.dbf' TO TABLESPACE USERS;C. 重新启动数据库:SHUTDOWN IMMEDIATE;STARTUP;3、使用Oracle Enterprise Manager来扩展表空间Oracle Enterprise Manager是一个功能强大的管理工具,可以帮助用户管理Oracle数据库。
Oracle数据库操作常见错误及解决方案这个错误通常发生在尝试查询一个表或视图但该表或视图不存在时。
解决方案是确保表或视图存在,并且用正确的名称引用它们。
使用DESCRIBE命令或查询SYS.ALL_TABLES视图来验证表或视图是否存在。
另外,确保用户有足够的权限来访问表或视图。
这个错误发生在使用无效的用户名或密码来连接到Oracle数据库时。
解决方案是确保提供了正确的用户名和密码,并且用户在数据库中存在且密码正确。
可以通过使用SQL*Plus或Oracle SQL Developer来验证用户名和密码是否正确。
这个错误通常发生在尝试使用无效的数字进行数值计算时,例如将一个字符串转换为数字时。
解决方案是确保提供的值是有效的数字。
可以使用TO_NUMBER函数将字符串转换为数字,并使用TO_CHAR函数将数字转换为字符串。
这个错误通常发生在尝试向一个非空列插入NULL值时。
解决方案是确保插入的值不为NULL,并与列的数据类型匹配。
如果希望列允许NULL 值,可以修改表定义以允许NULL值。
这个错误通常发生在使用无效的列名或对象名称时。
解决方案是确保引用的列名或对象名称存在且正确。
可以使用DESCRIBE命令或查询SYS.ALL_TAB_COLUMNS视图来验证列名或对象名称是否正确。
这个错误通常发生在使用不存在的函数、过程或包体时。
解决方案是确保引用的函数、过程或包体存在且正确。
可以使用DESCRIBE命令或查询SYS.ALL_PROCEDURES和SYS.ALL_PACKAGES视图来验证对象是否存在。
这个错误通常发生在无法解析TNS服务名称时。
解决方案是确保TNS 服务名称正确,并且TNS配置文件(tnsnames.ora)中包含了正确的服务定义。
可以使用lsnrctl命令来验证TNS服务是否可用。
这个错误通常发生在无法连接到Oracle数据库时。
解决方案是确保Oracle数据库监听程序正在运行,并且可以通过网络访问。
Oracle的SQL语句执行效率问题查找与解决方法一、识别占用资源较多的语句的方法(4种方法)1.测试组和最终用户反馈的与反应缓慢有关的问题。
2.利用V_$SQLAREA视图提供了执行的细节。
(执行、读取磁盘和读取缓冲区的次数)•数据列EXECUTIONS:执行次数DISK_READS:读盘次数COMMAND_TYPE:命令类型(3:select,2:insert;6:update;7delete;47:pl/sql程序单元)OPTIMIZER_MODE:优化方式SQL_TEXT:Sql语句SHARABLE_MEM:占用shared pool的内存多少BUFFER_GETS:读取缓冲区的次数•用途1、帮忙找出性能较差的SQL语句2、帮忙找出最高频率的SQL3、帮忙分析是否需要索引或改善联接3.监控当前Oracle的session,如出现时钟的标志,表示此进程中的sql运行时间较长。
4.Trace工具:a)查看数据库服务的初始参数:timed_statistics、user_dump_dest和max_dump_file_sizeb)Step 1: alter session set sql_trace=truec)Step 2: run sql;d)Step 3: alter session set sql_trace=falsee)Step 4:使用“TKPROF”转换跟踪文件f)Parse,解析数量大通常表明需要增加数据库服务器的共享池大小,query或current提取数量大表明如果没有索引,语句可能会运行得更有效,disk提取数量表明索引有可能改进性能,library cache中多于一次的错过表明需要一个更大的共享池大小二、如何管理语句处理和选项•基于成本(Cost Based)和基于规则(Rule Based)两种优化器,简称为CBO 和RBO •Optimizer Mode参数值:Choose:如果存在访问过的任何表的统计数据,则使用基于成本的Optimizer,目标是获得最优的通过量。
SQL文件占用大量空间解决方法当SQL文件占用大量空间时,可以采取以下解决方法:1.数据库优化:-删除不必要的数据:检查数据库中是否存在过期或无用数据,可以使用查询语句删除不再需要的数据记录。
同时,可以定期清理日志文件和临时文件。
-压缩表格:对数据库中的表进行压缩,可以节省存储空间。
压缩可以通过重新构建表格或使用特定的压缩算法来实现。
-优化查询语句:检查数据库的查询语句,确保它们能够高效地执行。
可以通过添加索引、优化联接和减少冗余查询等方式来提高查询性能。
2.分区表:-分区表是将大表分成多个逻辑区域的方法,每个区域是一个独立的物理对象,可以单独管理。
使用分区表可以减少磁盘空间的使用,提高查询性能。
-根据业务需求将表按照时间范围、地理位置等方式分区,将不经常访问的数据存储在较慢的媒介上,如归档表或冷存储。
3.数据压缩:-数据压缩是减少SQL文件大小的有效方法。
可以使用数据库管理系统提供的压缩功能,或者使用第三方压缩工具对数据库文件进行压缩。
压缩后的文件需要时解压缩才能使用。
4.备份和归档:-可以定期备份数据库,并将备份数据迁移到离线存储介质上,如磁带库。
备份后,可以通过删除原始数据文件释放存储空间。
归档数据库文件可以将不再经常访问的数据存储在归档库中,从而优化存储空间的使用。
5.增加硬盘空间:-如果以上方法无法解决空间问题,可以考虑增加硬盘空间。
这可以通过添加新的硬盘驱动器、扩展存储区域网络(SAN)或使用云存储等方式来实现。
增加硬盘空间后,可以将数据库文件迁移到新的硬盘上。
6.数据库分片:-数据库分片是将数据库分配到多个服务器上的方法,每个服务器上存储一部分数据。
这可以通过水平分片(将表按照一些字段分割)或垂直分片(将表按照列分割)来实现。
数据库分片可以提高查询性能,并减少存储空间的使用。
7.数据库压缩工具:-可以使用专门的数据库压缩工具来压缩SQL文件,这些工具能够对数据进行高效的压缩和解压缩,从而减少存储空间的使用。
【转】ORACLE 临时表空间使用率过高的原因及解决方案在数据库的日常学习中,发现公司生产数据库的默认临时表空间temp使用情况达到了30G,使用率达到了100%;待调整为32G后,使用率还是为100%,导致磁盘空间使用紧张。
根据临时表空间的主要是对临时数据进行排序和缓存临时数据等特性,待重启数据库后,temp 会自动释放。
于是想通过重启数据库的方式来缓解这种情况,但是重启数据库之后,发现临时表空间temp的使用率还是100%,一点没变。
虽然运行中应用暂时没有报什么错误,但是这在一定程度上存在一定的隐患,有待解决该问题。
由于临时表空间主要使用在以下几种情况:1、order by or group by (disc sort占主要部分);2、索引的创建和重创建;3、distinct操作;4、union & intersect & minus sort-merge joins;5、Analyze 操作;6、有些异常也会引起TEMP的暴涨。
Oracle临时表空间暴涨的现象经过分析可能是以下几个方面的原因造成的:1. 没有为临时表空间设置上限,而是允许无限增长。
但是如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的测试。
2.查询的时候连表查询中使用的表过多造成的。
我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的大小,如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。
3.对查询的某些字段没有建立索引。
Oracle中,如果表没有索引,那么会将所有的数据都复制到临时表空间,而如果有索引的话,一般只是将索引的数据复制到临时表空间中。
针对以上的分析,对查询的语句和索引进行了优化,情况得到缓解,但是需要进一步测试。
总结:1.SQL语句是会影响到磁盘的消耗的,不当的语句会造成磁盘暴涨。
2.对查询语句需要仔细的规划,不要想当然的去定义一个查询语句,特别是在可以提供用户自定义查询的软件中。
3.仔细规划表索引。
如果临时表空间是temporary的,空间不会释放,只是在sort结束后被标记为free的,如果是permanent的,由SMON负责在sort结束后释放,都不用去手工释放的。
查看有哪些用户和SQL导致TEMP增长的两个重要视图:v$ sort_usage和v$sort_segment。
通过查询相关的资料,发现解决方案有如下几种:一、重建临时表空间tempTemporary tablespace是不能直接drop默认的临时表空间的,不过我们可以通过以下方法达到。
查看目前的Temporary TablespaceSQL> select name from v$tempfile;NAME———————————————————————D:\ORACLE\ORADA TA\ORCL\TEMP01.DBFSQL> select username,temporary_tablespace from dba_users;USERNAME TEMPORARY_TABLESPACE------------------------------ ------------------------------MGMT_VIEW TEMPSYS TEMPSYSTEM TEMPDBSNMP TEMPSYSMAN TEMP1.创建中转临时表空间create temporary tablespace TEMP1 TEMPFILE 'D:\ORACLE\ORADATA\ORCL\temp02.DBF' SIZE 512M REUSE AUTOEXTEND ON NEXT 1MMAXSIZE UNLIMITED;2.改变缺省临时表空间为刚刚创建的新临时表空间temp1alter database default temporary tablespace temp1;3.删除原来临时表空间drop tablespace temp including contents and datafiles;4.重新创建临时表空间create temporary tablespace TEMP TEMPFILE 'D:\ORACLE\ORADATA\ORCL\temp01.DBF' SIZE 512M REUSE AUTOEXTEND ON NEXT 1M MAXSIZEUNLIMITED;5.重置缺省临时表空间为新建的temp表空间alter database default temporary tablespace temp;6.删除中转用临时表空间drop tablespace temp1 including contents and datafiles;以上的方法只是暂时释放了临时表空间的磁盘占用空间,是治标但不是治本的方法,真正的治本的方法是找出数据库中消耗资源比较大的sql语句,然后对其进行优化处理。
下面是查询在sort排序区使用的执行耗时的SQL:Select ername,se.sid,su.extents,su.blocks*to_number(rtrim(p.value))as Space,tablespace,segtype,sql_textfrom v$sort_usage su,v$parameter p,v$session se,v$sql swhere ='db_block_size' and su.session_addr=se.saddr and s.hash_value=su.sqlhash and s.address=su.sqladdr order by ername,se.sid;或是:Select ername,su.Extents,tablespace,segtype,sql_textfrom v$sort_usage su,v$sql sWhere su.SQL_ID = s.SQL_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 session1、使用如下语句a查看一下认谁在用临时段SELECT ername, se.SID, se.serial#, se.sql_address, se.machine, se.program, su.TABLESPACE,su.segtype, su.CONTENTS fromv$session se, v$sort_usage su WHERE se.saddr = su.session_addr2、kill正在使用临时段的进程SQL>Alter system kill session 'sid,serial#';3、把TEMP表空间回缩一下SQL>Alter tablespace TEMP coalesce;注:这处方法只能针对字典管理表空间(Dictionary Managed Tablespace)。
于本地管理表空间(LMT:Local Managed Tablespace),不需要整理的。
9i以后只能创建本地管理的表空间。
CREATE TABLESPACE TEST DATAFILE 'D:\TEST01.dbf' SIZE 5M EXTENT MANAGEMENT DICTIONARYCREATE TABLESPACE TEST DATAFILE 'D:\TEST01.dbf' SIZE 5M EXTENT MANAGEMENT LOCAL;四、使用诊断事件,也是相对有效的一种方法1、查询事件代码SQL>select ts#, name from sys.ts$ ;TS# NAME---------- ------------------------------0 SYSTEM1 UNDOTBS12 SYSAUX3 TEMP4 USERS5 UNDOTBS22、执行清理操作SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4';说明:temp表空间的TS# 为3, So TS#+ 1= 4。
oracle临时表空间过大的原因2009-05-12 11:22Oracle 临时表空间主要是用来做查询和存放一些缓存的数据的,磁盘消耗的一个主要原因是需要对查询的结果进行排序,如果没有猜错的话,在磁盘空间的(内存)的分配上,Oracle 使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB,如果还有增长,那么依此类推,临时表空间始终保持在一个最大的上限。
Oracle临时表空间暴涨的现象经过分析可能是以下几个方面的原因造成的。
1. 没有为临时表空间设置上限,而是允许无限增长。
但是如果设置了一个上限,最后可能还是会面临因为空间不够而出错的问题,临时表空间设置太小会影响性能,临时表空间过大同样会影响性能,至于需要设置为多大需要仔细的测试。
2.查询的时候连表查询中使用的表过多造成的。
我们知道在连表查询的时候,根据查询的字段和表的个数会生成一个迪斯卡尔积,这个迪斯卡尔积的大小就是一次查询需要的临时空间的大小,如果查询的字段过多和数据过大,那么就会消耗非常大的临时表空间。
3.对查询的某些字段没有建立索引。