完整的ORACLE TEMP重建过程
oracle创建临时表的方法
Oracle数据库是一种被广泛应用的关系型数据库管理系统,它提供了许多强大的功能来满足不同的数据库需求。
其中,创建临时表是在数据库开发和管理中经常会用到的功能之一。
本文将为大家介绍在Oracle数据库中创建临时表的方法,并提供一些注意事项和最佳实践。
一、什么是临时表在Oracle数据库中,临时表是一种特殊的表,它的数据仅在当前会话或事务中存在,并在会话或事务结束后自动删除。
临时表通常用于存储临时数据,或者在复杂的数据处理过程中起到缓冲的作用。
在Oracle中,临时表可以通过全局临时表和局部临时表两种方式来实现。
1. 全局临时表全局临时表是一种在数据库中存在的临时表,它对所有会话都可见,但表中的数据仅对创建它的会话可见。
全局临时表的数据在会话结束时自动删除,但表的结构保持不变,其他会话可以重复使用该表。
在Oracle中,创建全局临时表需要使用CREATE GLOBAL TEMPORARY TABLE语句,并在表名后添加ON COMMIT DELETE ROWS选项来指定表的删除规则。
2. 局部临时表局部临时表是一种在会话中存在的临时表,它对当前会话可见,但对其他会话不可见。
局部临时表的数据在当前会话结束时自动删除,表的结构也随之消失。
在Oracle中,创建局部临时表需要使用CREATETEMPORARY TABLE语句,并在表名后添加ON COMMIT DELETE ROWS选项来指定表的删除规则。
二、创建全局临时表的方法在Oracle数据库中,创建全局临时表可以通过以下步骤来完成:1. 使用CREATE GLOBAL TEMPORARY TABLE语句定义临时表的结构,例如:```sqlCREATE GLOBAL TEMPORARY TABLE temp_table(id NUMBER,name VARCHAR2(50))ON COMMIT DELETE ROWS;```2. 在创建表的也可以定义表的索引和约束等其他特性,以满足具体的需求。
Oracle:Ora-01652无法通过128(在temp表空间中)扩展temp段的过程-解决步骤
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 temp表空间激增的处理方法
Temp激增的原因:没有限制temp的最大空间限制,oracle守护程序没有将临时表空间清掉方法一:查询具体哪些用户在使用临时表空间登录到数据库SQL> Select ername,se.sid,se.serial#,su.extents,su.blocks*to_number(rtrim(p.value))as Space,tablespace,segtype,sql_text2 from v$sort_usage su,v$parameter p,v$session se,v$sql s3 where ='db_block_size' and su.session_addr=se.saddr and s.address=su.sqladdr; no rows selectedSQL>查询出来之后,kill掉这些sql语句:SQL>alter system kill session '524,778'; //(假如某一条运行的sql语句的SID为524,serial#为778)全部杀掉之后,就可以使用em管理器删除temp临时表空间了。
注意:一定要全部杀掉使用sys作为sysdba登录em选择administration,然后选择tablesplaces这是就可以看到temp的大小和使用情况如果原来的temp文件比较大,则新增加一个TRMP文件作为默认的TEMP,点击create输入name:temp3,然后在Type中选择temporary,然后将set as default temporary tablesplace点击add,然后会要求再次输入名称:temp3extend datafile when full(autoextend),在increment填入数值(即每次增加多大的空间)后点击continue选择ok,如果成功会显示之后就能将temp删除了选中temp,然后点击delete,选择yes删除完成后,查询SQL> select * from database_properties2 where property_name='DEFAULT_TEMP_TABLESPACE';PROPERTY_NAME------------------------------PROPERTY_VALUE--------------------------------------------------------------------------------DESCRIPTION--------------------------------------------------------------------------------DEFAULT_TEMP_TABLESPACETEMP3 //默认的临时表空间为temp3 Name of default temporary tablespaceSQL>方法二:如果以上的不行,则使用诊断模式清理temp空间SQL> select ts#, name from sys.ts$ ;TS# NAME---------- ------------------------------0 SYSTEM1 UNDOTBS12 SYSAUX3 TEMP4 USERS5 rows selected.//temp表空间的TS# 为3*, So TS#+ 1= 4SQL> alter session set events 'immediate trace name DROP_SEGMENTS level 4' ;Session altered.SQL>然后登录em查看一下大小。
Oracle_表空间的过大处理方法
--临时表空间满时的处理方法1.增加临时文件: 不建议设置为自增长导致把磁盘给撑满SQL> ALTER TABLESPACE TEMP ADD TEMPFILE'/oracle/oradata/itpuxdb/temp02.dbf'SIZEE 10M AUTOEXTEND OFF;2.修改临时文件: 可以将原来的数据文件改大一点如:SQL> ALTER DATABASE TEMPFILE'/oracle/oradata/itpuxdb/temp02.dbf'RESIZE100M;3.收缩Shrinking临时表空间SQL> ALTER TABLESPACE temp SHRINK SPACE KEEP20M; 收缩表空间SQL> ALTER TABLESPACE temp SHRINK TEMPFILE'/oracle/oradata/itpuxdb/temp02.dbf'; 收缩文件数据库重启后,会自动释放temp表空间默认临时表空间TEMP的过大的重建流程如果删除不了查询哪些sql在使用临时表空间,开启另外一个session查询SQL> selectername,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$sessionse,v$sql s where ='db_block_size'and su.session_addr=se.saddr ands.hash_value=su.sqlhash and s.address=su.sqladdr order by ername,se.sid;如果列出存在的,则通过以下语句杀掉这些sid与serial 【注意:1是系统进程不能乱杀】SQL> alter system kill session'187,12619';SYSTEM与SYSAUX表空间满了怎么办?1.添加表空间2.把system或者sysaux表空间的信息迁移到其它表空间。
oracle reorg用法
大家知道,长期使用的表和索引可能会出现大量的碎片,尤其是归档掉大量数据的时候,这时候需要对表和索引进行重组操作,降低其高水位,既回收了空间又能提高性能。
重组表一般采用两种办法:离线和在线方式。
离线就是停掉业务系统操作喽,常用的就是table move 和index rebuild,命令如下:alter table xxxx move parallel 8;alter index xxxx rebuild parallel 8 nologging;alter index xxxx noparallel;使用parallel 可以大大提高操作效率。
需要注意的是,在table move期间禁止对表进行dml操作。
在线就是不停业务的情况下就行的操作喽,也就是oracle提供的在线重定义。
在线重定义不止可以reorg 对象,也可以用来修改表结构,如将一个大表在线修改为分区表、修改表字段类型。
下面重点介绍这种方法。
在线重定义需要定义一个临时表(最终想要的表结构),原表和中间表发生“交换”,原表的表空间变成中间表的表空间,中间表的表空间变成原表的表空间,索引也是如此,同时,原表的数据全部复制到中间表。
实验:修改列的参数类型(number变为float)1、创建测试表create tablespace tp01 datafile 'D:\test\tp01.dbf' size 1m autoextend on;create table t1 (id int,num int,sy int) partition by range(id)(partition t1_p1 values less than(1000) tablespace tp01,partition t1_p2 values less than(2000) tablespace tp01,partition t1_p3 values less than(maxvalue) tablespace tp01);--插入数据beginfor i in 1..10000 loopinsert into t1 values(i,100,i);end loop;commit;end;/create index ind_t1 on t1(sy) local tablespace tp01;表和索引都在tp01表空间下2、创建中间表获取原表定义语句select DBMS_METADATA.GET_DDL('TABLE','t1','USER01') from dual;select Dbms_Metadata.Get_Dependent_Ddl('INDEX','t1','USER01') from dual;修改如下:create table t1_tmp (id int,num float,sy char(9) )partition by range(id)(partition t1_p1 values less than(1000) tablespace tp02,partition t1_p2 values less than(2000) tablespace tp02,partition t1_p3 values less than(maxvalue) tablespace tp02)create index ind_t1_tmp on t1_tmp(sy) local tablespace tp02;创建索引的操作可以放在步骤6完成重定义之前,这样做可以大大提高效率,尤其是大表的情况下,因为在同步数据到临时表的过程中不需要维护索引,而是在大部分数据都同步到临时之后统一创建索引。
oracle数据库rman备份计划及恢复
oracle数据库rman备份计划及恢复1.rman完全恢复的前提条件:历史的datafile,controlfile和spfile备份,加上完整的archivelog和完好的redolog。
2.rman备份脚本: a.RMAN 0级备份命令:run{allocate channel c1 type disk;allocate channel c2 type disk;allocate channel c3 type disk;backup incremental level 0 tag 'level0' format "E:\recovery_area\rfdb\rfdb\AUTOBACKUP\rman_dir\RFDB_level_0_%u_%s_%p" as compressed backupset database;sql "alter system archive log current";backup filesperset 3 format "E:\recovery_area\rfdb\rfdb\AUTOBACKUP\rman_dir\arch_%u_%s_%p_%c"archivelog all delete input; #备份归档可选,可以单独定期备份release channel c1;release channel c2;release channel c3;} b.RMAN 1级备份命令:run{allocate channel c1 type disk;allocate channel c2 type disk;allocate channel c3 type disk;backup incremental level 1 tag 'level1' format 'E:\recovery_area\rfdb\rfdb\AUTOBACKUP\rman_dir\RFDB_level_1_%u_%s_%p' as compressed backupset database;sql 'alter system archive log current';backup filesperset 3 format 'E:\recovery_area\rfdb\rfdb\AUTOBACKUP\rman_dir\arch_%u_%s_%p'archivelog all delete input; #备份归档可选,可以单独定期备份release channel c1;release channel c2;release channel c3;} c.rman删除备份命令(在保留最近⼀天备份的情况下,删除其他备份):DELETE NOPROMPT OBSOLETE RECOVERY WINDOW OF 1 DAYS; d.操作系统层⾯运⾏rman备份或删除命令(windows/linux):rman target sys/rf4rfvbgt56yhn@rfdb nocatalog CMDFILE 'D:\app\rman\rman_file\level_0.txt' log=E:\recovery_area\rfdb\rfdb\AUTOBACKUP\rman_dir\log\rman_level_0.log export ORACLE_BASE=/u01/app/oracleexport ORACLE_HOME=/u01/app/oracle/product/11.2.0/db1export ORACLE_SID=atestexport PATH=$ORACLE_HOME/bin:$PATHrman target sys/123456@atest nocatalog CMDFILE '/u01/rman/rman.sh' log=/u01/rman/rman.log00 02 * * 1 bash /u01/rman_file/run_rman_0.sh00 02 * * 3 bash /u01/rman_file/run_rman_0.sh00 02 * * 5 bash /u01/rman_file/run_rman_0.sh00 04 * * * bash /u01/rman_file/run_delete.sh34 11 * * * bash /u01/rman_file/run_rman_0.sh e.rman参数设置:RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;RMAN> CONFIGURE DEFAULT DEVICE TYPE TO DISK;RMAN> CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE disk TO 2;RMAN> CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE disk TO 2;3.rman恢复a.拷贝datafile,controlfile和spfile的rman备份,以及完整的archivelog和完好的redolog⽂件到新的数据库。
Oracle 建立临时表空间
Oracle 建立临时表空间通过在表空间中分配临时存储空间,Oracle能够使带有排序等操作的SQL语句获得更高的执行效率。
如果创建了专门的临时表空间,Oracle就可以不必在其他的表空间中为排序操作分配临时空间,这样不仅可以实现临时数据的集中化管理,而且还不会影响到其他表空间的使用效率。
在数据库中创建用户时必须为用户指定一个表空间作为临时表空间使用,该用户所生成的所有临时表数据都将存储在这个表空间中。
如果使用其他表空间作为临时表空间,这不仅会占用其中的存储空间,而且会在该表空间中生成许多存储碎片,从而影响整个数据库的性能。
因此,最好为数据库创建一个专门的临时表空间。
一个临时表空间可以被多个数据库用户共享使用。
在临时表空间中创建的段称为临时段。
Oracle只会为一个实例创建一个临时段,这个临时段被实例中所有的排序操作共享使用,但是临时段中的每一个区只能由一个事务使用。
另外,如果在数据库运行过程中经常有大量并发排序操作,那么为了提高排序性能,可以建立多个临时表空间。
建立临时表空间是使用CREATE TEMPORARY TABLESPACE命令完成的。
1.建立本地管理临时表空间建立本地管理临时表空间时,使用UNIFORM选项可以指定区尺寸。
需要注意,当建立临时表空间时,不能指定AUTOALLOCA TE选项。
例如,下面的语句在数据库中创建一个临时表空间TEMP01:SQL> create temporary tablespace temp012 tempfile 'd:\oracledata\temp01.dbf' size 10m3 extent management local4 uniform size 256k;表空间已创建。
上面创建的表空间其管理方式为本地化管理,并且区尺寸统一为256KB。
需要注意,本地化管理临时表空间不使用数据文件,而使用临时文件,也就是说,在创建临时表空间时,必须将表示数据文件的DA TAFILE改为表示临时文件的TEMPFILE。
oracle临时表空间的增删改查操作
操作oracle 临时表空间的增删改查1、查看临时表空间dba_temp_files视图v_$tempfile视图select tablespace_name,file_name,bytes/1024/1024 file_size,autoextensible from dba_temp_files;select status,enabled, name, bytes/1024/1024 file_size from v_$tempfile;--sys用户查看2、缩小临时表空间大小alter database tempfile 'D:\ORACLE\PRODUCT\' resize 100M;3、扩展临时表空间:方法一、增大临时文件大小:SQL> alter database tempfile ‘/u01/app/oracle/oradata/orcl/’ resize 100m;方法二、将临时数据文件设为自动扩展:SQL> alter database tempfile ‘/u01/app/oracle/oradata/orcl/’ autoextend on next 5m maxsize unlimited;方法三、向临时表空间中添加数据文件:SQL> alter tablespace temp add tempfile ‘/u01/app/oracle/oradata/orcl/’ size100m;4、创建临时表空间:SQL> create temporary tablespace temp1 tempfile ‘/u01/app/oracle/oradata/orcl/’ size 10M;5、更改系统的默认临时表空间:--查询默认临时表空间select from database_properties whereproperty_name='DEFAULT_TEMP_TABLESPACE';--修改默认临时表空间alter database default temporary tablespace temp1;所有用户的默认临时表空间都将切换为新的临时表空间:select username,temporary_tablespace,default_ from dba_users;--更改某一用户的临时表空间:alter user scott temporary tablespace temp;6、删除临时表空间删除临时表空间的一个数据文件:SQL> alter database tempfile ‘/u01/app/oracle/oradata/orcl/’ drop;删除临时表空间彻底删除:SQL> drop tablespace temp1 including contents and datafiles cascade constraints;7、查看临时表空间的使用情况GV_$TEMP_SPACE_HEADER视图必须在sys用户下才能查询GV_$TEMP_SPACE_HEADER视图记录了临时表空间的使用大小与未使用的大小dba_temp_files视图的bytes字段记录的是临时表空间的总大小SELECT ,total - used as "Free",total as "Total",roundnvltotal - used, 0 100 / total, 3 "Free percent"FROM SELECT tablespace_name, SUMbytes_used / 1024 / 1024 usedFROM GV_$TEMP_SPACE_HEADERGROUP BY tablespace_name temp_used,SELECT tablespace_name, SUMbytes / 1024 / 1024 totalFROM dba_temp_filesGROUP BY tablespace_name temp_totalWHERE =8、查找消耗资源比较的sql语句Select ,,,to_numberrtrim as Space,tablespace,segtype,sql_textfrom v$sort_usage su, v$parameter p, v$session se, v$sql swhere = 'db_block_size'and =and =and =order by ,9、查看当前临时表空间使用大小与正在占用临时表空间的sql语句select , segtype, blocks 8 / 1000 "MB", sql_textfrom v$sort_usage sort, v$session sess, v$sql sqlwhere =and =order by blocks desc;10、临时表空间组介绍1创建临时表空间组:create temporary tablespace tempts1 tempfile '/home/oracle/' size 2M tablespace group group1;create temporary tablespace tempts2 tempfile '/home/oracle/' size 2M tablespace group group2;2查询临时表空间组:dba_tablespace_groups视图select from dba_tablespace_groups;GROUP_NAME TABLESPACE_NAME------------------------------ ------------------------------GROUP1 TEMPTS1GROUP2 TEMPTS23将表空间从一个临时表空间组移动到另外一个临时表空间组:alter tablespace tempts1 tablespace group GROUP2 ;select from dba_tablespace_groups;GROUP_NAME TABLESPACE_NAME------------------------------ ------------------------------GROUP2 TEMPTS1GROUP2 TEMPTS24把临时表空间组指定给用户alter user scott temporary tablespace GROUP2;5在数据库级设置临时表空间alter database <db_name> default temporary tablespace GROUP2;6删除临时表空间组删除组成临时表空间组的所有临时表空间drop tablespace tempts1 including contents and datafiles;select from dba_tablespace_groups;GROUP_NAME TABLESPACE_NAME------------------------------ ------------------------------GROUP2 TEMPTS2drop tablespace tempts2 including contents and datafiles;select from dba_tablespace_groups;GROUP_NAME TABLESPACE_NAME11、对临时表空间进行shrink11g新增的功能--将temp表空间收缩为20Malter tablespace temp shrink space keep 20M;--自动将表空间的临时文件缩小到最小可能的大小ALTER TABLESPACE temp SHRINK TEMPFILE ’/u02/oracle/data/’;临时表空间作用Oracle临时表空间主要用来做查询和存放一些缓冲区数据;临时表空间消耗的主要原因是需要对查询的中间结果进行排序;重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题sql语句的执行,temp表空间会一直增长;直到耗尽硬盘空间;网上有人猜测在磁盘空间的分配上,oracle使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB;也就是说当前临时表空间文件的大小是历史上使用临时表空间最大的大小;临时表空间的主要作用:索引create或rebuild;Order by 或group by;Distinct 操作;Union 或intersect 或minus;Sort-merge joins;analyze.。
oracle扩展表空间的三种方法
oracle扩展表空间的三种方法在Oracle数据库中,扩展表空间是一种常见的管理数据库空间的操作。
当表空间的容量不足时,需要扩展表空间以满足数据库的需求。
以下将介绍三种常见的Oracle扩展表空间的方法。
1.增加数据文件增加数据文件是扩展表空间最直接和常见的方法。
数据文件是Oracle数据库中存储数据的基本单位,通过增加数据文件可以扩展表空间的容量。
以下是增加数据文件的步骤:步骤1:选择要扩展的表空间使用如下语句选择要扩展的表空间:```sqlSELECT tablespace_name FROM dba_tablespaces;```步骤2:创建数据文件使用如下语句创建数据文件:```sqlALTER TABLESPACE tablespace_name ADD DATAFILE 'file_name' SIZE size [AUTOEXTEND ON NEXT size NEXT size ...];```其中,tablespace_name是要扩展的表空间名称,file_name是新数据文件的名称,size是数据文件初始大小。
AUTOEXTEND关键字用于设置数据文件的自动增长。
可以通过NEXT关键字设置数据文件的自动增长的大小。
2.增加临时表空间临时表空间用于存储排序、连接和其他需要临时存储空间的操作。
当临时表空间的空间不足时,需要扩展临时表空间。
以下是增加临时表空间的步骤:步骤1:选择要扩展的临时表空间使用如下语句选择要扩展的临时表空间:```sqlSELECT tablespace_name FROM dba_temp_files;```步骤2:创建临时文件使用如下语句创建临时文件:```sqlALTER TABLESPACE tablespace_name ADD TEMPFILE 'file_name' SIZE size [AUTOEXTEND ON NEXT size NEXT size ...];```其中,tablespace_name是要扩展的临时表空间名称,file_name是新临时文件的名称,size是临时文件初始大小。
如何处理Oracle中TEMP表空间满的问题?
如何处理Oracle中TEMP表空间满的问题?前几天有朋友问我关于TEMP临时表空间满的问题,今天找到了一个解决办法,总结的非常好,借用过来,保留。
有些有侯我们则会遇到临时段没有被释放,TEMP表空间几乎满的状况,甚至是我们重启了数据库仍没有解决问题。
这个问题在论坛中也常被网友问到,下面我总结一下,给出几种处理方法。
本文的测试环境是hp-unix11i+Oracle8i。
正常来说,在完成Select语句、create index等一些使用TEMP 表空间的排序操作后,Oracle是会自动释放掉临时段a的。
但有些有侯我们则会遇到临时段没有被释放,TEMP表空间几乎满的状况,甚至是我们重启了数据库仍没有解决问题。
这个问题在论坛中也常被网友问到,下面我总结一下,给出几种处理方法。
法一、重启库库重启时,Smon进程会完成临时段释放,TEMP表空间的清理操作,不过很多的时侯我们的库是不允许down的,所以这种方法缺少了一点的应用机会,不过这种方法还是很好用的。
法二、Metalink给出的一个方法修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而锏角謇砗蚑EMP表空间的目的。
SQL>alter tablespace temp increase 1;SQL>alter tablespace temp increase 0;法三、我常用的一个方法,具体内容如下:1、使用如下语句a查看一下认谁在用临时段SELECT username,sid,serial#,sql_address,machine,program,tablespace,segtype,contentsFROM v$session se,v$sort_usage suWHERE se.saddr=su.session_addr2、那些正在使用临时段的进程SQL>Alter system kill session 'sid,serial#';3、把TEMP表空间回缩一下SQL>Alter tablespace TEMP coalesce;法四、使用诊断事件的一种方法,也是被我认为是“杀手锏”的一种方法1、确定TEMP表空间的ts#SQL>select ts#, name from sys.ts$ ;TS# NAME-----------------------0 SYSYEM1 RBS2 USERS3* TEMP4 TOOLS5 INDX6 DRSYS2、执行清理操作SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4' ;说明:temp表空间的TS# 为 3*, So TS#+ 1= 4其它:1、出现如上问题的原因我认为可能是由于大的排序超出了TEMP 表空间的空间允许范围引起的。
oracle 如何缩小和重建temp表空间的数据文件
如果为一个表空间增加了一个不合适的数据文件,可以手工调整其大小,
如果想删除该数据文件,那只有通过删除该表空间才能达到目的,比较麻烦些。
>如果这样的行为多了,岂不是弄的很乱?
刚开始不熟悉oracle可能会多次遇到这样的问题,以后知道这么回事了就不会那么多了;
temp表空间的 变的太大,如何缩小?
先试试
temp(非本地管理表空间) 回收
可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1,如:
alter tablespace temp
default storage(pctincrease 1);
这样smon便会将自由范围自动合并。也可以手工合并自由范围:
另,建表空间这样的操作应该是dba的事,所以不要轻易的把dba权限给不是数据库管理员的人,
8.alter user roll temporary tablespace temp; --重新指定用户表空间为重建的临时表空间
---------------------------------------------------------------
>另外,不小心建了一个很大的数据文件,难道就要这么麻烦才能删除?
alter database datafile 'xxxxx' resize 10M; -- 重新设置数据文件的大小。
---------------------------------------------------------------
>那还是没有办法删除?
不是不能删除,只是方法麻烦些。
ORACLE数据库如何恢复
ORACLE数据库如何恢复(邝俊标)ORACLE数据库备份与恢复与ORACLE的结构密切相关,大家先弄清ORACLE 物理结构有哪些?逻辑结构是有哪些?它们的作用是什么?弄明白这些以后,具体怎么备份、怎么恢复就需要了解下ORACLE本身是怎么管理数据库的有那些相关的ORACLE系统表?ORACLE的后台进程是怎么管理的?最后就要知道相关的ORACLE命令、语法,根据系统提示错误灵活处理了。
ORACLE 恢复主要有下面的几种问题:一、数据文件丢失恢复:二、OS备份下的基于时间的恢复三、损坏联机日志的恢复四、损坏当前联机日志恢复五损坏控制文件的恢复六、损坏回滚数据文件的恢复七、损坏临时数据文件的恢复一、数据文件丢失恢复:1、查看报警文件或动态视图v$recover_fileSQL>select * from v$recover_file;2、脱机数据文件SQL> alter database datafile 'file#' offline drop;3、打开数据库,拷贝备份回来(restore),恢复(recover)该数据文件,并联机SQL> alter database open;4、拷贝备份从备份处copy d:\databak\ users01.dbf d:\oracle\oradata\orcl;5、恢复该数据文件SQL> recover datafile 'file#';SQL> recover database; (多个数据文件丢失,恢复整个数据库)6、恢复成功,联机该数据文件SQL> alter database datafile 'file#' online;说明:1) 采用热备份,需要运行在归档模式下,可以实现数据库的完全恢复,也就是说,从备份后到数据库崩溃时的数据都不会丢失。
2) 可以采用全备份数据库的方式备份,对于特殊情况,也可以只备份特定的数据文件,如只备份用户表空间(一般情况下对于某些写特别频繁的数据文件,可以单独加大备份频率)3) 如果在恢复过程中,发现损坏的是多个数据文件,即可以采用一个一个数据文件的恢复方法(第5步中需要对数据文件一一脱机,第6步中需要对数据文件分别恢复),也可以采用整个数据库的恢复方法。
重建temp表空间
重建temp表空间:1.以sysdba身份登录2.创建临时中转的临时表空间TEMP2SQL> create temporary tablespace TEMP2 TEMPFILE D:\ORACLE\ORADA TA\KDC\TEMP02.DBF' SIZE 5M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMIT ED2 /表空间已创建。
3.修改默认临时表空间为TEMP2SQL> alter database default temporary tablespace temp2;数据库已更改。
4.drop原来的临时表空间TEMP:SQL> drop tablespace temp including contents and datafiles;表空间已丢弃。
5.重新创建临时表空间TEMP:SQL> create temporary tablespace TEMP TEMPFILE D:\ORACLE\ORADATA\KDC\TEMP01.DBF' SIZE 4000M(这个地方跟你的需要而定)REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED2 /表空间已创建。
6.更改默认临时表空间为TEMP:SQL> alter database default temporary tablespace temp;数据库已更改。
7.drop临时表空间TEMP2SQL> drop tablespace temp2 including contents and datafiles;表空间已丢弃。
1.select tablespace_name, file_name,bytes from dba_temp_files2. create temporary tablespace temptesttempfile '/DBSoftware/app/oracle/oradata/testdb/temptest.dbf' size 209715203. alter database default temporary tablespace temptest4. drop tablespace temp including contents and datafiles5. create temporary tablespace temptempfile '/DBSoftware/app/oracle/oradata/testdb/temp01.dbf' size 209715206. alter database default temporary tablespace temp7. drop tablespace temptest including contents and datafiles。
ORACLE最简单有效的备份恢复方案
ORACLE 最简单有效的备份恢复方案ORACLE备份分两种,1.逻辑备份;2.物理备份;逻辑备份又分两种:传统的exp备份;10g开始支持的expdp数据泵备份;物理备份主要就是RMAN备份;最基本的原则是:这些逻辑或物理备份和数据库文件必须放在不同的硬盘上;否者一损俱损;备份就没多大意义了;如果数据库不是很大,比如在50G以下,那么我们就考虑一些傻话化的全备方案我现在的备份方案是:两个逻辑备份和RMAN 备份全部用上;1.传统dmp逻辑备份和恢复1.1传统dmp逻辑备份,这个是最简单的备份方法;现在我提供一个简单的脚本:1.1.1首先建立一个bat文件,名字叫:exp_backup.bat内容是:set oracle_username=%1set oracle_password=%2set local_tnsname=%3set url=%oracle_username%/%oracle_password%if not %local_tnsname% == "" set url=%url%@%local_tnsname%if exist %oracle_username%_old.dmp del %oracle_username%_old.dmpif exist %oracle_username%_old.log del %oracle_username%_old.logif exist %oracle_username%.dmp ren %oracle_username%.dmp %oracle_username%_old.dmpif exist %oracle_username%.log ren %oracle_username%.log %oracle_username%_old.logexp %url% file=%oracle_username%.DMP log=%oracle_username%.LOG该脚本是一个通用的最简单的exp脚本;意思就是:备份之间,把以前的备份文件修改名字,后面加上_old ,如果本来就有old文件,就删除之;之后,就开始备份;备份的文件目录和该脚本一致(这样做最简单);所以总是会出现一新一旧两个文件;当然只要最新的就行了,所以理论上只要一份文件;但是考虑有可能备份的时候突然报错,这样old文件还在,将就着使用,否者新的是坏的,旧的也没了;有的人做一周7天逻辑循环备份,我觉得没有必要,要那么多旧的备份文件何用,浪费空间;1.1.2然后再做一个bat文件,比如是my_exp.bat内容是:call exp_backup.bat USER PASSWORD ""如果是在服务器自身上备份,就不需要写入数据库服务名;如果有多个用户数据需要备份;那么就在my_exp.bat继续添加:call exp_backup.bat USER1 PASSWORD1 ""….My_EXP.BAT可以做成windows的执行计划,每天不忙的时候执行一次;1.2 exp备份的恢复下面就是恢复的最简单方法:1.2.1.把电脑上当前用户彻底删除,用命令,这样就可以把对象彻底清除;DROP USER XXX CASCADE1.2.2.再创建该用户CREATE USER xxxxIDENTIFIED BY xxxxDEFAULT TABLESPACE xxxxTEMPORARY TABLESPACE TEMP并赋予权限:GRANT DBA TO xxxx WITH ADMIN OPTION1.2.3用IMP恢复C:\> imp xxxx/xxxx FILE=xxxx.DMP LOG=xxxx.LOG FULL=Y2.10G后的数据泵expdp备份和恢复2.1 expdp 备份据说这个比exp有很多优点,这个我就不说了,大家可以自己参考资料;不过我测试下来,如果数据量小expdp 还是不如exp的;但是还是建议是使用expdp,因为数据会慢慢变大的,用expdp更好些;我最看重的是:expdp备份的文件涵盖的东西更多;所以恢复的时候方便;删除用户后,可以不用再创建用户恢复;实现方法和exp类似:不过,它的目录不像EXP那么直接,需要使用oracle的目录对象;所以2.1.1第一步先创建一个目录对象,比如:SQL>create or replace directory LOGIC_BUCKUPas 'd:\OACLE_BACKUP\逻辑备份';2.1.2建立一个通用脚本,比如叫EXPDP_BACKUP.BAT内容是:set oracle_username=%1set oracle_password=%2set local_tnsname=%3set url=%oracle_username%/%oracle_password%if not %local_tnsname% == "" set url=%url%@%local_tnsname%if exist %oracle_username%_old_dump.dmp del %oracle_username%_old_dump.dmpif exist %oracle_username%_old_dump.log del %oracle_username%_old_dump.logif exist %oracle_username%_dump.dmp ren %oracle_username%_dump.dmp %oracle_username%_old_dump.dmpif exist %oracle_username%_dump.log ren %oracle_username%_dump.log %oracle_username%_old_dump.logEXPDP %url% DIRECTORY=LOGIC_BACKUP DUMPFILE=%oracle_username%_DUMP.DMP LOGFILE=%oracle_username%_DUMP.LOG PARALLEL=2该方法与上面的dmp备份类似;2.1.3然后再做一个bat文件,比如是my_expdp.bat内容是:call expdp_backup.bat USER PASSWORD ""如果是在服务器自身上备份,就不需要写入数据库服务名;如果有多个用户数据需要备份;那么就在my_exp.bat继续添加:call expdp_backup.bat USER1 PASSWORD1 ""……同dmp备份一样,My_EXPdp.BAT也可以做成windows的执行计划,每天不忙的时候执行一次;2.2 expdp备份的恢复下面就是恢复的最简单方法:2.2.1.把电脑上当前用户彻底删除,用命令,这样就可以把对象彻底清除;DROP USER XXXX CASCADE2.2.2.用另外一个权限较高的用户(最好不是sys,比如是YYYY) 导入:C:\>IMPDP yyyy/yyyy DUMPFILE=xxxx_DUMP.DMP LOGFILE=xxxx_DUMP.LOG DIRECTORY=LOGIC_BUCKUPPARALLEL=2(这里的LOGIC_BUCKUP是oracle的对象目录,要和xxxx_dump.dup存放的目录一致)这样就OK了,也即是说用户不需要创建,数据泵文件含有了用户以及它原来的权限;从这点来讲,是不是比IMP导入更为方便;好了,两种逻辑备份讲完了,下面重点说一下RMAN备份;因为在生产系统中,逻辑备份作用不大的,因为它不能实时的备份数据,所以逻辑备份更多的时候是给开发人员互相导入数据和存储过程之类用的;RMAN备份的原理还是有点复杂的,很多细节的我也不是很清楚,不过没关系,我们可以整理出一套最简单的备份方案:3.RMAN备份和恢复3.1. RMAN备份3.1.1 首先把数据库参数关注一下,关注下面两个参数第一个参数:db_recovery_file_dest_size,上图中的大小是默认的4G,也就是归档模式下,archivelog的所有归档日志文件大小总和,如果超过这个数,就会导致数据库出问题;所以要非常小心,因而建议修改大一些,比如修改成20G;当然最本质的方法,是要按时清理无用的归档日志;第二个参数:db_recovery_file_dest ,这个参数非常重要,是11G里,存放rman备份集和归档日志的地方;默认是放在flash_recovery_area目录下的,因为我的系统的flash_recovery_area 和数据库文件在同一个硬盘,所以修改了;3.1.2.关注redo日志文件,每组里要有两个成员,1个在数据库文件的硬盘下,1个在备份文件的硬盘下,因为日志文件写入最频繁,RMAN无法对它备份,或者说任何备份工具都无法对redo日志备份;不过redo它自己可以做冗余,两个文件只要有一个在,即可;比如:3.1.3做一个最简单的rman备份脚本;3.1.3.1首先做一个txt,比如是:autorman.txt内容是:sql 'alter system archive log current';backup database;delete noprompt obsolete;这三句话的作用分别是:1.对当前redo日志进行归档;2.备份数据库3.删除无效的archive日志和rman备份集3.1.3.2 做一个bat 调用上面的autorman.txt,比如是:autorman.bat内容是:rman target / @autorman.txt然后就在winddows下做一个执行计划,每天或没隔几天,自动执行一下这个autorman.bat当然备份之前,要用rman>show all 看一下参数设置,有没有自动备份控制文件,如果没有,要加上;3.2 rman恢复Rman恢复非常简单;下面说一下步骤:3.2.1 假如最新一次全备是3天前的,先随便建立一个新表,比如是test_rman,随便插几条数据;用来测试还原后,这个最新的对象是否也给恢复了;现在用sqlplus登陆,shutdown 数据库,然后把oracle的数据库文件全部删除(控制文件,redo日志文件,数据库文件);3.2.2 用sql> startup nomount 启动数据库的参数文件,参数文件和数据库文件不在同一个硬盘,所以没丢;这时候如果执行sql>alter database mount 会报错,因为mount会加载控制文件,而控制文件已经丢了;3.3.3.把以前控制文件所在的目录建立好,否者rman找不到控制文件恢复路径;然后执行RMAN> restore controlfile from autobackup;这样控制文件就回复了,有了控制文件就好办了;3.2.4. 以为有了控制文件,所以在sqlplus里,可以装载数据库Sql>alter database mount3.2.5 数据库被装载后,说明控制文件生效了,这时候,所有的数据库信息都出来了;所以可以用rman还原数据库了:RMAN> RESTORE database;3.2.6 恢复数据库:RMAN> recover database;2.2.7 数据库现在已经全部回复好,可以重新启动了:SQL> alter database open resetlogs;数据库已更改。
总结了10种_Oracle_文件损坏及恢复的过程
总结了10种_Oracle_文件损坏及恢复的过程Oracle数据库是一个关系数据库管理系统(RDBMS),用于存储和管理大量结构化数据。
然而,由于各种原因,Oracle数据库文件可能会损坏,这可能导致数据库无法正常工作。
为了解决这个问题,需要进行文件的恢复过程。
下面总结了10种Oracle文件损坏及恢复的常见过程:1.数据文件丢失:如果数据文件丢失,可以从最近的备份还原数据文件,并进行恢复。
2. 数据文件坏块:在Oracle数据库中,可以使用DBVERIFY工具来检查数据文件的坏块。
如果坏块小部分,可以使用RMAN进行恢复。
如果坏块较多,可能需要考虑重新创建数据文件。
3.日志文件丢失:如果日志文件丢失,可以使用备份中的归档日志文件进行恢复。
如果没有备份,可以使用增量备份或物理备份进行恢复。
4.日志文件坏块:使用DBVERIFY工具可以检查日志文件的坏块。
如果发现坏块,可以尝试使用RMAN进行恢复,或者由管理员手动修复坏块。
5.控制文件丢失:如果控制文件丢失,可以从备份中还原控制文件,并使用RECOVER命令进行数据库恢复。
6.控制文件坏块:使用DBVERIFY工具检查控制文件的坏块。
如果找到坏块,可以使用备份恢复控制文件,或者手动修复坏块。
7.数据库文件或表空间重命名:如果数据库文件或表空间被重命名,可以使用ALTERDATABASERENAME命令更改文件或表空间的名称。
8. 恶意软件或数据损坏:如果Oracle数据库中的数据被恶意软件感染或损坏,必须进行杀毒和修复操作。
首先,应使用杀毒软件对系统进行全面扫描,以确保杀死所有恶意软件。
然后,可以使用RMAN进行数据恢复。
9.操作错误:有时,由于误操作或错误的命令,数据库文件可能会被损坏。
在这种情况下,可以从备份中还原损坏的文件,并执行相关的恢复操作。
10. 数据库崩溃:如果Oracle数据库发生崩溃,可能需要使用RMAN 进行恢复。
首先,必须使用备份进行数据库重建,然后使用RMAN进行恢复。
Oracle 解决 ora-01652无法通过128(在temp表空间中)扩展temp段
SQL> exec show_space('ENROL_EXAMINEE','AUTO');
Total Blocks............................2432
,(SELECT taskid,reexam FROM ENROL_EXAMINEE) b WHERE a.taskid=b.taskid
ORDER BY A.KSBH ASC
咋一看,真不赖,字段将近一百个,而且原表记录数有15000多条。所以可能真的把临时表空间吃完。于是对涉及到的基表做了一个空间占用情况统计:
select * from v$tempfile
通过观察发现,temp表空间只有一个数据文件,大小为4G,不自动扩展。大小为4G,应该说是不能算小啦。这时想到,需要看一看执行的sql语句到底是 什么样的,难道它能把这个空间用完(由于系统事务非常少,所以暂不考虑其它用户语句对temp的影响),于是就把那个语句拷贝下拉,研究一番:
a.JS2MC, a.JS2CJ, a.SSMZ, a.SSMZBZ, a.DXWPSSM,
a.DXWPSS, a.LQXSM, a.LQXSMC, a.LQDSM, a.LQDSXM,
a.LQYJFXM, a.LQYJFXMC, a.HANDLERESULT, a.XLZSBH, a.XWZSBH,
Oracle 解决 ora-01652无法通过128(在temp表空间中)扩展temp段时间:2012-02-14 10:47来源:未知 作者:admin 点击:248次解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程 昨 天开发人员跟我说,执行一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅了oracle的错误代码说 明:意思是指temp表空间无法自动扩展temp段。这种问题一解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程
Oracle-重建控制文件的方式
Oracle-重建控制⽂件的⽅式简介控制⽂件记录了当前数据库的结构信息,如数据⽂件,⽇志⽂件的信息和相关的状态等。
它是⼀个⼆进制⽂件。
在参数⽂件中描述控制⽂件的位置和数量,在数据库实例启动到mount状态时读取控制⽂件的信息,在open状态中⼀直被使⽤,以维护数据库的⼀致性。
控制⽂件位置SHOW PARAMETER CONTROL_FILESset lines 168 pages 99col name for a60select * from v$controlfile;控制⽂件的内容数据字典中查看col type for a32select * from V$CONTROLFILE_RECORD_SECTION;strings 查看控制⽂件内容数据库的名字,ID、创建的时间戳表空间的名字联机⽇志⽂件、数据⽂件的位置、个数、名字联机⽇志的Sequence号码检查点的信息撤销段的开始或结束归档信息备份信息重建控制⽂件注意事项重建控制⽂件时,需要相应的redo logfile和数据⽂件已存在。
set和reuse databaseset database:将数据⽂件头的db_name改成脚本中指定的名称reuse database: 读取数据⽂件头中的db_name并校验脚本中指定的名称是否⼀致resetlogs和noresetlogsnoresetlogs: 从current的redo logfile中得到系统scn号,数据⽂件scn号resetlogs: 将redo logfile内容清空,sequence#从1开始tempfile控制⽂件不包含tempfile,可以在open数据库后再创建。
问题描述当⽆备份控制⽂件的情况下,如何重建处理⽅案获取控制⽂件的⽅式trace⽂件(需要在mount或open状态)⽣成trace⽂件alter database backup controlfile to trace as '/tmp/control_rebuild.trc';⽣成的trace⽂件包含了resetlogs和noresetlogs 两个部分。
Oracle 重建控制文件
ORACLE的控制文件是数据库的非常重要的文件,它保存着数据库的连接实例(instance)和database的一个桥梁,它定义了当前数据库物理信息的状态。
因此控制文件对于一个数据库来说是非常重要的,在某些时候我们需要重新创建控制文件:1。
当控制文件丢失的时候,并且没有最近的文件Copy备份(一般在建库完成后的生成一个创建ControlFile的的脚本)。
2。
需要修改数据库初始物理信息,如Log文件数量,数据文件的数量等,这些信息是在建库的时候写在ControlFIle里的,如果需要修改,可以通过重建ControlFile来调整。
以下是一种较好的重建控制文件的方法:1. 在重建Contrl前,建议备份数据库中的数据,以防不测。
2. sqlplus /nolog3. SQL>connect /as sysdbal4. SQL>alter database backup controlfile to trace; 备份创建控制文件的脚本到TRC文件5. 在$ORACLE_HOME/admin/SID/udump下可找到最新生成的TRACE文件,如ora_23456.trc,此文件就包含了当前控制文件的参数及生成语法。
6. 提取ora_23456.trc中有关控制文件生成的语句另存为recreatctl.sq l。
7. recreatctl.sql的内容为:STARTUP NOMOUNTCREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOGMAXLOGFILES 32MAXLOGMEMBERS 2MAXDATAFILES 50MAXINSTANCES 8MAXLOGHISTORY 800LOGFILEGROUP 1 '/dev/vg00/roraredoa1' SIZE 10M,GROUP 2 '/dev/vg00/roraredoa2' SIZE 10M,GROUP 3 '/dev/vg00/roraredoa3' SIZE10MDATAFILE'/dev/vg00/rorclsys','/dev/vg00/rorclrbs','/dev/vg00/rorcltemp','/dev/vg00/rorcltools','/dev/vg00/rorcluser';8. 如果需要修改,可按自己的需要编辑creatctl.sql中的参数,如maxdatafiles、maxinstances等。