6、用户与Oracle服务器的连接方式...12
第二章:实例管理及数据库的启动/关闭...14
2.1实例和参数文件...14
2.2数据库启动与关闭:...16
2.3告警日志:alert_SID.log.18
2.4口令文件...19
2.5添加scott案例...21
第三章:控制文件...22
3.1控制文件的功能和特点:...22
3.2控制文件的内容...22
3.3控制文件多元化...24
3.4控制文件的重建与备份...24
3.5控制文件手工恢复...25
第四章:redo日志...26
4.1redo(重做)log的功能:数据recovery.27
4.2redolog特征:...27
4.3redo日志组...27
4.4如何添加日志组...27
4.5如何添加日志组的成员...29
4.6如何查看日志信息...30
4.7redo日志成员重命名或迁移...31
第五章:归档日志archivelog.40
5.1归档和非归档的区别...40
5.2查看归档模式:...41
5.3设置归档模式...41
5.4、归档日志的路径及命名方法...41
5.5在liunx下查看归档进程...43
5.6日志归档:...44
第六章日志挖掘logminer.45
6.1logminer的作用:...45
6.2有两种日志挖掘方法针对DML和DDL,整理如下:...45
第七章:管理undo.49
7.1undo作用...49
7.2undo的管理模式:...49
7.3undo表空间管理...49
7.4查看当前正在使用的undotablespace.50
7.5切换undo.51
7.6删除undotablespace.52
7.7undoblock的4种状态...52
7.8关于undo_retention参数...53
7.9undo信息的查询...54
7.10system表空间的undo.55
7.11测试:模拟数据库open下的undo损坏和修复。...55
第八章检查点(checkpoint)59
8.1什么是checkpoint.59
8.2checkpoint主要2个作用:...60
8.3checkpoint分类...60
8.4设置合理的MTTR参数...63
8.5局部检查点的触发条件:...64
第九章实例恢复机制...64
第二部分Oracle的存储架构...65
第十章数据字典...65
10.1数据字典...65
10.2动态性能表(V$)...66
第十一章:Oracle的存储架构...67
11.1TABLESPACE(表空间)特点...67
11.2SEGMENT(段)...73
11.3EXTENT(区)...75
11.4BLOCK(数据块)...79
11.5临时表空间...84
11.6如何调整表空间的尺寸(表空间的大小等同它下的数据文件大小之和)...88
11.7Oracle的Resumable功能...90
第十二章:Oracle中表的几种类型...90
12.1分区表及其种类(10g)90
12.2索引组织表...95
12.3簇表(clustertable):...96
12.4临时表:...97
12.5只读表(11g新特性)...97
第十三章:数据库审计audit.98
13.4审计的对象:...99
13.5举例:...99
第十四章:数据装载sqlloader.101
第十五章:oracle网络...105
15.1OracleNet基本要素:...105
15.2客户端链接:...106
15.3lisenter注册:...106
第三部分:管理ORACLE数据库...111
第十六章:OracleASM管理(ppt-II:602-636)111
16.1什么是ASM..111
16.2系统级的磁盘管理...111
16.3ASM和LSM的比较...111
16.4ASM体系结构...112
16.5在Linux上创建ASM实例的范例...114
第十七章:逻辑备份与恢复...124
17.1传统的导入导出exp/imp:...125
第十八章物化视图...133
看ppt,Oracle结构的基本单元、术语
1)oracleserver:database+instance
2)database:datafile、controlfile、redologfile
3)instance:aninstanceaccessadatabase
//一个实例访问一个数据库
4)oraclememory:sga+pga
5)instance:sga+backgroudprocess
//sga+后台进程
6)sga组成:sga在一个instance只有一个sga,sga为所有session共享,随着instance启动而分配,instancedown,sga被释放。
//systemgrobleareas
1)sharedpool
共享池是对SQL、PL/SQL程序进行语法分析、编译、执行的内存区域。
共享池由库缓存(librarycache),和数据字典缓存(datadictionarycache)组成。
共享池的大小直接影响数据库的性能。
关于sharedpool中的几个重要概念
librarycache:sql和plsql的解析场所,存放着所有编译过的sql语句代码,以备所有用户共享。
sql语句解析过程:
硬解析:
1)分析:包括SQL语句的语法和语义检验,并检查所执行活动的对象权限。
2)优化:Oracle优化程序在评估了几种备选方案后,得出如何以最低成本(COST)处理相应语句的最终方案。
软解析:
3)执行:Oracle执行这个执行计划。(这个成本最低的执行计划也包括访问路径,也存在库缓存中)
4)取数据:只用于select语句,这个步骤在非查询语句中不需要。
datadictionarycache:存放重要的数据字典信息,以备数据库使用
2)databasebuffercache
用于存储从磁盘数据文件中读入的数据,所有用户共享。
服务器进程(serverprocess)将读入的数据保存在数据缓冲区中,当后续的请求需要这些数据时可以在内存中找到,则不需要再从磁盘读取。
数据缓冲区中被修改的数据块(脏块)由后台进程DBWR将其写入磁盘。
数据缓冲区的大小对数据库的读取速度有直接的影响。
考点:服务器进程对数据文件执行读操作,而DBWN负责对数据文件执行写操作。
dbbuffer中的几个cache参数:
db_cache_size//指定标准块大小内存空间,比如标准块是8k,LRU默认数据块放到defaultcache
db_nk_cache_size//指定非标准块大小内存空间,比如2k、4k、16k、32k。
db_keep_cache_size//keep存放经常访问的小表或索引等
db_recycle_cache_size//与keep相反,存放偶尔做全表扫描的大表的数据
注意:
2.1)keepcache和recyclecache是可选的。全部buffercache的大小就是以上参数的总合。即没有分配到keepcache和recyclecache的任何数据库对象都将分配给defaultcache。说的更清楚些就是default,keep,recycle相互独立,对于某一个对象(表)来说,它只能属于它们之中的一种。
SQL>altertablescott.emp1storage(buffer_poolkeep);
SQL>selectsegment_name,buffer_poolfromdba_segmentswheresegment_name='EMP1';
SEGMENT_NAMEBUFFER_
----------------------------------------------------------------------------------------
EMP1KEEP
2.2)default_cache_szie和标准块defaultblock是配套的,如果defaultblock是8k,db_cache_size这个参数将代替db_8k_cache_size。
如果要建立非标准块的表空间,先前要设定dbbuffer中的与之对应的nk_cache_size。
09:50:46SQL>altersystemsetdb_16k_cache_size=8m;//改参数,先把dbbuffer里的16kcache建上。
09:50:49SQL>createtablespacetbs_16kdatafile'/u01/oradata/timran11g/tbs16k01.dbf'size10mblocksize16k;
09:51:29SQL>selectTABLESPACE_NAME,block_sizefromdba_tablespaces;
TABLESPACE_NAMEBLOCK_SIZE
----------------------------------------
SYSTEM8192
UNDOTBS18192
SYSAUX8192
TEMP8192
USERS8192
EXAMPLE8192
TBS_16K16384
2.3)查看buffercache命中率:
18:28:20SQL>select(1-(sum(decode(name,'physicalreads',value,0))/(sum(decode(name,'dbblockgets',value,0))+sum(decode(name,'consistentgets',value,0)))))*100"HitRatio"fromv$sysstat;
HitRatio
----------
97.6811923
3)redologbuffer
日志条目(redoentries)记录了数据库的所有修改信息(包括DML和DDL),用于数据库恢复,日志条目首先产生于日志缓冲区。
日志缓冲区较小,它是以字节为单位的,它极其重要。
18:29:04SQL>showparameterlog_buffer
NAMETYPEVALUE
-----------------------------------------------------------------------------
log_bufferinteger7057408
*考点:日志缓冲区的大小是不变的,启动时就是固定值,只能手动设置,不能由SGA自动管理!
如果想让它是一个最小值,这样可以做:
18:30:24SQL>altersystemsetlog_buffer=1scope=spfile;//修改动态参数文件,下次启动有效。
18:31:20SQL>startupforce
18:31:35SQL>showparameterlog_buffer;
log_bufferinteger2927616//这就是最小值了
4)largepool(可选)
为了进行大的后台进程操作而分配的内存空间,与sharedpool管理不同,主要用于并行查询,RMAN备份恢复、以及共享连接方式等。
5)javapool(可选)
为了java虚拟机及应用而分配的内存空间,包含大量JAVA代码。
6)streampool(可选)
为了stream应用而分配的内存空间。stream技术是为了在不同数据库之间共享数据,因此,它只对使用了stream数据库特性的系统是重要的。
从Oracle10g有了SGA自动管理,有关的pool可以动态自动调整
a)sga_max_size:SGA最大物理空间
b)sga_target:SGA实际可达最大空间,sga_target<=sga_max_size,设定这个值>0时就使能了SGA的自动管理。
c)granules(颗粒):组成oracle内存的最小单位
sga_max_size<1G,4m
sga_max_size>1G,16m
20:12:30SQL>selectname,bytes/1024/1024"Size(M)"fromv$sgainfo;//在oracle里查看SGA分配情况
NAMESize(M)
------------------------------------------
FixedSGASize1.2401123
RedoBuffers1.84765625
BufferCacheSize56
SharedPoolSize152
LargePoolSize4
JavaPoolSize12
StreamsPoolSize4
SharedIOPoolSize0
GranuleSize4
MaximumSGASize403.089844
StartupoverheadinSharedPool40
FreeSGAMemoryAvailable172
三种process:1)userprocess、2)serverprocess、3)backgroundprocess
userprocess:属于客户端的process,一般分为三种形式,1)sql*plus,2)应用程序,3)web方式(OEM)
客户端请求,sqlplus是客户端命令,oracle不容许userprocess直接访问oracleserver。
*考点:由userprocess造成的会话终止,系统将自动回滚这个会话上的处于活动状态的事务。
如果windows作为客户端:可以通过查看任务管理器看到sqlplus用户进程:
C:\DocumentsandSettings\timran>sqlplussys/system@timran11gassysdba
linux作为客户端时可以使用ps看到sqlplus关键字:
[oracle@timran~]$ps-ef|grepsqlplus
oracle23532325017:02pts/000:00:00rlwrapsqlplus/assysdba
oracle23542353017:03pts/100:00:00sqlplusassysdba
oracle26032445017:25pts/200:00:00grepsqlplus
serverprocess:这是服务器端的进程,userprocess不能直接访问Oracle,必须通过相应的serverprocess访问实例,进而访问数据库。
[oracle@timran~]$ps-ef|grepLOCAL
oracle23992354117:0300:00:04oracletimran11g(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle25031017:0500:00:00oracletimran11g(LOCAL=NO)
oracle25122445017:07pts/200:00:00grepLOCAL
[oracle@timran~]$
//注意:在linux下看到的serverprocess,(LOCAL=YES)是本地连接,(LOCAL=NO)是远程连接。
backgroudprocess:
非常重要!有许多后台进程,先掌握六个。查看方法ps、v$process、v$bgprocess
----------查看后台进程
[oracle@timran~]$ps-ef|grepora_
oracle26171001:2600:00:00ora_pmon_timran
oracle26191001:2600:00:00ora_psp0_timran
oracle26211001:2600:00:00ora_mman_timran
oracle26231001:2600:00:00ora_dbw0_timran
oracle26251001:2600:00:00ora_lgwr_timran
oracle26271001:2600:00:00ora_ckpt_timran
oracle26291001:2600:00:00ora_smon_timran
oracle26311001:2600:00:00ora_reco_timran
oracle26331001:2600:00:00ora_cjq0_timran
oracle26351001:2600:00:01ora_mmon_timran
oracle26371001:2600:00:00ora_mmnl_timran
oracle26391001:2600:00:00ora_d000_timran
oracle26411001:2600:00:00ora_s000_timran
oracle26451001:2600:00:00ora_p000_timran
oracle26471001:2600:00:00ora_p001_timran
oracle26491001:2600:00:01ora_arc0_timran
oracle26511001:2600:00:00ora_arc1_timran
oracle26531001:2600:00:00ora_arc2_timran
oracle26551001:2600:00:00ora_qmnc_timran
oracle26611001:2600:00:00ora_q000_timran
oracle26631001:2600:00:00ora_q001_timran
oracle26761001:2900:00:00ora_j000_timran
oracle26782486001:29pts/200:00:00grepora_
六个后台进程(backgroundprocess)
smon:系统监控进程
在实例崩溃之后,Oracle会自动恢复实例。另一个作用是整理数据文件的自由空间,将相邻区域结合起来。释放不再使用的临时段。
pmon:进程监控进程
processmonitor(监控session)清理出现故障的进程。释放所有当前挂起的锁定。释放故障进程使用的资源。
dbwr:数据写入进程
1、将修改后的缓冲区(脏buffer)数据写入数据文件中。写脏块。
2、释放databuffer空间。
注意:以下几种情况发生时dbwr都会写
1)ckpt发生,2)脏块太多时,3)db_buffer自由空间不够时,4)延迟发生,5)表空间redoonly/offline/backup等
考点:commit时dbwn有何举动?答案是:它什么也不做!
lgwr:写日志条目,从redologbuffer到redologfile(必须在dbwr写脏块之前写入日志)
负责将日志缓冲区中的日志条目写入日志文件。系统有多个日志文件,该进程以循环的方式将数据写入文件。
注意:以下5个状况发生时,lgwr都会写
1)commit,2)三分之一满,3)1m满,4)3秒,5)先于dbwr写而写(先记后写,即dbwn正好要执行写入前)
ckpt:生成检查点,通知或督促dbwr写脏块
arcn:归档模式下,发生日志切换时,把当前日志组中的内容写入归档日志,作为备份历史日志。
考点:lgwr负责对联机日志文件写操作,arcn负责读取联机日志文件。其他进程与日志文件不接触。
11g里又强调了其他几个后台进程,它们都和数据库性能有关,有关内容将在053课程介绍:
MMON:oracle自我监视和自我调整的支持进程(与AWR有关)
MMNL:MMON的辅助进程(与ASH有关)
MMAN:内存自动管理,10g时推出,11g得到加强,在11g里这个进程负责Oracle内存结构(SGA+PGA)的自动调整。
CJQN:与job队列有关
属于oracle内存结构,存放用户游标、变量、控制、数据排序、存放hash值。与SGA不同,PGA是独立的,非共享
从Oracle9i开始有了pga的自动管理:
workarea_size_policy=auto;
pga_aggregate_target>0
由于是pga的自动管理hash_area_size,sort_area_size这两个参数现在已经不用了。
对于客户端的每个userprocess,服务器端都会出现一个serverprocess,会话与专用服务器之间存在一对一的映射。
对专用连接来说,用户在客户端启动了一个应用程序,例如sql*plus,就是在客户端启动一个用户进程;与oracle服务器端连接成功后,会在服务器端生成一个服务器进程,该服务器进程作为用户进程的代理进程,代替客户端执行各种命令并把结果返回给客户端。用户进程一旦中止,与之对应的服务器进程立刻中止。
专用连接的PGA的管理方式是私有的。现在,大多情况下,oracle缺省采用专用连接模式。
多个userprocess共享一个serverprocess。它通过调度进程(dispatcher)与共享服务器连接,共享服务器实际上就是一种连接池机制(connectionpooling),连接池可以重用已有的超时连接,服务于其它活动会话。但容易产生锁等待。此种连接方式现在已经很少见了,但是在OCP11g考试中有几个考点与其有关:
用户进程1用户进程2用户进程3
.|-----------------------|.|.
.|.|.
.......调度进程1............调度进程2
.||.
.|--------------------------------|.
调度响应队列1||调度响应队列2
.公共请求队列.
.|.
.服务器进程.
..................|...................
*考点:
1)所有调度进程共享一个公共的输入队列,但是每个调度进程都有与自己响应的队列。
2)在共享服务器中会话是在SGA中的(UGA)存储信息,而不像专用连接那样在PGA中存储信息,这时的PGA的存储结构为堆栈空间。
适用于必须维持数据库的永久连接。结合了专用服务器模式和共享服务器模式的特点,它提供了服务器连接池,但是放入连接池的是专用服务器。它使用连接代理(而不是专用服务器)连接客户机到数据库,优点是可以用很少的内存处理大量并发连接(11g新特性,特别针对Apache的PHP应用环境)。
1、instance功能:用于管理和访问database。
3、pfile:静态参数文件。1)文本文件,可以通过编辑器进行修改参数。2)修改参数必须关闭实例,下次重启实例才生效。
命名方式:init+SID.ora
4、spfile:动态参数文件。1)二进制文件,不可以通过编辑器修改。2)Linux下strings可以查看
命名方式:spfile+SID.ora
修改动态参数文件方式:
altersystemset参数=值默认是第三种
altersessionset参数=值
第一种scope=memory参数修改立刻生效,但不修改spfile文件。
第二种scope=spfile修改了spfile文件,重启后生效。
第三种scope=both前两种都要满足。
如果不写scope,即缺省,那就是第三种。
*考点:如果不将scope=spfile,将无法更改静态参数。
通过查看v$parameter,可以确定那些参数可以在memory修改,制定scope
10:38:35SQL>descv$parameter;
NameNullType
NUMNUMBER
NAMEVARCHAR2(80)
TYPENUMBER
VALUEVARCHAR2(512)
DISPLAY_VALUEVARCHAR2(512)
ISDEFAULTVARCHAR2(9)
ISSES_MODIFIABLEVARCHAR2(5)
ISSYS_MODIFIABLEVARCHAR2(9)
ISINSTANCE_MODIFIABLEVARCHAR2(5)
ISMODIFIEDVARCHAR2(10)
ISADJUSTEDVARCHAR2(5)
ISDEPRECATEDVARCHAR2(5)
DESCRIPTIONVARCHAR2(255)
UPDATE_COMMENTVARCHAR2(255)
HASHNUMBER
其中:
ISSYS_MODIFIABLE参数:对应altersystem命令,即系统级修改
10:38:35SQL>selectdistinctissys_modifiablefromv$parameter;
ISSYS_MODIFIABLE
----------------
IMMEDIATE//对应scope=memory
FALSE//只能scope=spfile,即修改spfile文件,下次启动才生效。
DEFERRED//其他session有效
ISSES_MODIFIABLE参数:对应altersession命令,即session级修改
10:38:35SQL>selectdistinctisses_modifiablefromv$parameter;
ISSES_MODIFIABLE
TRUE//表示可以修改
FALSE//表示不能修改
10:38:35selectisses_modifiable,issys_modifiablefromv$parameterwherelower(name)='log_buffer';
ISSES_MODIFIABLEISSYS_MODIFIABLE
--------------------------------
FALSEFALSE
这个结果表示log_buffer参数在session方式不能改,
在system方式memory不能改,both当然也不行,只能是spfile下次有效。
5、startup时读取参数文件,找到$ORACLE_HOME/dvs目录,顺序是优先spfile启动,没有spfile才从pfile启动。
pfile和spfile可以相互生成:
SQL>createpfilefromspfile
SQL>createspfilefrompfile(使用spfile启动后不能在线生成spfile,ORA-32002:无法创建已由实例使用的SPFILE)
*考点:如果使用pfile启动,设置scope=spfile将失败!
可以通过当前内存参数生成pfile和spfile(11g新特性):
SQL>createpfilefrommemory;
SQL>createspfilefrommemory;
有了spfile,pfile一般留做备用,特殊情况也可以使用pfile启动,命令如下:
10:38:35SQL>startuppfile=$ORACLE_HOME/dbs/inittimran.ora
10:38:35SQL>showparameterspfile
spfilestring/u01/app/oracle/product/10.2.0
/db_1/dbs/spfileprod.ora
//如果value有值,说明数据库启动时读的是spfile
1)nomount阶段:读取initparameter
10:38:35SQL>selectstatusfromv$instance;(这条命令很实用,是看当前数据库启动的状态,有三个stated,mounted,open.)
STATUS
------------
STARTED
2)mount阶段:读取控制文件
20:32:53SQL>selectstatusfromv$instance;
MOUNTED
3)open阶段:1、检查所有的datafile、redolog、group、passwordfile。
2、检查数据库的一致性(controlfile、datafile、redofile的检查点是否一致)
10:38:35SQL>selectfile#,checkpoint_change#fromv$datafile;//从控制文件读出
FILE#CHECKPOINT_CHANGE#
----------------------------
1570836
2570836
3570836
4570836
5570836
6570836
6rowsselected.
10:38:35SQL>selectfile#,checkpoint_change#fromv$datafile_header;//从datafileheader读出来
数据库open之前要检查controlfile所记录SCN和datafileheader记录的SCN是否一致;一致就正常打开库,不一致需要做mediarecover
10:38:35SQL>selectstatusfromv$instance;
OPEN
shutdownnormal:拒绝新的连接,等待当前事务结束,等待当前会话结束,生成检查点
shutdowntransaction:拒绝新的连接,等待当前事务结束,生成检查点
shutdownimmediate:拒绝新的连接,未提交的事务回滚,生成检查点//默认
shutdownabort(startupforce):事务不回滚,不生成检查点,下次启动需要做instancerecovery
*考点:shutdownabort不会损坏database。
10:38:35SQL>showparameterdump//这是Oracle11g的。
SQL>showparameterdump
background_core_dumpstringpartial
background_dump_deststring/u01/diag/rdbms/timran11g/timr
an11g/trace
core_dump_deststring/u01/diag/rdbms/timran11g/timr
an11g/cdump
max_dump_file_sizestringunlimited
shadow_core_dumpstringpartial
user_dump_deststring/u01/diag/rdbms/timran11g/timr
在oracle11g中,故障诊断及跟踪的文件路径改变较大,alert文件的信息是以xml的文件格式存在的,另外提供了普通文本格式的alert文件。
这两份log文件的位置分别是V$DIAG_INFO中的DiagAlert和DiagTrace对应的目录。
SQL>select*fromv$diag_info;
INST_IDNAMEVALUE
-------------------------------------------------------------------------------------------------------------------
1DiagEnabledTRUE
1ADRBase/u01
1ADRHome/u01/diag/rdbms/timran11g/timran11g
1DiagTrace/u01/diag/rdbms/timran11g/timran11g/trace
1DiagAlert/u01/diag/rdbms/timran11g/timran11g/alert
1DiagIncident/u01/diag/rdbms/timran11g/timran11g/incident
1DiagCdump/u01/diag/rdbms/timran11g/timran11g/cdump
1HealthMonitor/u01/diag/rdbms/timran11g/timran11g/hm
1DefaultTraceFile/u01/diag/rdbms/timran11g/timran11g/trace/timran11g_ora_3381.trc
1ActiveProblemCount0
1ActiveIncidentCount0
其中DiagTrace对应的目录为文本格式的告警日志,及我们在10g中经常习惯使用的日志
[oracle@timrantrace]$tail-f/u01/diag/rdbms/timran11g/timran11g/trace/alert_timran11g.log
spaceavailableintheunderlyingfilesystemorASMdiskgroup.
TueSep0409:12:192012
Completed:ALTERDATABASEOPEN
TueSep0409:16:412012
StartingbackgroundprocessCJQ0
CJQ0startedwithpid=29,OSid=2483
TueSep0410:19:112012
droptablespacetb1
Completed:droptablespacetb1
如:sqlplus/assysdba
2)口令文件认证:是一种远程认证方式,只有sysdba权限的用户可以使用口令文件,必须输入密码和网路连接符。
如:sqlplussys/oracle@timran11gassysdba
通过设置这个参数为TURE,可以让口令是大小写敏感的(11g新特性)
位置:$ORACLE_HOME/dbs/orapwSID.
SQL>showparametercase
sec_case_sensitive_logonbooleanTRUE
所以口令文件,指的就是sys的口令文件,可以通过remote_login_passwordfile参数控制是否生效
参数remote_login_passwordfile的三种模式:
1)none拒绝sys用户从远程连接
2)exclusivesys用户可以从远程连接
3)share多个库可以共享口令文件
[oracle@timran~]$cd/u01/oracle/dbs
[oracle@timrandbs]$ll
总计52
-rw-rw----1oracleoinstall154408-1707:19hc_timran11g.dat
-rw-r--r--1oracleoinstall129202001-05-03initdw.ora
-rw-r--r--1oracleoinstall83851998-09-11init.ora
-rw-r--r--1oracleoinstall102408-1713:23inittimran11g.ora
-rw-r-----1oracleoinstall2408-1707:21lkTIMRAN11
-rw-r-----1oracleoinstall2408-1710:36lkTIMRAN11G
-rw-r-----1oracleoinstall153608-3110:47orapwtimran11g
-rw-r-----1oracleoinstall358409-0417:49spfiletimran11g.ora
这里是放参数文件和(sys)口令文件的地方,orapwtimran11g就是我的sys口令文件
使用orapwd命令创建sys口令文件:
你可以先删掉它,再创建它,在linux下做:
[oracle@timrandbs]$rmorapwtimran11g//把sys口令文件删了
总计48
-rw-r-----1oracleoinstall358409-0417:54spfiletimran11g.ora
[oracle@timrandbs]$orapwdfile=orapwtimran11gpassword=oracleentries=5force=y//重新建立口令文件
注意:file=orapw+sid的写法
有时候,scott用户被误删掉了,不要紧,可以通过执行下列脚本重新建立。
10:38:35SQL>@$ORACLE_HOME/rdbms/admin/utlsampl.sql
大家可以试一下:先删除scott用户,再执行一下脚本即可。(不是所有案例都有恢复脚本,HR就没有)
1)定义数据库当前物理状态
2)维护数据的一致性
3)二进制文件
4)在mount阶段被读取
5)记录RMAN备份恢复信息
查看database控制文件位置:
19:02:27SQL>showparametercontrol_file
control_file_record_keep_timeinteger7
control_filesstring/u01/oradata/timran11g/control01.
ctl,/u01/oradata/timran11g/contr
ol02.ctl,/u01/oradata/timran11g/
control03.ctl
19:02:42SQL>selectnamefromv$controlfile;
NAME
-----------------------------------------------------------------------------------------------------
/u01/oradata/timran11g/control01.ctl
/u01/oradata/timran11g/control02.ctl
/u01/oradata/timran11g/control03.ctl
19:02:59SQL>alterdatabasebackupcontrolfiletotrace;//生成了重做控制文件脚本,存放的位置:注意10g和11g有很大不同。
19:03:18SQL>showparameterdump
可以看到11g的dump路径和命名方式较10g改动较大,
10g中的bdump与udump合并到了一起,目录都是/u01/diag/rdbms/timran11g/timran11g/trace
trace的内容存放在该目录的最新的那个.trc里。
[oracle@timrantrace]$$cattimran11g_ora_2407.trc//显示出在这个.trc文件里的一段内容
STARTUPNOMOUNT
CREATECONTROLFILEREUSEDATABASE"TIMRAN11"NORESETLOGSARCHIVELOG
MAXLOGFILES16
MAXLOGMEMBERS3
MAXDATAFILES100
MAXINSTANCES8
MAXLOGHISTORY292
LOGFILE
GROUP1'/u01/oradata/timran11g/redo01.log'SIZE50M,
GROUP2'/u01/oradata/timran11g/redo02.log'SIZE50M,
GROUP3'/u01/oradata/timran11g/redo03.log'SIZE50M
--STANDBYLOGFILE
DATAFILE
'/u01/oradata/timran11g/system01.dbf',
'/u01/oradata/timran11g/sysaux01.dbf',
'/u01/oradata/timran11g/undotbs01.dbf',
'/u01/oradata/timran11g/users01.dbf',
'/u01/oradata/timran11g/example01.dbf'
CHARACTERSETZHS16GBK
;
1)配置多个control_files,控制文件最好有三个,是相互镜像的(shutdown下cp命令复制即可),然后修改spfile中的control_files参数,Oracle建议分配在不同的物理磁盘上。
*考点:最多可以有8个controlfiles多路复用。
19:10:25SQL>altersystemsetcontrol_files='/u01/oradata/timran11g/control01.ctl','/u01/disk1/control02.ctl','/u01/disk1/control03.ctl'scope=spfile;
Systemaltered.
2)三个control文件要一致(同一版本,scn相同),本来就是镜像关系
-rw-r-----1oracleoinstall735641607-1620:00control01.ctl
-rw-r-----1oracleoinstall735641607-1620:01control02.ctl
-rw-r-----1oracleoinstall735641607-1620:01control03.ctl
3)控制文件查看:v$controlfile、showparametercontrolfile、v$parameter
1.trace:用于控制文件重建(生成的trace文件在udump)
19:59:24SQL>alterdatabasebackupcontrolfiletotrace;
或者SQL>alterdatabasebackupcontrolfiletotraceas'/u01/oradata/timran11g/con.trace';//存到自己起的文件名里。
Databasealtered.
2.binary文件:控制文件的备份
20:00:20SQL>alterdatabasebackupcontrolfileto'/u01/oradata/timran11g/con.bak';
1)单个文件,假设使用的是spfile指定的控制文件之一损坏了:
数据库关闭下,使用操作系统命令复制其副本到指定的位置。
2)所有的控制文件丢失,(正常关闭,shutdownimmediate后删除控制文件)
假设控制文件的备份也没有,利用前面做的trace文件重新生成控制文件
在nomount状态下执行前面曾做过的trace脚本
15:37:16SQL>startupforcenomount
ORACLEinstancestarted.
TotalSystemGlobalArea285212672bytes
FixedSize1218968bytes
VariableSize113247848bytes
DatabaseBuffers163577856bytes
RedoBuffers7168000bytes
15:37:49SQL>CREATECONTROLFILEREUSEDATABASE"TIMRAN"NORESETLOGSARCHIVELOG
15:37:522MAXLOGFILES16
15:37:523MAXLOGMEMBERS3
15:37:524MAXDATAFILES100
15:37:525MAXINSTANCES8
15:37:526MAXLOGHISTORY292
15:37:527LOGFILE
15:37:528GROUP1'/u01/oradata/timran11g/redo01.log'SIZE50M,
15:37:529GROUP2'/u01/oradata/timran11g/redo02.log'SIZE50M,
15:37:5210GROUP3'/u01/oradata/timran11g/redo03.log'SIZE50M
15:37:5211--STANDBYLOGFILE
15:37:5212DATAFILE
15:37:5213'/u01/oradata/timran11g/system01.dbf',
15:37:5214'/u01/oradata/timran11g/undotbs01.dbf',
15:37:5215'/u01/oradata/timran11g/sysaux01.dbf',
15:37:5216'/u01/oradata/timran11g/users01.dbf',
15:37:5217'/u01/oradata/timran11g/example01.dbf',
15:37:5218'/u01/oradata/timran11g/test01.dbf'
15:37:5219CHARACTERSETZHS16GBK
15:37:5220;
Controlfilecreated.//三个控制文件又重新建立了。
SQL>selectfile#,checkpoint_change#fromv$datafile;
15629150
25629150
35629150
45629150
55629150
65629150
SQL>selectfile#,checkpoint_change#fromv$datafile_header;
15:39:49SQL>alterdatabaseopen;
2)所有的控制文件丢失,利用控制文件备份恢复控制文件(非正常关闭,shutdownabort后删除控制文件或直接操作系统下删除,有点复杂,留在053备份恢复中再介绍吧)
1)记录数据库的变化(DML、DDL)
2)用于数据块的recover
3)以组的方式管理redofile,最少两组redo,循环使用
4)和数据文件存放到不同的磁盘上,需读写速度快的磁盘(比如采用RAID10)
日志切换:
1)归档模式:将历史日志进行保存
2)非归档:历史日志被覆盖
3)并产生checkpoint,通知redolog所对应的dirtyblock从databuffer写入到datafile,并且更新控制文件
1)最少两组(考点),最好每组有两个成员(考点),并存放到不同的磁盘上,大小形同,互相镜像
2)日志在组写满时发生切换,或手工切换:altersystemswitchlogfile;
15:49:43SQL>select*fromv$log;
GROUP#THREAD#SEQUENCE#BYTESMEMBERSARCSTATUSFIRST_CHANGE#FIRST_TIME
------------------------------------------------------------------------------------------------
11143524288001YESINACTIVE214459417-7月-12
21144524288001NOCURRENT214520017-7月-12
31142524288001YESINACTIVE211398117-7月-12
15:50:31SQL>colmemberfora50;
15:50:47SQL>selectgroup#,memberfromv$logfile;
GROUP#MEMBER
------------------------------------------------------------
1/u01/oradata/timran11g/redo01.log
3/u01/oradata/timran11g/redo03.log
2/u01/oradata/timran11g/redo02.log
增加一个组group4,
15:53:53SQL>alterdatabaseaddlogfile'/u01/oradata/timran11g/redo04.log'size50m;
15:53:56SQL>selectgroup#,memberfromv$logfileorderbygroup#;
4/u01/oradata/timran11g/redo04.log
15:55:27SQL>select*fromv$log;
410524288001YESUNUSED0
//切换日志组
altersystemswitchlogfile;
加member为每个组(一共是4个组)
先建好目录,准备放在/u01/disk2/timran/下
[oracle@timrantimran]$mkdir-p/u01/disk2/timran
[oracle@timrantimran]$
16:00:39SQL>alterdatabaseaddlogfilemember
'/u01/disk2/timran/redo01b.log'togroup1,
'/u01/disk2/timran/redo02b.log'togroup2,
'/u01/disk2/timran/redo03b.log'togroup3,
'/u01/disk2/timran/redo04b.log'togroup4;
SQL>selectgroup#,member,statusfromv$logfile;
GROUP#MEMBERSTATUS
-------------------------------------------------------------------------------------------------
1/u01/disk2/timran/redo01b.logINVALID
2/u01/disk2/timran/redo02b.logINVALID
3/u01/disk2/timran/redo03b.logINVALID
4/u01/disk2/timran/redo04b.logINVALID
16:01:54SQL>select*fromv$log;//看到MEMBERS列已经是2了
11143524288002YESINACTIVE214459417-7月-12
21144524288002NOCURRENT214520017-7月-12
31142524288002YESINACTIVE211398117-7月-12
410524288002YESUNUSED0
16:03:06SQL>altersystemswitchlogfile;//多做几次切换,消除invalid//同步组里的member,这步很重要。
16:03:13SQL>select*fromv$log;
归档日志排的号
21144524288002YESACTIVE214520017-7月-12
41145524288002NOCURRENT214661317-7月-12
说明一下v$log这个重要的视图
status有四个状态:
unused:新添加的日志组,还没有使用
inactive:日志组对应的脏块已经从databuffer写入到datafile,可以覆盖
active:日志组对应的脏块还没有从databuffer写入到datafile,不能被覆盖
current:当前日志组,日志组对应的脏块还没有从databuffer写入到datafile,不能被覆盖
thread:线程(通过后台进程lgwr启动),在单实例的环境下,thread#永远是1
sequence:日志序列号。在日志切换时会递增。
FIRST_CHANGE#:在当前日志中记录的首个数据块的scn。(当事务完成的时候会在数据块上写入一个scn,代表数据块的变化)。
16:11:08SQL>selectgroup#,memberfromv$logfileorderby1;
1/u01/disk2/timran/redo01b.log
2/u01/disk2/timran/redo02b.log
3/u01/disk2/timran/redo03b.log
4/u01/disk2/timran/redo04b.log
假设/u01/oradata/timran11g/目录下的4个log文件都损坏了,看如何迁移更名。
16:12:03SQL>shutdownimmediate
Databaseclosed.
Databasedismounted.
ORACLEinstanceshutdown.
16:12:30SQL>
建立目录/u01/disk3/timran/
[oracle@timrantimran]$mkdir-p/u01/disk3/timran
[oracle@timrantimran]$cp/u01/disk2/timran/redo01b.log/u01/disk3/timran/redo01a.log
[oracle@timrantimran]$cp/u01/disk2/timran/redo02b.log/u01/disk3/timran/redo02a.log
[oracle@timrantimran]$cp/u01/disk2/timran/redo03b.log/u01/disk3/timran/redo03a.log
[oracle@timrantimran]$cp/u01/disk2/timran/redo04b.log/u01/disk3/timran/redo04a.log
16:15:19SQL>startupmount
VariableSize117442152bytes
DatabaseBuffers159383552bytes
Databasemounted.
16:15:26SQL>
16:16:05SQL>colmemberfora50;
16:16:08SQL>selectgroup#,memberfromv$logfileorderby1;
16:18:05SQL>alterdatabaserenamefile'/u01/oradata/timran11g/redo01.log'to'/u01/disk3/timran/redo01a.log';
16:18:34SQL>alterdatabaserenamefile'/u01/oradata/timran11g/redo02.log'to'/u01/disk3/timran/redo02a.log';
16:18:45SQL>alterdatabaserenamefile'/u01/oradata/timran11g/redo03.log'to'/u01/disk3/timran/redo03a.log';
16:20:16SQL>alterdatabaserenamefile'/u01/oradata/timran11g/redo04.log'to'/u01/disk3/timran/redo04a.log';
16:21:35SQL>selectgroup#,memberfromv$logfileorderby1;
1/u01/disk3/timran/redo01a.log
2/u01/disk3/timran/redo02a.log
3/u01/disk3/timran/redo03a.log
4/u01/disk3/timran/redo04a.log
16:21:55SQL>alterdatabaseopen;
23:52:06SQL>select*fromv$log;
21144524288002YESINACTIVE214520017-7月-12
23:52:15SQL>selectgroup#,member,statusfromv$logfile;
-------------------------------------------------------------------
3/u01/disk3/timran/redo03a.logSTALE
3/u01/disk2/timran/redo03b.logSTALE
23:52:25SQL>altersystemswitchlogfile;//出现stale不要紧,表明文件内容不完全,做几次切换就可以了。
23:52:28SQL>/
23:52:30SQL>/
23:52:32SQL>selectgroup#,member,statusfromv$logfile;
4.8、日志恢复
例1、多元化成员中,单个成员(inactive)丢失
00:06:15SQL>select*fromv$log;
116524288002YESINACTIVE215207918-7月-12
217524288002YESACTIVE215208418-7月-12
318524288002NOCURRENT215208718-7月-12
415524288002YESINACTIVE215207618-7月-12
[oracle@timran~]$cd/u01/disk3/timran
[oracle@timrantimran]$ll
鎬昏205040
-rw-r-----1oracleoinstall5242931207-1723:49redo01a.log
-rw-r-----1oracleoinstall5242931207-1723:49redo02a.log
-rw-r-----1oracleoinstall5242931207-1723:49redo03a.log
-rw-r-----1oracleoinstall5242931207-1723:52redo04a.log
[oracle@timrantimran]$rmredo01a.log
00:10:11SQL>startupforce
00:18:29SQL>select*fromv$log;
217524288002YESINACTIVE215208418-7月-12
318524288002YESINACTIVE215208718-7月-12
419524288002NOCURRENT217210718-7月-12
00:19:02SQL>selectgroup#,member,statusfromv$logfile;
1INVALID//invalid表明该文件不可访问
00:19:12SQL>
告警日志:
LinuxError:2:Nosuchfileordirectory
Additionalinformation:3
WedJul1800:16:252012
Errorsinfile/u01/admin/timran/bdump/timran_lgwr_2807.trc:
ORA-00321:log1ofthread1,cannotupdatelogfileheader
ORA-00312:onlinelog1thread1:'/u01/disk3/timran/redo01a.log'
解决:
直接在open方式下复制这个member,为何可以?因为是这个group是inactive状态!
00:25:54SQL>altersystemswitchlogfile;//切换时会同步,把invalid状态消除掉。
00:25:57SQL>selectgroup#,member,statusfromv$logfile;
例2非当前日志组所有成员丢失
00:32:47SQL>select*fromv$log;
1114524288002YESINACTIVE217264418-7月-12
2115524288002NOCURRENT217264618-7月-12
3112524288002YESINACTIVE217224718-7月-12
4113524288002YESINACTIVE217225018-7月-12
00:33:45SQL>shutdownimmediate
[oracle@timrantimran]$rm/u01/disk3/timran/redo04a.log
[oracle@timrantimran]$rm/u01/disk2/timran/redo04b.log
SQL>startup
ORA-00313:openfailedformembersofloggroup4ofthread1
ORA-00312:onlinelog4thread1:'/u01/disk3/timran/redo04a.log'
ORA-00312:onlinelog4thread1:'/u01/disk2/timran/redo04b.log'
00:37:31SQL>alterdatabaseclearlogfilegroup4;//注意:这一步使刚才在os里删掉的那两个group4的文件又建立上了。
总计205040
-rw-r-----1oracleoinstall5242931207-1800:44redo01b.log
-rw-r-----1oracleoinstall5242931207-1800:38redo02b.log
-rw-r-----1oracleoinstall5242931207-1800:38redo03b.log
-rw-r-----1oracleoinstall5242931207-1800:43redo04b.log
00:45:02SQL>alterdatabaseopen;
SQL>select*fromv$log;
GROUP#THREAD#SEQUENCE#BYTESMEMBERSARCHIVEDSTATUSFIRST_CHANGE#FIRST_TIME
--------------------------------------------------------------------------------------------------
1125524288002YESINACTIVE70259042013-2-192
2126524288002YESINACTIVE70259072013-2-192
3127524288002NOCURRENT70259552013-2-192
410524288002YESUNUSED70259022013-2-192
例3当前日志组丢失。非正常关库,直接从os下删除当前日志组的所有member,模拟数据库open状态下currentlog损坏
[oracle@timrantimran]$rm/u01/disk3/timran/redo01a.log
[oracle@timrantimran]$rm/u01/disk2/timran/redo01b.log
01:10:11SQL>altersystemswitchlogfile;切一下,触动它一下。
告警日志
WedJul1801:11:042012
Errorsinfile/u01/admin/timran/bdump/timran_arc1_3269.trc:
ORA-00313:openfailedformembersofloggroup1ofthread1
ORA-00312:onlinelog1thread1:'/u01/disk2/timran/redo01b.log'
ORA-27037:unabletoobtainfilestatus
01:13:33SQL>selectgroup#,member,statusfromv$logfile;
01:13:40SQL>altersystemswitchlogfile;
01:13:53SQL>select*fromv$log;
115524288002NOACTIVE219494518-7月-12
216524288002NOACTIVE219522818-7月-12
317524288002NOCURRENT219529618-7月-12
414524288002YESINACTIVE219494318-7月-12
暂时好像没有什么问题发生,继续切换,当current又转会到group1时,死机!
01:17:44SQL>startupforce
ORA-00313:无法打开日志组1(用于线程1)的成员
ORA-00312:联机日志1线程1:'/u01/disk3/timran/redo01a.log'
ORA-00312:联机日志1线程1:'/u01/disk2/timran/redo01b.log'
SQL>alterdatabaseclearlogfilegroup1;
alterdatabaseclearlogfilegroup1
*
第1行出现错误:
ORA-00350:日志1(实例timran11g的日志,线程1)需要归档
SQL>alterdatabaseclearunarchivedlogfilegroup1;
SQL>alterdatabaseopen;
说明如下:当前日志损坏是一种严重的故障,面临的情况也比较复杂。
1)如果数据库模式是archived的,当前日志损坏,可以先尝试强制清除。
alterdatabaseclearunarchivedlogfilegroupn;
这步如果能成功,打开数据库后要做数据库全备(考点)。因为open前的当前日志已经坏掉无法真正归档,那么将来的前滚可能会有问题。
2)如果clearunarchived不能成功尝试,只好准备把当前日志甩掉,去做基于日志的不完全恢复。
SQL>recoverdatabaseuntilcancel;
SQL>alterdatabaseopenresetlogs;
3)如果严重到使用resetlogs也不能打开数据库,可以试试下面的最后一招:
修改pfile文件,第一行添加_allow_resetlogs_corruption=TRUE
该参数的含义是:允许在破坏一致性的情况下强制重置日志,打开数据库。_allow_resetlogs_corruption将使用所有数据文件最旧的SCN打开数据库,所以通常来讲需要保证SYSTEM表空间拥有最旧的SCN。在强制打开数据库之后,可能因为各种原因会有ora-600错误。
[oracle@workdbs]$viinittest11g.ora
_allow_resetlogs_corruption=TRUE
*.background_dump_dest='$ORACLE_BASE/admin/test/bdump'
*.control_files='/u01/app/oracle/oradata/test/control01.ctl','/disk1/oradata/test/control02.ctl','/disk2/oradata/test/control03.ctl'
*.core_dump_dest='$ORACLE_BASE/admin/test/cdump'
*.db_block_size=8192
*.db_cache_size=80M#DEMO
*.db_file_multiblock_read_count=16
*.db_name='test'
*.optimizer_mode='choose'
*.parallel_threads_per_cpu=4#SMALL
*.pga_aggregate_target=10485760
*.query_rewrite_enabled='true'
*.query_rewrite_integrity='trusted'
*.shared_pool_size=60M#DEMO
*.star_transformation_enabled='true'
*.undo_management='auto'
*.undo_tablespace='rtbs'
*.user_dump_dest='$ORACLE_BASE/admin/test/udump'
//再以pfile启动instance到mount状态,然后alterdatabaseopenresetlogs
//这是在不一致状态下强行打开了数据库,建议做一个逻辑全备。
4.9使日志恢复到原来的配置
尝试使用OEM方式恢复原状。最后,验证无误后删掉/u01/disk2和/u01/disk3目录。
[oracle@timrantimran]$rm-rf/u01/disk2
[oracle@timrantimran]$rm-rf/u01/disk3
2)归档会启用arcn的后台进程、占用磁盘空间
3)非归档用于OLAP/DSS,只能冷备份,只能恢复到最后一次备份状态
补充:olap(select操作比较多)
02:34:50SQL>archiveloglist;
DatabaselogmodeArchiveMode
AutomaticarchivalEnabled
Archivedestination/u01/disk1/timran/
Oldestonlinelogsequence1
Nextlogsequencetoarchive2
Currentlogsequence2
02:35:50SQL>shutdownimmediate//这里shutdown一定要immediate方式
02:36:40SQL>startupmount//到mount下设置
02:37:50SQL>alterdatabasenoarchivelog;
02:37:55SQL>archiveloglist;
DatabaselogmodeNoArchiveMode
AutomaticarchivalDisabled
02:38:15SQL>alterdatabasearchivelog;//换回来,不要NoArchiveMode
02:38:30SQL>alterdatabaseopen;
指定归档日志存放处及命名
注意:另外指定并不意味着你要取消闪回恢复区的参数,因为这个闪回恢复区不仅归档日志,还有RMAN的备份及闪回日志等等。
02:39:20SQL>showparameterarchive
archive_lag_targetinteger0
log_archive_configstring
log_archive_deststring
log_archive_dest_1stringlocation=/u01/disk1/timran/ma
ndatory
log_archive_dest_10string
log_archive_dest_2string
log_archive_dest_3string
log_archive_dest_4string
log_archive_dest_5string
log_archive_dest_6string
log_archive_dest_7string
log_archive_dest_8string
log_archive_dest_9string
log_archive_dest_state_1stringenable
log_archive_dest_state_10stringenable
log_archive_dest_state_2stringenable
log_archive_dest_state_3stringenable
log_archive_dest_state_4stringenable
log_archive_dest_state_5stringenable
log_archive_dest_state_6stringenable
log_archive_dest_state_7stringenable
log_archive_dest_state_8stringenable
log_archive_dest_state_9stringenable
log_archive_duplex_deststring
log_archive_formatstringarch_%t_%r_%s.log
log_archive_local_firstbooleanTRUE
log_archive_max_processesinteger2
log_archive_min_succeed_destinteger1
log_archive_startbooleanFALSE
log_archive_traceinteger0
remote_archive_enablestringtrue
standby_archive_deststring/dbs/arch
主要看这两个参数:
log_archive_dest_n
log_archive_format
log_archive_dest_n(n:1-10)表示可以有10个目标路径存放归档日志(镜像关系),即可以多路复用10个归档日志的备份。如上显示我只使用了log_archive_dest_1,也就是说只有一套归档日志,没有做镜像,若是生产系统最好能再做一个镜像。
如果你没有指定log_archive_dest_n,那么系统隐含的将log_archive_dest_10指向了闪回恢复区(flashbackrevoveryarea),这个闪回恢复区不仅默认的存放归档日志,还有RMAN的备份及闪回日志等等。
使用log_archive_dest_n就不要使用log_archive_dest参数了
SQL>altersystemsetlog_archive_dest_1='location=/u01/disk1/timran';
//把历史日志归档到本机目录下(location代表本机)
SQL>altersystemsetlog_archive_dest_2='service=test';
//远程备份,把历史日志备份到服务名为test的另外的数据库上。(service代表远程),配置双机时有用。
SQL>altersystemsetlog_archive_dest_1='location=/u01/disk1/timranmandatory';
//mandatory强制,日志归档未完成之前不允许覆盖redologfile。(考点)
//默认optional(日志在没有归档完成前可以被覆盖redologfile。
log_archive_format是定义命名格式的,我使用了下面三个内置符号,其含义是:
%t,thread#,日志线程号
%s,sequence,日志序列号
%r,resetlog,代表数据库的周期
SQL>altersystemsetlog_archive_format='arch_%t_%r_%s.log'scope=spfile;
[oracle@timranbdump]$ps-ef|grepora_|grep-vgrep
oracle34581001:3000:00:00ora_pmon_timran
oracle34601001:3000:00:00ora_psp0_timran
oracle34621001:3000:00:00ora_mman_timran
oracle34641001:3000:00:00ora_dbw0_timran
oracle34661001:3000:00:00ora_lgwr_timran
oracle34681001:3000:00:00ora_ckpt_timran
oracle34701001:3000:00:01ora_smon_timran
oracle34721001:3000:00:00ora_reco_timran
oracle34741001:3000:00:00ora_cjq0_timran
oracle34761001:3000:00:01ora_mmon_timran
oracle34781001:3000:00:00ora_mmnl_timran
oracle34801001:3000:00:00ora_d000_timran
oracle34821001:3000:00:00ora_s000_timran
oracle34901001:3200:00:00ora_arc0_timran
oracle34921001:3200:00:00ora_arc1_timran
oracle34961001:3200:00:00ora_qmnc_timran
oracle35061001:3200:00:00ora_q000_timran
oracle35081001:3200:00:00ora_q001_timran
oracle35421001:4100:00:00ora_j000_timran
ARCn就是归档进程,这里启动了两个arc0和arc1,最多可达30个,由log_archive_max_processes参数指定。
1)自动归档,日志切换时
2)手工
3)在归档时,会把归档信息写入到控制文件
02:44:00SQL>altersystemswitchlogfile;//手工归档方法一。
02:46:30SQL>altersystemarchivelogcurrent;//手工归档方法二,此方式仅限于Archivemode。【此方法只能在归档模式下用】
查看已经归档日志:
02:48:08SQL>selectnamefromv$archived_log;
--------------------------------------------------------------------------------------------------------
/u01/disk1/timran/arch_1_782662700_141.log
/u01/disk1/timran/arch_1_782662700_142.log
/u01/disk1/timran/arch_1_782662700_143.log
/u01/disk1/timran/arch_1_782662700_144.log
/u01/disk1/timran/arch_1_782662700_145.log
/u01/disk1/timran/arch_1_788918717_1.log
/u01/disk1/timran/arch_1_788918717_2.log
/u01/disk1/timran/arch_1_788918717_3.log
05:47:10SQL>
1)添加database补充日志
SQL>ALTERDATABASEADDSUPPLEMENTALLOGDATA(PRIMARYKEY,UNIQUEINDEX)COLUMNS;//10g和11g中这一步还是挺重要的。
2)确定要分析的日志范围,添加日志,分析
SQL>
executedbms_logmnr.add_logfile(logfilename=>'日志',options=>dbms_logmnr.new);
eg:/u01/disk1/timran/arch_1_804874397_20.log
//第一个要加载的日志文件
executedbms_logmnr.add_logfile(logfilename=>'补充日志',options=>dbms_logmnr.addfile);//可以反复添加补充多个日志文件
3)执行logmnr分析
SQL>executedbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
SQL>selectusername,scn,timestamp,sql_redofromv$logmnr_contentswhereseg_name='表名';
5)关闭日志分析
SQL>executedbms_logmnr.end_logmnr;
例
scott:
09:44:08SQL>createtablea(idint);
09:44:20SQL>insertintoavalues(1);
09:44:29SQL>updateasetid=5;
09:44:45SQL>commit;
09:44:47SQL>deletea;
09:44:51SQL>commit;
Commitcomplete.
sys:
11:32:12SQL>select*fromv$log;
1126524288002NOCURRENT22578702012-7-239
2125524288002YESINACTIVE22578662012-7-239
3123524288002YESINACTIVE22578622012-7-239
4124524288002YESINACTIVE22578642012-7-239
//上面a表的DML操作都写进了current组里,记住sequence#是26号。然后手工切换当前日志进archive里。
11:32:18SQL>altersystemswitchlogfile;
11:33:00SQL>/
11:33:02SQL>/
11:33:09SQL>selectnamefromv$archived_log;
/u01/disk1/timran/arch_1_789252862_21.log
/u01/disk1/timran/arch_1_789252862_22.log
/u01/disk1/timran/arch_1_789252862_23.log
/u01/disk1/timran/arch_1_789252862_24.log
/u01/disk1/timran/arch_1_789252862_25.log
/u01/disk1/timran/arch_1_789252862_26.log
/u01/disk1/timran/arch_1_789252862_27.log
/u01/disk1/timran/arch_1_789252862_28.log
/u01/disk1/timran/arch_1_789252862_29.log
62rowsselected
//切换后,sequence#26的日志的应该对应的是/u01/disk1/timran/arch_1_789252862_26.log
11:33:20SQL>alterdatabaseaddsupplementallogdata;
11:33:48SQL>executedbms_logmnr.add_logfile(logfilename=>'/u01/disk1/timran/arch_1_789252862_26.log',options=>dbms_logmnr.new);
11:34:13SQL>executedbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
11:34:49SQL>selectscn,to_char(timestamp,'yyyy-mm-ddhh24:mi:ss')timestamp,sql_redofromv$logmnr_contentswhereseg_name='A';
SCNTIMESTAMPSQL_REDO
-------------------------------------------------------------------------------------------------------------
22582322012-07-2309:43:16droptableapurge;
22583342012-07-2309:44:20createtablea(idint);
22583412012-07-2309:44:28insertinto"SCOTT"."A"("ID")values('1');
22583492012-07-2309:44:46update"SCOTT"."A"set"ID"='5'where"ID"='1'andROWID='AAANBAAAEAAAAGEA
22583532012-07-2309:44:52deletefrom"SCOTT"."A"where"ID"='5'andROWID='AAANBAAAEAAAAGEAAA';
另外,也可以采用OEM方式进行logmnr,设定scn或timestamp一个范围,查出需要的DML语句,比较方便。不过,OEM是针对已提交的事务的。
6.2.2对DDL的操作的logminer:
1)如果是第一次做,先要建好logmnr目录,
设置logmnr参数,存放数据字典文件dict.ora
$mkdir/home/oracle/logmnr
SQL>altersystemsetutl_file_dir='/home/oracle/logmnr'scope=spfile;
2)建立数据字典文件dict.ora
SQL>executedbms_logmnr_d.build('dict.ora','/home/oracle/logmnr',dbms_logmnr_d.store_in_flat_file);
3)添加日志分析
SQL>executedbms_logmnr.add_logfile(logfilename=>'日志文件',options=>dbms_logmnr.new);
SQL>executedbms_logmnr.add_logfile(logfilename=>'追加日志',options=>dbms_logmnr.addfile);
4)执行分析
SQL>executedbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);
5)查看分析结果
SQL>selectusername,scn,to_char(timestamp,'yyyy-mm-ddhh24:mi:ss'),sql_redofromv$logmnr_contentsWHEREUSERNAME='SCOTT'andlower(sql_redo)like'%table%';
6)关闭日志分析
例子将在053的不完全恢复一节中演示。
使用undotablespace存放从datafiles读出的数据块的前镜像【老值】,提供以下四种情况所需要的信息
1)回滚事务:rollback
2)读一致性:正在做DML操作的数据块,事务结束前,其他用户读undo里面的数据前镜像
3)实例的恢复:instancerecover(undo-------->rollback)
4)闪回查询:flashbackquery、flashbacktable
1)manaual手工:rollsegment//作废了
2)auto自动:undotablespace(initparameter:undo_management=auto)
1)可以建立多个undo表空间,但一个时刻只有一个处于active
2)处于active状态的undotablespace不能offline和drop
01:08:31SQL>selecttablespace_name,status,contentsfromdba_tablespaces;
TABLESPACE_NAMESTATUSCONTENTS
------------------------------------------------
SYSTEMONLINEPERMANENT
UNDOTBS1ONLINEUNDO
SYSAUXONLINEPERMANENT
TEMPONLINETEMPORARY
USERSONLINEPERMANENT
EXAMPLEONLINEPERMANENT
TESTONLINEPERMANENT
09:47:08
createundotablespaceundotbs2datafile'/u01/oradata/timran11g/undotbs02.dbf'size100mautoextendon;
09:47:55SQL>selecttablespace_name,status,contentsfromdba_tablespaces;
SQL>selecttablespace_name,status,contentsfromdba_tablespaces;
UNDOTBS2ONLINEUNDO
09:48:00SQL>showparameterundo
undo_managementstringAUTO
undo_retentioninteger900
undo_tablespacestringUNDOTBS1
00:20:50SQL>SQL>select*fromv$rollname;
USNNAME
0SYSTEM
11_SYSSMU11_1357956213$
12_SYSSMU12_1357956213$
13_SYSSMU13_1357956213$
14_SYSSMU14_1357956213$
15_SYSSMU15_1357956213$
16_SYSSMU16_1357956213$
17_SYSSMU17_1357956213$
18_SYSSMU18_1357956213$
19_SYSSMU19_1357956213$
20_SYSSMU20_1357956213$
11rowsselected.
09:50:10SQL>altersystemsetundo_tablespace=undotbs2;//memory动态修改
09:50:28SQL>showparameterundo
undo_tablespacestringUNDOTBS2
00:22:29SQL>SQL>select*fromv$rollname;
1_SYSSMU1_1363316212$
2_SYSSMU2_1363316212$
3_SYSSMU3_1363316212$
4_SYSSMU4_1363316212$
5_SYSSMU5_1363316212$
6_SYSSMU6_1363316212$
7_SYSSMU7_1363316212$
8_SYSSMU8_1363316212$
9_SYSSMU9_1363316212$
10_SYSSMU10_1363316212$
SQL>droptablespaceundotbs1includingcontentsanddatafiles;
SQL>select*fromv$tablespace;
TS#NAMEINCBIGFLAENC
----------------------------------------------------
0SYSTEMYESNOYES
1SYSAUXYESNOYES
4USERSYESNOYES
6EXAMPLEYESNOYES
8TESTYESNOYES
3TEMPNONOYES
5UNDOTBS2YESNOYES
1)active:表示使用这个undoblock的transaction还未提交
2)unexpired:undoblock上没有活动事务,可以被覆盖(但是未过期expired)
4)free:空闲的
//这个参数只对已提交的undo状态有效
01:10:46SQL>
selecttablespace_name,status,contents,retentionfromdba_tablespaces;
TABLESPACE_NAMESTATUSCONTENTSRETENTION
-----------------------------------------------------------
SYSTEMONLINEPERMANENTNOTAPPLY
SYSAUXONLINEPERMANENTNOTAPPLY
TEMPONLINETEMPORARYNOTAPPLY
USERSONLINEPERMANENTNOTAPPLY
EXAMPLEONLINEPERMANENTNOTAPPLY
TESTONLINEPERMANENTNOTAPPLY
UNDOTBS2ONLINEUNDONOGUARANTEE
guarantee属性随undo表空间建立,可以修改
09:52:22SQL>altertablespaceundotbs2retentionguarantee;//保证在retention期间不允许被覆盖
01:11:16SQL>selecttablespace_name,status,contents,retentionfromdba_tablespaces;
UNDOTBS2ONLINEUNDOGUARANTEE
缺省配置下undoretention是noguarantee,
SQL>altertablespaceundotbs2retentionnoguarantee;
1)v$session查看用户建立的session
2)v$transaction当前的事务
3)v$rollnameundo段的名称
4)v$rollstatundo段的状态
5)dba_rollback_segs数据字典里记录的undo段状态
一般来说,一个session只能对应一个事务,建立了session未必有事务,只有事务处于中间态时,v$transaction才能看到这个事务。
换句话说,如果看到了事务(在v$transaction里),那一定有个session和它对应,将两个视图里连在一起,信息看得更为清楚。
10:03:28SQL>selectusername,sid,serial#fromv$sessionwhereusernameisnotnull;//看看有几个session连上来了。
USERNAMESIDSERIAL#
--------------------------------------------------
SCOTT13118
SYS1705
cmd下updateempsetsal=1000whereempno=7788;//产生一个活动事务
SQL>selecta.sid,a.serial#,a.username,b.xidusn,xidslot,b.ubablk,b.statusfromv$sessiona,v$transactionbwherea.saddr=b.ses_addr;
10:08:29SQL>colnamefora10
SIDSERIAL#USERNAMEXIDUSNXIDSLOTUBABLKSTATUS
--------------------------------------------------------------------------------------
13118SCOTT817305ACTIVE
//两表联查,sid和serial#在v$session里,在v$transaction里XIDUSN是undosegment的id,XIDSLOT是事务槽的id,UBABLK是undo块号
对照上面看,下面语句显示出_SYSSMU8$是一个活动段,与XIDUSN=8吻合,说明这个段被读进buffer了.
SQL>selectb.name,a.xactsfromv$rollstata,v$rollnamebwherea.usn=b.usn;
NAMEXACTS
SYSTEM0
_SYSSMU1_1363316212$0
_SYSSMU2_1363316212$0
_SYSSMU3_1363316212$0
_SYSSMU4_1363316212$0
_SYSSMU5_1363316212$0
_SYSSMU6_1363316212$0
_SYSSMU7_1363316212$0
_SYSSMU8_1363316212$1
_SYSSMU9_1363316212$0
_SYSSMU10_1363316212$0
默认system表空间会有一个undosegment(usn为0)。system下的undo是系统需要的(比如数据字典),其他表空间的事务不能使用它。缺省下undotablespace会被分配10个undosegment,如果数据库启动时碰到undo数据文件损坏或不同步,可以将其offline,只有一个系统表空间的undo也能进入系统,但不能做其他表空间的DML操作。
如果在数据库打开的情况下,当前undo坏掉的话,比如现在UNDOTBS2出现了介质损坏,那么数据库就不能做DML操作了。如果UNDOTBS2表空间上还有活动的事务,Oracle会将其下的所有段标志为NEEDSRECOVERY,这时若没有备份或没有可替代UNDO来切换的话,那么这种错误将是严重的,会丢失了原来的事务。必须重新启动,然后重建一个undo表空间,再将NEEDSRECOVERY处理后,才可将该表空间删除。我们模拟一下这种情况:
[oracle@timrantimran]$mvundotbs02.dbfundotbs02.bak
00:29:28SQL>altersystemcheckpoint;
cmd端再做update语句时会报错
ORA-01116:打开数据库文件3时出错
ORA-01110:数据文件3:'/u01/oradata/timran11g/undotbs02.dbf'
ORA-27041:无法打开文件
00:29:28SQL>startupforce
ORA-01157:无法标识/锁定数据文件3-请参阅DBWR跟踪文件
16708724
26708724
36708724
46708724
56708724
66708724
//磁盘上去读数据文件
30
SQL>alterdatabasedatafile3offline;
SQL>select*fromv$rollname;
//只剩下系统表空间undo端
createundotablespaceundotbs1datafile'/u01/oradata/timran11g/undotbs01.dbf'size100mautoextendon;
SQL>showparameterundo;
2UNDOTBS1YESNOYES
SQL>altersystemsetundo_tablespace=UNDOTBS1;
注意:此时原有的事务可能仍然在UNDOTBS2,只能刷掉了。
SQL>droptablespaceundotbs2includingcontentsanddatafiles;
droptablespaceundotbs2includingcontentsanddatafiles
ORA-01548:已找到活动回退段'_SYSSMU1_1363316212$',终止删除表空间
SQL>selectsegment_name,statusfromdba_rollback_segs;
SEGMENT_NAMESTATUS
----------------------------------------------
SYSTEMONLINE
_SYSSMU20_1363319420$ONLINE
_SYSSMU19_1363319420$ONLINE
_SYSSMU18_1363319420$ONLINE
_SYSSMU17_1363319420$ONLINE
_SYSSMU16_1363319420$ONLINE
_SYSSMU15_1363319420$ONLINE
_SYSSMU14_1363319420$ONLINE
_SYSSMU13_1363319420$ONLINE
_SYSSMU12_1363319420$ONLINE
_SYSSMU11_1363319420$ONLINE
_SYSSMU10_1363316212$NEEDSRECOVERY
_SYSSMU9_1363316212$NEEDSRECOVERY
_SYSSMU8_1363316212$NEEDSRECOVERY
_SYSSMU7_1363316212$NEEDSRECOVERY
_SYSSMU6_1363316212$NEEDSRECOVERY
_SYSSMU5_1363316212$NEEDSRECOVERY
_SYSSMU4_1363316212$NEEDSRECOVERY
_SYSSMU3_1363316212$NEEDSRECOVERY
_SYSSMU2_1363316212$NEEDSRECOVERY
_SYSSMU1_1363316212$NEEDSRECOVERY
解决有两个办法:1)使用备份恢复,2)使用oracle提供的隐含参数_CORRUPTED_ROLLBACK_SEGMENTS
我们使用第2种方法
SQL>createpfilefromspfile;//建立静态参数文件
SQL>shutdownabort
#vi/u01/oracle/dbs/inittimran11g.ora//在静态参数文件里第一行插入以下内容
_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1_1363316212$,_SYSSMU2_1363316212$,_SYSSMU3_1363316212$,_SYSSMU4_1363316212$,_SYSSMU5_1363316212$,_SYSSMU6_1363316212$,_SYSSMU7_1363316212$,_SYSSMU8_1363316212$,_SYSSMU9_1363316212$,_SYSSMU10_1363316212$)
然后存盘,再使静态参数文件启动数据库
SQL>startuppfile='/u01/oracle/dbs/inittimran11g.ora'
SQL>droprollbacksegment"_SYSSMU1_1363316212$";
回退段已删除。
......
SQL>droprollbacksegment"_SYSSMU10_1363316212$";
已选择11行。
表空间已删除。
如果还删除不了,则尝试修改字典
select*fromv$tablespace;记下要删除的undo对应的ts#号,比如是=2,则执行下行语句:
updateseg$settype#=3wherets#=2;
然后再删除该表空间即可。
checkpoint是数据库的一个内部事件,检查点激活时会触发数据库写进程(DBWR),将数据缓冲区里的脏数据块写到数据文件中。
由于DBWR与事务提交的无关性,数据库在某个时刻会存在已提交的事务没有来及写到磁盘,而未提交的事务却已经写到了磁盘的情况,也就是说内存中的数据和磁盘中的数据不一致。
1)保证数据库的一致性,这是指将脏数据写出到硬盘,保证内存和硬盘上的数据是一样的;
完全检查点fullcheckpoint
增量检查点incrementalcheckpoint
局部检查点partialcheckpoint
记下当前的scn,将此scn之前所有的脏块一次性写完,再将该scn号同步更新控制文件和数据文件头。
可以引起完全检查点的两个动作
a)正常关闭数据库:shutdownimmediate
b)手动检查点切换:altersystemcheckpoint;
补充:实例b
查询:当前文件scn号
selectfile#,checkpoint_change#fromv$datafile_header;
altersystemcheckpoint;
1)一般来说增量检查点不会更新数据文件头和控制文件的SCN,它只是根据策略计算一个SCN(未必是当前SCN),将此SCN前的脏块刷新到磁盘,这个SCN点也叫检查点位置,然后将与此scn有关的信息记录到控制文件。
什么是检查点队列?
被修改过的块,在oracle中都被统称为脏块.所有的脏块被一个双向链表串起来,称做检查点队列.
什么是检查点位置?
什么是RBALRBAHRBATARGETRBA
RBA就是redo块地址,比如说,用户发出了一条update命令,更新了块A,块A现在变成了脏块,oracle会为他生成一条redo条目.这个条目在redo日志文件中的位置就是rba(redobyteaddress).过了一会儿,假如:块A依然还是脏块,此时.用户又发出一条更新块A的命令,这又会生成一条redo条目.第一条更新命令对应的redo条目的RBA被称为块A的LRBA(lowrba),第二条更新命令对应的RBA,被称为HRBA(highrba).
其实,按照LRBA来排列,就是按照块首次被修改的顺序来排列.LRBA在脏块的块头有指针。
TARGETRBA是增量检查点发生时要求脏块写到一个RBA为止,这个RBA就是TargetRBA。
1)FAST_START_MTTR_TARGET:
这个参数是考点。如何有效的缩短最近检查点位置与联机重做日志尾部之间的距离,正是设计此参数目的。
*考点:如果将fast_start_mttr_target设置为非0,将启用检查点自动调整机制。
验证以上概念的一个有效的方法,可以研究一下日志切换:altersystemswitchlogfile;这个动作比较特殊,其特征是完全检查点和增量检查点综合的效果。
如果FAST_START_MTTR_TARGET有值,v$log视图中的active状态几分钟后会变成inactive状态,然后更新了控制文件和日志文件头部的SCN(这似乎是完全检查点的特征)
还有以下三个参数,它们是:
2)FAST_START_IO_TARGET:实例恢复所需要读取的redoblocks数量,
4)LOG_CHECKPOINT_INTERVAL:最后一次增量检查点与当前日志文件末尾所差的redoblock数量。(淘汰)
这三个参数已经被FAST_START_MTTR_TARGET取代了。如果fast_start_io_targetorlog_checkpoint_interval被指定,他们会自动覆盖由fast_start_mttr_target参数计算出来的值。
演示:
ALTERSYSTEMSETLOG_checkpointS_TO_ALERT=TRUE;
altersystemsetLOG_CHECKPOINT_TIMEOUT=30;
增量checkpoint信息将会被记录到告警日志alert_$SID.log文件中
注意:并不是将脏列表中的所有脏块都写出到数据文件中,而是写出一部分,保证满足条件即可。
5)90%OFSMALLESTREDOLOG(Oarcle内部参数),将重做日志文件末尾前面90%的位置设为检查点位置。
6)每3s检查checkpoint队列,查看脏块的写入情况,记录此刻的那个RBA,并将其作为检查点位置写入到controlfile
1)STATISTICS_LEVEL-->置为typical(缺省)或者all
2)FAST_START_MTTR_TARGET-->置为非零值
有两个视图可供参考
v$instance_recovery
v$mttr_target_advice
SQL>selectrecovery_estimated_ios,actual_redo_blks,target_redo_blks,target_mttr,
estimated_mttrfromv$instance_recovery;
RECOVERY_ESTIMATED_IOSACTUAL_REDO_BLKSTARGET_REDO_BLKSTARGET_MTTRESTIMATED_MTTR
-------------------------------------------------------------------------------
7233337003312
SQL>selectmttr_target_for_estimatetar_est,dirty_limit,estd_cache_writesest_c_w,
estd_cache_write_factorest_c_w_f,estd_total_writesest_t_w,estd_total_write_factorest_t_w_ffromv$mttr_target_advice;
TAR_ESTDIRTY_LIMITEST_C_WEST_C_W_FEST_T_WEST_T_W_F
-------------------------------------------------------------
16182176591.063576591.0635
2045167202172021
2258257202172021
2576167202172021
1832087202172021
对于某些操作,局部检查点是必须的,并会自动执行。
比如:表空间offline,数据文件offline,删除extent,表truncate,beginbackup(将表空间置于备份模式)等。Oracle会根据需要自动执行。
SQL>selectfile#,checkpoint_change#,last_change#fromv$datafile;
有了redo,undo和ckpt概念后,有助于更好的理解实例恢复(ppt:404-408)
由于引入了增量检查点,当实例需要恢复的时候,oracle首先从控制文件里找到最后一次检查点位置,这个位置就是实例恢复的起点
然后是smon的一系列动作:
1)rollforward:利用redo,将检查点位置以后的更改,包括提交的和未提交的数据重做一遍。
2)open:
3)rollback:通过undo机制把写入磁盘里的未提交的事务回滚掉。
重点理解实例恢复的概念
为何要使用redo前滚?因为abort时有可能丢失了在内存中(未写到数据文件)的已提交的事务。
为何要使用undo回滚?因为abort前有可能有未提交的事务已经写到了数据文件里。
为何要open?打开数据库意味着用户会话可以建立了。
Oracle提供了大量的内部表,它们记录了数据库对象的更改和修正。可以将这些内部表划分为两种主要类型:静态数据字典表和动态性能表。
这些内部表是由oracle维护的,可以说它们是只读表。用户包括sys都不能修改,只能查看。
1)centralofdatabase//数据库的核心
2)read_onlytableandviews
3)owner:sys
4)oracleserver维护,ddl操作会更新
5)通过select访问
6)记录数据库的物理、逻辑结构和所有对象的定义的信息
7)存放在systemtablesapce
通过dictview可以了解数据字典的组成
SQL>select*fromdictwheretable_name='DBA_OBJECTS';
TABLE_NAMECOMMENTS
---------------------------------------------------------------------------------------------------------
DBA_OBJECTSAllobjectsinthedatabase
SQL>selectcount(*)fromdict;
COUNT(*)
2323
1)数据库的逻辑和物理的架构
2)用户及对象的定义和存储信息
3)权限、角色、审计等
4)database的状态
static:在数据库open状态下访问,可以通过静态视图了解database的架构(记录database的架构,object的数据定义和存储等信息)
dba_:存储所有用户对象的信息(默认只能有sys/system用户访问)
是维护当前实例信息的,由于不断的更新,所以也叫动态视图。其底层是一组虚拟的动态表称为X$表,oracle不允许直接访问X$表,而是在这些表上创建视图,然后再创建这些视图的同义词。
Eg:
SQL>setautotraceon;//打开解析
SQL>setautotraceoff;//关闭解析
基表(x$)-------------视图(v_$)--------------同义词v$-------Useraccess
可以通过v$fixed_table视图查到所有的动态视图的名称;用于调优和数据库监控。从Oracle8开始,GV$视图开始被引入,其含义为GlobalV$,GV$的产生是为了满足OPS环境的需要,除了一些特例以外,每个V$视图都有一个GV$视图存在。
SQL>descv$fixed_table;
SQL>selectcount(object_id)fromv$fixed_table;
SQL>selectnamefromv$fixed_tablewherenamelike'V$%DATA%';
SQL>selectcheckpoint_change#fromv$database;
SQL>selectcheckpoint_change#fromv$datafile;
*考点:动态性能视图填充了来自实例和控制文件的信息,前缀为DBA_、ALL_、_USER_的视图则填充了来自数据字典的信息,此差异决定了可以在不同启动阶段查询那些视图。
补充:
DATABASE-->TABLESPACES-->SEGMENTS-->EXENTS-->BLOCKS(DBA-I-PPT36-)
1)字典管理:在数据字典中管理表空间的空间分配。Oracle8i以前只有通过uet$和fet$的字典管理。
缺点:某些在字典管理方式下的存储分配有时会产生递归操作,并且容易产生碎片,从而影响了系统的性能,现在已经淘汰了。
2)本地管理:在每个数据文件中使用位图管理空间的分配。表空间中所有区(extent)的分配信息都保存在该表空间对应的数据文件的头部。
优点:速度快,存储空间的分配和回收只是简单地改变数据文件中的位图,而不像字典管理方式还需要修改数据库。无碎片,更易于DBA维护。
03:32:36
SQL>selecttablespace_name,contents,extent_management,segment_space_managementfromdba_tablespaces;
TABLESPACE_NAMECONTENTSEXTENT_MANSEGMEN
-------------------------------------------------------
SYSTEMPERMANENTDICTIONARYMANUAL
SYSAUXPERMANENTLOCALAUTO
TEMPTEMPORARYLOCALMANUAL
USERSPERMANENTLOCALAUTO
EXAMPLEPERMANENTLOCALAUTO
UNDO_TBS01UNDOLOCALMANUAL
TMP01TEMPORARYLOCALMANUAL
TBS_16KPERMANENTLOCALAUTO
BIG_TBSPERMANENTLOCALAUTO
TESTPERMANENTDICTIONARYMANUAL
注意两点:
1)如果system表空间是数据字典管理,其他表空间可以是数据字典管理或local管理(默认)
2)字典管理可以转换成本地管理,但是对于系统表空间,要求执行一些附加步骤,比较麻烦。
executedbms_space_admin.tablespace_migragte_to_local('tablespacename');
建一个最简单的表空间
SQL>createtablespaceadatafile'/u01/oradata/timran11g/a01.dbf'size10m;
利用oracle提供的dbms_metadata.get_ddl包看看缺省值都给的是什么?
SQL>setserverouton;
//把显示打开
declare
aavarchar2(2000);
begin
selectdbms_metadata.get_ddl('TABLESPACE','A')intoaaFROMdual;
dbms_output.put_line(aa);
end;
/
结果:
CREATETABLESPACE"A"DATAFILE
'/u01/oradata/timran11g/a01.dbf'SIZE10485760
LOGGINGONLINEPERMANENTBLOCKSIZE
8192
EXTENTMANAGEMENTLOCALAUTOALLOCATE
//区是自动
SEGMENTSPACEMANAGEMENTAUTO
//段自动
PL/SQL过程已成功完成。
区默认本地管理,而且我也无法指定它为字典管理,因为我的system表空间是本地管理
createtablespaceadatafile'/u01/oradata/timran11g/a01.dbf'size10m
extentmanagementlocaluniformsize128k
segmentspacemanagementmanual;
同上,调dbms_metadata.get_ddl包看oracle对该语句的ddl操作是:
EXTENTMANAGEMENTLOCALUNIFORMSIZE131072SEGMENTSPACEMANAGEMENTMANUAL
最后一行信息是:区本地管理且统一分配128K,段手动管理。如果在建表时使用缺省说明,则该表将服从其表空间的这些定义,
SQL>createtablescott.t1(idint)tablespacea;
调dbms_metadata.get_ddl包看oracle对SCOTT.T1表的ddl操作是:
selectdbms_metadata.get_ddl('TABLE','T1','SCOTT')intoaaFROMdual;
CREATETABLE"SCOTT"."T1"
("ID"NUMBER(38,0)
)PCTFREE10PCTUSED40INITRANS1MAXTRANS255NOCOMPRESS
LOGGING
STORAGE(INITIAL131072NEXT131072MINEXTENTS1MAXEXTENTS2147483645
PCTINCREASE0FREELISTS1FREELIST
GROUPS1BUFFER_POOLDEFAULT)
TABLESPACE"A"
注意两个地方:1)因为表空间指定了MSSM方式,表这边就有了PCTUSED值,缺省是40,存储子句(storage)沿用了表空间的uniform128k.
cannotdrop:
1)system
2)activeundotablespace
3)defaulttemporarytablespace
4)default的永久表空间
09:43:11SQL>DROPTABLESPACESYSTEM;
DROPTABLESPACESYSTEM
ERRORatline1:
ORA-01550:cannotdropsystemtablespace
09:44:38SQL>droptablespacetestincludingcontentsanddatafiles;
Tablespacedropped.
09:44:59
//产看数据文件和表空间的关系
SQL>selectfile_id,file_name,tablespace_name,AUTOEXTENSIBLE,bytes/1024/1024"size"fromdba_data_files;
SQL>colfile_nameformata50;
//修改某一列显示宽度
FILE_IDFILE_NAMETABLESPACE_NAMEAUTOEXTENSIBLEsize
----------------------------------------------------------------------------------------------------------
4/u01/oradata/timran11g/users01.dbfUSERSYES51.25
3/u01/oradata/timran11g/sysaux01.dbfSYSAUXYES260
2/u01/oradata/timran11g/undotbs01.dbfUNDOTBS1YES100
1/u01/oradata/timran11g/system01.dbfSYSTEMYES480
5/u01/oradata/timran11g/example01.dbfEXAMPLEYES100
查看表空间空闲大小
09:47:04SQL>selectTABLESPACE_NAME,sum(bytes)/1024/1024fromdba_free_spacegroupbytablespace_name;
TABLESPACE_NAMESUM(BYTES)/1024/1024
UNDOTBS198.4375
SYSAUX14.625
USERS48.1875
SYSTEM1.875
EXAMPLE31.25
1)smallfile,在一个表空间可以建立多个数据文件
2)bigfile:在一个表空间只能建立一个数据文件(8k的block,datafilemaxsize可以32T),可以简化对数据文件管理
09:54:49
createbigfiletablespacebig_tbsdatafile'/u01/oradata/timran11g/bigtbs01.dbf'size100m;
Tablespacecreated.
09:55:01
SQL>altertablespacebig_tbsadddatafile'/u01/oradata/timran11g/bigtbs02.dbf'size100m;
altertablespacebig_tbsadddatafile'/u01/oradata/timran11g/bigtbs02.dbf'size100m
ORA-32771:cannotaddfiletobigfiletablespace
09:55:46SQL>selectname,bigfilefromv$tablespace;
NAMEBIG
---------------------------------
SYSTEMNO
UNDOTBS1NO
SYSAUXNO
USERSNO
TEMPNO
EXAMPLENO
TBS_16KNO
BIG_TBSYES
一个段属于一个表,一个表可以有多个段(带有段、大对象)。
一个segment只属于一个模式(schema)对象,模式对象如表、索引,一个段比较大时可以跨多个数据文件。
创建一个模式对象时,ORACLE为这个对象创建一个(或多个)段,在这个段中保存这个对象的所有数据,当这个段数据增加时,为这个段分配新的区(extent)存储数据。段中至少有一个初始区。
段管理也有两种方式:
1)自动管理方式(ASSM(AutoSystemtSpaceManagement))--采用位图管理段的存储空间
简单说就是每个段的段头都有一组位图(5个位图),位图描述每个块的满度,根据满度的不同将每个块对应到相应的位图上,位图自动跟踪每个块的使用空间,这5个位图的满度按如下定义:一个位图位于满块,其余位图分别用于满度为75%-100%、50%-75%、25%-50%和0%-25%的块,比如块大小为8k,你要插入一行是3k的表行,那么oracle就给你对应到25%-50%的那个位图指定的块上去。
2)手工管理方式(MSSM(ManualSegmentSpaceManagement))--采用FREELIST(空闲列表)管理段的存储空间
这个是传统的方法,现在仍然在使用,未被淘汰,它与pctfree和pctused的概念有关,后面再介绍block时再讨论。
段的管理方式只有在创建表空间时设置,一经确定不能改变。
在ORACLE9I中,缺省状态为自动管理方式
segmentspacemanagement{manual|auto}
一般来讲一个单纯的表就分配一个段,但往往表没那么单纯,比如表上经常会有主键约束,那么就会有索引,索引也是表,要求单独分一个段,还有,例如分区表,每个分区会有独立的段,再有就是oracle的大对象,如果你的表里引用blob,clob,那么这个表就又被分出多个段来。
SQL>conn/assysdba
SQL>createusertimidentifiedbytim;
SQL>grantconnect,resourcetotim;
SQL>conntim/tim
SQL>select*fromuser_segments;
未选定行
SQL>createtablet1(idint);
SQL>selectsegment_namefromuser_segments;
SEGMENT_NAME
---------------------------------------------------------------------------------
T1
SQL>createtablet2(idintconstraintpk_t2primarykey,bblob,cclob);
T2
SYS_LOB0000074368C00002$$
SYS_IL0000074368C00002$$
SYS_LOB0000074368C00003$$
SYS_IL0000074368C00003$$
PK_T2
区是ORACLE进行存储空间分配的最小单位。是由一系列逻辑上连续的Oracle数据块组成的逻辑存储结构。段中第一个区叫初始区,随后分配的区叫后续区。当段中所有的空间使用完后,ORACLE自动为该段分配一个新的区。
根据表空间的管理方法不同,区的分配方法也不同。
1)本地管理方式下的区的分配方法。
自动分配和统一分配(见表空间一节)
2)字典管理方式下的区的分配方法。逐步淘汰了
考点:区分配管理方式在创建表空间时确定,建完后,不允许更改。
当建立表的时候,建立段,然后自动分配相应的extent(1个或者多个),亦可以手工提前分配extent(用于需大量插入数据的表)
区是段分配存储的单位。当建立一个表段时,Oracle为该段分配初始区,初始区到底是多少个block?实验表明:
ASSM下autoallocat方式一般是8个block,而uniform可以使它最小5个block,MSSM方式下uniform最小可以是2个block,一句话,所谓initial_extent最小可以5个或2个一定是uniform形式下的。
SQL>createtablespaceadatafile'/u01/oradata/timran11g/a01.dbf'size1mextentmanagementlocaluniformsize40ksegmentspacemanagementauto;
SQL>select*fromdba_tablespaces;//看initial_extent是多少
SQL>createtablespacebdatafile'/u01/oradata/timran11g/b01.dbf'size1mextentmanagementlocaluniformsize5ksegmentspacemanagementmanual;
SQL>select*fromdba_tablespaces;//看initial_extent是多少?我只给了5k(一个block是8k)oracle隐性补全到16k。
如果之后由于数据的插入,初始区装满后,将继续分配下一个区。
scott:
SQL>createtablet1tablespacetestasselect*fromdept;
SQL>colsegment_namefora20;
SQL>selectsegment_name,extent_id,bytesfromuser_extentswheresegment_name='T1';
SEGMENT_NAMEEXTENT_IDBYTES
---------------------------------------
T1065536
可以看到段T1的初始区ID为0,大小为65536bytes;
向表段中自插表数据,看Oracle为该段分配更多的区
SQL>insertintot1select*fromt1;
已创建2048行。
T1165536
T1265536
此时看到随着数据的插入,T1段动态扩展为三个区;
SQL>deletet1;
已删除4096行。
此时表段的数据已经删除,但所有extent依然健在,无法回收T1段的区(这是高水位线问题);
可以再扩展表:
altertablescott.t1allocateextent(datafile'/u01/oradata/timran11g/test01.dbf'size5m);
查看
SQL>selectsegment_name,extent_id,file_id,bytesfromdba_extentswheresegment_name='T1';
SEGMENT_NAMEEXTENT_IDFILE_IDBYTES
T10665536
T11665536
T12665536
T1361048576
T1461048576
T1561048576
T1661048576
T1761048576
回收空闲extent
SQL>altertablescott.t1deallocateunused;
表已更改。
顺便提一句:如何查看一个表所对应的数据文件及表空间的关系呢?
抓住上面dba_extents中的file_id字段(user_extents里没有这个字段),然后;
SQL>selectfile_id,file_name,tablespace_namefromdba_data_files;
查看视图
Block是oracle进行IO操作的最小单位,block的管理方法是区的管理和段管理的具体体现。
数据块的管理方法也分两种:
1、自动管理方式如创建表空间时设置为本地管理方式,并且将段的存储空间方式设置为AUTO(即ASSM),该表空间的所有块均采用自动管理方式。这是系统默认的。
2、手工管理方式是传统的管理方式,主要通过PCTFREE和PCTUSED两个存储参数控制可用存储区的大小,避免行迁移现象的发生。这两个参数可在创建表空间时设置,也可在建立数据库的模式对象(表,索引)中设置。模式对象中设置的优先级比表空间的要高。就是说;如表和索引中没有设置,则按表空间的设置,如表空间也没设置,则按自动管理方式管理块。
datablock:oracle11g标准块:8k,支持2-32k,
有blockheader、freespace、data组成
数据块并发访问:由数据块的事务槽来分配
ITL:事务槽,可以有多个ITL以支持并发事务,每当一个事务要更新数据时,必须先得到一个ITL槽,然后将当前事务ID,事务所用的undo块儿,
initrans:初始化事务槽的个数(1·255),表默认1,index默认为2;
maxtrans:最大的事务槽个数(默认255)
pctfree:预留给update操作的空间,freespace大于pctfree可以insert,小于,不允许insert
数据块的freespace管理:
pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。达到该值,从freelist清除该块信息。
pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。达到该值,该块信息加入freelist
freelist:可用列表中登记了可以插入数据的可用块,位置在段头,插入表行数据时首先查找该列表。
行链接:指一行存储在多个块中的情况,这是因为该行的长度超过了一个块的可用空间大小,即行链接是跨越多块的行。
行迁移:指一个数据行由于update语句导致当前块被重新定位到另一个块(那里有充足的空间)中,但在原始块中保留一个指针的情形。原始块中的指针是必需的,因为索引的ROWID项仍然指向原始位置。(pctfree问题)注意行迁移与insert和delete语句无关(考点)。
如何能够知道发生了行链接或行迁移?
查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列,当CHAIN_CNT有值时,看AVG_ROW_LEN,它表示行的平均长度,如果小于块大小,那么行是迁移行,如果大于块大小,那么是链接行。
SQL>createtablet1(c1varchar2(20));
SQL>begin
2foriin1..1000loop
3insertintot1values(null);
4endloop;
5end;
6/
分析t1表确定无行迁移
SQL>analyzetablet1computestatistics;
SQL>selectavg_row_len,chain_cntfromuser_tableswheretable_name='T1';
AVG_ROW_LENCHAIN_CNT
---------------------
填充这些空列,再分析t1,有了行迁移
SQL>updatet1setc1='timranismyname';
26865
使用段重组(即move),再分析t1,行迁移消失
SQL>altertablet1move;
210
考点:对于大部分目的而言,应该用DBMS_STATS包中的过程分析表,但要查看行链接或行迁移信息,只能通过ANALYZE命令检测。
1)什么是高水位线?
高水位线(high-watermark,HWM)
顾名思义,高水位线有点类型于水文监测站里测水深度的标杆一样,当水涨的时候,水位线随之上升,并在标杆留下一个水印痕,这个水印痕就是高水位线。在数据库中,上述比喻很恰当。如果把表想象成一个平面结构,或者想象成从左到右依次排开的一系列块,高水位线就是包含了数据的最右边的块。
原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值。
HWM对数据库的操作有如下影响:
a)全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。
b)即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。
2)两个解决办法
2.1)移动表move,从一个表空移动到另一个表空间(也可以在本表空间内move),可以清除表里的碎片。
语法:altertablet1move[tablespaceusers];
优点:可以清除数据块中的碎片,降低高水位线
缺点:move过程中,表上的不能做DML或DDL操作。
createtablespacetimrandatafile'/u01/oradata/timran11g/timran01.dbf'size100m;
createtablescott.t2tablespacetimranasselect*fromdba_objects;
selectmax(rownum)fromt2;
selecttable_name,blocks,empty_blocks,num_rowsfromuser_tableswheretable_name='T2';
analyzetablet2computestatistics;
deletet2whererownum<=40000;
commit;
analyzetablet2computestatisticsfortable;
selecttable_name,blocks,num_rowsfromuser_tableswheretable_name='T2';
这时候,num_rows已经减掉了40000条,但blocks并没有减少,说明HWM没有下降。
altertablet2movetablespaceusers;
select*fromuser_tableswheretable_name='T2';
可以看到blocks减少了,
2.2)收缩表shrink,将数据行从一个数据块移动到另一个数据块。
表收缩的底层实现的是通过匹配的INSERT和DELETE操作,它分两个不同的阶段:压缩阶段和DDL命令阶段。
语法:altertablet2shrinkspace[cascade][compact];
前提:1)表所在的表空间使用了ASSM,因为位图方法才记录有关块实际有多满的信息(考点)。2)表上启用了rowmovement
droptablet2purge;
....重复上面步骤
altertablet2enablerowmovement;
altertablet2shrinkspace;
考点1:表收缩操作生成undo和redo数据,索引可以得到维护,因为收缩实现为一组DML事务,在压缩期间不锁表,但在移动单独行时将锁行。
考点2:SHRINKSPACECOMPACT命令重组段的内容,它执行第一阶段,不返回空间给表空间。
考点3:表必须遵守前面所说的两个前提,否则不能收缩,如果不满足前提,MOVE就是重组表的唯一方式。
考点4:使用位图管理块,不能收缩MSSM管理,或有LONG列表或是有refresh_on_commit物化视图的表。
用于排序,可以建立多个临时表空间,但默认的临时表空间也只能有一个,defaulttemporarytablespace不能offline和drop。如果未指定默认的临时表空间,oracle将会使用system作为临时表空间。只有temp表空间是nologing其他表空间都是logging的。
【当临时表空间为空时】
09:00:53
SQL>altertablespacetempaddtempfile'/u01/oradata/timran11g/temp01.dbf'size100mreuse;
这等于在原地重置了临时表空间
09:01:14SQL>selectfile_id,file_name,tablespace_namefromdba_temp_files;
FILE_IDFILE_NAMETABLESPACE_NAME
------------------------------------------------------------------------------------------
1/u01/oradata/timran11g/temp01.dbfTEMP
09:01:17SQL>colnamefora60;
09:01:19SQL>selectfile#,name,bytes/1024/1024fromv$tempfile;
FILE#NAMEBYTES/1024/1024
---------------------------------------------------------------------------
1/u01/oradata/timran11g/temp01.dbf100
09:04:18
SQL>createtemporarytablespacetemp2tempfile'/u01/oradata/timran11g/temp02.dbf'size10mextentmanagementlocaluniformsize128k;
09:06:17SQL>selectfile#,namefromv$tempfile;
FILE#NAME
1/u01/oradata/timran11g/temp01.dbf
2/u01/oradata/timran11g/temp02.dbf
09:06:52SQL>colPROPERTY_VALUEfora30
09:06:59SQL>coldescriptionfora40
09:07:04SQL>select*fromdatabase_properties;
PROPERTY_NAMEPROPERTY_VALUEDESCRIPTION
----------------------------------------------------------------------------------------------------
DICT.BASE2dictionarybasetablesversion#
DEFAULT_TEMP_TABLESPACETEMPNameofdefaulttemporarytablespace
DEFAULT_PERMANENT_TABLESPACEUSERSNameofdefaultpermanenttablespace
DEFAULT_TBS_TYPESMALLFILEDefaulttablespacetype
NLS_LANGUAGEAMERICANLanguage
NLS_TERRITORYAMERICATerritory
.....
27rowsselected.
20:55:00SQL>alteruserscotttemporarytablespacetemp2;
09:07:05SQL>alterdatabasedefaulttemporarytablespacetemp2;
09:07:34SQL>select*fromdatabase_properties;
DEFAULT_TEMP_TABLESPACETMP01Nameofdefaulttemporarytablespace
NLS_CURRENCY$Localcurrency
NLS_ISO_CURRENCYAMERICA
...
09:07:41SQL>
在很多情况下,会有多个session使用一个用户名去访问Oracle,而临时表空间又是基于用户的,那么可以建立一个临时表空间组,其中若干临时表空间组成,从而可以提高表空间的使用效率。
1)临时表空间组无法显式创建,当第一个临时表空间分配给该组时自动创建。
09:07:41SQL>altertablespacetemptablespacegrouptmpgrp;
09:09:33SQL>altertablespacetemp2tablespacegrouptmpgrp;
09:09:38SQL>select*fromdba_tablespace_groups;
GROUP_NAMETABLESPACE_NAME
TMPGRPTEMP
TMPGRPTEMP2
2)将临时表空间组设成默认临时表空间,可以实现负载均衡。
09:09:52SQL>alterdatabasedefaulttemporarytablespacetmpgrp;
09:10:10SQL>select*fromdatabase_properties;
DEFAULT_TEMP_TABLESPACETMPGRPNameofdefaulttemporarytablespace
3)要移除表空间组时,该组不能是缺省的临时表空间。
SQL>alterdatabasedefaulttemporarytablespacetemp;
05:36:11SQL>select*fromdatabase_properties;
05:38:11SQL>altertablespacetemptablespacegroup'';
05:38:16SQL>altertablespacetmp01tablespacegroup'';
Tablespacealtered.
4)当组内所有临时表空间被移除时,组也被自动删除。
05:38:23SQL>select*fromdba_tablespace_groups;
norowsselected
SQL>droptablespacetmp01includingcontentsanddatafiles;
【干净删除表空间】
当发生表空间不足的问题时常用的3个解决办法:
1)增加数据文件大小(resize),
alterdatabasedatafile'/u01/oradata/timran11g/timran01.dbf'resize5m;
2)增加数据文件(adddatafile),
altertablespacetimranadddatafile'/u01/oradata/timran11g/timran02.dbf'size20m;
3)设置表空间自动增长(autoextend),
alterdatabasedatafile'/u01/oradata/timran11g/timran01.dbf'autoextendonnext10mmaxsize500m;
SQL>createtablespacetimrandatafile'/u01/oradata/timran11g/timran01.dbf'size5m;
05:46:08SQL>createtablescott.test1(idint)tablespacetimran;
05:47:11SQL>insertintoscott.test1values(1);
05:47:15SQL>insertintoscott.test1select*fromscott.test1;
05:47:19SQL>/
05:47:29SQL>/
32768rowscreated.
05:47:23SQL>/
insertintoscott.test1select*fromscott.test1
ORA-01653:unabletoextendtableSCOTT.TEST1by8intablespaceTIMRAN
//用第一种方法扩充表空间
05:47:23SQL>alterdatabasedatafile'/u01/oradata/timran11g/timran01.dbf'resize10m;
05:48:18SQL>insertintoscott.test1select*fromscott.test1;
05:48:25SQL>/
131072rowscreated.
05:48:26SQL>/
ORA-01653:unabletoextendtableSCOTT.TEST1by128intablespaceTIMRAN
//用第二种方法扩充表空间:
05:48:57SQL>altertablespacetimranadddatafile'/u01/oradata/timran11g/timran02.dbf'size20m;
05:49:04SQL>insertintoscott.test1select*fromscott.test1;
05:49:13SQL>/
524288rowscreated.
05:49:14SQL>/
//用第三种方法扩充表空间:
05:49:15SQL>alterdatabasedatafile'/u01/oradata/timran11g/timran01.dbf'autoextendonnext10mmaxsize500m;
05:49:33SQL>insertintoscott.test1select*fromscott.test1;
05:49:37SQL>droptablespacetimranincludingcontentsanddatafiles;
待补充:例子
1、表的功能:存储、管理数据的基本单元(二维表:有行和列组成)
2、表的类型:
1)普通表:heaptable:数据存储时,无序的,对它的访问采用全表扫描。
2)分区表:(>2G)对大表进行优化(RangePartitioning,HashPartitioning,ListPartitioning,CompositePartitioning)
1.表的功能,存储、管理数据的的基本单位(二维表:有行和列组成)
1)堆表:heaptable,数据存储时,无序的,对它的访问采用全表扫描
2)分区表表>2G
3)索引组织表(IOT)
4)簇表
5)临时表
6)嵌套表
3、如何将普通表转换为分区表:
1)range分区
createtablesale(
product_idvarchar2(5),sales_countnumber(10,2)
)
partitionbyrange(sales_count)
(
partitionp1valueslessthan(1000),
partitionp2valueslessthan(2000),
partitionp3valueslessthan(3000)
);
查看信息:
select*fromuser_tab_partitionswheretable_name='SALE';
insertintosalevalues('1',600);
insertintosalevalues('2',1000);
insertintosalevalues('3',2300);
insertintosalevalues('4',6000);
select*fromsalepartition(p1);
select*fromsalepartition(p2);
增加一个分区
altertablesaleaddpartitionp4valueslessthan(maxvalue);
再看一下,可以插入6000值了
会报错——ORA-14402:。如果一定要改,可以通过打开表的rowmovement属性来完成。
SQL>selectrowid,t1.*fromsalepartition(p1)t1;
ROWIDPRODUSALES_COUNT
----------------------------------
AAASvUAAEAAAAGVAAA1600
SQL>updatesalesetsales_count=1200wheresales_count=600;
updatesalesetsales_count=1200wheresales_count=600
ORA-14402:更新分区关键字列将导致分区的更改
SQL>altertablesaleenablerowmovement;
已更新1行。
SQL>selectrowid,t1.*fromsalepartition(p2)t1;
AAASvVAAEAAAAGdAAA21000
AAASvVAAEAAAAGdAAB11200
SQL>createindexsale_idxonsale(sales_count)local;
SQL>select*fromuser_ind_partitions;
如果还想建全表索引(不分区)则(不能与分区表索引同时存在)
SQL>createindexsale_idxonsale(sales_count)global
SQL>select*fromuser_indexes;
createtablemy_emp(
empnonumber,enamevarchar2(10)
partitionbyhash(empno)
partitionp1,partitionp2
select*fromuser_tab_partitionswheretable_name='MY_EMP';
插入几个值,看是否均匀插入。
insertintomy_empvalues(1,'A');
insertintomy_empvalues(2,'B');
insertintomy_empvalues(3,'C');
select*frommy_emppartition(P1);
select*frommy_emppartition(P2);
createtablepersoncity(
idnumber,namevarchar2(10),cityvarchar2(10)
partitionbylist(city)
partitioneastvalues('tianjin','dalian'),
partitionwestvalues('xian'),
partitionsouthvalues('shanghai'),
partitionnorthvalues('herbin'),
partitionothervalues(default)
insertintopersoncityvalues(1,'sohu','tianjin');
insertintopersoncityvalues(2,'sina','herbin');
insertintopersoncityvalues(3,'yahoo','dalian');
insertintopersoncityvalues(4,'360','zhengzhou');
insertintopersoncityvalues(5,'baidu','xian');
看结果
select*frompersoncitypartition(east);
把范围分区和散列分区相结合或者范围分区和列表分区相结合。
createtablestudent(
snonumber,snamevarchar2(10)
partitionbyrange(sno)
subpartitionbyhash(sname)
subpartitions4
partitionp3valueslessthan(maxvalue)
有三个range分区,对每个分区会有4个hash分区,共有12个分区。
SQL>select*fromuser_tab_partitionswheretable_name='STUDENT';
SQL>select*fromuser_tab_subpartitionswheretable_name='STUDENT';
用OEM查看,看scott的studenttable子分区里的名字是oracle取名。
Oracle11g新增分区
Partition(分区),一直是Oracle数据库引以为傲的一项技术,正是分区的存在让Oracle高效的处理海量数据成为可能。在Oracle11g在10g的分区技术基础上又有了新的发展,使分区技术在易用性和可扩展性上再次得到了增强。
也称为间隔分区,实际上是由range分区引申而来,最终实现了range分区的自动化。
间隔分区的特点:
1).以定长宽度创建分区(比如年、月、具体的数字(比如100、500等))
2).分区字段必须是number或date类型
3).必须至少指定一个range分区(永久分区)
4).当有记录插入时,系统根据需要自动创建新的分区和本地索引
5).已有的范围分区可被转换成间隔分区(通过ALTERTABLESETINTERVAL选项完成)
又一个人性化的分区类型,SystemPartitioning,在这个新的类型中,我们不需要指定任何分区键,数据会进入哪个分区完全由应用程序决定,实际上也就是由SQL来决定,终于,我们在Insert语句中可以指定插入哪个分区了。
在10g中,我们知道复合分区只支持Range-List和Range-Hash,而在在11g中复合分区的类型大大增加,现在Range,List,Interval都可以作为Toplevel分区,而Secondlevel则可以是Range,List,Hash,也就是在11g中可以有3*3=9种复合分区,满足更多的业务需求。
所谓的虚拟列,是指该列数据并不实际存储于磁盘上,只有当读取的时候才实时计算。
(IOT表:如果表经常以主键为索引查询,可建立索引组织表,加快表的访问速度
heaptable数据的存放也是随机的,获取表中的数据时没有明确的先后之分,在进行全表扫描的时候,并不是先插入的数据就先获取。而IOT就是类似一个全是索引的表,表结构按照索引(主键)有序组织,因此数据存放是按照严格规定的,在数据插入以前就已经确定了其位置,所以不管插入的先后顺序,它在那个物理上的那个位置与插入的先后顺序无关。
由于IOT表是把普通表与其索引合二而一了,这样在进行查询的时候就可以少访问很多blocks,但是插入的时候,速度就比普通的表要慢一些。
IOT表的叶子节点存储了所有表列,因为按主键排序,不需要存储rowid。
设置溢出段将主键和溢出数据分开来存储以提高效率。
说明:pctthreshold制定了在叶子节点中主键和其他列的百分比,当行数据在叶子节点占用大小超出时,将该行的其他列放入溢出段,即overflow到指定的存储空间去,溢出段不是必选的。
createtableiot_timran(idint,namechar(50),salint,
constraintpk_timranprimarykey(id))
organizationindexpctthreshold30overflowtablespaceusers;
使用select*fromuser_indexes查看是否单独有索引。
SQL>selectindex_name,index_type,table_namefromuser_indexes;
INDEX_NAMEINDEX_TYPETABLE_NAME
---------------------------------------------------------------------------------------
PK_TIMRANIOT-TOPIOT_TIMRAN
PK_EMPNORMALEMP
PK_DEPTNORMALDEPT
两个相互关联的表的数据,同时放到一个簇数据块中,当以后进行关联读取时,只要扫描一个数据块就可以了,极大地提高了效率。
建立簇表的三个步骤:
1)建立簇段clustersegment
3)为簇创建索引。
createclustercluster1(code_keynumber);
createtablestudent(sno1number,snamevarchar2(10))clustercluster1(sno1);
createtableaddress(sno2number,zzvarchar2(10))clustercluster1(sno2);
createindexindex1onclustercluster1;
查看簇的信息:
select*fromuser_clusters;
select*fromuser_clu_columns;
删除簇:
droptablestudent;
droptableaddress;
dropclustercluster1;
用于电子商务的网上购物
临时表用于存放临时数据,临时表被每个session单独使用,即:不同session看到的临时表中的数据可能不一样。
临时表在临时表空间中存储。没有约束,索引,日志,节省资源,访问数据快。
两种模式:
1)在事务提交时,就会自动删除记录,oncommitdeleterows。
2)当用户退出session时,才会自动删除记录,oncommitpreserverows。
例:scott:
createglobaltemporarytabletmp_student(snoint,snamevarchar2(10),sageint)oncommitpreserverows;
再用Scott开一个session
两边插入记录看看,你可以在两个session里插入同样的记录,井水不犯河水!
要删除临时表,先要断开连接,使用disconnect命令,这时临时表消失了,再来删除。
droptabletmp_table
在以前版本中,有只读表空间但没有只读表。11g中增加了新特性----只读表。
SQL>altertabletreadonly;
SQL>updatetsetid=2;
updatetsetid=2
ORA-12081:不允许对表"SCOTT"."T"进行更新操作
SQL>altertabletreadwrite;
13.1审计的功能:监控用户在database的action(操作)
13.2审计分类:
1)session:在同一个session,相同的语句只产生一个审计结果(默认)
2)access:在同一个session,每一个语句产生一个审计结果
13.3启用审计(默认不启用)
09:54:18SQL>showparameteraudit
audit_file_deststring/u01/admin/timran/adump
audit_sys_operationsbooleanFALSE
audit_syslog_levelstring
audit_trailstringNONE(不启用)
09:54:56SQL>altersystemsetaudit_trail=dbscope=spfile;
09:55:02SQL>startupforce;
09:55:23SQL>showparameteraudit
audit_trailstringDB
09:55:29SQL>
audit_trail参数三个选项
1)none不启用audit
2)db将审计结果放在数据字典里(database),只有dba可以访问
3)os将审计结果存放到操作系统的文件里(由audit_file_dest指定的位置)
启用audit,默认不审计sys用户的action
audit_sys_operations=true,启用对于sys用户的审计
(默认情况:session,对成功和不成功的同时审计)
oracle提供的审计种类:语句审计、权限审计、对象审计、精细审计(FGA)、应用审计(触发器审计)等。
精细审计FineGrainedAuditing(FGA),操作可以使用dbms_fga包或OEM。
1)添加一个精细度审计策略
dbms_fga.add_policy(
object_schema=>'scott',
object_name=>'emp',
policy_name=>'chk_emp',
audit_condition=>'deptno=20',
audit_column=>'sal',
statement_types=>'update,select');
end
11:31:28SQL>connscott/scott
2)测试一下步骤,再查看审计结果
11:31:35SQL>select*fromemp;
11:31:41SQL>select*fromempwheredeptno=20;
11:31:48SQL>updateempsetdeptno=10whereempno=7788;
11:32:12SQL>updateempsetsal=8000wheredeptno=20;
16:04:54SQL>updateempsetsal=8000wheredeptno=10;
11:32:21SQL>commit;
3)验证审计结果
11:32:24SQL>conn/assysdba
11:33:52SQL>selectdb_user,to_char(timestamp,'yyyy-mm-ddhh24:mi:ss')"time",sql_textfromdba_fga_audit_trail;
DB_USERtimeSQL_TEXT
SCOTT2011-08-1111:31:42select*fromemp
SCOTT2011-08-1111:31:49select*fromempwheredeptno=20
SCOTT2011-08-1111:32:12updateempsetsal=8000whereempno=7788
SCOTT2011-08-1111:32:21updateempsetsal=8000wheredeptno=20
精细审计结果存放到fga_log$的基表里,通过dba_fga_audit_trail查看。
11:34:36SQL>selectcount(*)fromfga_log$;
4
11:36:20SQL>deletefromfga_log$;
11:36:26SQL>selectdb_user,to_char(timestamp,'yyyy-mm-ddhh24:mi:ss')"time",sql_textfromdba_fga_audit_trail;
4)禁止、激活、删除FGA的PL/SQLAPI命令
禁止精细审计
04:08:08SQL>
execdbms_fga.disable_policy(-
object_name=>'emp',-
policy_name=>'chk_emp');
PL/SQLproceduresuccessfullycompleted.
激活精细审计
04:10:33SQL>
execdbms_fga.enable_policy(-
删除FGA策略
04:11:52SQL>
execdbms_fga.drop_policy(object_schema=>'scott',object_name=>'emp',policy_name=>'chk_emp');
删除精细审计的结果
04:12:43SQL>deletefromsys.fga_log$;
(比如文本型)数据导入oracledatabase。(用于数据导入、不同类型数据库数据迁移)
在段(segment表)insert记录
1)normal:将记录插入到segment的HWM(高水位线)以下的块,要首先访问bitmap,来确定那些block有freespace
2)direct:将记录插入到segment的HWM(高水位线)以上的从未使用过的块,加快插入速度
SQLLDRkeyword=value[,keyword=value,...]
看帮助信息
$/u01/oracle/bin/sqlldr(回车)
*考点:sql*loader与datadump的一个区别:datadump只能读取由它导出的文件,而sql*loader可以读取任何它能解析的第三方文件格式
1)模拟生成数据源
SQL>settimeon
11:02:13
SQL>selectempno||','||ename||','||job||','||mgr||','||hiredate||','||sal||','||comm||','||deptnofromscott.emp;
EMPNO||','||ENAME||','||JOB||','||MGR||','||HIREDATE||','||SAL||','||COMM||','||DEPTNO
------------------------------------------------------------------------------------------------------------------------
7369,SMITH,CLERK,7902,1980-12-1700:00:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-2000:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-2200:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-0200:00:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-2800:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-0100:00:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-0900:00:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-1900:00:00,3000,,20
7839,KING,PRESIDENT,,1981-11-1700:00:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-0800:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-2300:00:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-0300:00:00,950,,30
7902,FORD,ANALYST,7566,1981-12-0300:00:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-2300:00:00,1300,,10
14rowsselected.
2)建个目录
[oracle@timran]$mkdir-p/home/oracle/sqlload
[oracle@timran]$cd/home/oracle/sqlload
[oracle@timransqlload]$viemp.dat--生成外部表
--------查看数据源
[oracle@timransqlload]$moreemp.dat
3)普通模式导入
建立控制文件
[oracle@worksqlldr]$viemp.ctl
loaddata
infile'/home/oracle/sqlload/emp.dat'
insert--insert插入表必须是空表,非空表用append
intotableemp1
fieldsterminatedby','
optionallyenclosedby'"'
empno,
ename,
job,
mgr,
hiredate,
comm,
sal,
deptno)
4)在scott下建立emp1表(内部表),只要结构不要数据
11:10:13SQL>createtableemp1asselect*fromempwhere1=2;
5)执行导入(normal)
[oracle@timrantimran]$sqlldrscott/scottcontrol=emp.ctllog=emp.log
SQL*Loader:Release10.2.0.1.0-ProductiononThuAug1112:18:362011
Commitpointreached-logicalrecordcount14
5)验证:
11:07:12SQL>
11:07:12SQL>select*fromemp1;
上例的另一种形式是将数据源和控制文件合并在.ctl里描述
infile*
append
begindata
[oracle@timransqlload]$sqlldrscott/scottcontrol=emp.ctllog=emp.log
Commitpointreached-logicalrecordcount15
[oracle@timransqlload]$
[oracle@timransqlload]$ll
总计12
-rw-r--r--1oracleoinstall107-1711:09emp.bad
-rw-r--r--1oracleoinstall78207-1711:09emp.ctl
-rw-r--r--1oracleoinstall205507-1711:09emp.log
[oracle@timransqlload]$moreemp.bad
11:09:34SQL>SQL>selectcount(*)fromemp1;
28
1)listener:在oracleserver上启动,负责接收clientprocess并派生serverprocess,与clientprocess建立session
2)建立listener:通过netca
3)listener配置
4)lsnrctlstart|stop|status
5)$ORACLE_HOME/network/admin/listener.ora配置程序,动态注册可以不使用这个配置程序。
1)$ORACLE_HOME/network/admin/tnsnames.ora配置文件。
如:
myoracle=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.88)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=timran11g)
2)注意几个地方
2.1HOST=目标机的IP,如果是windows平台,习惯使用主机名。PORT=1521这是动态注册的默认端口号。
2.2SERVICE_NAME是目标机的instance名,不能写错。
2.3myoracle是连接符,代表的是等号后面整个网络连接字符串,为了便于记忆,它常常和SERVICE_NAME同名。但含义不同。
C:\DocumentsandSettings\timran>sqlplussys/oracle@myoracleassysdba
告诉listener,database的instancename和servicename
1)动态注册:listener采用的是默认端口(1521),当实例启动时,由pmon自动将instancename和servicename注册到listener
2)静态注册:当listener使用的是非标准端口(1521),在listener.ora的文件里手工注册(添加instancename和servicename)
静态注册:
1)静态注册不需要监听器启动,数据库关闭时可以完成静态注册,因而可以进行远程启动/关闭数据库的任务。
2)静态注册使用用户指定的端口号(非1521),相对隐蔽,安全。
3)静态注册需要listener.ora描述。
动态注册:
1)需要监听器启动,而监听器依赖数据库打开才能开启。所以动态注册无法远程启动数据库。
2)使用标准1521端口,自动注册。
3)可以不使用listener.ora
例子:动态注册和静态注册搭配使用
[oracle@timranadmin]$catlistener.ora
#listener.oraNetworkConfigurationFile:/u01/oracle/network/admin/listener.ora
#GeneratedbyOracleconfigurationtools.
LSN2=
(DESCRIPTION_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.88)(PORT=1522))
SID_LIST_LSN2=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=timran11g)
(ORACLE_HOME=/u01/oracle)
(SID_NAME=timran11g)
--以上是静态监听描述
SID_LIST_LISTENER=
(SID_NAME=PLSExtProc)
(PROGRAM=extproc)
LISTENER=
(ADDRESS=(PROTOCOL=TCP)(HOST=timran.localdomain)(PORT=1521))
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0))
--以上是动态监听默认描述
[oracle@timranadmin]$
--启动lsn2
[oracle@timranadmin]$netstat-an|grep1522
tcp000.0.0.0:15220.0.0.0:*LISTEN
tcp00192.168.8.240:1522192.168.8.248:3371ESTABLISHED
tcp00192.168.8.240:33187192.168.8.240:1522ESTABLISHED
tcp00192.168.8.240:1522192.168.8.240:33187ESTABLISHED
启动静态监听器
[oracle@timranadmin]$lsnrctlstartlsn2
LSNRCTLforLinux:Version10.2.0.1.0-Productionon12-AUG-201111:13:33
Starting/u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr:pleasewait...
TNSLSNRforLinux:Version10.2.0.1.0-Production
Systemparameterfileis/u01/oracle/network/admin/listener.ora
Logmessageswrittento/u01/oracle/network/log/lsn2.log
Listeningon:(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.66)(PORT=1522)))
Connectingto(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.66)(PORT=1522)))
STATUSoftheLISTENER
------------------------
Aliaslsn2
VersionTNSLSNRforLinux:Version10.2.0.1.0-Production
StartDate12-AUG-201111:13:33
Uptime0days0hr.0min.0sec
TraceLeveloff
SecurityON:LocalOSAuthentication
SNMPOFF
ListenerParameterFile/u01/oracle/network/admin/listener.ora
ListenerLogFile/u01/oracle/network/admin/log/lsn2.log
ListeningEndpointsSummary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.66)(PORT=1522)))
ServicesSummary...
Service"prod"has1instance(s).
Instance"prod",statusUNKNOWN,has1handler(s)forthisservice...
Thecommandcompletedsuccessfully
----------查看lsn2status
[oracle@timranadmin]$lsnrctlstatuslsn2
LSNRCTLforLinux:Version10.2.0.1.0-Productionon12-AUG-201111:16:18
Uptime0days0hr.2min.44sec
ListenerLogFile/u01/oracle/network/log/lsn2.log
//statusunknown表示instance是以静态注册方式注册
客户端的tnsnames.ora配置文件
lsn2=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.8.88)(PORT=1522))
timran11g=
EXTPROC_CONNECTION_DATA=
(SID=PLSExtProc)
(PRESENTATION=RO)
说明:lsn2是静态注册链接,端口号1522。timran11g是动态注册链接,端口号1521.
1)如果没有使用RAC,那么监听器必须与实例在同一台主机上运行。在RAC环境下,集群中任何主机的任何监听器都可以任何主机的任何实例。
2)如果监听器停止运行,那么不能启动任何新的服务器进程,但不会影响先前已经建立的会话。
3)共享连接方式下,会话与调度进程在会话期间持久存在,而与监听器的连接是短暂的。
自动存储管理即ASM(AutomaticStorageManagement),是Oracle提供的一项管理磁盘的功能,它是一种以纯软件方式实现的逻辑卷管理器,功能上提供了基于Oracle数据文件的条带化和可选的镜像。ASM的知识同时涉及了数据库管理和系统管理两大领域。
物理卷:指的是独立磁盘,或磁盘分区或磁盘RAID结构。
逻辑卷:LVM(LogicalVolumeManager),以软件方式将虚拟磁盘呈现给用户,LVM是操作系统级别的。提供了磁盘管理的灵活性,可靠性,具有条带,镜像和快照等功能。
磁盘阵列上的RAID技术:希望通过多个物理卷增强性能和容错性,常用的有4个级别,RAID0,RAID1,RAID5,RAID0+1。
1)ASM了解Oracle特性,它提供的条带和镜像功能是基于文件的,而不像LVM是基于物理卷的。所以ASM可以做到不同的数据文件有不同的条带大小,这对提高系统性能来说是一个优势。
2)由于基于文件的条带,ASM可以针对数据文件制定不同的容错方案,比如system表空间的数据文件可以采用3个副本的镜像,而临时表空间的数据文件根本不需要镜像。
3)ASM增加/删除磁盘后会使磁盘组上的文件重新均衡分布,这个过程是自动完成的。除了高级存储如EMC或EVA以外,一般的LVM是不提供的,
4)ASM是Oracle绑定的,不同的平台上可移植性好,不像LVM依赖硬件厂商提供的OS,各有各的LVM技术,而有些OS上并没有捆绑LVM,那么要使用的话还要从第三方购买。
(以下概念全是考点)
ASM数据库需要启动ASM实例,非ASM数据库实例(又叫标准实例)的默认参数INSTANCE_TYPE是RDBMS,此参数设置成ASM将启动ASM实例,ASM实例负责定位数据文件,注意仅仅是定位,数据文件的IO读写操作还是由RDBMS实例完成的。
ASM实例合法参数很少,应该设置ASM_DISKTRING表示ASM磁盘和ASM_DISKGROUP参数来标识ASM磁盘组,这些参数在RDBMS实例中是没有的。
ASM可以管理的文件有数据文件,临时文件,控制文件,联机和归档日志文件,spfile,及RMAN备份集和映像副本等,ASM不支持口令文件、跟踪文件、告警文件和Oracle二进制文件(考点)。
ASM磁盘可以是实际的磁盘,也可以是磁盘的某个分区,或LVM管理的逻辑卷,ASM磁盘应该使用没有文件系统的磁盘(就是说未格式化的磁盘)
ASM磁盘组由ASM磁盘组成,可以包含一个或多个ASM磁盘
磁盘组中创建的文件由跨越组中所有的ASM磁盘分布的1M大小的分配单元(AU)构成。注意,AU是基于ASM磁盘的。
只能使用RMAN备份ASM文件,操作系统命令对ASM文件不可知。
可以向磁盘组动态添加磁盘,磁盘组会自动再平衡,即会重新条带化文件的分配单元,注意,条带(stripting)是基于ASM文件的。
可以通过ALTERDISKGROUPMOUNT手动加载ASM磁盘,也可以通过指定参数ASM_DISKGROUP动态加载。
AU是建立磁盘组时确定的,缺省是1M,可以指定为1,2,4,8,16,32或64M。
striping分为粗粒度条带(coarse),细粒度条带(fine),相对1M的AU,粗粒度也是1U,而细粒度是128K,它们是针对不同的数据文件制定的不同的条带策略,这些策略已由Oracle模板缺省定义了,比如datafile是粗粒度,controlfile是细粒度,若有特殊需求,可自定义模板,然后在建立表空间时引用自定义模板,
AU是跨一个磁盘组中的所有磁盘。
striping是跨一个磁盘组中所有磁盘文件。
ASM的镜像是建立在striping上的,是extent级的。这也是对LVM的一个优势。
缺省ASM容错有点类似RAID0+1,磁盘镜像是normalredundancy(两个副本),还可以调整为EXTERNALREDUNDANCY(无镜像),以及HIGHREDUNDANCY(三个副本)。ASM不能禁用条带化。
一个磁盘组可以由两个或多个故障组(failgroup)组成,一个故障组由一个或多个ASM磁盘组成
故障组是在标准冗余的基础上指定镜像策略,它是一种镜像功能的补充,此考虑常常是出于想指定一对镜像分配在两路磁盘控制器下,以便在提供了更安全的共享相同资源的冗余,
假定有磁盘组DG1,且创建了两个故障组fgroup1,fgroup2,每个故障组由个ASM磁盘组成,则对标准冗余而言,指定两个故障组互为镜像
failgroup1-->asmdiskA,asmdiskB
failgroup2-->asmdiskC,asmdiskD
注意:failgroup1和failgroup2互为镜像,这是以每个组中所有磁盘统一考虑的,内部工作机制是镜像extent。
假定文件datafileA大小为4MB,则个4extent均匀分布到asmdiskA,asmdiskB,同样asmdiskC,asmdiskD也包含该文件的每个extent
即只要有一个extent在故障组fgroup1中存在,必定有一个镜像的extent存在于fgroup2中,反之亦然,两个组的extent互为镜像。
当一个故障组中的某个磁盘损坏,假定为asmdiskA,则asmdiskA中原来保存的extent将会从failgroup2中复制到asmdiskB中。
总之,故障组failgroup1和failgroup2必定有相同的extent副本
要求claster服务,即使不是RAC配置,单实例工作方式也要使用CSS部分功能,另外还需要了解ASM也有后台进程,如SMON,PMON,LGWR,DBWR,CKPT等,此外还增添了两个新进程,一个是RBAL,一个是ARBn
RBAL:用于协调和管理磁盘组之间的动态平衡
ARBn:可以为多个,用于完成AU的移动
特别注意RBAL在ASM实例和RDBMS实例中各有一个,但功能不同,前者是负责协调ASM再平衡活动,后者负责打开和关闭ASM磁盘。
1)只能在nomount下启动ASM实例,它永远不能mount控制文件,也不能打开datafile
2)启动:ASM实例先启动,RDBMS实例后启动。退出:RDBMS实例先shutdwonimmediate,ASM实例后退出.
3)如果ASM实例崩溃,RDBMS也崩溃。如果RDBMSshutdownabort,ASM实例什么也不做。
1)建立条带是必须的,而镜像则是可选的。但ASM文件的默认特性是:同时条带化和镜像文件。
2)ASM文件是由RDBMS实例打开,不是ASM实例打开。
1).OracleASMlib安装
ASMlib是Oracle针对linux操作系统做的ASM管理套件,ASMlib简化磁盘管理,取代原来我们在linux上常用rawdevices服务。
真正需要安装的ASMlib一般是三个包,如下:
oracleasm-kernel-version.arch.rpm
oracleasmlib-version.arch.rpm
oracleasm-support-version.arch.rpm
比如,我的linux内核版本是:
[root@timran~]#uname-a
Linuxtimran.localdomain2.6.18-53.el5#1SMPWedOct1016:34:02EDT2007i686athloni386GNU/Linux
根据上面的kernel版本,我找到的三个对应的ASMlib包应该是:
oracleasm-2.6.18-53.el5-2.0.4-1.el5.i686.rpm
oracleasmlib-2.0.4-1.el5
oracleasm-support-2.1.7-1.el5
将这三个包加载到linuxkernel中
[root@timranoracle]#rpm-qa|grepasm
[root@timranoracle]#rpm-ivh*.rpm
warning:oracleasmlib-2.0.4-1.el5.i386.rpm:HeaderV3DSAsignature:NOKEY,keyID1e5e0159
Preparing...###########################################[100%]
1:oracleasm-support###########################################[33%]
2:oracleasm-2.6.18-53.el5###########################################[67%]
3:oracleasmlib###########################################[100%]
[root@timranoracle]#reboot//重启一下,看看主控台显示ASM驱动能否正常加载.
Broadcastmessagefromroot(pts/1)(ThuNov1516:23:302012):
ThesystemisgoingdownforrebootNOW!
ASMlib包装好后会在/etc/init.d/下出现oracleasm这个service,它可以支持很多关于ASM的操作。
2).启用css服务(ClusterSynchronizationServices),用于同步ASM实例与RDBMS实例
使用root帐户进行配置,配置程序位于$ORACLE_HOME/bin
[root@timran~]#/u01/oracle/bin/localconfigadd
/u01/oracle/bin/localconfigadd
/etc/oracledoesnotexist.Creatingitnow.
SuccessfullyaccumulatednecessaryOCRkeys.
CreatingOCRkeysforuser'root',privgrp'root'..
Operationsuccessful.
ConfigurationforlocalCSShasbeeninitialized
CleaningupNetworksocketdirectories
SettingupNetworksocketdirectories
Addingtoinittab
Startupwillbequeuedtoinitwithin30seconds.
CheckingthestatusofnewOracleinitprocess...
ExpectingtheCRSdaemonstobeupwithin600seconds.
ClusterSynchronizationServicesisactiveonthesenodes.
timran
ClusterSynchronizationServicesisactiveonallthenodes.
OracleCSSserviceisinstalledandrunningunderinit(1M)
[root@timran~]#
3).创建ASM参数文件(使用VI或VIM)
[root@timrandbs]#cat/u01/oracle/dbs/init+ASM.ora
#*.asm_diskgroups='DG1'--这行先注释掉,等到建完磁盘组后再去掉#号
*.asm_diskstring=''--这里有个技巧,设成空表示可以搜索任意的ASM磁盘
*.diagnostic_dest='/u01'
*.instance_type='ASM'
*.instance_name='+ASM'
*.large_pool_size=12M
*.remote_login_passwordfile='SHARED'
*.asm_power_limit=1
存盘后改一下属主:
[root@timrandbs]#chownoracle:oinstallinit+ASM.ora
4).创建密码文件
[oracle@timran~]$orapwdfile=$ORACLE_HOME/dbs/orapw+ASMpassword=redhatentries=5
[oracle@timran~]$exportORACLE_SID=+ASM
[oracle@timran~]$sqlplus/assysdba
Connectedtoanidleinstance.
ASMinstancestarted
TotalSystemGlobalArea284565504bytes
FixedSize1299428bytes
VariableSize258100252bytes
ASMCache25165824bytes
ORA-15110:nodiskgroupsmounted
实例启动了,可以在linux下看一下+ASM进程
[root@timrandbs]#ps-ef|grep+ASM
oracle39931014:3100:00:00asm_pmon_+ASM
oracle39951014:3100:00:00asm_vktm_+ASM
oracle39991014:3100:00:00asm_diag_+ASM
oracle40011014:3100:00:00asm_psp0_+ASM
oracle40051014:3100:00:00asm_dia0_+ASM
oracle40071014:3100:00:00asm_mman_+ASM
oracle40091014:3100:00:00asm_dbw0_+ASM
oracle40111014:3100:00:00asm_lgwr_+ASM
oracle40131014:3100:00:00asm_ckpt_+ASM
oracle40151014:3100:00:00asm_smon_+ASM
oracle40171014:3100:00:00asm_rbal_+ASM
oracle40191014:3100:00:00asm_gmon_+ASM
oracle40213988014:3100:00:00oracle+ASM(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root40323235014:37pts/200:00:00grep+ASM
如果实例不能启动,可以使用DBCA工具中-ConfigureAutomatic-Storage-Management项去创建一个+ASM实例。
5).创建ASM磁盘及配置ASMlib驱动
创建ASM磁盘可以基于三种平台,1)磁盘,2)磁盘分区,3)逻辑卷。
此例我就选磁盘分区的示例一下:
在Vbox里增加一块4G虚盘,(注意,Vbox不支持热插虚盘,加盘需要将linux关闭)然后启动linux,看是否已经认出了/dev/sdb这个盘。
使用fdisk/dev/sdb命令将/dev/sdb做四个同等大小的分个,分别是sdb1,sdb2,sdb3,sdb4.(linux基础知识,这里不多述)
你也可以接下来做格式化,(如:mkfs.ext3/dev/sdb*)将四个分区分别格式化成ext3文件系统,但是我们做的是基于分区的,格式化就不必做了。
Command(mforhelp):p
Disk/dev/sdb:4294MB,4294967296bytes
255heads,63sectors/track,522cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBootStartEndBlocksIdSystem
/dev/sdb1112398796683Linux
/dev/sdb2124246987997+83Linux
/dev/sdb3247369987997+83Linux
/dev/sdb4370492987997+83Linux
Command(mforhelp):w
Thepartitiontablehasbeenaltered!
[root@timraninit.d]#/etc/init.d/oracleasmconfigure
ConfiguringtheOracleASMlibrarydriver.
Thiswillconfiguretheon-bootpropertiesoftheOracleASMlibrary
driver.Thefollowingquestionswilldeterminewhetherthedriveris
loadedonbootandwhatpermissionsitwillhave.Thecurrentvalues
willbeshowninbrackets('[]').Hitting
answerwillkeepthatcurrentvalue.Ctrl-Cwillabort.
Defaultusertoownthedriverinterface[]:oracle
Defaultgrouptoownthedriverinterface[]:dba
StartOracleASMlibrarydriveronboot(y/n)[n]:y
ScanforOracleASMdisksonboot(y/n)[y]:y
WritingOracleASMlibrarydriverconfiguration:done
InitializingtheOracleASMLibdriver:[OK]
[root@timraninit.d]#reboot
如果你前面加的ASMlib包正确的话,你将有上面的显示,否则有初始化ASMlibdriver失败的提示。
[root@timrandev]#ls/dev/oracleasm/disks//现在还没有创建ASM磁盘,所以没有显示。
创建ASM磁盘,执行下面四行命令:
[root@timrandisks]#/etc/init.d/oracleasmcreatediskVOL1/dev/sdb1
Markingdisk"VOL1"asanASMdisk:[OK]
[root@timrandisks]#/etc/init.d/oracleasmcreatediskVOL2/dev/sdb2
Markingdisk"VOL2"asanASMdisk:[OK]
[root@timrandisks]#/etc/init.d/oracleasmcreatediskVOL3/dev/sdb3
Markingdisk"VOL3"asanASMdisk:[OK]
[root@timrandisks]#/etc/init.d/oracleasmcreatediskVOL4/dev/sdb4
Markingdisk"VOL4"asanASMdisk:[OK]
[root@timrandisks]#
[root@timrandev]#ls/dev/oracleasm/disks
VOL1VOL2VOL3VOL4
此时ASM磁盘已经建好,接下来可以建ASM磁盘组了。
6).创建ASM磁盘组
建磁盘组有两个办法,一个是使用DBCA工具,另一个是使用sqlplus命令
使用sqlplus命令:
注意:加磁盘组必须在+ASM启动以后
#su-oracle
$exportORACLE_SID=+ASM
$sqlplus/assysdba
[oracle@timran~]$sqlplusassysdba
加磁盘组前要改一下这个参数
SQL>altersystemsetasm_diskstring='/dev/oracleasm/disks/VOL*';
creatediskgroupDG1normalredundancy
failgroupFG1disk'/dev/oracleasm/disks/VOL1'nameVOL1,'/dev/oracleasm/disks/VOL2'nameVOL2
failgroupFG2disk'/dev/oracleasm/disks/VOL3'nameVOL3,'/dev/oracleasm/disks/VOL4'nameVOL4;
SQL>colnamefora10;
SQL>selectNAME,STATE,FREE_MB,REQUIRED_MIRROR_FREE_MBUSABLE_FILE_MBfromv$asm_diskgroup;
NAMESTATEFREE_MBUSABLE_FILE_MB
---------------------------------------------
DG1MOUNTED3750964
SQL>colfailgroupfora10;
SQL>selectGROUP_NUMBER,DISK_NUMBER,NAME,FAILGROUP,STATE,TOTAL_MBfromv$asm_disk;
GROUP_NUMBERDISK_NUMBERNAMEFAILGROUPSTATETOTAL_MB
13VOL4FG2NORMAL964
12VOL3FG2NORMAL964
11VOL2FG1NORMAL964
10VOL1FG1NORMAL964
重新启动前将参数文件的第一行#去掉
[root@timrandbs]#vi/u01/oracle/dbs/init+ASM.ora
*.asm_diskgroups='DG1'
到此,建立ASM的基本内容已经完成了。重启系统,检查一下看看磁盘组是否能够自动mounted了。
SQL>exit
[oracle@timran~]$exportORACLE_SID=timran11g
[root@timran~]#su-oracle
SQL*Plus:Release11.1.0.6.0-ProductiononThuNov1521:11:292012
ORA-32004:obsoleteand/ordeprecatedparameter(s)specified
ASMdiskgroupsmounted
7)测试ASM是否可以工作
启动了+ASM实例正常后,再启动RDBMS实例,然后建立一个+ASM上的表空间testasm做测试。
DisconnectedfromOracleDatabase11gEnterpriseEditionRelease11.1.0.6.0-Production
WiththePartitioning,OLAP,DataMiningandRealApplicationTestingoptions
SQL*Plus:Release11.1.0.6.0-ProductiononThuNov1521:26:002012
TotalSystemGlobalArea422670336bytes
FixedSize1300352bytes
VariableSize339740800bytes
DatabaseBuffers75497472bytes
RedoBuffers6131712bytes
Databaseopened.
SQL>createtablespacetestasmdatafile'+DG1';
7TESTASMYESNOYES
7rowsselected.
SQL>selectfile#,namefromv$datafile;
1/u01/oradata/timran11g/system01.dbf
2/u01/oradata/timran11g/sysaux01.dbf
3/u01/oradata/timran11g/undotbs01.dbf
4/u01/oradata/timran11g/users01.dbf
5/u01/oradata/timran11g/example01.dbf
6+DG1/timran11g/datafile/testasm.256.803235039
SQL>connscott/scott
SQL>createtabletest(idint)tablespacetestasm;
SQL>insertintotestvalues(1);
SQL>commit;
SQL>select*fromtest;
ID
1
8)删除ASM
SQL>droptablespacetestasmincludingcontentsanddatafiles;
[oracle@timran~]$sqlplus/assysdb
SQL>dropdiskgroupdg1includingcontents;//删除ASM组和ASM磁盘要在实例启动时做。
#/etc/init.d/oracleasmlistdisks
VOL1
VOL2
VOL3
VOL4
#/etc/init.d/oracleasmdeletediskvol1
#/etc/init.d/oracleasmdeletediskvol2
#/etc/init.d/oracleasmdeletediskvol3
#/etc/init.d/oracleasmdeletediskvol4
SQL>shutdownabort//关闭ASM实例
#/u01/oracle/bin/localconfigdelete//删除css信息
#rm/u01/oracle/dbs/*ASM*//删除ASM参数文件及口令文件
[root@timraninit.d]#rpm-qa|grepasm//查询asm有关的rpm包,
oracleasm-2.6.18-53.el5-2.0.4-1.el5
[root@timraninit.d]#rpm-eoracleasmlib-2.0.4-1.el5//删除这三个rpm包
[root@timraninit.d]#rpm-eoracleasm-2.6.18-53.el5-2.0.4-1.el5
[root@timraninit.d]#rpm-eoracleasm-support-2.1.7-1.el5
[root@timraninit.d]#
[root@timraninit.d]#ll/etc/init.d/oracleasm//确信oracleasm文件删掉了
ls:/etc/init.d/oracleasm:Nosuchfileordirectory
[root@timraninit.d]#shutdown-hnow关闭系统,去window下直接删除小魔方(后加入的虚盘)。
重启系统看看sdb已经没有了。
[root@timrandev]#ll/dev/sd*
brw-r-----1rootdisk8,0Dec2817:35sda
brw-r-----1rootdisk8,1Dec2817:35sda1
brw-r-----1rootdisk8,2Dec2817:35sda2
[root@timrandev]#
9)安装测试完成后碰到了一个问题:当启动ASM实例后再启动RDBMS实例时报错:
ORA-00845:MEMORY_TARGETnotsupportedonthissystem
这个问题是由于设置SGA的大小超过了操作系统/dev/shm的大小:
查看并更改/etc/fstab文件后,问题解决。
[root@timran~]#df-h/dev/shm
FilesystemSizeUsedAvailUse%Mountedon
tmpfs506M158M348M32%/dev/shm
[root@timran~]#vi/etc/fstab
LABEL=//ext3defaults11
tmpfs/dev/shmtmpfsdefaults,size=800m00
devpts/dev/ptsdevptsgid=5,mode=62000
sysfs/syssysfsdefaults00
proc/procprocdefaults00
LABEL=SWAP-sda2swapswapdefaults00
*再强调一下以下考点:
1)ASM只能存储数据库文件,不能存储二进制文件。即只能用于数据库和恢复文件,因此Oracle的主目录以及跟踪、告警、口令及静态参数文件务必保存在常规文件系统上。
2)ASM使用RAC,但不是必须的,因为可以使用第三方的集群卷管理器,ASM不仅仅使用RAC,因为它同样适用于单实例的非集群数据库。
3)ASM镜像默认是单镜像,但是可以设置为无镜像或双镜像,不能禁用条带化。
4)常规的磁盘活动不涉及ASM实例,ASM的功能是实现对文件可用性管理和控制,它不执行实际的I/O操作。
expdp/impdp:数据泵
传统的导出导入程序指的是exp/imp,用于实施数据库的逻辑备份和恢复。
导出程序exp将数据库中的对象定义和数据备份到一个操作系统二进制文件中。
导入程序imp读取二进制导出文件并将对象和数据载入数据库中
传统的导出导入程序是客户端工具。在$ORACLE_HOME/bin下
导出和导入实用程序的特点有:
2)允许导出指定的表,并重新导入到新的数据库中
3)可以把数据库迁移到另外一台异构服务器上
4)在两个不同版本的Oracle数据库之间传输数据
5)在联机状态下进行备份和恢复
6)可以重新组织表的存储结构,减少链接及磁盘碎片
使用以下三种方法调用导出和导入实用程序:
1,交互提示符:以交互的方式提示用户逐个输入参数的值。
2,命令行参数:在命令行指定执行程序的参数和参数值。
3,参数文件:允许用户将运行参数和参数值存储在参数文件中,以便重复使用参数
导出和导入数据库对象的四种模式是:
1,数据库模式:导出和导入整个数据库中的所有对象
2,表空间模式:导出和导入一个或多个指定的表空间中的所有对象
3,用户模式:导出和导入一个用户模式中的所有对象
4,表模式:导出和导入一个或多个指定的表或表分区
1)scott导入导出自己的表,一般是从服务器导出到客户端(在cmd下操作)
SQL>createtableemp1asselect*fromemp;
SQL>createtabledept1asselect*fromdept;
C:\DocumentsandSettings\timran>expscott/scott@timran11gfile=d:empdept1.dmptables=(emp1,dept1)
连接到:OracleDatabase10gEnterpriseEditionRelease11.1.0.6.0-Production
WiththePartitioning,OLAPandDataMiningoptions
已导出ZHS16GBK字符集和UTF8NCHAR字符集
即将导出指定的表通过常规路径...
..正在导出表EMP1导出了14行
..正在导出表DEPT1导出了4行
成功终止导出,没有出现警告。
sysdba下导入导出其他用户的表
再导入server里
SQL>droptableemp1purge;
SQL>droptabledept1purge;
C:\DocumentsandSettings\timran>impscott/scott@timran11gfile=d:empdept1.dmp
经由常规路径由EXPORT:V10.02.01创建的导出文件
已经完成ZHS16GBK字符集和UTF8NCHAR字符集中的导入
.正在将SCOTT的对象导入到SCOTT
..正在导入表"EMP1"导入了14行
..正在导入表"DEPT1"导入了4行
成功终止导入,没有出现警告。
使用sys导出scott的两个表
C:\DocumentsandSettings\timran>exp'sys/system@timran11gassysdba'file=d:scott.dmptables=(scott.emp1,scott.dept1)
当前的用户已更改为SCOTT
使用sys再导入scott的这两个表
C:\DocumentsandSettings\timran>imp'sys/system@timran11gassysdba'file=d:scott.dmpfromuser=scott
Import:Release11.1.0.6.0-Productionon星期一7月3021:59:582012
.正在将SYS的对象导入到SYS
sys导出scott表,scott导入(报错)
C:\DocumentsandSettings\timran>exp'sys/system@timran11gassysdba'file=d:sysscott.dmptables=(scott.emp1,scott.dept1)
Export:Release11.1.0.6.0-Productionon星期五8月314:34:522012
scott导入
C:\DocumentsandSettings\timran>impscott/scott@timran11gfile=d:sysscott.dmp
IMP-00013:只有DBA才能导入由其他DBA导出的文件
IMP-00000:未成功终止导入
C:\DocumentsandSettings\timran>
当前用户scott导出自己的所有对象,注意仅仅导出的是schema的object,也就是说这个导出不包括数据字典中的信息,比如用户账户,及原有的一些系统权限等等。
C:\DocumentsandSettings\timran>expscott/scott@timran11gfile=d:scott.dmpowner=scott
SQL>dropuserscottcascade;
SQL>createuserscottidentifiedbyscott;
SQL>grantconnect,resourcetoscott;
C:\DocumentsandSettings\timran>impscott/scott@timran11gfile=d:scott.dmp
..正在导入表"BONUS"导入了0行
..正在导入表"DEPT"导入了4行
..正在导入表"EMP"导入了14行
..正在导入表"SALGRADE"导入了5行
即将启用约束条件...
//如果用sys来完成也可以使用如下命令:
C:\DocumentsandSettings\timran>imp'sys/system@timran11gassysdba'file=d:scott.dmpfromuser=scotttouser=scott
//sys用户也可以将导出的scott的内容导入给其他用户
C:\DocumentsandSettings\timran>imp'sys/system@timran11gassysdba'file=d:scott.dmpfromuser=scotttouser=tim
17.1.3导入导出表空间
Oracle10g后,引入了导入导出可传输表空间技术,使表空间的迁移更加快速高效
模拟场景:xp/orcl到linux/timran11g(中文字符集)可传输表空间的导入导出:
1)在xp/orcl上建立表空间
sys:
createtablespacetb1datafile'd:/mytb1.dbf'size5m;
createtable测试(姓名char(10),年龄int)tablespacetb1;
insertinto测试values('张三',20);
insertinto测试values('王小二',18);
2)导出tb1表空间,先设为只读;
altertablespacetb1readonly;
xp:cmd下
exp'sys/system@orclassysdba'tablespaces=tb1transport_tablespace=yfile=d:\exp_tb1.dmp
Export:Release11.1.0.6.0-Productionon星期五8月316:11:252012
已导出ZHS16GBK字符集和AL16UTF16NCHAR字符集
注:将不导出表数据(行)
即将导出可传输的表空间元数据...
对于表空间TB1...
.正在导出簇定义
.正在导出表定义
..正在导出表测试
.正在导出引用完整性约束条件
.正在导出触发器
.结束导出可传输的表空间元数据
3)以xmanager把exp_tb1.dmp和MYTB1.DBF都传输到linux/timran里
目录如下:/u01/oradata/timran11g
4)在linux的$下执行导入
[oracle@timran~]$impuserid=\'sys/systemassysdba\'tablespaces=tb1file=/u01/oradata/timran11g/exp_tb1.dmptransport_tablespace=ydatafiles=/u01/oradata/timran11g/MYTB1.DBF
Import:Release11.1.0.6.0-Productionon星期五8月222:19:502012
Connectedto:OracleDatabase10gEnterpriseEditionRelease11.1.0.6.0-Production
ExportfilecreatedbyEXPORT:V10.02.01viaconventionalpath
Abouttoimporttransportabletablespace(s)metadata...
importdoneinZHS16GBKcharactersetandUTF8NCHARcharacterset
exportserverusesAL16UTF16NCHARcharacterset(possiblencharsetconversion)
.importingSYS'sobjectsintoSYS
.importingSCOTT'sobjectsintoSCOTT
..importingtable"测试"
Importterminatedsuccessfullywithoutwarnings.
5)进入linux/timran下验证
selecttablespace_name,statusfromdba_tablespaces;
6)重设回读写方式
altertablespacetb1readwrite;
TABLESPACE_NAMESTATUS
UNDOTBS1ONLINE
SYSAUXONLINE
TEMPONLINE
USERSONLINE
EXAMPLEONLINE
TB1ONLINE
TEXTONLINE
TEST1ONLINE
TIMRANONLINE
6)验证
select*fromtab;
select*from测试;
selecttable_name,tablespace_namefromuser_tables;
17.1.4导出整个数据库的对象
C:\DocumentsandSettings\timran>exp'sys/system@timran11gassysdba'file=d:full.dmpfull=y//这个过程太长,就不做了。
17.2数据泵的导入导出--expdp/impdp(10g/11g新特性)
exp/imp的缺点是速度太慢,在大型生产库中尤其明显。从10g开始,Oracle设计了数据泵,这是一个服务器端的工具,它为Oracle提供了高速并行的大数据迁移方法。
expdp/impdp的工作方式体现在需要在server端创建一个Directory即操作MT表。
举例
1)server端先建好一个存放MT表的物理目录
[oracle@timran~]$mkdir-p/u01/oradata/timran11g/dir1
2)server端用SYS建立目录对象:
SQL>createdirectoryMY_DIRas'/u01/oradata/timran11g/dir1';
3)为scott授予目录权限
SQL>grantread,writeondirectoryMY_DIRtoscott;
4)导出scott的empdept表,导出过程中在server端有MT表出现SYS_EXPORT_TABLE_01,导出完成后MT表自动消失
C:\DocumentsandSettings\timran>expdpscott/scott@timran11gdirectory=MY_DIRdumpfile=expdp_scott1.dmptables=(emp,dept)
Export:Release11.1.0.6.0-Productionon星期二,317月,20129:54:45
Starting"SCOTT"."SYS_EXPORT_TABLE_01":scott/********@timrandirectory=MY_DIRdumpfile=expdp_scott1.dmptables=(emp,de
pt)
EstimateinprogressusingBLOCKSmethod...
ProcessingobjecttypeTABLE_EXPORT/TABLE/TABLE_DATA
TotalestimationusingBLOCKSmethod:128KB
ProcessingobjecttypeTABLE_EXPORT/TABLE/TABLE
ProcessingobjecttypeTABLE_EXPORT/TABLE/INDEX/INDEX
ProcessingobjecttypeTABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
ProcessingobjecttypeTABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
ProcessingobjecttypeTABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
ProcessingobjecttypeTABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
..exported"SCOTT"."DEPT"5.648KB4rows
..exported"SCOTT"."EMP"7.812KB14rows
Mastertable"SCOTT"."SYS_EXPORT_TABLE_01"successfullyloaded/unloaded
******************************************************************************
DumpfilesetforSCOTT.SYS_EXPORT_TABLE_01is:
/u01/oradata/timran11g/dir1/expdp_scott1.dmp
Job"SCOTT"."SYS_EXPORT_TABLE_01"successfullycompletedat09:51:14
看看目录下的导出的文件
[oracle@timrandir1]$ll/
总计132
-rw-r-----1oracleoinstall12697607-3009:51expdp_scott1.dmp
-rw-r--r--1oracleoinstall138707-3009:51export.log
[oracle@timrandir1]$
5)导入expdp_scott1.dmp实验先删掉原来的emp,dept两个表
SQL>droptableemppurge;
SQL>droptabledeptpurge;
C:\DocumentsandSettings\timran>impdpscott/scott@timran11gdirectory=MY_DIRdumpfile=expdp_scott1.dmp
Import:Release11.1.0.6.0-Productionon星期二,317月,201210:16:04
Mastertable"SCOTT"."SYS_IMPORT_FULL_01"successfullyloaded/unloaded
Starting"SCOTT"."SYS_IMPORT_FULL_01":scott/********@timrandirectory=MY_DIRdumpfile=expdp_scott1.dmp
..imported"SCOTT"."DEPT"5.648KB4rows
..imported"SCOTT"."EMP"7.812KB14rows
Job"SCOTT"."SYS_IMPORT_FULL_01"successfullycompletedat10:04:37
6)导出scott的empdetp的数据,但不导出结构
expdpscott/scott@timran11gdirectory=MY_DIRdumpfile=expdp_scott1.dmptables=(emp,dept)content=data_onlyreuse_dumpfiles=y
impdpscott/scott@timran11gdirectory=MY_DIRdumpfile=expdp_scott1.dmp
7)导出scott用户
expdpscott/scott@timran11gdirectory=MY_DIRdumpfile=expdp1.dmpschemas=scott//注意与exp的区别,schemas代替了owner的写法
impdpscott/scott@timran11gdirectory=MY_DIRdumpfile=expdp1.dmp
18.1、物化视图作用
1)数据仓库中的物化视图主要用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,从而快速的得到结果。
2)物化视图和表一样可以直接进行查询。物化视图还用于复制、移动计算等方面。
18.2物化视图创建时的权限
如果创建基于主键的物化视图,则必须具有访问主表、访问主表的日志、createMATERIALIZEDVIEW这三个权限。
如果创建基于rowid的物化视图,则必须具有访问主表、createMATERIALIZEDVIEW这两个权限。
18.3创建物化视图语法
creatematerializedview[view_name]
refresh[fast|complete|force]
[
on[commit|demand]|
startwith(start_time)next(next_time)
]
as
{创建物化视图用的查询语句}
18.4物化视图创建时的选项
1)查询重写(QueryRewrite):查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果。默认为DISABLEQUERYREWRITE。
2)物化视图日志:如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARYKEY类型的。
3)刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ONDEMAND和ONCOMMIT。ONDEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。ONCOMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCEONDEMAND。
18.5示例
测试环境:生产库(linux)+备份库(xp)
1)建立link连接
备份库:
C:\DocumentsandSettings\timran>sqlplussys/system@orclassysdba
SQL>createpublicdatabaselinkmy_linkconnecttoscottidentifiedbyscottusing'timran11g';
//如果以前建立过,提示重名的话可以使用下面语句删掉SQL>droppublicdatabaselinkmy_link;
若想查看所有的数据库链接,进入系统管理员SQL>操作符下,运行命令:
SQL>selectowner,object_namefromdba_objectswhereobject_type='DATABASELINK';
OWNEROBJECT_NAME
-------------------------------------------------------------------------
PUBLICMY_LINK.REGRESS.RDBMS.DEV.US.ORACLE.COM
2)在备份库上测试与生产库(启动监听)的访问连接是否成功。
SQL>select*fromtab;//看备份库(自己)
TNAMETABTYPECLUSTERID
-----------------------------------------------
BONUSTABLE
DEPTTABLE
EMPTABLE
SALGRADETABLE
测试TABLE
SQL>select*fromtab@my_link;//看生产库(别人)
范例1基于主键的物化视图
生产库:(远端linux)
SQL>createtabletest(idintprimarykey,namechar(10));
SQL>creatematerializedviewlogontest;
SQL>select*fromtab;
MLOG$_TESTTABLE
RUPD$_TESTTABLE
TESTTABLE
备份数据库(本地xp)
SQL>grantcreatematerializedviewtoscott;
SQL>creatematerializedviewtest_viewrefresh
fast
startwithsysdate
nextsysdate+1/2880
withprimarykey
asselect*fromscott.test@my_link;
//1440分钟时24小时,1/1440是1分钟,1/2880是30秒。
TEST_VIEWTABLE
生产库scott:
SQL>insertintotestvalues(1,'sina');
备份库scott:
SQL>select*fromtest_view;
---30秒以后...
IDNAME
--------------------
1sina
SQL>insertintotestvalues(2,'sohu');
2sohu
范例2基于rowid的物化视图
SQL>droptabletestpurge;
SQL>SQL>createtableemp1asselect*fromemp;
SQL>dropmaterializedviewtest_view;
SQL>creatematerializedviewemp1_viewrefreshwithrowid
asselectdeptno,sum(sal),avg(sal)fromscott.emp1@my_linkgroupbydeptno;
SQL>select*fromemp1_view;
DEPTNOSUM(SAL)AVG(SAL)
------------------------------
3094001566.66667
20108752175
1087502916.66667
SQL>updateemp1setsal=sal+100;
30100001666.66667
20113752275
1090503016.66667
范例3使用job,执行基于primarykey的物化视图
SQL>dropmaterializedviewtest_view
SQL>creatematerializedviewtest_view
createorreplaceproceduretestviewas
dbms_mview.refresh('TEST_VIEW');
variablejob1number;
dbms_job.submit(:job1,'testview;',sysdate,'sysdate+1/2880');