Oracle的存储架构

DATABASE-->TABLESPACES-->SEGMENTS-->EXENTS-->BLOCKS 11.1 TABLESPACE(表空间)分类 PERMANENT 永久表空间 UNDO 撤销表空间 TEMPORARY 临时表空间 11.1.1 表空间的管理方式: 重点是段的管理方式和区的管理方式是在建立表空间时确定的。 段管理方式有AUTO和MANUAL两种,区管理方式有本地管理和字典管理(已淘汰)两种。 03:32:36 SQL> select tablespace_name,contents,extent_management,segment_space_management from dba_tablespaces; TABLESPACE_NAME CONTENTS EXTENT_MAN SEGMEN ------------------------------ --------- ---------- ------ SYSTEM PERMANENT DICTIONARY MANUAL SYSAUX PERMANENT LOCAL AUTO TEMP TEMPORARY LOCAL MANUAL USERS PERMANENT LOCAL AUTO EXAMPLE PERMANENT LOCAL AUTO UNDO_TBS01 UNDO LOCAL MANUAL TMP01 TEMPORARY LOCAL MANUAL TBS_16K PERMANENT LOCAL AUTO BIG_TBS PERMANENT LOCAL AUTO TEST PERMANENT DICTIONARY MANUAL 注意两点: 1)如果system表空间是数据字典管理,其他表空间可以是数据字典管理或local管理(默认) 2)字典管理可以转换成本地管理,但是对于系统表空间,要求执行一些附加步骤,比较麻烦。 execute dbms_space_admin.tablespace_migragte_to_local('tablespacename'); 11.1.2 表和表空间的关系 建一个使用缺省值的表空间 SQL> create tablespace a datafile '/u01/oradata/timran11g/a01.dbf' size 10m; 利用oracle提供的dbms_metadata.get_ddl包看看缺省值都给的是什么? SQL> set serverout on; SQL> declare aa varchar2(2000); begin select dbms_metadata.get_ddl('TABLESPACE','B') into aa FROM dual; dbms_output.put_line(aa); end; / 结果: CREATE TABLESPACE "A" DATAFILE '/u01/oradata/timran11g/a01.dbf' SIZE 10485760 LOGGING ONLINE PERMANENT BLOCKSIZE 8192 EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO PL/SQL 过程已成功完成。 关注最后一行,两个重要信息是:(1)区本地管理且自动分配空间,(2)段自动管理。 // dbms_metadata.get_ddl也可以查看表,('TABLE','EMP','SCOTT')替换('TABLESPACE','B')试试。 SQL> create tablespace b datafile '/u01/oradata/timran11g/b01.dbf' size 10m extent management local uniform size 128k segment space management manual 同上,调dbms_metadata.get_ddl包看oracle对该语句的ddl操作是: CREATE TABLESPACE "B" DATAFILE '/u01/oradata/timran11g/a01.dbf' SIZE 10485760 LOGGING ONLINE PERMANENT BLOCKSIZE 8192 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 131072 SEGMENT SPACE MANAGEMENT MANUAL 最后一行信息是:区本地管理且统一分配128K,段手动管理。如果在建表时使用缺省说明,则该表将服从其表空间的这些定义, 11.1.3 删除表空间 数据库OPEN下不能删除的表空间是 1)system 2)active undo tablespace 3) default temporary tablespace 4)default tablespace 数据库OPEN下不能offine的表空间是 1)system 2)active undo tablespace 3) default temporary tablespace 查看表空间空闲大小 09:47:04 SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name; TABLESPACE_NAME SUM(BYTES)/1024/1024 ------------------------------ -------------------- UNDOTBS1 98.4375 SYSAUX 14.625 USERS 48.1875 SYSTEM 1.875 EXAMPLE 31.25 11.1.4 大文件(bigfile)表空间(默认small file) 1)small file,在一个表空间可以建立多个数据文件 2)bigfile :在一个表空间只能建立一个数据文件 (8k的block ,datafile maxsize 可以 32T),可以简化对数据文件管理 09:54:49 SQL> create bigfile tablespace big_tbs datafile '/u01/oradata/timran11g/bigtbs01.dbf' size 100m; 试图在该表空间下增加一个数据文件会报错 09:55:01 SQL> alter tablespace big_tbs add datafile '/u01/oradata/timran11g/bigtbs02.dbf' size 100m; alter tablespace big_tbs add datafile '/u01/oradata/timran11g/bigtbs02.dbf' size 100m * ERROR at line 1: ORA-32771: cannot add file to bigfile tablespace 查看大文件表空间: 09:55:46 SQL> select name,bigfile from v$tablespace; NAME BIG ------------------------------ --- SYSTEM NO UNDOTBS1 NO SYSAUX NO USERS NO TEMP NO EXAMPLE NO TBS_16K NO BIG_TBS YES 11.2 SEGMENT(段) 11.2.1 SEGMENT(段)的特点: 1)表空间在逻辑上可以对应多个段,物理上可以对应多个数据文件,一个段比较大时可以跨多个数据文件。 2)创建一个表,ORACLE为表创建一个(或多个)段,在一个段中保存该表的所有表数据(表数据不能跨段)。 3)段中至少有一个初始区。当这个段数据增加使区(extent)不够时,将为这个段分配新的后续区。 段管理有两种方式: 1)自动管理方式(ASSM(Auto Segment Space Management)) --采用位图管理段的存储空间 简单说就是每个段的段头都有一组位图(5个位图),位图描述每个块的满度,根据满度的不同将每个块登记到相应的位图上,位图自动跟踪每个块的使用空间,这5个位图的满度按如下定义:满度100%,75%、50%、25%和0%,比如块大小为8k,你要插入一行是3k的表行,那么oracle就给你在满度50%的位图上找个登记的块。 ASSM的前提是EXTENT MANAGEMENT LOCAL,在ORACLE9I以后,缺省状态为自动管理方式,ASSM废弃pctused属性。 2)手工管理方式(MSSM(Manual Segment Space Management)) --采用FREELIST(空闲列表)管理段的存储空间 这是传统的方法,现在仍然在使用,未被淘汰,保留pctfree和pctused属性,这些概念后面介绍block时再讨论。 11.2.2 表和段(segment)的关系 一般来讲 一个单纯的表就分配一个段,但往往表没那么单纯,比如表上经常会有主键约束,那么就会有索引,索引有索引段,还有分区表,每个分区会有独立的段,再有就是oracle的大对象,如果你的表里引用blob,clob,那么这个表就又被分出多个段来。 SQL> conn / as sysdba SQL> create user tim identified by tim; SQL> grant connect,resource to tim; SQL> conn tim/tim SQL> select * from user_segments; 未选定行 SQL> create table t1 (id int); SQL> select segment_name from user_segments; SEGMENT_NAME --------------------------------------------------------------------------------- T1 SQL> create table t2 (id int constraint pk_t2 primary key,b blob,c clob); SQL> select segment_name from user_segments; SEGMENT_NAME SEGMENT_TYPE ----------------------------------------------------------------------------------------------- PK_T2 INDEX SYS_IL0000071160C00003$$ LOBINDEX SYS_LOB0000071160C00003$$ LOBSEGMENT SYS_IL0000071160C00002$$ LOBINDEX SYS_LOB0000071160C00002$$ LOBSEGMENT T2 TABLE T1 TABLE 注:Oracle11gR2又增加了一个新的初始化参数DEFERRED_SEGMENT_CREATION(仅适用未分区的heap table),此参数设为TRUE后,create table后并不马上分配segment,当第一个insert语句后才开始分配segment。这对于应用程序的部署可能有些好处。(PPT-II-476-478) 也可以使局部设置改变这一功能(覆盖DEFERRED_SEGMENT_CREATION),在create table语句时加上SEGMENT CREATION子句指定。如: create table scott.t1(id int,name char(10)) SEGMENT CREATION IMMEDIATE TABLESPACE TB1 或 create table scott.t1(id int,name char(10)) SEGMENT CREATION DEFERRED; //缺省在11gR2 11.3 EXTENT(区) 11.3.1 EXTENT(区)的特点: 区是ORACLE进行存储空间分配的最小单位。是由一系列逻辑上连续的Oracle数据块组成的逻辑存储结构。段中第一个区叫初始区,随后分配的区叫后续区。 11.3.2 区的管理方式: 1)字典管理:在数据字典中管理表空间的区空间分配。Oracle 8i以前只有通过uet$和fet$的字典管理。 缺点:某些在字典管理方式下的存储分配有时会产生递归操作,并且容易产生碎片,从而影响了系统的性能,现在已经淘汰了。 2)本地管理:在每个数据文件中使用位图管理空间的分配。表空间中所有区(extent)的分配信息都保存在该表空间对应的数据文件的头部。 优点:速度快,存储空间的分配和回收只是简单地改变数据文件中的位图,而不像字典管理方式还需要修改数据库。无碎片,更易于DBA维护。 11.3.3 表和区(extent)的关系: 当建立表的时候建立段,然后自动分配相应的extent(1个或者多个),亦可以手工提前分配extent(用于需大量插入数据的表) 11.3.4 实验:查看段的初始区分配情况 sys: SQL> create tablespace test datafile '/u01/oradata/timran11g/test01.dbf' size 10m; SQL> create table scott.t1 tablespace test as select * from scott.dept; SQL> col segment_name for a20; SQL> select segment_name,file_id,extent_id,bytes from dba_extents where segment_name='T1'; SEGMENT_NAME FILE_ID EXTENT_ID BYTES -------------------- ---------- ---------- ---------- T1 6 0 65536 可以看到段T1的初始区ID为0,大小为 65536 bytes; 向表段中自插表数据,看Oracle为该段分配更多的区 SQL> insert into scott.t1 select * from scott.t1; 已创建2048行。 SQL> select segment_name,bytes from dba_extents where segment_name='T1'; SEGMENT_NAME FILE_ID EXTENT_ID BYTES -------------------- ---------- ---------- ---------- T1 6 0 65536 T1 6 1 65536 T1 6 2 65536 此时看到随着数据的插入,T1段动态扩展为三个区; SQL> delete scott.t1; 已删除4096行。 SQL> select segment_name,bytes from dba_extents where segment_name='T1'; 此时表段的数据已经删除,但所有extent依然健在,无法回收T1段的所有区,可以要求一个预分配的所需空间(但要注意,所需要的空间 一定是在表空间可达到的size范围内): alter table scott.t1 allocate extent (datafile '/u01/oradata/timran11g/test01.dbf' size 5m); SQL> select segment_name,bytes from dba_extents where segment_name='T1'; SEGMENT_NAME EXTENT_ID FILE_ID BYTES -------------------- ---------- ---------- ---------- T1 0 6 65536 T1 1 6 65536 T1 2 6 65536 T1 3 6 1048576 T1 4 6 1048576 T1 5 6 1048576 T1 6 6 1048576 T1 7 6 1048576 回收free extent,使用deallocate,注意:只能收回从未使用的extent。 SQL> alter table scott.t1 deallocate unused; 表已更改。 SQL> select segment_name,bytes from dba_extents where segment_name='T1'; SEGMENT_NAME EXTENT_ID FILE_ID BYTES -------------------- ---------- ---------- ---------- T1 0 6 65536 T1 1 6 65536 T1 2 6 65536 顺便提一句:如何查看一个表所对应的数据文件及表空间呢? 抓住上面dba_extents中的file_id字段(user_extents里没有这个字段),然后; SQL> select file_id,file_name,tablespace_name from dba_data_files; 11.4 BLOCK(数据块) 11.4.1 BLOCK(数据块)的特点: BLOCK是Oracle进行存储空间IO操作的最小单位,BLOCK的管理方法是区的管理和段管理的具体体现: 1、自动管理方式 如创建表空间时区为本地管理方式,并且将段的存储空间方式设置为AUTO(即ASSM),该表空间的所有块均采用位图自动管理方式。这是系统默认的。 2、空闲列表方式(MSSM) 引入FREELIST概念,以及PCTFREE和PCTUSED两个参数控制可用存储区的大小,避免行迁移现象的发生。这两个参数可在创建表空间时设置,也可在建立数据库的模式对象(表,索引)中设置。模式对象中设置的优先级比表空间的要高。就是说;如表和索引中没有设置,则按表空间的设置,如表空间也没设置,则按自动管理方式管理块。 data block :oracle 11g 标准块:8k,支持2-32k,有block header 、free space 、data 组成 数据块头部: ITL:事务槽,可以有多个ITL以支持并发事务,每当一个事务要更新数据块里的数据时,必须先得到一个ITL槽,然后将当前事务ID,事务所用的undo数据块地址,SCN号,当前事务是否提交等信息写到ITL槽里。 initrans :初始化事务槽的个数,表默认1,index 默认为2; maxtrans: 最大的事务槽个数 (默认255) ROW DIR: 行目录,指向空闲行起始和结束的偏移量。 考点:使块头增加的可能情况是,row entries增加,增加更多的ITL空间。 空闲列表方式的数据块的管理: freelist:空闲列表中登记了可以插入数据的可用块,位置在段头,插入表行数据时首先查找该列表。 pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。达到该值,从freelist清除该块信息。 pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。达到该值,该块信息加入freelist 。这个参数在ASSM下不使用。 行链接:指一行存储在多个块中的情况,这是因为该行的长度超过了一个块的可用空间大小,即行链接是跨越多块的行。 行迁移:指一个数据行由于update语句导致当前块被重新定位到另一个块(那里有充足的空间)中,但在原始块中保留一个指针的情形(PPT-II-470)。原始块中的指针是必需的,因为索引的ROWID项仍然指向原始位置。行迁移是update语句当pctfree空间不足时引起的,它 与insert和delete语句无关(考点)。 如何能够知道发生了行链接或行迁移? 查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列,当CHAIN_CNT有值时,看AVG_ROW_LEN,它表示行的平均长度(byte),如果AVG_ROW_LEN<块大小,那么行是迁移行,如果>块大小,那么是链接行。 查看发生迁移或连接的行,使用analyze table xx list chained rows; 但命令需要将结果插入chained_rows表,创建此表用utlchained.sql或utlchn1.sql脚本。参见sql referenve中的analyze命令。 SQL> create table t1 (c1 varchar2(20)); SQL> begin for i in 1..1000 loop insert into t1 values(null); end loop; end; / 分析t1表确定无行迁移 SQL> analyze table t1 compute statistics; SQL> select pct_free,pct_used,avg_row_len,chain_cnt from user_tables where table_name='T1'; PCT_FREE PCT_USED AVG_ROW_LEN CHAIN_CNT ---------- ---------- ----------- ---------- 10 3 0 填充这些空列,再分析t1,有了行迁移 SQL> update t1 set c1='timran is my name'; SQL> analyze table t1 compute statistics; SQL> select pct_free,chain_cnt from user_tables where table_name='T1'; PCT_FREE PCT_USED AVG_ROW_LEN CHAIN_CNT ---------- ---------- ----------- ---------- 10 26 865 move表,再分析t1,行迁移消失。 思考:段重组对于行链接有效吗? SQL> alter table t1 move; SQL> analyze table t1 compute statistics; SQL> select pct_free,chain_cnt from user_tables where table_name='T1'; PCT_FREE PCT_USED AVG_ROW_LEN CHAIN_CNT ---------- ---------- ----------- ---------- 10 21 0 注意点:对于大部分目的而言,应该用DBMS_STATS包中的过程分析表,但要查看行链接或行迁移信息,只能通过ANALYZE命令检测。 11.4.2 表和数据块(block)的关系 1)什么是高水位线? 高水位线(high-water mark,HWM) 在数据库中,如果把表想象成从左到右依次排开的一系列块,高水位线就是曾经包含了数据的最右边的块。原则上HWM只会增大,即使将表中的数据全部删除,HWM也不会降低。 HWM不是好事,使用全表扫描时通常要读出HWM以下的所有数据块(尽管该表中可能仅有少量数据),这将白白耗费大量IO资源。 2)两个解决办法可降低HWM: 2.1)移动表,move方法,将表从一个表空间移动到另一个表空间(也可以在本表空间内move)。 语法:alter table t1 move [tablespace users]; 优点:可以清除数据块中的碎片,降低高水位线。 缺点:move需要额外(一倍)的空间。 move过程中会锁表,其他用户不能在该表上做DML或DDL操作。 move之后,相关索引都不可用了,表上的索引需要重建(考点)。 2.2)收缩表,shrink 也叫段重组,表收缩的底层实现的是通过匹配的INSERT和DELETE操作。 它分两个不同的阶段:压缩阶段和降低HWM阶段。(PPT-II-491) 语法:alter table t2 shrink space [cascade][compact]; 两个前提:1)表所在的表空间段管理是ASSM方式,因为位图方法才记录有关块实际的满度信息(考点)。2)表上启用了row movement。 你发出alter table t2 shrink space compact; 那么只完成了第一阶段。这是压缩阶段。在业务高峰时可以先完成第一阶段 高峰过后,再次alter table t2 shrink space; 因压缩阶段工作大部分已完成,将很快进入第二阶段,DML操作会有短暂的锁等待发生。 测试: create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size 100m; create table scott.t2 tablespace timran as select * from dba_objects; scott: select max(rownum) from t2; select table_name,blocks,empty_blocks,num_rows from user_tables where table_name='T2'; analyze table t2 compute statistics; delete t2 where rownum<=40000; commit; analyze table t2 compute statistics for table; select table_name,num_rows from user_tables where table_name='T2'; 这时候,num_rows已经减掉了40000条, 但 blocks 并没有减少, 说明HWM没有下降。 做shrink alter table t2 enable row movement; //使能行移动 进行第一步----压缩阶段 alter table t2 shrink space compact; analyze table t2 compute statistics for table; select table_name,num_rows from user_tables where table_name='T2'; //HWM不会降低。 进行第二步----降低HWM阶段 alter table t2 shrink space; analyze table t2 compute statistics for table; select table_name,num_rows from user_tables where table_name='T2'; //HWM已经降低。 注意点: 1,表收缩操作生成undo和redo数据,索引可以得到维护。 2,收缩分为两个阶段 第一阶段是压缩阶段,第二阶段是降低HWM阶段。SHRINK不占用额外的空间。 3,可以单独完成第一阶段,即SHRINK SPACE COMPACT 此阶段不降低HWM,DML操作几乎不受影响。 4,可以级联相关的段一起收缩,即SHRINK SPACE CASCADE。 5,段必须ASSM管理方式,且使能行移动,否则不能收缩,如果不满足这两个前提,MOVE就是重组表的唯一方式。 6,不能收缩MSSM管理,或有LONG列表或是有refresh_on_commit物化视图的表。 11.5 临时表空间 11.5.1 temporary tablespace用途: 用于排序,可以建立多个临时表空间,但默认的临时表空间只能有一个,default temporary tablespace不能offline和drop。如果未指定默 认的临时表空间,oracle 将会使用system作为临时表空间(非本地管理),只有temp表空间是nologing。 09:00:53 SQL> alter tablespace temp add tempfile '/u01/oradata/timran11g/temp01.dbf' size 120m reuse; 这等于在原地重置了临时表空间。 09:01:14 SQL> select file_id,tablespace_name from dba_temp_files; FILE_ID FILE_NAME TABLESPACE_NAME ---------- -------------------------------------------------- ------------------------------ 1 /u01/oradata/timran11g/temp01.dbf TEMP 09:01:17 SQL> col name for a60; 09:01:19 SQL> select file#,name,bytes/1024/1024 from v$tempfile; FILE# NAME BYTES/1024/1024 ---------- -------------------------------------------------- --------------- 1 /u01/oradata/timran11g/temp01.dbf 100 11.5.2 建立临时表空间temp2,增加或删除tempfile。 09:04:18 SQL> create temporary tablespace temp2 tempfile '/u01/oradata/timran11g/temp02.dbf' size 10m; 09:05:00 SQL> alter tablespace temp2 add tempfile '/u01/oradata/timran11g/temp03.dbf' size 5m; SQL> select file_id,tablespace_name from dba_temp_files; FILE_ID FILE_NAME TABLESPACE_NAME ---------- -------------------------------------------------------------------------------- ------------------------------ 1 /u01/oradata/timran11g/temp01.dbf TEMP 2 /u01/oradata/timran11g/temp02.dbf TEMP2 3 /u01/oradata/timran11g/temp03.dbf TEMP2 将temp2里删掉一个tempfile。 SQL> alter tablespace temp2 drop tempfile '/u01/oradata/timran11g/temp03.dbf'; SQL> select file_id,tablespace_name from dba_temp_files; FILE_ID FILE_NAME TABLESPACE_NAME ---------- -------------------------------------------------------------------------------- ------------------------------ 1 /u01/oradata/timran11g/temp01.dbf TEMP 2 /u01/oradata/timran11g/temp02.dbf TEMP2 11.5.3 查看默认的临时表空间 09:06:52 SQL> col PROPERTY_VALUE for a30 09:06:59 SQL> col description for a40 09:07:04 SQL> select * from database_properties; PROPERTY_NAME PROPERTY_VALUE DESCRIPTION ------------------------------ ------------------------------ ---------------------------------------- DICT.BASE 2 dictionary base tables version # DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace DEFAULT_TBS_TYPE SMALLFILE Default tablespace type NLS_LANGUAGE AMERICAN Language NLS_TERRITORY AMERICA Territory ..... 27 rows selected. 11.5.4 指定用户使用临时表空间 20:55:00 SQL> alter user scott temporary tablespace temp2; //注意,与default profile不同,删除了temp2,scott的temporary不会转回到temp。 11.5.5 切换默认的临时表空间 09:07:05 SQL> alter database default temporary tablespace temp2; 09:07:34 SQL> select * from database_properties; PROPERTY_NAME PROPERTY_VALUE DESCRIPTION ------------------------------ ------------------------------ ---------------------------------------- DICT.BASE 2 dictionary base tables version # DEFAULT_TEMP_TABLESPACE TEMP2 Name of default temporary tablespace DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace DEFAULT_TBS_TYPE SMALLFILE Default tablespace type NLS_LANGUAGE AMERICAN Language ... 09:07:41 SQL> 11.5.6 建立临时表空间组 (10g新特性) 在很多情况下,会有多个session 使用同一个用户名去访问Oracle,而临时表空间又是基于用户的,那么可以建立一个临时表空间组, 组中由若干临时表空间构成,从而可以提高单个用户多个会话使用表空间的效率。 1)临时表空间组无法显式创建,组是通过第一个临时表空间分配时自动创建。 09:07:41 SQL> alter tablespace temp tablespace group tmpgrp; 09:09:33 SQL> alter tablespace temp2 tablespace group tmpgrp; 09:09:38 SQL> select * from dba_tablespace_groups; GROUP_NAME TABLESPACE_NAME ------------------------------ ------------------------------ TMPGRP TEMP TMPGRP TEMP2 2)将临时表空间组设成默认临时表空间,实现负载均衡。 09:09:52 SQL> alter database default temporary tablespace tmpgrp; Database altered. 09:10:10 SQL> select * from database_properties; PROPERTY_NAME PROPERTY_VALUE DESCRIPTION ------------------------------ ------------------------------ ---------------------------------------- DICT.BASE 2 dictionary base tables version # DEFAULT_TEMP_TABLESPACE TMPGRP Name of default temporary tablespace DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace DEFAULT_TBS_TYPE SMALLFILE Default tablespace type NLS_LANGUAGE AMERICAN Language NLS_TERRITORY AMERICA Territory 3)要移除表空间组时,该组不能是缺省的临时表空间。 SQL>alter database default temporary tablespace temp; 05:38:11 SQL> alter tablespace temp tablespace group ''; 05:38:16 SQL> alter tablespace temp2 tablespace group ''; 4)当组内所有临时表空间被移除时,组也被自动删除。 05:38:23 SQL> select * from dba_tablespace_groups; no rows selected SQL> drop tablespace temp2 including contents and datafiles; 注意点:某个tempfile坏掉使得default temporary tablespace不能正常工作,数据库不会crash,解决的办法是add一个新的tempfile,然后 再drop掉坏的tempfile.(default temporary tablespace不能offline,但temporary file可以offline) 11.6 如何调整表空间的尺寸(表空间的大小等同它下的数据文件大小之和) 当发生表空间不足的问题时常用的3个解决办法: 1)增加原有数据文件大小(resize) alter database datafile '/u01/oradata/timran11g/timran01.dbf' resize 10m; 2)增加一个数据文件(add datafile) alter tablespace timran add datafile '/u01/oradata/timran11g/timran02.dbf' size 20m; 3)设置表空间自动增长(autoextend) alter database datafile '/u01/oradata/timran11g/timran01.dbf' autoextend on next 10m maxsize 500m; 例: SQL> create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size 5m; 05:46:08 SQL> create table scott.test1 (id int) tablespace timran; 05:47:12 SQL> insert into scott.test1 values(1); 05:47:15 SQL> insert into scott.test1 select * from scott.test1; 05:47:23 SQL> / 05:47:23 SQL> / 32768 rows created. 05:47:23 SQL> / insert into scott.test1 select * from scott.test1 * ERROR at line 1: ORA-01653: unable to extend table SCOTT.TEST1 by 8 in tablespace TIMRAN //用第一种方法扩充表空间 05:47:23 SQL> alter database datafile '/u01/oradata/timran11g/timran01.dbf' resize 10m; 05:48:18 SQL> insert into scott.test1 select * from scott.test1; 05:48:25 SQL> / 131072 rows created. 05:48:26 SQL> / insert into scott.test1 select * from scott.test1 * ERROR at line 1: ORA-01653: unable to extend table SCOTT.TEST1 by 128 in tablespace TIMRAN //用第二种方法扩充表空间: 05:48:57 SQL> alter tablespace timran add datafile '/u01/oradata/timran11g/timran02.dbf' size 20m; 05:49:04 SQL> insert into scott.test1 select * from scott.test1; 05:49:13 SQL> / 524288 rows created. 05:49:14 SQL> / insert into scott.test1 select * from scott.test1 * ERROR at line 1: ORA-01653: unable to extend table SCOTT.TEST1 by 128 in tablespace TIMRAN //用第三种方法扩充表空间: 05:49:15 SQL> alter database datafile '/u01/oradata/timran11g/timran01.dbf' autoextend on next 10m maxsize 500m; 05:49:33 SQL> insert into scott.test1 select * from scott.test1; 05:49:37 SQL> drop tablespace timran including contents and datafiles; 11.7 可恢复空间分配 Oracle的Resumable(可恢复)功能 (PPT-II-502) 当我们往一个表里面插入大量数据时,如果某条insert语句因表空间的空间不足(没有开启自动扩展),会报 ORA-01653:无法扩展空间的 错误,该条SQL语句会中断,浪费了时间及数据库资源。为防范这个问题,Oracle设计了resumable。在resumable开启的情况下,如果 Oracle执行某条SQL申请不到空间了,比如数据表空间,undob表空间,temporary空间等,则会将该事务的语句挂起(suspended),等 你把空间扩展后,Oracle又会使该insert语句继续进行。 可以通过两个级别设置resumable system级别:初始化参数RESUMABLE_TIMEOUT非0,这将使数据库中所有session使用可恢复的空间分配 session级别:alter session enable|disable resumable [TIMEOUT]; 这将为当前session设置可恢复的空间分配 因为resumable是有资源消耗代价的,所以session级的resumable是比较实际的: 注意TIMEOUT的用法,单位为秒,进一步要理解初始化参数RESUMABLE_TIMEOUT的含义 RESUMABLE_TIMEOUT=0,enable session时应该指定TIMEOUT。否则使用缺省值7200秒。 RESUMABLE_TIMEOUT<>0,enable session时可以省略TIMEOUT,此时指定TIMEOUT会覆盖掉参数RESUMABLE_TIMEOUT值。 举例: session 1: 1)建个小表空间,固定2m大小,然后建个表属于这个表空间 SQL> create tablespace small datafile '/u01/oradata/timran11g/small01.dbf' size 2m; SQL> create table scott.test(n1 char(1000)) tablespace small; 2)向这个表插入数据,表空间满了,使for语句没有完成循环,2000条语句整体失败。 SQL> begin for i in 1..2000 loop insert into scott.test values('this is test'); end loop; commit; end; / begin * 第 1 行出现错误: ORA-01653: 表 SCOTT.TEST 无法通过 128 (在表空间 SMALL 中) 扩展 ORA-06512: 在 line 3 SQL> select count(*) from scott.test; COUNT(*) ---------- 0 3)使能 resumable功能 SQL> alter session enable resumable; 4)再重复第2)步,会话被挂起; session 2: 5)查看视图的有关信息 SQL> select session_id,sql_text,error_number from dba_resumable; SESSION_ID SQL_TEXT ERROR_NUMBER ---------- -------------------------------------------------- ------------ 136 INSERT INTO SCOTT.TEST VALUES('this is test') 1653 SQL> select sid,event,seconds_in_wait from v$session_wait where sid=136; SID EVENT SECONDS_IN_WAIT ---------- ---------------------------------------------------------------- --------------- 136 statement suspended,wait error to be cleared 1 6)加扩表空间,看到session1里挂起的会话得以继续并成功完成了2000条语句的插入。 SQL> alter tablespace small add datafile '/u01/oradata/timran11g/small02.dbf' size 4m; SQL> select count(*) from scott.test; COUNT(*) ---------- 2000 7)查看EM告警日志报告了以上信息。验证结束后可以disable resumable,并删除small表空间及数据文件。 session 1: SQL> alter session disable resumable; SQL> drop tablespace small including contents and datafiles; 考点: 1.下列三种情况可引起resumable a)表空间上限超出,b)extents到达最大值,c)quota超出。 2.enable resumable可以在一个session中多次挂起执行的语句,直到disable resumable。 3.DBMS_RESUMABLE.SET_SESSION_TIMEOUT 可以延长当前session的TIMEOUT,并立即有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读773次,点赞6次,收藏9次。【代码】c# json字符串转Oracle的insert into的小程序。
文章浏览阅读8.7k次,点赞2次,收藏17次。此现象一般定位到远端的监听服务来找问题,在远端查看监听服务状态(具体看下面的解决方案会详细呈现),服务是否开启,另外查看监听端点概要是否存在host未指向到计算名的,如无直接进入监听配置文件listener.ora内添加指向即可。2、查看监听服务状态 lsnrctl status,右边为远端端点状态,未添加host指向到计算名;1、本地及远端安装好Oracle并配置好连接,Oracle服务和监听已启动;1、远程Oracle数据库:Oracle11g R2。或者进入下述服务手动重启。,再进行远程连接即可。_ora-12541:tns:无监听程序
文章浏览阅读2.8k次。mysql脚本转化为oracle脚本_mysql建表语句转oracle
文章浏览阅读2.2k次。cx_Oracle报错:cx_Oracle DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library_cx_oracle.databaseerror: dpi-1047: cannot locate a 64-bit oracle client libr
文章浏览阅读1.1k次,点赞38次,收藏35次。本文深入探讨了Oracle数据库的核心要素,包括体系结构、存储结构以及各类参数。通过解析Oracle数据库的体系结构,读者可以深入了解其内部组成和工作原理。存储结构部分介绍了数据在Oracle中的存储方式,从表空间到数据文件的层层逻辑。最后,我们深入探讨了Oracle数据库中各类参数的作用和配置方法,帮助读者更好地理解和优化数据库性能。本文旨在帮助读者全面理解Oracle数据库的运作机制,为其在实践中的应用提供基础和指导。
文章浏览阅读1.5k次。默认自动收集统计信息的时间为晚上10点(周一到周五,4个小时),早上6点(周六,周日,20个小时)由于平时默认每天只收集4小时,时间有点短了,改成每天可收集8小时。oracle 18c中默认是打开的。查看当前自动收集统计信息的时间。_oracle自动收集统计信息
文章浏览阅读929次,点赞18次,收藏20次。只有assm(Automatic Shared Memory Management)模式可以使用大页,需要关闭amm(Memory Manager Process)HugePages_Free: 306 (空闲306页,已使用306-306=0页)防止oracle使用的内存交换,所以设置的大小与oracle配置的sga、pga相关。HugePages_Rsvd: 0 (操作系统承诺给oracle预留的页数)HugePages_Total: 306 (总共306页)_oracle11g 大页
文章浏览阅读801次。例如:10046:0,1,4,8,12。默认redo日志有三个,大小为50M,循环覆盖使用。redo log再覆盖之前,会被归档,形成归档日志。答:不同事件,不同级别。trace的不同级别?_oracle 日志
文章浏览阅读4.2k次,点赞84次,收藏77次。主要讲解MySQL中SQL的DDL语句,其中包括对数据库和表的一系列操作。_sql ddl 新增字段 mysql
文章浏览阅读1.1k次。ON DEMAND:仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;ON COMMIT:一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。Method =>'C',物化视图有三种刷新方式:COMPLETE、FAST和FORCE。物化视图会占用空间,一半可用于大量数据查询时,减缓主表的查询压力使用。例如创建一个物化视图,让对接单位查询。_oracle物化视图定时刷新
文章浏览阅读713次,点赞21次,收藏18次。1.背景介绍在当今的大数据时代,数据量越来越大,传统的关系型数据库已经无法满足业务需求。因此,NoSQL数据库技术迅速崛起,成为企业和开发者的首选。Oracle NoSQL Database是Oracle公司推出的一款分布式NoSQL数据库产品,具有高性能、高可用性和易于扩展等特点。在本文中,我们将深入了解Oracle NoSQL Database的集成与开发者工具,帮助您更好地掌握这款产品的...
文章浏览阅读2.5k次,点赞2次,收藏4次。今天遇见一个问题需要将字段中包含中文字符串的筛选出来。_oracle查询包含中文字符
文章浏览阅读802次。arcmap 在oracle删除表重新创建提示表名存在解决放啊
文章浏览阅读4.3k次,点赞2次,收藏4次。Oracle连接数据库提示 ORA-12638:身份证明检索失败_ora-12638
文章浏览阅读3.4k次,点赞6次,收藏25次。etc/profile是一个全局配置文件,所有用户登录都会使用该文件构建用户环境。与windows配置环境变量是一个道理。选择Linux系统,找到适合自己系统的安装包,我的是CentOS 8 x64。接下来需要登陆Oracle账户才能下载,无账户的可以自己注册一个。Linux中export 命令用于设置或显示环境变量。模式,利用上下键到文档最后,添加以下代码。出现如图所示版本号字样,则说明安装成功。点击下载,勾选1,点击2。记住完整路径用于后面配置。找到Java并点击进去。往下翻,找到Java8。_linux安装jdk1.8
文章浏览阅读2.4w次,点赞26次,收藏109次。JDK 是的简称,也就是 Java 开发工具包。JDK 是整个 Java 的核心,其中JDK包含了 Java 运行环境(Java Runtime Envirnment,简称 JRE),Java 工具(比如 javac、java、javap 等等),以及 Java 基础类库(比如 rt.jar)。最主流的 JDK 是Oracle公司发布的 JDK,除了 Oracle JDK(商业化,更稳定)之外,还有很多公司和组织开发了属于自己的 JDK,比较有名的有IBM JDK(更适合 IBM) 和OpenJDK。_jdk安装教程
文章浏览阅读7.5w次。出现 “java.sql.SQLNonTransientConnectionException:Could not create connection to database server” 的错误通常是由于无法连接到数据库服务器引起的。_java.sql.sqlnontransientconnectionexception: could not create connection to
文章浏览阅读849次,点赞7次,收藏10次。在ClickHouse中创建用户、数据库并进行权限分配是一个重要的管理任务,它涉及到安全性和访问控制。下面是一个基本的指南来帮助你完成这些操作:1. 创建数据库首先,需要创建一个数据库。使用以下命令:CREATE DATABASE IF NOT EXISTS your_database_name;将 your_database_name 替换为你想要的数据库名。2. 创建用户接下来,创建一个新用户。使用以下命令:CREATE USER your_username IDENTIFIED WIT_在clickhouse中如何创建用户 赋权
文章浏览阅读1.2k次,点赞53次,收藏39次。本文是一篇关于Oracle数据库安装和使用的博文摘要。作者以轻松幽默的笔调介绍了自己在实验中掌握的Oracle数据库基本操作,包括使用组件查看命令、配置数据库监听器等。作者也分享了在实验中遇到的一些有趣问题,如SQL语句缺少分号导致的意外错误。此外,作者还强调了登录sys用户和启动实例加载数据库的注意事项,并鼓励读者面对挑战时保持乐观,不断提升自己的能力。整体风格风趣严谨,引人入胜。
文章浏览阅读820次,点赞17次,收藏16次。KingbaseES、xml、dbms_xmlgen、SETSKIPROWS、人大金仓、KingbaseES兼容Oracle包dbms_xmlgen的功能是通过SQL查询将关系表中数据转化为XML文档。转化方式一共有两种:(1)通过查询字符串直接转化。(2)通过上下文句柄转化。对于通过查询字符串直接转化的方式,无法跳过若干行进行查询,只能直接将表格中的所有数据转化为XML文档。