OCP 052 课堂笔记
目录
第一部分: Oracle体系架构... 4
第一章:实例与数据库... 4
1、Oracle 网络架构及应用环境... 4
2、Oracle 体系结构... 4
3、 SGA. 5
4 Oracle的进程: 9
5 PGA. 12
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.1 redo (重做) log 的功能:数据recovery. 27
4.2 redo log 特征:... 27
4.3 redo 日志组... 27
4.4 如何添加日志组... 27
4.5 如何添加日志组的成员... 29
4.6 如何查看日志信息... 30
4.7 redo 日志成员重命名或迁移... 31
第五章: 归档日志 archivelog. 40
5.1 归档和非归档的区别... 40
5.2 查看归档模式:... 41
5.3 设置归档模式... 41
5.4、归档日志的路径及命名方法... 41
5.5 在liunx下查看归档进程... 43
5.6 日志归档:... 44
第六章 日志挖掘 log miner. 45
6.1 log miner的作用:... 45
6.2 有两种日志挖掘方法 针对DML和DDL,整理如下 :... 45
第七章: 管理undo. 49
7.1 undo作用... 49
7.2 undo 的管理模式:... 49
7.3 undo 表空间管理... 49
7.4 查看当前正在使用的undo tablespace. 50
7.5 切换undo. 51
7.6 删除undo tablespace. 52
7.7 undo block的4种状态... 52
7.8 关于undo_retention 参数... 53
7.9 undo 信息的查询... 54
7.10 system表空间的undo. 55
7.11 测试:模拟数据库open下的undo损坏和修复。... 55
第八章 检查点(checkpoint) 59
8.1 什么是checkpoint. 59
8.2 checkpoint主要2个作用:... 60
8.3 checkpoint分类... 60
8.4 设置合理的MTTR参数... 63
8.5 局部检查点的触发条件:... 64
第九章 实例恢复机制... 64
第二部分 Oracle的存储架构... 65
第十章 数据字典... 65
10.1 数据字典... 65
10.2 动态性能表(V$)... 66
第十一章: Oracle的存储架构... 67
11.1 TABLESPACE(表空间)特点... 67
11.2 SEGMENT(段)... 73
11.3 EXTENT(区)... 75
11.4 BLOCK(数据块)... 79
11.5 临时表空间... 84
11.6 如何调整表空间的尺寸(表空间的大小等同它下的数据文件大小之和)... 88
11.7 Oracle的Resumable功能... 90
第十二章: Oracle中表的几种类型... 90
12.1 分区表及其种类(10g) 90
12.2 索引组织表... 95
12.3 簇表(cluster table):... 96
12.4 临时表:... 97
12.5 只读表 (11g新特性)... 97
第十三章: 数据库审计audit. 98
13.4 审计的对象:... 99
13.5 举例:... 99
第十四章: 数据装载 sql loader. 101
第十五章: oracle 网络... 105
15.1 Oracle Net 基本要素:... 105
15.2 客户端链接:... 106
15.3 lisenter 注册:... 106
第三部分: 管理ORACLE数据库... 111
第十六章:Oracle ASM 管理(ppt-II:602-636) 111
16.1 什么是ASM.. 111
16.2 系统级的磁盘管理... 111
16.3 ASM和LSM的比较... 111
16.4 ASM体系结构... 112
16.5 在Linux上创建ASM实例的范例... 114
第十七章:逻辑备份与恢复... 124
17.1 传统的导入导出exp/imp:... 125
第十八章 物化视图... 133
看ppt,Oracle结构的基本单元、术语
1)oracle server :database + instance
2)database:data file 、control file 、 redolog file
3)instance: an instance access a database
//一个实例访问一个数据库
4)oracle memory: sga + pga
5)instance : sga + backgroud process
//sga+后台进程
6)sga组成:sga 在一个instance只有一个sga,sga为所有session共享,随着instance启动而分配,instance down ,sga被释放。
//system groble areas
1) shared pool
共享池是对SQL、PL/SQL程序进行语法分析、编译、执行的内存区域。
共享池由库缓存(library cache),和数据字典缓存(data dictionary cache)组成。
共享池的大小直接影响数据库的性能。
关于shared pool中的几个重要概念
library cache: sql和plsql的解析场所,存放着所有编译过的sql语句代码,以备所有用户共享。
sql语句解析过程:
硬解析:
1)分析:包括SQL语句的语法和语义检验,并检查所执行活动的对象权限。
2)优化:Oracle优化程序在评估了几种备选方案后,得出如何以最低成本(COST )处理相应语句的最终方案。
软解析:
3)执行:Oracle执行这个执行计划。(这个成本最低的执行计划也包括访问路径,也存在库缓存中)
4)取数据:只用于select语句,这个步骤在非查询语句中不需要。
data dictionary cache: 存放重要的数据字典信息,以备数据库使用
2) database buffer cache
用于存储从磁盘数据文件中读入的数据,所有用户共享。
服务器进程(server process)将读入的数据保存在数据缓冲区中,当后续的请求需要这些数据时可以在内存中找到,则不需要再从磁盘读取。
数据缓冲区中被修改的数据块(脏块)由后台进程DBWR将其写入磁盘。
数据缓冲区的大小对数据库的读取速度有直接的影响。
考点:服务器进程对数据文件执行读操作,而DBWN负责对数据文件执行写操作。
db buffer中的几个cache参数:
db_cache_size //指定标准块大小内存空间,比如标准块是8k,LRU 默认数据块放到default cache
db_nk_cache_size //指定非标准块大小内存空间,比如2k、4k、16k、32k。
db_keep_cache_size //keep 存放经常访问的小表或索引等
db_recycle_cache_size //与keep相反,存放偶尔做全表扫描的大表的数据
注意:
2.1)keep cache和recycle cache是可选的。全部buffer cache的大小就是以上参数的总合。即没有分配到keep cache和recycle cache的任何数据库对象都将分配给default cache。说的更清楚些就是default, keep, recycle 相互独立,对于某一个对象(表)来说,它只能属于它们之中的一种。
SQL> alter table scott.emp1 storage(buffer_pool keep);
SQL> select segment_name,buffer_pool from dba_segments where segment_name='EMP1';
SEGMENT_NAME BUFFER_
--------------------------------------------------------------------------------- -------
EMP1 KEEP
2.2)default_cache_szie和标准块default block是配套的,如果default block是8k, db_cache_size这个参数将代替db_8k_cache_size。
如果要建立非标准块的表空间,先前要设定db buffer中的与之对应的nk_cache_size。
09:50:46 SQL> alter system set db_16k_cache_size=8m; //改参数,先把db buffer里的16k cache建上。
09:50:49 SQL> create tablespace tbs_16k datafile '/u01/oradata/timran11g/tbs16k01.dbf' size 10m blocksize 16k;
09:51:29 SQL> select TABLESPACE_NAME,block_size from dba_tablespaces;
TABLESPACE_NAME BLOCK_SIZE
------------------------------ ----------
SYSTEM 8192
UNDOTBS1 8192
SYSAUX 8192
TEMP 8192
USERS 8192
EXAMPLE 8192
TBS_16K 16384
2.3)查看buffer cache命中率:
18:28:20 SQL>select (1-(sum(decode(name, 'physical reads',value,0))/(sum(decode(name, 'db block gets',value,0))+sum(decode(name,'consistent gets',value,0))))) * 100 "Hit Ratio" from v$sysstat;
Hit Ratio
----------
97.6811923
3)redo log buffer
日志条目(redo entries )记录了数据库的所有修改信息(包括DML和DDL),用于数据库恢复,日志条目首先产生于日志缓冲区。
日志缓冲区较小,它是以字节为单位的,它极其重要。
18:29:04 SQL> show parameter log_buffer
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_buffer integer 7057408
*考点:日志缓冲区的大小是不变的,启动时就是固定值,只能手动设置,不能由SGA自动管理!
如果想让它是一个最小值,这样可以做:
18:30:24 SQL> alter system set log_buffer =1 scope=spfile; //修改动态参数文件,下次启动有效。
18:31:20 SQL> startup force
18:31:35 SQL> show parameter log_buffer;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_buffer integer 2927616 //这就是最小值了
4) large pool(可选)
为了进行大的后台进程操作而分配的内存空间,与shared pool管理不同,主要用于并行查询,RMAN备份恢复、以及共享连接方式等。
5) java pool(可选)
为了java虚拟机及应用而分配的内存空间,包含大量JAVA代码。
6) stream pool(可选)
为了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:30 SQL> select name ,bytes/1024/1024 "Size(M)" from v$sgainfo; //在oracle里查看SGA分配情况
NAME Size(M)
-------------------------------- ----------
Fixed SGA Size 1.2401123
Redo Buffers 1.84765625
Buffer Cache Size 56
Shared Pool Size 152
Large Pool Size 4
Java Pool Size 12
Streams Pool Size 4
Shared IO Pool Size 0
Granule Size 4
Maximum SGA Size 403.089844
Startup overhead in Shared Pool 40
Free SGA Memory Available 172
三种process: 1)user process、 2)server process 、3)background process
user process:属于客户端的process,一般分为三种形式,1)sql*plus, 2)应用程序,3)web方式(OEM)
客户端请求,sqlplus是客户端命令,oracle不容许user process直接访问oracle server。
*考点:由user process造成的会话终止,系统将自动回滚这个会话上的处于活动状态的事务。
如果windows作为客户端:可以通过查看任务管理器看到sqlplus用户进程:
C:\Documents and Settings\timran>sqlplus sys/system@timran11g as sysdba
linux作为客户端时可以使用ps看到sqlplus关键字:
[oracle@timran ~]$ ps -ef |grep sqlplus
oracle 2353 2325 0 17:02 pts/0 00:00:00 rlwrap sqlplus / as sysdba
oracle 2354 2353 0 17:03 pts/1 00:00:00 sqlplus as sysdba
oracle 2603 2445 0 17:25 pts/2 00:00:00 grep sqlplus
server process:这是服务器端的进程,user process不能直接访问Oracle,必须通过相应的server process访问实例,进而访问数据库。
[oracle@timran ~]$ ps -ef |grep LOCAL
oracle 2399 2354 1 17:03 ? 00:00:04 oracletimran11g (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 2503 1 0 17:05 ? 00:00:00 oracletimran11g (LOCAL=NO)
oracle 2512 2445 0 17:07 pts/2 00:00:00 grep LOCAL
[oracle@timran ~]$
//注意:在linux下看到的server process, (LOCAL=YES)是本地连接,(LOCAL=NO)是远程连接。
backgroud process :
非常重要!有许多后台进程,先掌握六个。查看方法 ps 、v$process 、v$bgprocess
----------查看后台进程
[oracle@timran ~]$ ps -ef |grep ora_
oracle 2617 1 0 01:26 ? 00:00:00 ora_pmon_timran
oracle 2619 1 0 01:26 ? 00:00:00 ora_psp0_timran
oracle 2621 1 0 01:26 ? 00:00:00 ora_mman_timran
oracle 2623 1 0 01:26 ? 00:00:00 ora_dbw0_timran
oracle 2625 1 0 01:26 ? 00:00:00 ora_lgwr_timran
oracle 2627 1 0 01:26 ? 00:00:00 ora_ckpt_timran
oracle 2629 1 0 01:26 ? 00:00:00 ora_smon_timran
oracle 2631 1 0 01:26 ? 00:00:00 ora_reco_timran
oracle 2633 1 0 01:26 ? 00:00:00 ora_cjq0_timran
oracle 2635 1 0 01:26 ? 00:00:01 ora_mmon_timran
oracle 2637 1 0 01:26 ? 00:00:00 ora_mmnl_timran
oracle 2639 1 0 01:26 ? 00:00:00 ora_d000_timran
oracle 2641 1 0 01:26 ? 00:00:00 ora_s000_timran
oracle 2645 1 0 01:26 ? 00:00:00 ora_p000_timran
oracle 2647 1 0 01:26 ? 00:00:00 ora_p001_timran
oracle 2649 1 0 01:26 ? 00:00:01 ora_arc0_timran
oracle 2651 1 0 01:26 ? 00:00:00 ora_arc1_timran
oracle 2653 1 0 01:26 ? 00:00:00 ora_arc2_timran
oracle 2655 1 0 01:26 ? 00:00:00 ora_qmnc_timran
oracle 2661 1 0 01:26 ? 00:00:00 ora_q000_timran
oracle 2663 1 0 01:26 ? 00:00:00 ora_q001_timran
oracle 2676 1 0 01:29 ? 00:00:00 ora_j000_timran
oracle 2678 2486 0 01:29 pts/2 00:00:00 grep ora_
六个后台进程(background process)
smon:系统监控进程
在实例崩溃之后,Oracle会自动恢复实例。另一个作用是整理数据文件的自由空间,将相邻区域结合起来。释放不再使用的临时段。
pmon:进程监控进程
process monitor(监控session)清理出现故障的进程。 释放所有当前挂起的锁定。释放故障进程使用的资源。
dbwr: 数据写入进程
1、将修改后的缓冲区(脏buffer)数据写入数据文件中。写脏块。
2、释放data buffer空间。
注意:以下几种情况发生时 dbwr都会写
1)ckpt发生,2)脏块太多时,3)db_buffer自由空间不够时,4)延迟发生,5)表空间redo only/offline/backup等
考点:commit时dbwn有何举动?答案是:它什么也不做!
lgwr:写日志条目,从redo log buffer到redo logfile (必须在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 这两个参数现在已经不用了。
对于客户端的每个user process,服务器端都会出现一个server process,会话与专用服务器之间存在一对一的映射。
对专用连接来说,用户在客户端启动了一个应用程序,例如sql*plus,就是在客户端启动一个用户进程;与oracle服务器端连接成功后,会在服务器端生成一个服务器进程,该服务器进程作为用户进程的代理进程,代替客户端执行各种命令并把结果返回给客户端。用户进程一旦中止,与之对应的服务器进程立刻中止。
专用连接的PGA的管理方式是私有的。现在,大多情况下,oracle缺省采用专用连接模式。
多个user process共享一个server process。它通过调度进程(dispatcher)与共享服务器连接,共享服务器实际上就是一种连接池机制(connectionpooling),连接池可以重用已有的超时连接,服务于其它活动会话。但容易产生锁等待。此种连接方式现在已经很少见了,但是在OCP11g考试中有几个考点与其有关:
用户进程1 用户进程2 用户进程3
. |-----------------------| . | .
. | . | .
....... 调度进程1............ 调度进程2
. | | .
. |--------------- -----------------| .
. | | .
. | | .
调度响应队列1 | | 调度响应队列2
. 公共请求队列 .
. | .
. | .
. 服务器进程 .
. | .
..................|...................
*考点:
1)所有调度进程共享一个公共的输入队列,但是每个调度进程都有与自己响应的队列。
2)在共享服务器中会话是在SGA中的(UGA)存储信息,而不像专用连接那样在PGA中存储信息,这时的PGA的存储结构为堆栈空间。
适用于必须维持数据库的永久连接。结合了专用服务器模式和共享服务器模式的特点,它提供了服务器连接池,但是放入连接池的是专用服务器。它使用连接代理(而不是专用服务器)连接客户机到数据库,优点是可以用很少的内存处理大量并发连接(11g新特性,特别针对Apache的PHP应用环境)。
1、instance 功能:用于管理和访问database。
2、init parameter files :管理实例相关启动参数 。位置:$ORACLE_HOME/dbs
3、pfile :静态参数文件。1)文本文件,可以通过编辑器进行修改参数。 2)修改参数必须关闭实例,下次重启实例才生效。
命名方式:init+SID.ora
4、spfile :动态参数文件。 1)二进制文件,不可以通过编辑器修改。 2)Linux 下strings可以查看
命名方式: spfile+SID.ora
修改动态参数文件方式:
alter system set 参数=值 默认是第三种
alter session set 参数=值
第一种scope=memory 参数修改立刻生效,但不修改spfile文件。
第二种scope=spfile 修改了spfile文件,重启后生效。
第三种scope=both 前两种都要满足。
如果不写scope,即缺省,那就是第三种。
*考点:如果不将scope=spfile,将无法更改静态参数。
通过查看v$parameter ,可以确定那些参数可以在memory修改,制定scope
10:38:35 SQL> desc v$parameter;
Name Null? Type
----------------------------------------- -------- ----------------------------
NUM NUMBER
NAME VARCHAR2(80)
TYPE NUMBER
VALUE VARCHAR2(512)
DISPLAY_VALUE VARCHAR2(512)
ISDEFAULT VARCHAR2(9)
ISSES_MODIFIABLE VARCHAR2(5)
ISSYS_MODIFIABLE VARCHAR2(9)
ISINSTANCE_MODIFIABLE VARCHAR2(5)
ISMODIFIED VARCHAR2(10)
ISADJUSTED VARCHAR2(5)
ISDEPRECATED VARCHAR2(5)
DESCRIPTION VARCHAR2(255)
UPDATE_COMMENT VARCHAR2(255)
HASH NUMBER
其中:
ISSYS_MODIFIABLE参数:对应alter system 命令,即系统级修改
10:38:35 SQL> select distinct issys_modifiable from v$parameter;
ISSYS_MODIFIABLE
----------------
IMMEDIATE //对应scope=memory
FALSE //只能scope=spfile,即修改spfile文件,下次启动才生效。
DEFERRED //其他session有效
ISSES_MODIFIABLE参数:对应alter session命令,即session级修改
10:38:35 SQL> select distinct isses_modifiable from v$parameter;
ISSES_MODIFIABLE
----------------
TRUE //表示可以修改
FALSE //表示不能修改
10:38:35 select isses_modifiable,issys_modifiable from v$parameter where lower(name)='log_buffer';
ISSES_MODIFIABLE ISSYS_MODIFIABLE
---------------- ----------------
FALSE FALSE
这个结果表示 log_buffer参数在session方式不能改,
在system方式memory不能改,both当然也不行,只能是spfile下次有效。
5、startup时读取参数文件,找到$ORACLE_HOME/dvs目录,顺序是优先spfile启动,没有spfile 才从pfile启动。
pfile和spfile可以相互生成:
SQL>create pfile from spfile
SQL>create spfile from pfile(使用spfile启动后不能在线生成spfile,ORA-32002: 无法创建已由实例使用的 SPFILE)
*考点:如果使用pfile启动,设置scope=spfile将失败!
可以通过当前内存参数生成pfile和spfile(11g新特性):
SQL>create pfile from memory;
SQL>create spfile from memory;
有了spfile,pfile一般留做备用,特殊情况也可以使用pfile启动,命令如下:
10:38:35 SQL> startup pfile=$ORACLE_HOME/dbs/inittimran.ora
10:38:35 SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/product/10.2.0
/db_1/dbs/spfileprod.ora
//如果value有值,说明数据库启动时读的是spfile
1)nomount阶段:读取init parameter
10:38:35 SQL> select status from v$instance; (这条命令很实用,是看当前数据库启动的状态,有三个 stated,mounted,open.)
STATUS
------------
STARTED
2)mount阶段: 读取控制文件
20:32:53 SQL> select status from v$instance;
STATUS
------------
MOUNTED
3)open阶段: 1、检查所有的datafile、redo log、 group 、password file。
2、检查数据库的一致性(controlfile、datafile、redo file的检查点是否一致)
10:38:35 SQL> select file#,checkpoint_change# from v$datafile; //从控制文件读出
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 570836
2 570836
3 570836
4 570836
5 570836
6 570836
6 rows selected.
10:38:35 SQL> select file#,checkpoint_change# from v$datafile_header; //从datafile header 读出来
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 570836
2 570836
3 570836
4 570836
5 570836
6 570836
6 rows selected.
数据库open之前要检查controlfile所记录SCN和datafile header 记录的SCN是否一致;一致就正常打开库,不一致需要做media recover
10:38:35 SQL> select status from v$instance;
STATUS
------------
OPEN
shutdown normal: 拒绝新的连接,等待当前事务结束,等待当前会话结束,生成检查点
shutdown transaction :拒绝新的连接,等待当前事务结束,生成检查点
shutdown immediate: 拒绝新的连接,未提交的事务回滚,生成检查点 //默认
shutdown abort(startup force) :事务不回滚,不生成检查点,下次启动需要做instance recovery
*考点:shutdown abort 不会损坏database。
10:38:35 SQL> show parameter dump //这是Oracle11g的。
SQL> show parameter dump
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_core_dump string partial
background_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/trace
core_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/cdump
max_dump_file_size string unlimited
shadow_core_dump string partial
user_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/trace
在oracle 11g中,故障诊断及跟踪的文件路径改变较大,alert文件的信息是以xml的文件格式存在的,另外提供了普通文本格式的alert文件。
这两份log文件的位置分别是V$DIAG_INFO中的Diag Alert 和Diag Trace 对应的目录。
SQL> select * from v$diag_info;
INST_ID NAME VALUE
---------- ---------------------------------------- -----------------------------------------------------------------
1 Diag Enabled TRUE
1 ADR Base /u01
1 ADR Home /u01/diag/rdbms/timran11g/timran11g
1 Diag Trace /u01/diag/rdbms/timran11g/timran11g/trace
1 Diag Alert /u01/diag/rdbms/timran11g/timran11g/alert
1 Diag Incident /u01/diag/rdbms/timran11g/timran11g/incident
1 Diag Cdump /u01/diag/rdbms/timran11g/timran11g/cdump
1 Health Monitor /u01/diag/rdbms/timran11g/timran11g/hm
1 Default Trace File /u01/diag/rdbms/timran11g/timran11g/trace/timran11g_ora_3381.trc
1 Active Problem Count 0
1 Active Incident Count 0
其中Diag Trace对应的目录为文本格式的告警日志,及我们在10g中经常习惯使用的日志
[oracle@timran trace]$ tail -f /u01/diag/rdbms/timran11g/timran11g/trace/alert_timran11g.log
space available in the underlying filesystem or ASM diskgroup.
Tue Sep 04 09:12:19 2012
Completed: ALTER DATABASE OPEN
Tue Sep 04 09:16:41 2012
Starting background process CJQ0
Tue Sep 04 09:16:41 2012
CJQ0 started with pid=29, OS id=2483
Tue Sep 04 10:19:11 2012
drop tablespace tb1
Completed: drop tablespace tb1
oracle登录认证方式有多种
sys的两种常用的登录认证方式:OS认证和口令文件认证,
1)OS认证:Oracle不验证用户密码,条件:用户必须属于DBA组,且使用本地登录
如:sqlplus / as sysdba
2)口令文件认证:是一种远程认证方式,只有sysdba权限的用户可以使用口令文件,必须输入密码和网路连接符。
如:sqlplus sys/oracle@timran11g as sysdba
普通用户,没有sysdba权限的用户,比如system 、scott,或者是tim什么的,登录时都必须输入口令,不管是本地还是远程,它们的口令密码不是以文件形式存放的,它们存放在oracle内部的数据字典里。
通过设置这个参数为TURE,可以让口令是大小写敏感的(11g新特性)
本节讨论的口令文件是sysdba用户的远程登录认证密码文件,主要用于sys用户远程登录的认证。
位置:$ORACLE_HOME/dbs/orapwSID.
SQL> show parameter case
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sec_case_sensitive_logon boolean TRUE
所以口令文件,指的就是sys的口令文件,可以通过remote_login_passwordfile参数控制是否生效
参数remote_login_passwordfile的三种模式:
1) none 拒绝sys用户从远程连接
2)exclusive sys用户可以从远程连接
3)share 多个库可以共享口令文件
[oracle@timran ~]$ cd /u01/oracle/dbs
[oracle@timran dbs]$ ll
总计 52
-rw-rw---- 1 oracle oinstall 1544 08-17 07:19 hc_timran11g.dat
-rw-r--r-- 1 oracle oinstall 12920 2001-05-03 initdw.ora
-rw-r--r-- 1 oracle oinstall 8385 1998-09-11 init.ora
-rw-r--r-- 1 oracle oinstall 1024 08-17 13:23 inittimran11g.ora
-rw-r----- 1 oracle oinstall 24 08-17 07:21 lkTIMRAN11
-rw-r----- 1 oracle oinstall 24 08-17 10:36 lkTIMRAN11G
-rw-r----- 1 oracle oinstall 1536 08-31 10:47 orapwtimran11g
-rw-r----- 1 oracle oinstall 3584 09-04 17:49 spfiletimran11g.ora
这里是放参数文件和(sys)口令文件的地方,orapwtimran11g就是我的sys口令文件
使用orapwd命令创建sys口令文件:
你可以先删掉它,再创建它,在linux下做:
[oracle@timran dbs]$ rm orapwtimran11g //把sys口令文件删了
[oracle@timran dbs]$ ll
总计 48
-rw-rw---- 1 oracle oinstall 1544 08-17 07:19 hc_timran11g.dat
-rw-r--r-- 1 oracle oinstall 12920 2001-05-03 initdw.ora
-rw-r--r-- 1 oracle oinstall 8385 1998-09-11 init.ora
-rw-r--r-- 1 oracle oinstall 1024 08-17 13:23 inittimran11g.ora
-rw-r----- 1 oracle oinstall 24 08-17 07:21 lkTIMRAN11
-rw-r----- 1 oracle oinstall 24 08-17 10:36 lkTIMRAN11G
-rw-r----- 1 oracle oinstall 3584 09-04 17:54 spfiletimran11g.ora
[oracle@timran dbs]$orapwd file=orapwtimran11g password=oracle entries=5 force=y //重新建立口令文件
注意:file=orapw+sid的写法
entries的含义是表示口令文件中可以存放的最大用户数,对应于允许以SYSDBA/SYSOPER权限登录数据库的最大用户数,如果用户数超过这个值只能重建口令文件。
有时候,scott用户被误删掉了,不要紧,可以通过执行下列脚本重新建立。
10:38:35 SQL> @$ORACLE_HOME/rdbms/admin/utlsampl.sql
大家可以试一下:先删除scott用户,再执行一下脚本即可。(不是所有案例都有恢复脚本,HR就没有)
1)定义数据库当前物理状态
2)维护数据的一致性
3)二进制文件
4)在mount阶段被读取
5)记录RMAN备份恢复信息
查看database控制文件位置:
19:02:27 SQL> show parameter control_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string /u01/oradata/timran11g/control01.
ctl, /u01/oradata/timran11g/contr
ol02.ctl, /u01/oradata/timran11g/
control03.ctl
19:02:42 SQL> select name from v$controlfile;
NAME
-----------------------------------------------------------------------------------------------------
/u01/oradata/timran11g/control01.ctl
/u01/oradata/timran11g/control02.ctl
/u01/oradata/timran11g/control03.ctl
19:02:59 SQL> alter database backup controlfile to trace; //生成了重做控制文件脚本,存放的位置:注意10g和11g有很大不同。
19:03:18 SQL> show parameter dump
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_core_dump string partial
background_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/trace
core_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/cdump
max_dump_file_size string unlimited
shadow_core_dump string partial
user_dump_dest string /u01/diag/rdbms/timran11g/timr
an11g/trace
可以看到11g的dump路径和命名方式较10g改动较大,
10g中的bdump与udump合并到了一起,目录都是 /u01/diag/rdbms/timran11g/timran11g/trace
trace的内容存放在该目录的最新的那个.trc里。
[oracle@timran trace]$ $ ls -trl *.trc //在linux下,-trl参数可以按时间排列出.trc名字
[oracle@timran trace]$ $ cat timran11g_ora_2407.trc //显示出在这个.trc文件里的一段内容
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "TIMRAN11" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oradata/timran11g/redo01.log' SIZE 50M,
GROUP 2 '/u01/oradata/timran11g/redo02.log' SIZE 50M,
GROUP 3 '/u01/oradata/timran11g/redo03.log' SIZE 50M
-- STANDBY LOGFILE
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'
CHARACTER SET ZHS16GBK
;
1)配置多个control_files,控制文件最好有三个,是相互镜像的(shutdown下cp命令复制即可),然后修改spfile中的control_files参数,Oracle建议分配在不同的物理磁盘上。
*考点:最多可以有8个control files多路复用。
19:10:25 SQL> alter system set control_files='/u01/oradata/timran11g/control01.ctl','/u01/disk1/control02.ctl','/u01/disk1/control03.ctl' scope=spfile;
System altered.
2)三个control文件要一致(同一版本,scn相同),本来就是镜像关系
-rw-r----- 1 oracle oinstall 7356416 07-16 20:00 control01.ctl
-rw-r----- 1 oracle oinstall 7356416 07-16 20:01 control02.ctl
-rw-r----- 1 oracle oinstall 7356416 07-16 20:01 control03.ctl
3)控制文件查看:v$controlfile 、show parameter controlfile、 v$parameter
1.trace: 用于控制文件重建 (生成的trace 文件在udump)
19:59:24 SQL> alter database backup controlfile to trace;
或者 SQL>alter database backup controlfile to trace as '/u01/oradata/timran11g/con.trace'; //存到自己起的文件名里。
Database altered.
2.binary 文件:控制文件的备份
20:00:20 SQL> alter database backup controlfile to '/u01/oradata/timran11g/con.bak';
Database altered.
1)单个文件,假设使用的是spfile指定的控制文件之一损坏了:
数据库关闭下,使用操作系统命令复制其副本到指定的位置。
2)所有的控制文件丢失,(正常关闭,shutdown immediate后删除控制文件)
假设控制文件的备份也没有,利用前面做的trace文件重新生成控制文件
在nomount 状态下执行前面曾做过的trace脚本
15:37:16 SQL> startup force nomount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218968 bytes
Variable Size 113247848 bytes
Database Buffers 163577856 bytes
Redo Buffers 7168000 bytes
15:37:49 SQL> CREATE CONTROLFILE REUSE DATABASE "TIMRAN" NORESETLOGS ARCHIVELOG
15:37:52 2 MAXLOGFILES 16
15:37:52 3 MAXLOGMEMBERS 3
15:37:52 4 MAXDATAFILES 100
15:37:52 5 MAXINSTANCES 8
15:37:52 6 MAXLOGHISTORY 292
15:37:52 7 LOGFILE
15:37:52 8 GROUP 1 '/u01/oradata/timran11g/redo01.log' SIZE 50M,
15:37:52 9 GROUP 2 '/u01/oradata/timran11g/redo02.log' SIZE 50M,
15:37:52 10 GROUP 3 '/u01/oradata/timran11g/redo03.log' SIZE 50M
15:37:52 11 -- STANDBY LOGFILE
15:37:52 12 DATAFILE
15:37:52 13 '/u01/oradata/timran11g/system01.dbf',
15:37:52 14 '/u01/oradata/timran11g/undotbs01.dbf',
15:37:52 15 '/u01/oradata/timran11g/sysaux01.dbf',
15:37:52 16 '/u01/oradata/timran11g/users01.dbf',
15:37:52 17 '/u01/oradata/timran11g/example01.dbf',
15:37:52 18 '/u01/oradata/timran11g/test01.dbf'
15:37:52 19 CHARACTER SET ZHS16GBK
15:37:52 20 ;
Control file created. //三个控制文件又重新建立了。
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 5629150
2 5629150
3 5629150
4 5629150
5 5629150
6 5629150
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 5629150
2 5629150
3 5629150
4 5629150
5 5629150
6 5629150
15:39:49 SQL> alter database open;
2)所有的控制文件丢失,利用控制文件备份恢复控制文件(非正常关闭,shutdown abort 后删除控制文件或直接操作系统下删除,有点复杂,留在053备份恢复中再介绍吧)
1)记录数据库的变化(DML、DDL)
2) 用于数据块的recover
3)以组的方式管理redo file ,最少两组redo ,循环使用
4)和数据文件存放到不同的磁盘上,需读写速度快的磁盘(比如采用RAID10)
日志切换:
1)归档模式:将历史日志进行保存
2)非归档: 历史日志被覆盖
3)并产生checkpoint,通知redo log 所对应的 dirty block 从data buffer写入到datafile,并且更新控制文件
1)最少两组(考点),最好每组有两个成员(考点),并存放到不同的磁盘上,大小形同,互相镜像
2)日志在组写满时发生切换,或手工切换: alter system switch logfile ;
3)在归档模式,日志进行归档,并把相关的信息写入controlfile
15:49:43 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 143 52428800 1 YES INACTIVE 2144594 17-7月 -12
2 1 144 52428800 1 NO CURRENT 2145200 17-7月 -12
3 1 142 52428800 1 YES INACTIVE 2113981 17-7月 -12
15:50:31 SQL> col member for a50;
15:50:47 SQL> select group#, member from v$logfile;
GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/oradata/timran11g/redo01.log
3 /u01/oradata/timran11g/redo03.log
2 /u01/oradata/timran11g/redo02.log
增加一个组group4,
15:53:53 SQL> alter database add logfile '/u01/oradata/timran11g/redo04.log' size 50m;
15:53:56 SQL> select group#, member from v$logfile order by group#;
GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/oradata/timran11g/redo01.log
2 /u01/oradata/timran11g/redo02.log
3 /u01/oradata/timran11g/redo03.log
4 /u01/oradata/timran11g/redo04.log
15:55:27 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 143 52428800 1 YES INACTIVE 2144594 17-7月 -12
2 1 144 52428800 1 NO CURRENT 2145200 17-7月 -12
3 1 142 52428800 1 YES INACTIVE 2113981 17-7月 -12
4 1 0 52428800 1 YES UNUSED 0
//切换日志组
alter system switch logfile;
加member为每个组(一共是4个组)
先建好目录,准备放在/u01/disk2/timran/下
[oracle@timran timran]$ mkdir -p /u01/disk2/timran
[oracle@timran timran]$
16:00:39 SQL> alter database add logfile member
'/u01/disk2/timran/redo01b.log' to group 1,
'/u01/disk2/timran/redo02b.log' to group 2,
'/u01/disk2/timran/redo03b.log' to group 3,
'/u01/disk2/timran/redo04b.log' to group 4;
Database altered.
SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------------------------------------- -------
3 /u01/oradata/timran11g/redo03.log
2 /u01/oradata/timran11g/redo02.log
1 /u01/oradata/timran11g/redo01.log
4 /u01/oradata/timran11g/redo04.log
1 /u01/disk2/timran/redo01b.log INVALID
2 /u01/disk2/timran/redo02b.log INVALID
3 /u01/disk2/timran/redo03b.log INVALID
4 /u01/disk2/timran/redo04b.log INVALID
16:01:54 SQL> select * from v$log; //看到MEMBERS列已经是2了
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 143 52428800 2 YES INACTIVE 2144594 17-7月 -12
2 1 144 52428800 2 NO CURRENT 2145200 17-7月 -12
3 1 142 52428800 2 YES INACTIVE 2113981 17-7月 -12
4 1 0 52428800 2 YES UNUSED 0
16:03:06 SQL> alter system switch logfile; //多做几次切换,消除invalid //同步组里的member,这步很重要。
16:03:13 SQL> select * from v$log;
归档日志排的号
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 143 52428800 2 YES INACTIVE 2144594 17-7月 -12
2 1 144 52428800 2 YES ACTIVE 2145200 17-7月 -12
3 1 142 52428800 2 YES INACTIVE 2113981 17-7月 -12
4 1 145 52428800 2 NO CURRENT 2146613 17-7月 -12
说明一下v$log这个重要的视图
status有四个状态:
unused: 新添加的日志组,还没有使用
inactive: 日志组对应的脏块已经从data buffer写入到data file ,可以覆盖
active: 日志组对应的脏块还没有从data buffer写入到data file,不能被覆盖
current: 当前日志组,日志组对应的脏块还没有从data buffer写入到data file,不能被覆盖
thread: 线程(通过后台进程lgwr 启动),在单实例的环境下,thread# 永远是1
sequence: 日志序列号。在日志切换时会递增。
FIRST_CHANGE#: 在当前日志中记录的首个数据块的scn。(当事务完成的时候会在数据块上写入一个scn,代表数据块的变化)。
16:11:08 SQL> select group#,member from v$logfile order by 1;
GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/oradata/timran11g/redo01.log
1 /u01/disk2/timran/redo01b.log
2 /u01/oradata/timran11g/redo02.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
3 /u01/oradata/timran11g/redo03.log
4 /u01/disk2/timran/redo04b.log
4 /u01/oradata/timran11g/redo04.log
假设/u01/oradata/timran11g/目录下的4个log文件都损坏了,看如何迁移更名。
16:12:03 SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
16:12:30 SQL>
建立目录/u01/disk3/timran/
[oracle@timran timran]$ mkdir -p /u01/disk3/timran
[oracle@timran timran]$
[oracle@timran timran]$ cp /u01/disk2/timran/redo01b.log /u01/disk3/timran/redo01a.log
[oracle@timran timran]$ cp /u01/disk2/timran/redo02b.log /u01/disk3/timran/redo02a.log
[oracle@timran timran]$ cp /u01/disk2/timran/redo03b.log /u01/disk3/timran/redo03a.log
[oracle@timran timran]$ cp /u01/disk2/timran/redo04b.log /u01/disk3/timran/redo04a.log
[oracle@timran timran]$
16:15:19 SQL> startup mount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218968 bytes
Variable Size 117442152 bytes
Database Buffers 159383552 bytes
Redo Buffers 7168000 bytes
Database mounted.
16:15:26 SQL>
16:16:05 SQL> col member for a50;
16:16:08 SQL> select group# ,member from v$logfile order by 1;
GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/oradata/timran11g/redo01.log
1 /u01/disk2/timran/redo01b.log
2 /u01/oradata/timran11g/redo02.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
3 /u01/oradata/timran11g/redo03.log
4 /u01/disk2/timran/redo04b.log
4 /u01/oradata/timran11g/redo04.log
16:18:05 SQL> alter database rename file '/u01/oradata/timran11g/redo01.log' to '/u01/disk3/timran/redo01a.log';
16:18:34 SQL> alter database rename file '/u01/oradata/timran11g/redo02.log' to '/u01/disk3/timran/redo02a.log';
16:18:45 SQL> alter database rename file '/u01/oradata/timran11g/redo03.log' to '/u01/disk3/timran/redo03a.log';
16:20:16 SQL> alter database rename file '/u01/oradata/timran11g/redo04.log' to '/u01/disk3/timran/redo04a.log';
16:21:35 SQL> select group# ,member from v$logfile order by 1;
GROUP# MEMBER
---------- --------------------------------------------------
1 /u01/disk3/timran/redo01a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk3/timran/redo02a.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
3 /u01/disk3/timran/redo03a.log
4 /u01/disk2/timran/redo04b.log
4 /u01/disk3/timran/redo04a.log
16:21:55 SQL> alter database open;
23:52:06 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 143 52428800 2 YES INACTIVE 2144594 17-7月 -12
2 1 144 52428800 2 YES INACTIVE 2145200 17-7月 -12
3 1 142 52428800 2 YES INACTIVE 2113981 17-7月 -12
4 1 145 52428800 2 NO CURRENT 2146613 17-7月 -12
23:52:15 SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------- -------
1 /u01/disk3/timran/redo01a.log
3 /u01/disk3/timran/redo03a.log STALE
2 /u01/disk3/timran/redo02a.log
4 /u01/disk3/timran/redo04a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log STALE
4 /u01/disk2/timran/redo04b.log
23:52:25 SQL> alter system switch logfile; //出现stale不要紧,表明文件内容不完全,做几次切换就可以了。
23:52:28 SQL> /
23:52:30 SQL> /
23:52:32 SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------- -------
1 /u01/disk3/timran/redo01a.log
3 /u01/disk3/timran/redo03a.log
2 /u01/disk3/timran/redo02a.log
4 /u01/disk3/timran/redo04a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
4 /u01/disk2/timran/redo04b.log
4.8、日志恢复
例1、多元化成员中,单个成员(inactive)丢失
00:06:15 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 6 52428800 2 YES INACTIVE 2152079 18-7月 -12
2 1 7 52428800 2 YES ACTIVE 2152084 18-7月 -12
3 1 8 52428800 2 NO CURRENT 2152087 18-7月 -12
4 1 5 52428800 2 YES INACTIVE 2152076 18-7月 -12
[oracle@timran ~]$ cd /u01/disk3/timran
[oracle@timran timran]$ ll
鎬昏 205040
-rw-r----- 1 oracle oinstall 52429312 07-17 23:49 redo01a.log
-rw-r----- 1 oracle oinstall 52429312 07-17 23:49 redo02a.log
-rw-r----- 1 oracle oinstall 52429312 07-17 23:49 redo03a.log
-rw-r----- 1 oracle oinstall 52429312 07-17 23:52 redo04a.log
[oracle@timran timran]$ rm redo01a.log
00:10:11 SQL> startup force
00:18:29 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 6 52428800 2 YES INACTIVE 2152079 18-7月 -12
2 1 7 52428800 2 YES INACTIVE 2152084 18-7月 -12
3 1 8 52428800 2 YES INACTIVE 2152087 18-7月 -12
4 1 9 52428800 2 NO CURRENT 2172107 18-7月 -12
00:19:02 SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------- -------
1 INVALID //invalid表明该文件不可访问
3 /u01/disk3/timran/redo03a.log
2 /u01/disk3/timran/redo02a.log
4 /u01/disk3/timran/redo04a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
4 /u01/disk2/timran/redo04b.log
00:19:12 SQL>
告警日志:
Linux Error: 2: No such file or directory
Additional information: 3
Wed Jul 18 00:16:25 2012
Errors in file /u01/admin/timran/bdump/timran_lgwr_2807.trc:
ORA-00321: log 1 of thread 1, cannot update log file header
ORA-00312: online log 1 thread 1: '/u01/disk3/timran/redo01a.log'
Wed Jul 18 00:16:25 2012
解决:
直接在open方式下复制这个member,为何可以?因为是这个group是inactive状态!
[oracle@timran timran]$ cp /u01/disk2/timran/redo01b.log /u01/disk3/timran/redo01a.log
00:25:54 SQL> alter system switch logfile; //切换时会同步,把invalid状态消除掉。
00:25:57 SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------- -------
1 /u01/disk3/timran/redo01a.log
3 /u01/disk3/timran/redo03a.log
2 /u01/disk3/timran/redo02a.log
4 /u01/disk3/timran/redo04a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
4 /u01/disk2/timran/redo04b.log
例2 非当前日志组所有成员丢失
00:32:47 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 14 52428800 2 YES INACTIVE 2172644 18-7月 -12
2 1 15 52428800 2 NO CURRENT 2172646 18-7月 -12
3 1 12 52428800 2 YES INACTIVE 2172247 18-7月 -12
4 1 13 52428800 2 YES INACTIVE 2172250 18-7月 -12
00:33:45 SQL> shutdown immediate
[oracle@timran timran]$ rm /u01/disk3/timran/redo04a.log
[oracle@timran timran]$ rm /u01/disk2/timran/redo04b.log
SQL> startup
ORA-00313: open failed for members of log group 4 of thread 1
ORA-00312: online log 4 thread 1: '/u01/disk3/timran/redo04a.log'
ORA-00312: online log 4 thread 1: '/u01/disk2/timran/redo04b.log'
00:37:31 SQL> alter database clear logfile group 4; //注意:这一步使刚才在os里删掉的那两个group4的文件又建立上了。
[oracle@timran timran]$ ll
总计 205040
-rw-r----- 1 oracle oinstall 52429312 07-18 00:44 redo01b.log
-rw-r----- 1 oracle oinstall 52429312 07-18 00:38 redo02b.log
-rw-r----- 1 oracle oinstall 52429312 07-18 00:38 redo03b.log
-rw-r----- 1 oracle oinstall 52429312 07-18 00:43 redo04b.log
00:45:02 SQL> alter database open;
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------
1 1 25 52428800 2 YES INACTIVE 7025904 2013-2-19 2
2 1 26 52428800 2 YES INACTIVE 7025907 2013-2-19 2
3 1 27 52428800 2 NO CURRENT 7025955 2013-2-19 2
4 1 0 52428800 2 YES UNUSED 7025902 2013-2-19 2
例3 当前日志组丢失。非正常关库,直接从os下删除当前日志组的所有member,模拟数据库open状态下 current log损坏
[oracle@timran timran]$ rm /u01/disk3/timran/redo01a.log
[oracle@timran timran]$ rm /u01/disk2/timran/redo01b.log
[oracle@timran timran]$
01:10:11 SQL> alter system switch logfile; 切一下,触动它一下。
System altered.
告警日志
Wed Jul 18 01:11:04 2012
Errors in file /u01/admin/timran/bdump/timran_arc1_3269.trc:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u01/disk2/timran/redo01b.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
ORA-00312: online log 1 thread 1: '/u01/disk3/timran/redo01a.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
01:13:33 SQL> select group#,member,status from v$logfile;
GROUP# MEMBER STATUS
---------- -------------------------------------------------- -------
1 /u01/disk3/timran/redo01a.log
3 /u01/disk3/timran/redo03a.log
2 /u01/disk3/timran/redo02a.log
4 /u01/disk3/timran/redo04a.log
1 /u01/disk2/timran/redo01b.log
2 /u01/disk2/timran/redo02b.log
3 /u01/disk2/timran/redo03b.log
4 /u01/disk2/timran/redo04b.log
01:13:40 SQL> alter system switch logfile;
System altered.
01:13:53 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
1 1 5 52428800 2 NO ACTIVE 2194945 18-7月 -12
2 1 6 52428800 2 NO ACTIVE 2195228 18-7月 -12
3 1 7 52428800 2 NO CURRENT 2195296 18-7月 -12
4 1 4 52428800 2 YES INACTIVE 2194943 18-7月 -12
暂时好像没有什么问题发生,继续切换,当current 又转会到group1时,死机!
01:17:44 SQL> startup force
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: '/u01/disk3/timran/redo01a.log'
ORA-00312: 联机日志 1 线程 1: '/u01/disk2/timran/redo01b.log'
SQL> alter database clear logfile group 1;
alter database clear logfile group 1
*
第 1 行出现错误:
ORA-00350: 日志 1 (实例 timran11g 的日志, 线程 1) 需要归档
ORA-00312: 联机日志 1 线程 1: '/u01/disk3/timran/redo01a.log'
ORA-00312: 联机日志 1 线程 1: '/u01/disk2/timran/redo01b.log'
SQL> alter database clear unarchived logfile group 1;
SQL> alter database open;
说明如下:当前日志损坏是一种严重的故障,面临的情况也比较复杂。
1)如果数据库模式是archived的,当前日志损坏,可以先尝试强制清除。
alter database clear unarchived logfile group n;
这步如果能成功,打开数据库后要做数据库全备(考点)。因为open前的当前日志已经坏掉无法真正归档,那么将来的前滚可能会有问题。
2)如果clear unarchived不能成功尝试,只好准备把当前日志甩掉,去做基于日志的不完全恢复。
SQL> recover database until cancel;
SQL> alter database open resetlogs;
3)如果严重到使用resetlogs也不能打开数据库,可以试试下面的最后一招:
修改pfile文件,第一行添加_allow_resetlogs_corruption=TRUE
该参数的含义是:允许在破坏一致性的情况下强制重置日志,打开数据库。_allow_resetlogs_corruption将使用所有数据文件最旧的SCN打开数据库,所以通常来讲需要保证SYSTEM表空间拥有最旧的SCN。在强制打开数据库之后,可能因为各种原因会有ora-600错误。
[oracle@work dbs]$ vi inittest11g.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状态,然后 alter database open resetlogs
//这是在不一致状态下强行打开了数据库,建议做一个逻辑全备。
4.9 使日志恢复到原来的配置
尝试使用OEM方式恢复原状。最后,验证无误后删掉/u01/disk2和/u01/disk3目录。
[oracle@timran timran]$ rm -rf /u01/disk2
[oracle@timran timran]$ rm -rf /u01/disk3
1)归档会在日志切换时,备份历史日志,用于OLTP(dml操作比较多),可以进行冷备(mont下)份和热备份(数据库打开),可以实现数据库完全恢复、不完全恢复(基于时间点)
2)归档会启用arcn的后台进程、占用磁盘空间
3)非归档用于OLAP/DSS,只能冷备份,只能恢复到最后一次备份状态
补充:olap (select操作比较多)
02:34:50 SQL>archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/disk1/timran/
Oldest online log sequence 1
Next log sequence to archive 2
Current log sequence 2
02:35:50 SQL> shutdown immediate //这里shutdown 一定要immediate方式
Database closed.
Database dismounted.
ORACLE instance shut down.
02:36:40 SQL> startup mount //到mount下设置
02:37:50 SQL>alter database noarchivelog;
Database altered.
02:37:55 SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/disk1/timran/
Oldest online log sequence 1
Current log sequence 2
02:38:15 SQL> alter database archivelog; //换回来,不要No Archive Mode
02:38:30 SQL> alter database open;
指定归档日志存放处及命名
注意:另外指定并不意味着你要取消闪回恢复区的参数,因为这个闪回恢复区不仅归档日志,还有RMAN的备份及闪回日志等等。
02:39:20 SQL> show parameter archive
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
log_archive_config string
log_archive_dest string
log_archive_dest_1 string location=/u01/disk1/timran/ ma
ndatory
log_archive_dest_10 string
log_archive_dest_2 string
log_archive_dest_3 string
log_archive_dest_4 string
log_archive_dest_5 string
log_archive_dest_6 string
log_archive_dest_7 string
log_archive_dest_8 string
log_archive_dest_9 string
log_archive_dest_state_1 string enable
log_archive_dest_state_10 string enable
log_archive_dest_state_2 string enable
log_archive_dest_state_3 string enable
log_archive_dest_state_4 string enable
log_archive_dest_state_5 string enable
log_archive_dest_state_6 string enable
log_archive_dest_state_7 string enable
log_archive_dest_state_8 string enable
log_archive_dest_state_9 string enable
log_archive_duplex_dest string
log_archive_format string arch_%t_%r_%s.log
log_archive_local_first boolean TRUE
log_archive_max_processes integer 2
log_archive_min_succeed_dest integer 1
log_archive_start boolean FALSE
log_archive_trace integer 0
remote_archive_enable string true
standby_archive_dest string ?/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指向了闪回恢复区(flashback revovery area),这个闪回恢复区不仅默认的存放归档日志,还有RMAN的备份及闪回日志等等。
使用log_archive_dest_n就不要使用log_archive_dest参数了
SQL> alter system set log_archive_dest_1='location=/u01/disk1/timran';
//把历史日志归档到本机目录下 (location 代表本机)
SQL> alter system set log_archive_dest_2='service=test';
//远程备份,把历史日志备份到服务名为test的另外的数据库上。(service 代表远程),配置双机时有用。
SQL> alter system set log_archive_dest_1='location=/u01/disk1/timran mandatory';
//mandatory 强制,日志归档未完成之前不允许覆盖redo log file。(考点)
//默认optional(日志在没有归档完成前可以被覆盖redo log file。
log_archive_format 是定义命名格式的,我使用了下面三个内置符号,其含义是:
%t ,thread# , 日志线程号
%s ,sequence ,日志序列号
%r ,resetlog ,代表数据库的周期
SQL> alter system set log_archive_format ='arch_%t_%r_%s.log' scope=spfile;
[oracle@timran bdump]$ ps -ef |grep ora_|grep -v grep
oracle 3458 1 0 01:30 ? 00:00:00 ora_pmon_timran
oracle 3460 1 0 01:30 ? 00:00:00 ora_psp0_timran
oracle 3462 1 0 01:30 ? 00:00:00 ora_mman_timran
oracle 3464 1 0 01:30 ? 00:00:00 ora_dbw0_timran
oracle 3466 1 0 01:30 ? 00:00:00 ora_lgwr_timran
oracle 3468 1 0 01:30 ? 00:00:00 ora_ckpt_timran
oracle 3470 1 0 01:30 ? 00:00:01 ora_smon_timran
oracle 3472 1 0 01:30 ? 00:00:00 ora_reco_timran
oracle 3474 1 0 01:30 ? 00:00:00 ora_cjq0_timran
oracle 3476 1 0 01:30 ? 00:00:01 ora_mmon_timran
oracle 3478 1 0 01:30 ? 00:00:00 ora_mmnl_timran
oracle 3480 1 0 01:30 ? 00:00:00 ora_d000_timran
oracle 3482 1 0 01:30 ? 00:00:00 ora_s000_timran
oracle 3490 1 0 01:32 ? 00:00:00 ora_arc0_timran
oracle 3492 1 0 01:32 ? 00:00:00 ora_arc1_timran
oracle 3496 1 0 01:32 ? 00:00:00 ora_qmnc_timran
oracle 3506 1 0 01:32 ? 00:00:00 ora_q000_timran
oracle 3508 1 0 01:32 ? 00:00:00 ora_q001_timran
oracle 3542 1 0 01:41 ? 00:00:00 ora_j000_timran
ARCn就是归档进程,这里启动了两个arc0和arc1,最多可达30个,由log_archive_max_processes参数指定。
1)自动归档,日志切换时
2)手工
3)在归档时,会把归档信息写入到控制文件
02:44:00 SQL> alter system switch logfile; //手工归档方法一。
02:46:30 SQL> alter system archive log current; //手工归档方法二,此方式仅限于Archive mode。 【此方法只能在归档模式下用】
查看已经归档日志:
02:48:08 SQL> select name from v$archived_log;
NAME
--------------------------------------------------------------------------------------------------------
/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:10 SQL>
数据库恢复中有时会需要对Redo log进行分析, 要会使用log miner,以便确定要恢复的时间点
1)添加database补充日志
SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS; //10g和11g中这一步还是挺重要的。
2)确定要分析的日志范围,添加日志,分析
SQL>
execute dbms_logmnr.add_logfile(logfilename=>'日志',options=>dbms_logmnr.new);
eg: /u01/disk1/timran/arch_1_804874397_20.log
//第一个要加载的日志文件
SQL>
execute dbms_logmnr.add_logfile(logfilename=>'补充日志',options=>dbms_logmnr.addfile); //可以反复添加补充多个日志文件
3)执行logmnr 分析
SQL>execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
4)查询分析结果,可以设置时间格式,也可以在显示方式里再确定格式.
SQL>select username,scn,timestamp,sql_redo from v$logmnr_contents where seg_name='表名';
5)关闭日志分析
SQL>execute dbms_logmnr.end_logmnr;
例
scott:
09:44:08 SQL> create table a (id int);
09:44:20 SQL> insert into a values(1);
09:44:29 SQL> update a set id=5;
09:44:45 SQL> commit;
09:44:47 SQL> delete a;
09:44:51 SQL> commit;
Commit complete.
sys:
11:32:12 SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------
1 1 26 52428800 2 NO CURRENT 2257870 2012-7-23 9
2 1 25 52428800 2 YES INACTIVE 2257866 2012-7-23 9
3 1 23 52428800 2 YES INACTIVE 2257862 2012-7-23 9
4 1 24 52428800 2 YES INACTIVE 2257864 2012-7-23 9
//上面a 表的DML操作都写进了current组里,记住sequence#是26号。然后手工切换当前日志进archive里。
11:32:18 SQL> alter system switch logfile;
11:33:00 SQL> /
11:33:02 SQL> /
11:33:02 SQL> /
11:33:09 SQL> select name from v$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
62 rows selected
//切换后,sequence#26的日志的应该对应的是/u01/disk1/timran/arch_1_789252862_26.log
11:33:20 SQL> alter database add supplemental log data;
11:33:48 SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/disk1/timran/arch_1_789252862_26.log',options=>dbms_logmnr.new);
11:34:13 SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
11:34:49 SQL>select scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') timestamp,sql_redo from v$logmnr_contents where seg_name='A';
SCN TIMESTAMP SQL_REDO
---------- ------------------- --------------------------------------------------------------------------------
2258232 2012-07-23 09:43:16 drop table a purge;
2258334 2012-07-23 09:44:20 create table a (id int);
2258341 2012-07-23 09:44:28 insert into "SCOTT"."A"("ID") values ('1');
2258349 2012-07-23 09:44:46 update "SCOTT"."A" set "ID" = '5' where "ID" = '1' and ROWID = 'AAANBAAAEAAAAGEA
2258353 2012-07-23 09:44:52 delete from "SCOTT"."A" where "ID" = '5' and ROWID = 'AAANBAAAEAAAAGEAAA';
另外,也可以采用OEM方式进行logmnr,设定scn或timestamp一个范围,查出需要的DML语句,比较方便。不过,OEM是针对已提交的事务的。
6.2.2 对DDL的操作的log miner:
1)如果是第一次做,先要建好logmnr目录,
设置logmnr 参数,存放数据字典文件dict.ora
$ mkdir /home/oracle/logmnr
SQL> alter system set utl_file_dir='/home/oracle/logmnr' scope=spfile;
2)建立数据字典文件dict.ora
SQL> execute dbms_logmnr_d.build('dict.ora','/home/oracle/logmnr',dbms_logmnr_d.store_in_flat_file);
3)添加日志分析
SQL> execute dbms_logmnr.add_logfile(logfilename=>'日志文件',options=>dbms_logmnr.new);
SQL> execute dbms_logmnr.add_logfile(logfilename=>'追加日志',options=>dbms_logmnr.addfile);
4)执行分析
SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);
5)查看分析结果
SQL> select username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents WHERE USERNAME ='SCOTT' and lower(sql_redo) like '%table%';
6)关闭日志分析
SQL> execute dbms_logmnr.end_logmnr;
例子将在053的不完全恢复一节中演示。
使用undo tablespace 存放从datafiles 读出的数据块的前镜像【老值】,提供以下四种情况所需要的信息
1)回滚事务:rollback
2)读一致性:正在做DML操作的数据块,事务结束前,其他用户读undo里面的数据前镜像
3)实例的恢复:instance recover(undo -------->rollback)
4)闪回查询 :flashback query、flashback table
1)manaual 手工:roll segment //作废了
2)auto 自动:undo tablespace (init parameter :undo_management = auto)
1)可以建立多个undo表空间,但一个时刻只有一个处于active
2)处于active状态的undo tablespace 不能offline 和 drop
01:08:31 SQL> select tablespace_name,status ,contents from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS
------------------------------ --------- ---------
SYSTEM ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
SYSAUX ONLINE PERMANENT
TEMP ONLINE TEMPORARY
USERS ONLINE PERMANENT
EXAMPLE ONLINE PERMANENT
TEST ONLINE PERMANENT
09:47:08
SQL>
create undo tablespace undotbs2 datafile '/u01/oradata/timran11g/undotbs02.dbf' size 100m autoextend on;
09:47:55 SQL> select tablespace_name,status,contents from dba_tablespaces;
SQL> select tablespace_name,status ,contents from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS
------------------------------ --------- ---------
SYSTEM ONLINE PERMANENT
SYSAUX ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
TEMP ONLINE TEMPORARY
USERS ONLINE PERMANENT
UNDOTBS2 ONLINE UNDO
EXAMPLE ONLINE PERMANENT
TEST ONLINE PERMANENT
09:48:00 SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
00:20:50 SQL> SQL> select * from v$rollname;
USN NAME
---------- ------------------------------
0 SYSTEM
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$
11 rows selected.
09:50:10 SQL> alter system set undo_tablespace=undotbs2; //memory动态修改
09:50:28 SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS2
00:22:29 SQL> SQL> select * from v$rollname;
USN NAME
---------- ------------------------------
0 SYSTEM
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$
11 rows selected.
SQL> drop tablespace undotbs1 including contents and datafiles;
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
4 USERS YES NO YES
6 EXAMPLE YES NO YES
8 TEST YES NO YES
3 TEMP NO NO YES
5 UNDOTBS2 YES NO YES
1)active: 表示使用这个undo block的 transaction还未提交
2)unexpired: undo block上没有活动事务,可以被覆盖(但是未过期expired)
3)expired: undo block状态为inactive的时间 超过了undo_retention
4)free: 空闲的
//这个参数只对已提交的undo状态有效
01:10:46 SQL>
select tablespace_name,status,contents,retention from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS RETENTION
------------------------------ --------- --------- -----------
SYSTEM ONLINE PERMANENT NOT APPLY
SYSAUX ONLINE PERMANENT NOT APPLY
TEMP ONLINE TEMPORARY NOT APPLY
USERS ONLINE PERMANENT NOT APPLY
EXAMPLE ONLINE PERMANENT NOT APPLY
TEST ONLINE PERMANENT NOT APPLY
UNDOTBS2 ONLINE UNDO NOGUARANTEE
guarantee属性随undo表空间建立, 可以修改
09:52:22 SQL> alter tablespace undotbs2 retention guarantee; //保证在retention 期间不允许被覆盖
01:11:16 SQL> select tablespace_name,status ,contents,retention from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS RETENTION
------------------------------ --------- --------- -----------
SYSTEM ONLINE PERMANENT NOT APPLY
SYSAUX ONLINE PERMANENT NOT APPLY
TEMP ONLINE TEMPORARY NOT APPLY
USERS ONLINE PERMANENT NOT APPLY
EXAMPLE ONLINE PERMANENT NOT APPLY
TEST ONLINE PERMANENT NOT APPLY
UNDOTBS2 ONLINE UNDO GUARANTEE
缺省配置下undo retention是 noguarantee,
SQL> alter tablespace undotbs2 retention noguarantee;
1) v$session 查看用户建立的session
2) v$transaction 当前的事务
3) v$rollname undo段的名称
4) v$rollstat undo段的状态
5) dba_rollback_segs 数据字典里记录的undo段状态
一般来说,一个session只能对应一个事务,建立了session未必有事务,只有事务处于中间态时,v$transaction才能看到这个事务。
换句话说,如果看到了事务(在 v$transaction里),那一定有个session和它对应,将两个视图里连在一起,信息看得更为清楚。
cmd下scott登录:
10:03:28 SQL> select username,sid,serial# from v$session where username is not null; //看看有几个session连上来了。
USERNAME SID SERIAL#
------------------------------ ---------- ----------
SCOTT 131 18
SYS 170 5
cmd下 update emp set sal=1000 where empno=7788; // 产生一个活动事务
SQL> select a.sid,a.serial#,a.username,b.xidusn,xidslot,b.ubablk,b.status from v$session a,v$transaction b where a.saddr=b.ses_addr;
10:08:29 SQL> col name for a10
SID SERIAL# USERNAME XIDUSN XIDSLOT UBABLK STATUS
---------- ---------- -------------------- ---------- ---------- ---------- ----------------
131 18 SCOTT 8 17 305 ACTIVE
//两表联查,sid和serial#在v$session里,在v$transaction里 XIDUSN是undo segment 的id ,XIDSLOT 是事务槽的id,UBABLK是undo块号
对照上面看,下面语句显示出_SYSSMU8$是一个活动段, 与XIDUSN=8吻合, 说明这个段被读进buffer了.
SQL> select b.name,a.xacts from v$rollstat a, v$rollname b where a.usn=b.usn;
NAME XACTS
------------------------------ ----------
SYSTEM 0
_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表空间会有一个undo segment(usn为0)。system下的undo是系统需要的(比如数据字典),其他表空间的事务不能使用它。缺省下undo tablespace 会被分配10个undo segment,如果数据库启动时碰到undo数据文件损坏或不同步,可以将其offline, 只有一个系统表空间的undo也能进入系统,但不能做其他表空间的DML操作。
如果在数据库打开的情况下,当前undo坏掉的话,比如现在UNDOTBS2出现了介质损坏,那么数据库就不能做DML操作了。如果UNDOTBS2表空间上还有活动的事务,Oracle会将其下的所有段标志为NEEDS RECOVERY,这时若没有备份或没有可替代UNDO来切换的话,那么这种错误将是严重的,会丢失了原来的事务。必须重新启动,然后重建一个undo表空间,再将NEEDS RECOVERY处理后,才可将该表空间删除。我们模拟一下这种情况:
[oracle@timran timran]$ mv undotbs02.dbf undotbs02.bak
00:29:28 SQL>alter system checkpoint;
cmd端再做update 语句时会报错
ORA-01116: 打开数据库文件 3 时出错
ORA-01110: 数据文件 3: '/u01/oradata/timran11g/undotbs02.dbf'
ORA-27041: 无法打开文件
00:29:28 SQL> startup force
ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 3: '/u01/oradata/timran11g/undotbs02.dbf'
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 6708724
2 6708724
3 6708724
4 6708724
5 6708724
6 6708724
//磁盘上去读数据文件
SQL> select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 6708724
2 6708724
3 0
4 6708724
5 6708724
6 6708724
SQL> alter database datafile 3 offline;
SQL> alter database open;
SQL> select * from v$rollname;
//只剩下系统表空间 undo端
USN NAME
---------- ------------------------------
0 SYSTEM
SQL>
create undo tablespace undotbs1 datafile '/u01/oradata/timran11g/undotbs01.dbf' size 100m autoextend on;
SQL> show parameter undo;
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
2 UNDOTBS1 YES NO YES
4 USERS YES NO YES
3 TEMP NO NO YES
6 EXAMPLE YES NO YES
8 TEST YES NO YES
5 UNDOTBS2 YES NO YES
SQL> alter system set undo_tablespace=UNDOTBS1;
注意:此时原有的事务可能仍然在UNDOTBS2, 只能刷掉了。
SQL> drop tablespace undotbs2 including contents and datafiles;
drop tablespace undotbs2 including contents and datafiles
*
第 1 行出现错误:
ORA-01548: 已找到活动回退段 '_SYSSMU1_1363316212$', 终止删除表空间
//这个UNDOTBS2删不掉是因为Oracle把其下的所有段都标志成 NEEDS RECOVERY了,查看一下相关的数据字典:
SQL> select segment_name,status from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_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$ NEEDS RECOVERY
_SYSSMU9_1363316212$ NEEDS RECOVERY
_SYSSMU8_1363316212$ NEEDS RECOVERY
_SYSSMU7_1363316212$ NEEDS RECOVERY
_SYSSMU6_1363316212$ NEEDS RECOVERY
_SYSSMU5_1363316212$ NEEDS RECOVERY
_SYSSMU4_1363316212$ NEEDS RECOVERY
_SYSSMU3_1363316212$ NEEDS RECOVERY
_SYSSMU2_1363316212$ NEEDS RECOVERY
_SYSSMU1_1363316212$ NEEDS RECOVERY
解决有两个办法:1)使用备份恢复,2)使用oracle提供的隐含参数_CORRUPTED_ROLLBACK_SEGMENTS
我们使用第2种方法
SQL>create pfile from spfile; //建立静态参数文件
SQL>shutdown abort
#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> startup pfile='/u01/oracle/dbs/inittimran11g.ora'
SQL> drop rollback segment "_SYSSMU1_1363316212$";
回退段已删除。
......
SQL> drop rollback segment "_SYSSMU10_1363316212$";
SQL> select segment_name,status from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_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
已选择11行。
SQL> drop tablespace undotbs2 including contents and datafiles;
表空间已删除。
如果还删除不了,则尝试修改字典
select * from v$tablespace; 记下要删除的undo对应的ts#号,比如是=2,则执行下行语句:
update seg$ set type# = 3 where ts#=2;
然后再删除该表空间即可。
checkpoint是数据库的一个内部事件,检查点激活时会触发数据库写进程(DBWR),将数据缓冲区里的脏数据块写到数据文件中。
由于DBWR与事务提交的无关性,数据库在某个时刻会存在已提交的事务没有来及写到磁盘,而未提交的事务却已经写到了磁盘的情况,也就是说内存中的数据和磁盘中的数据不一致。
1)保证数据库的一致性,这是指将脏数据写出到硬盘,保证内存和硬盘上的数据是一样的;
2)缩短实例恢复的时间,实例恢复要把实例异常关闭前没有写出到硬盘的脏数据通过日志进行恢复。如果脏块过多,实例恢复的时间也会很长,检查点的发生可以减少脏块的数量,从而提高实例恢复的时间。
完全检查点 full checkpoint
增量检查点 incremental checkpoint
局部检查点 partial checkpoint
记下当前的scn, 将此scn之前所有的脏块一次性写完,再将该scn号同步更新控制文件和数据文件头。
可以引起完全检查点的两个动作
a)正常关闭数据库:shutdown immediate
b)手动检查点切换:alter system checkpoint;
补充:实例b
查询:当前文件scn号
select file#,checkpoint_change# from v$datafile_header;
alter system checkpoint;
select file#,checkpoint_change# from v$datafile_header;
1)一般来说增量检查点不会更新数据文件头和控制文件的SCN,它只是根据策略计算一个SCN(未必是当前SCN),将此SCN前的脏块刷新到磁盘,这个SCN点也叫检查点位置,然后将与此scn有关的信息记录到控制文件。
2)当增量检查点发生时,Oracle会写一部分脏块,使检查点位置前移。进而缩短实例恢复时运用日志起点和终点之间的距离,也就意味着缩短了实例恢复时间
以下相关知识已超出OCP考试范畴,仅供参考吧:
什么是检查点队列?
被修改过的块,在oracle中都被统称为脏块.所有的脏块被一个双向链表串起来,称做检查点队列.
什么是检查点位置?
脏块按照首次变脏的时间顺序排列,DBWR每到一定的时机,就会被触发,沿着检查点队列的顺序将脏块刷新到磁盘上。检查点位置之前的块,都是已被DBWR刷新到磁盘上的块。而最后的检查点位置(也就是最后的RBA)总是被记录在控制文件中。如果发生系统崩溃的话,这个最后一次的检查点位置就是实例恢复的起点。
什么是RBA? LRBA? HRBA? TARGET RBA?
RBA就是redo块地址,比如说,用户发出了一条update命令,更新了块A,块A现在变成了脏块,oracle会为他生成一条redo条目.这个条目在redo日志文件中的位置就是rba(redo byte address).过了一会儿,假如:块A依然还是脏块,此时.用户又发出一条更新块A的命令,这又会生成一条redo条目.第一条更新命令对应的redo条目的RBA被称为块A的LRBA(low rba),第二条更新命令对应的RBA,被称为HRBA(high rba).
其实,按照LRBA来排列,就是按照块首次被修改的顺序来排列. LRBA在脏块的块头有指针。
TARGET RBA是增量检查点发生时要求脏块写到一个RBA为止,这个RBA就是Target RBA。
1)FAST_START_MTTR_TARGET:
这个参数是考点。如何有效的缩短最近检查点位置与联机重做日志尾部之间的距离,正是设计此参数目的。
此参数单位为秒,缺省值900,范围0-3600秒,判定依据是当内存中产生的dirty buffer所需的日志恢复时间 (estimated_mttr)如果到达该参数指定时间,则增量检查点进程被触发。fast_start_mttr_target如果为0,这时是根据DBWN进程自身需要尽量减少写入量。虽然实现性能最大化,但实例恢复时间可能后比较长。
*考点:如果将fast_start_mttr_target设置为非0,将启用检查点自动调整机制。
验证以上概念的一个有效的方法,可以研究一下日志切换:alter system switch logfile; 这个动作比较特殊,其特征是完全检查点和增量检查点综合的效果。
如果FAST_START_MTTR_TARGET有值,v$log视图中的active状态几分钟后会变成inactive状态,然后更新了控制文件和日志文件头部的SCN(这似乎是完全检查点的特征)
如果FAST_START_MTTR_TARGET=0,在没有检查点机制的情况下,只能靠DBWN进程自身机制写脏块,如果没有事务发生active很长时间状态不变。
还有以下三个参数,它们是:
2)FAST_START_IO_TARGET: 实例恢复所需要读取的redo blocks数量,
3)LOG_CHECKPOINT_TIMEOUT:2次增量检查点的时间间隔。
4)LOG_CHECKPOINT_INTERVAL:最后一次增量检查点与当前日志文件末尾所差的redo block数量。(淘汰)
这三个参数已经被FAST_START_MTTR_TARGET取代了。如果fast_start_io_target or log_checkpoint_interval被指定,他们会自动覆盖由fast_start_mttr_target参数计算出来的值。
演示:
ALTER SYSTEM SET LOG_checkpointS_TO_ALERT=TRUE;
alter system set LOG_CHECKPOINT_TIMEOUT=30;
增量checkpoint信息将会被记录到告警日志alert_$SID.log文件中
注意:并不是将脏列表中的所有脏块都写出到数据文件中,而是写出一部分,保证满足条件即可。
5)90% OF SMALLEST REDO LOG(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>select recovery_estimated_ios,actual_redo_blks,target_redo_blks,target_mttr,
estimated_mttr from v$instance_recovery;
RECOVERY_ESTIMATED_IOS ACTUAL_REDO_BLKS TARGET_REDO_BLKS TARGET_MTTR ESTIMATED_MTTR
---------------------- ---------------- ---------------- ----------- --------------
72 333 3700 33 12
//系统计算出来的target_mttr为33秒,当前估算的恢复时间是12秒。
SQL>select mttr_target_for_estimate tar_est,dirty_limit,estd_cache_writes est_c_w,
estd_cache_write_factor est_c_w_f,estd_total_writes est_t_w,estd_total_write_factor est_t_w_f from v$mttr_target_advice;
TAR_EST DIRTY_LIMIT EST_C_W EST_C_W_F EST_T_W EST_T_W_F
---------- ----------- ---------- ---------- ---------- ----------
16 1821 7659 1.0635 7659 1.0635
20 4516 7202 1 7202 1
22 5825 7202 1 7202 1
25 7616 7202 1 7202 1
18 3208 7202 1 7202 1
//mttr_target_for_estimate里的25秒(最接近设定的目标时间30秒)那行记录的有关字段,值得参考。
对于某些操作,局部检查点是必须的,并会自动执行。
比如:表空间offline,数据文件offline,删除extent,表truncate,begin backup(将表空间置于备份模式)等。Oracle会根据需要自动执行。
SQL> select file#,checkpoint_change#,last_change# from v$datafile;
有了redo,undo和ckpt概念后,有助于更好的理解实例恢复(ppt:404-408)
由于引入了增量检查点,当实例需要恢复的时候,oracle首先从控制文件里找到最后一次检查点位置,这个位置就是实例恢复的起点
然后是smon的一系列动作:
1) roll forward :利用redo,将检查点位置以后的更改,包括提交的和未提交的数据重做一遍。
2) open:
3) roll back :通过undo机制 把写入磁盘里的未提交的事务回滚掉。
重点理解实例恢复的概念
为何要使用redo前滚?因为abort时有可能丢失了在内存中(未写到数据文件)的已提交的事务。
为何要使用undo回滚?因为abort前有可能有未提交的事务已经写到了数据文件里。
为何要open? 打开数据库意味着用户会话可以建立了。
Oracle提供了大量的内部表,它们记录了数据库对象的更改和修正。可以将这些内部表划分为两种主要类型:静态数据字典表和动态性能表。
这些内部表是由oracle维护的,可以说它们是只读表。用户包括sys都不能修改,只能查看。
1) central of database //数据库的核心
2)read_only table and views
3)owner :sys
4)oracle server 维护,ddl操作会更新
5)通过select 访问
6)记录数据库的物理、逻辑结构和所有对象的定义的信息
7)存放在system tablesapce
通过dict view 可以了解数据字典的组成
SQL> select * from dict where table_name='DBA_OBJECTS';
TABLE_NAME COMMENTS
--------------------------------------------- ------------------------------------------------------------
DBA_OBJECTS All objects in the database
SQL> select count(*) from dict;
COUNT(*)
----------
2323
1)数据库的逻辑和物理的架构
2)用户及对象的定义和存储信息
3)权限、角色、审计等
4)database的状态
static :在数据库open状态下访问,可以通过静态视图了解database的架构(记录database的架构,object的数据定义和存储等信息)
dba_ : 存储所有用户对象的信息(默认只能有sys/system 用户访问)
all_ : 存储当前用户能够访问的对象(包括用户所拥有的对象和别的用户授权访问的对象)的信息。
user_:存储当前用户所拥有的对象的相关信息。
是维护当前实例信息的,由于不断的更新,所以也叫动态视图。其底层是一组虚拟的动态表称为X$表,oracle不允许直接访问X$表,而是在这些表上创建视图,然后再创建这些视图的同义词。
Eg:
SQL> set autotrace on; //打开解析
SQL> set autotrace off; //关闭解析
基表(x$)-------------视图(v_$)--------------同义词v$-------User access
可以通过v$fixed_table 视图 查到所有的动态视图的名称;用于调优和数据库监控。从Oracle8开始, GV$视图开始被引入,其含义为Global V$,GV$的产生是为了满足OPS环境的需要,除了一些特例以外,每个V$视图都有一个GV$视图存在。
SQL> desc v$fixed_table;
SQL> select count(object_id) from v$fixed_table;
SQL> select name from v$fixed_table where name like'V$%DATA%';
SQL> select checkpoint_change# from v$database;
SQL> select checkpoint_change# from v$datafile;
*考点:动态性能视图填充了来自实例和控制文件的信息,前缀为DBA_、ALL_、_USER_的视图则填充了来自数据字典的信息,此差异决定了可以 在不同启动阶段查询那些视图。
补充:
DATABASE-->TABLESPACES-->SEGMENTS-->EXENTS-->BLOCKS (DBA-I-PPT36-)
1)字典管理:在数据字典中管理表空间的空间分配。Oracle 8i以前只有通过uet$和fet$的字典管理。
缺点:某些在字典管理方式下的存储分配有时会产生递归操作,并且容易产生碎片,从而影响了系统的性能,现在已经淘汰了。
2)本地管理:在每个数据文件中使用位图管理空间的分配。表空间中所有区(extent)的分配信息都保存在该表空间对应的数据文件的头部。
优点:速度快,存储空间的分配和回收只是简单地改变数据文件中的位图,而不像字典管理方式还需要修改数据库。无碎片,更易于DBA维护。
03:32:36
SQL> select tablespace_name,contents ,extent_management,segment_space_management from dba_tablespaces;
TABLESPACE_NAME CONTENTS EXTENT_MAN SEGMEN
------------------------------ --------- ---------- ------
SYSTEM PERMANENT DICTIONARY MANUAL
SYSAUX PERMANENT LOCAL AUTO
TEMP TEMPORARY LOCAL MANUAL
USERS PERMANENT LOCAL AUTO
EXAMPLE PERMANENT LOCAL AUTO
UNDO_TBS01 UNDO LOCAL MANUAL
TMP01 TEMPORARY LOCAL MANUAL
TBS_16K PERMANENT LOCAL AUTO
BIG_TBS PERMANENT LOCAL AUTO
TEST PERMANENT DICTIONARY MANUAL
注意两点:
1)如果system表空间是数据字典管理,其他表空间可以是数据字典管理或local管理(默认)
2)字典管理可以转换成本地管理,但是对于系统表空间,要求执行一些附加步骤,比较麻烦。
execute dbms_space_admin.tablespace_migragte_to_local('tablespacename');
建一个最简单的表空间
SQL> create tablespace a datafile '/u01/oradata/timran11g/a01.dbf' size 10m;
利用oracle提供的dbms_metadata.get_ddl包看看缺省值都给的是什么?
SQL> set serverout on;
//把显示打开
SQL>
declare
aa varchar2(2000);
begin
select dbms_metadata.get_ddl('TABLESPACE','A') into aa FROM dual;
dbms_output.put_line(aa);
end;
/
结果:
CREATE TABLESPACE "A" DATAFILE
'/u01/oradata/timran11g/a01.dbf' SIZE 10485760
LOGGING ONLINE PERMANENT BLOCKSIZE
8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
//区是自动
SEGMENT SPACE MANAGEMENT AUTO
//段自动
PL/SQL 过程已成功完成。
关注最后一行,两个重要信息是:(1)区本地管理且自动分配空间,(2)段自动管理。
区默认本地管理,而且我也无法指定它为字典管理,因为我的system表空间是本地管理
SQL>
create tablespace a datafile '/u01/oradata/timran11g/a01.dbf' size 10m
extent management local uniform size 128k
segment space management manual;
同上,调dbms_metadata.get_ddl包看oracle对该语句的ddl操作是:
CREATE TABLESPACE "A" DATAFILE
'/u01/oradata/timran11g/a01.dbf' SIZE 10485760
LOGGING ONLINE PERMANENT BLOCKSIZE
8192
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 131072 SEGMENT SPACE MANAGEMENT MANUAL
最后一行信息是:区本地管理且统一分配128K, 段手动管理。如果在建表时使用缺省说明,则该表将服从其表空间的这些定义,
SQL>create table scott.t1(id int) tablespace a;
调dbms_metadata.get_ddl包看oracle对SCOTT.T1表的ddl操作是:
SQL> set serverout on;
SQL>
declare
aa varchar2(2000);
begin
select dbms_metadata.get_ddl('TABLE','T1','SCOTT') into aa FROM dual;
dbms_output.put_line(aa);
end;
/
结果:
CREATE TABLE "SCOTT"."T1"
( "ID" NUMBER(38,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS
LOGGING
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST
GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "A"
注意两个地方:1)因为表空间指定了MSSM方式,表这边就有了PCTUSED值,缺省是40,存储子句(storage)沿用了表空间的uniform 128k.
can not drop :
1)system
2)active undo tablespace
3) default temporary tablespace
4)default的永久表空间
09:43:11 SQL> DROP TABLESPACE SYSTEM;
DROP TABLESPACE SYSTEM
*
ERROR at line 1:
ORA-01550: cannot drop system tablespace
09:44:38 SQL> drop tablespace test including contents and datafiles;
Tablespace dropped.
09:44:59
//产看数据文件和表空间的关系
SQL> select file_id,file_name,tablespace_name,AUTOEXTENSIBLE ,bytes/1024/1024 "size" from dba_data_files;
SQL> col file_name format a50;
//修改某一列显示宽度
FILE_ID FILE_NAME TABLESPACE_NAME AUTOEXTENSIBLE size
---------- ------------------------------------------ ------------------------------ -------------- ----------
4 /u01/oradata/timran11g/users01.dbf USERS YES 51.25
3 /u01/oradata/timran11g/sysaux01.dbf SYSAUX YES 260
2 /u01/oradata/timran11g/undotbs01.dbf UNDOTBS1 YES 100
1 /u01/oradata/timran11g/system01.dbf SYSTEM YES 480
5 /u01/oradata/timran11g/example01.dbf EXAMPLE YES 100
查看表空间空闲大小
09:47:04 SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name;
TABLESPACE_NAME SUM(BYTES)/1024/1024
------------------------------ --------------------
UNDOTBS1 98.4375
SYSAUX 14.625
USERS 48.1875
SYSTEM 1.875
EXAMPLE 31.25
1)small file,在一个表空间可以建立多个数据文件
2)bigfile :在一个表空间只能建立一个数据文件 (8k的block ,datafile maxsize 可以 32T),可以简化对数据文件管理
09:54:49
SQL>
create bigfile tablespace big_tbs datafile '/u01/oradata/timran11g/bigtbs01.dbf' size 100m;
Tablespace created.
09:55:01
SQL> alter tablespace big_tbs add datafile '/u01/oradata/timran11g/bigtbs02.dbf' size 100m;
alter tablespace big_tbs add datafile '/u01/oradata/timran11g/bigtbs02.dbf' size 100m
*
ERROR at line 1:
ORA-32771: cannot add file to bigfile tablespace
09:55:46 SQL> select name,bigfile from v$tablespace;
NAME BIG
------------------------------ ---
SYSTEM NO
UNDOTBS1 NO
SYSAUX NO
USERS NO
TEMP NO
EXAMPLE NO
TBS_16K NO
BIG_TBS YES
一个段属于一个表,一个表可以有多个段(带有段、大对象)。
一个segment只属于一个模式(schema)对象,模式对象如表、索引,一个段比较大时可以跨多个数据文件。
创建一个模式对象时,ORACLE为这个对象创建一个(或多个)段,在这个段中保存这个对象的所有数据,当这个段数据增加时,为这个段分配新的区(extent)存储数据。段中至少有一个初始区。
段管理也有两种方式:
1)自动管理方式(ASSM(Auto Systemt Space Management)) --采用位图管理段的存储空间
简单说就是每个段的段头都有一组位图(5个位图),位图描述每个块的满度,根据满度的不同将每个块对应到相应的位图上,位图自动跟踪每个块的使用空间,这5个位图的满度按如下定义:一个位图位于满块,其余位图分别用于满度为75%-100%、50%-75%、25%-50%和0%-25%的块,比如块大小为8k,你要插入一行是3k的表行,那么oracle就给你对应到25%-50%的那个位图指定的块上去。
2)手工管理方式(MSSM(Manual Segment Space Management)) --采用FREELIST(空闲列表)管理段的存储空间
这个是传统的方法,现在仍然在使用,未被淘汰,它与pctfree和pctused的概念有关,后面再介绍block时再讨论。
段的管理方式只有在创建表空间时设置,一经确定不能改变。
在ORACLE9I中,缺省状态为自动管理方式
segment space management { manual | auto}
一般来讲 一个单纯的表就分配一个段,但往往表没那么单纯,比如表上经常会有主键约束,那么就会有索引,索引也是表,要求单独分一个段,还有,例如分区表,每个分区会有独立的段,再有就是oracle的大对象, 如果你的表里引用blob,clob,那么这个表就又被分出多个段来。
SQL> conn / as sysdba
SQL> create user tim identified by tim;
SQL> grant connect,resource to tim;
SQL> conn tim/tim
SQL> select * from user_segments;
未选定行
SQL> create table t1 (id int);
SQL> select segment_name from user_segments;
SEGMENT_NAME
---------------------------------------------------------------------------------
T1
SQL> create table t2 (id int constraint pk_t2 primary key, b blob, c clob);
SQL> select segment_name from user_segments;
SEGMENT_NAME
---------------------------------------------------------------------------------
T1
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> create tablespace a datafile '/u01/oradata/timran11g/a01.dbf' size 1m extent management local uniform size 40k segment space management auto;
SQL> select * from dba_tablespaces; //看initial_extent是多少
SQL> create tablespace b datafile '/u01/oradata/timran11g/b01.dbf' size 1m extent management local uniform size 5k segment space management manual;
SQL> select * from dba_tablespaces; //看initial_extent是多少?我只给了5k(一个block是8k) oracle隐性补全到16k。
如果之后由于数据的插入,初始区装满后,将继续分配下一个区。
scott:
SQL> create table t1 tablespace test as select * from dept;
SQL> col segment_name for a20;
SQL> select segment_name,extent_id,bytes from user_extents where segment_name='T1';
SEGMENT_NAME EXTENT_ID BYTES
------------------- ---------- ----------
T1 0 65536
可以看到段T1的初始区ID为0,大小为 65536 bytes;
向表段中自插表数据,看Oracle为该段分配更多的区
SQL> insert into t1 select * from t1;
已创建2048行。
SQL> select segment_name,extent_id,bytes from user_extents where segment_name='T1';
SEGMENT_NAME EXTENT_ID BYTES
-------------------- ---------- ----------
T1 0 65536
T1 1 65536
T1 2 65536
此时看到随着数据的插入,T1段动态扩展为三个区;
SQL> delete t1;
已删除4096行。
SQL> select segment_name,extent_id,bytes from user_extents where segment_name='T1';
SEGMENT_NAME EXTENT_ID BYTES
-------------------- ---------- ----------
T1 0 65536
T1 1 65536
T1 2 65536
此时表段的数据已经删除,但所有extent依然健在,无法回收T1段的区(这是高水位线问题);
可以再扩展表:
sys:
alter table scott.t1 allocate extent (datafile '/u01/oradata/timran11g/test01.dbf' size 5m);
查看
SQL> select segment_name,extent_id,file_id,bytes from dba_extents where segment_name='T1';
SEGMENT_NAME EXTENT_ID FILE_ID BYTES
-------------------- ---------- ---------- ----------
T1 0 6 65536
T1 1 6 65536
T1 2 6 65536
T1 3 6 1048576
T1 4 6 1048576
T1 5 6 1048576
T1 6 6 1048576
T1 7 6 1048576
回收空闲extent
SQL> alter table scott.t1 deallocate unused;
表已更改。
SQL> select segment_name,extent_id,file_id,bytes from dba_extents where segment_name='T1';
SEGMENT_NAME EXTENT_ID FILE_ID BYTES
-------------------- ---------- ---------- ----------
T1 0 6 65536
T1 1 6 65536
T1 2 6 65536
顺便提一句:如何查看一个表所对应的数据文件及表空间的关系呢?
抓住上面dba_extents中的file_id字段(user_extents里没有这个字段),然后;
SQL> select file_id,file_name,tablespace_name from dba_data_files;
补充:
查看视图
Block 是 oracle进行IO操作的最小单位,block 的管理方法是区的管理和段管理的具体体现。
数据块的管理方法也分两种:
1、自动管理方式 如创建表空间时设置为本地管理方式,并且将段的存储空间方式设置为AUTO(即ASSM),该表空间的所有块均采用自动管理方式。这是系统默认的。
2、手工管理方式 是传统的管理方式,主要通过PCTFREE和PCTUSED两个存储参数控制可用存储区的大小,避免行迁移现象的发生。这两个参数可在创建表空间时设置,也可在建立数据库的模式对象(表,索引)中设置。模式对象中设置的优先级比表空间的要高。就是说;如表和索引中没有设置,则按表空间的设置,如表空间也没设置,则按自动管理方式管理块。
data block :oracle 11g 标准块:8k,支持2-32k,
有block header 、free space 、data 组成
数据块并发访问:由数据块的事务槽来分配
ITL :事务槽,可以有多个ITL以支持并发事务,每当一个事务要更新数据时,必须先得到一个ITL槽,然后将当前事务ID,事务所用的undo块儿,
initrans :初始化事务槽的个数(1·255),表默认1,index 默认为2;
maxtrans: 最大的事务槽个数 (默认255)
pctfree:预留给update 操作的空间,free space 大于pctfree 可以insert,小于,不允许insert
数据块的free space 管理:
pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。达到该值,从freelist清除该块信息。
pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。达到该值,该块信息加入freelist
freelist:可用列表中登记了可以插入数据的可用块,位置在段头,插入表行数据时首先查找该列表。
行链接:指一行存储在多个块中的情况,这是因为该行的长度超过了一个块的可用空间大小,即行链接是跨越多块的行。
行迁移:指一个数据行由于update语句导致当前块被重新定位到另一个块(那里有充足的空间)中,但在原始块中保留一个指针的情形。原 始块中的指针是必需的,因为索引的ROWID项仍然指向原始位置。(pctfree问题)注意行迁移与insert和delete语句无关(考点)。
如何能够知道发生了行链接或行迁移?
查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列,当CHAIN_CNT有值时,看AVG_ROW_LEN,它表示行的平均长度,如果小于块大小,那么行是迁移行,如果大于块大小,那么是链接行。
SQL> create table t1 (c1 varchar2(20));
SQL> begin
2 for i in 1..1000 loop
3 insert into t1 values(null);
4 end loop;
5 end;
6 /
分析t1表确定无行迁移
SQL> analyze table t1 compute statistics;
SQL> select avg_row_len,chain_cnt from user_tables where table_name='T1';
AVG_ROW_LEN CHAIN_CNT
----------- ----------
3 0
填充这些空列,再分析t1,有了行迁移
SQL> update t1 set c1='timran is my name';
SQL> analyze table t1 compute statistics;
SQL> select avg_row_len,chain_cnt from user_tables where table_name='T1';
AVG_ROW_LEN CHAIN_CNT
----------- ----------
26 865
使用段重组(即move),再分析t1,行迁移消失
SQL> alter table t1 move;
SQL> analyze table t1 compute statistics;
SQL> select avg_row_len,chain_cnt from user_tables where table_name='T1';
AVG_ROW_LEN CHAIN_CNT
----------- ----------
21 0
考点:对于大部分目的而言,应该用DBMS_STATS包中的过程分析表,但要查看行链接或行迁移信息,只能通过ANALYZE命令检测。
1)什么是高水位线?
高水位线(high-water mark,HWM)
顾名思义,高水位线有点类型于水文监测站里测水深度的标杆一样,当水涨的时候,水位线随之上升,并在标杆留下一个水印痕,这个水印痕就是高水位线。在数据库中,上述比喻很恰当。如果把表想象成一个平面结构,或者想象成从左到右依次排开的一系列块,高水位线就是包含了数据的最右边的块。
原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值。
HWM对数据库的操作有如下影响:
a) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。
b) 即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。
2)两个解决办法
2.1)移动表move, 从一个表空移动到另一个表空间(也可以在本表空间内move), 可以清除表里的碎片。
语法:alter table t1 move [tablespace users];
优点:可以清除数据块中的碎片,降低高水位线
缺点:move过程中,表上的不能做DML或DDL操作。
move之后, 相关索引都不可用了,表上的索引需要重建(考点)。
create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size 100m;
create table scott.t2 tablespace timran as select * from dba_objects;
select max(rownum) from t2;
select table_name, blocks, empty_blocks, num_rows from user_tables where table_name='T2';
analyze table t2 compute statistics;
delete t2 where rownum<=40000;
commit;
analyze table t2 compute statistics for table;
select table_name, blocks, num_rows from user_tables where table_name='T2';
这时候,num_rows已经减掉了40000条, 但 blocks 并没有减少, 说明HWM没有下降。
alter table t2 move tablespace users;
select * from user_tables where table_name='T2';
select table_name, blocks, num_rows from user_tables where table_name='T2';
可以看到blocks减少了,
2.2)收缩表shrink,将数据行从一个数据块移动到另一个数据块。
表收缩的底层实现的是通过匹配的INSERT和DELETE操作,它分两个不同的阶段:压缩阶段和DDL命令阶段。
语法:alter table t2 shrink space [cascade][compact];
前提:1)表所在的表空间使用了ASSM,因为位图方法才记录有关块实际有多满的信息(考点)。2)表上启用了row movement
drop table t2 purge;
....重复上面步骤
alter table t2 enable row movement;
alter table t2 shrink space;
analyze table t2 compute statistics for table;
考点1:表收缩操作生成undo和redo数据,索引可以得到维护,因为收缩实现为一组DML事务,在压缩期间不锁表,但在移动单独行时将锁行。
考点2:SHRINK SPACE COMPACT 命令重组段的内容,它执行第一阶段,不返回空间给表空间。
考点3:表必须遵守前面所说的两个前提,否则不能收缩,如果不满足前提,MOVE就是重组表的唯一方式。
考点4:使用位图管理块,不能收缩MSSM管理,或有LONG列表或是有refresh_on_commit物化视图的表。
用于排序,可以建立多个临时表空间,但默认的临时表空间也只能有一个,default temporary tablespace不能offline和drop。如果未指定默认的临时表空间,oracle 将会使用system作为临时表空间。 只有temp表空间是nologing 其他表空间都是logging的。
【当临时表空间为空时】
09:00:53
SQL> alter tablespace temp add tempfile '/u01/oradata/timran11g/temp01.dbf' size 100m reuse;
这等于在原地重置了临时表空间
09:01:14 SQL> select file_id,file_name,tablespace_name from dba_temp_files;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- -------------------------------------------------- ------------------------------
1 /u01/oradata/timran11g/temp01.dbf TEMP
09:01:17 SQL> col name for a60;
09:01:19 SQL> select file#,name ,bytes/1024/1024 from v$tempfile;
FILE# NAME BYTES/1024/1024
---------- -------------------------------------------------- ---------------
1 /u01/oradata/timran11g/temp01.dbf 100
09:04:18
SQL> create temporary tablespace temp2 tempfile '/u01/oradata/timran11g/temp02.dbf' size 10m extent management local uniform size 128k;
09:06:17 SQL> select file#,name from v$tempfile;
FILE# NAME
---------- --------------------------------------------------
1 /u01/oradata/timran11g/temp01.dbf
2 /u01/oradata/timran11g/temp02.dbf
09:06:52 SQL> col PROPERTY_VALUE for a30
09:06:59 SQL> col description for a40
09:07:04 SQL> select * from database_properties;
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ----------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
.....
27 rows selected.
20:55:00 SQL> alter user scott temporary tablespace temp2;
09:07:05 SQL> alter database default temporary tablespace temp2;
09:07:34 SQL> select * from database_properties;
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ----------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TMP01 Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
NLS_CURRENCY $ Local currency
NLS_ISO_CURRENCY AMERICA
...
09:07:41 SQL>
在很多情况下,会有多个session 使用一个用户名去访问Oracle,而临时表空间又是基于用户的,那么可以建立一个临时表空间组,其中若干临时表空间组成,从而可以提高表空间的使用效率。
1)临时表空间组无法显式创建,当第一个临时表空间分配给该组时自动创建。
09:07:41 SQL> alter tablespace temp tablespace group tmpgrp;
09:09:33 SQL> alter tablespace temp2 tablespace group tmpgrp;
09:09:38 SQL> select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TMPGRP TEMP
TMPGRP TEMP2
2)将临时表空间组设成默认临时表空间,可以实现负载均衡。
09:09:52 SQL> alter database default temporary tablespace tmpgrp;
Database altered.
09:10:10 SQL> select * from database_properties;
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ----------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TMPGRP Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
NLS_TERRITORY AMERICA Territory
3)要移除表空间组时,该组不能是缺省的临时表空间。
SQL>alter database default temporary tablespace temp;
05:36:11 SQL> select * from database_properties;
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION
------------------------------ ------------------------------ ----------------------------------------
DICT.BASE 2 dictionary base tables version #
DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE USERS Name of default permanent tablespace
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
NLS_LANGUAGE AMERICAN Language
05:38:11 SQL> alter tablespace temp tablespace group '';
05:38:16 SQL> alter tablespace tmp01 tablespace group '';
Tablespace altered.
4)当组内所有临时表空间被移除时,组也被自动删除。
05:38:23 SQL> select * from dba_tablespace_groups;
no rows selected
SQL> drop tablespace tmp01 including contents and datafiles;
【干净删除表空间】
当发生表空间不足的问题时常用的3个解决办法:
1)增加数据文件大小(resize),
alter database datafile '/u01/oradata/timran11g/timran01.dbf' resize 5m;
2)增加数据文件(add datafile),
alter tablespace timran add datafile '/u01/oradata/timran11g/timran02.dbf' size 20m;
3)设置表空间自动增长(autoextend),
alter database datafile '/u01/oradata/timran11g/timran01.dbf' autoextend on next 10m maxsize 500m;
例
SQL> create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size 5m;
05:46:08 SQL> create table scott.test1 (id int) tablespace timran;
05:47:11 SQL> insert into scott.test1 values(1);
05:47:15 SQL> insert into scott.test1 select * from scott.test1;
05:47:19 SQL> /
05:47:29 SQL> /
32768 rows created.
05:47:23 SQL> /
insert into scott.test1 select * from scott.test1
*
ERROR at line 1:
ORA-01653: unable to extend table SCOTT.TEST1 by 8 in tablespace TIMRAN
//用第一种方法扩充表空间
05:47:23 SQL> alter database datafile '/u01/oradata/timran11g/timran01.dbf' resize 10m;
05:48:18 SQL> insert into scott.test1 select * from scott.test1;
05:48:25 SQL> /
131072 rows created.
05:48:26 SQL> /
insert into scott.test1 select * from scott.test1
*
ERROR at line 1:
ORA-01653: unable to extend table SCOTT.TEST1 by 128 in tablespace TIMRAN
//用第二种方法扩充表空间:
05:48:57 SQL> alter tablespace timran add datafile '/u01/oradata/timran11g/timran02.dbf' size 20m;
05:49:04 SQL> insert into scott.test1 select * from scott.test1;
05:49:13 SQL> /
524288 rows created.
05:49:14 SQL> /
insert into scott.test1 select * from scott.test1
*
ERROR at line 1:
ORA-01653: unable to extend table SCOTT.TEST1 by 128 in tablespace TIMRAN
//用第三种方法扩充表空间:
05:49:15 SQL> alter database datafile '/u01/oradata/timran11g/timran01.dbf' autoextend on next 10m maxsize 500m;
05:49:33 SQL> insert into scott.test1 select * from scott.test1;
05:49:37 SQL> drop tablespace timran including contents and datafiles;
当我们执行一个事务操作,比如要建立一个大表,或往表里面插入大量数据时,如果中途因为表空间剩余空间不足并且没有开启自动扩展的话,会报 OUT-OF-SPACE错误,事务会中断,白白浪费了时间及数据库资源。那么,Oracle还为我们提供了一个很好的功能:resumable。
在resumable开启的情况下,如果Oracle执行某一个SQL申请不到空间了,会停顿下来(时间可以由TIMEOUT来控制),将相关事务的该语句挂起(suspended),但是不会报OUT-OF-SPACE这个错误。等你把空间的问题解决了,事务自动恢复运行,Oracle会继续从停下来的部分开始刚才的SQL。
待补充 :例子
1、表的功能:存储、管理数据的基本单元(二维表:有行和列组成)
2、表的类型:
1)普通表:heap table :数据存储时,无序的,对它的访问采用全表扫描。
2)分区表:(>2G)对大表进行优化 (Range Partitioning,Hash Partitioning,List Partitioning,Composite Partitioning)
1.表的功能 ,存储、管理数据的的基本单位(二维表:有行和列组成)
2、表的类型:
1) 堆表:heap table,数据存储时,无序的,对它的访问采用全表扫描
2)分区表 表>2G
3)索引组织表(IOT)
4)簇表
5)临时表
6)嵌套表
3、如何将普通表转换为分区表:
1)range分区
create table sale(
product_id varchar2(5), sales_count number(10,2)
)
partition by range(sales_count)
(
partition p1 values less than(1000),
partition p2 values less than(2000),
partition p3 values less than(3000)
);
查看信息:
select * from user_tab_partitions where table_name='SALE';
insert into sale values('1',600);
insert into sale values('2',1000);
insert into sale values('3',2300);
insert into sale values('4',6000);
commit;
select * from sale partition(p1);
select * from sale partition(p2);
增加一个分区
alter table sale add partition p4 values less than(maxvalue);
再看一下, 可以插入6000值了
select * from user_tab_partitions where table_name='SALE';
insert into sale values('4',6000);
会报错——ORA-14402: 。如果一定要改,可以通过打开表的row movement属性来完成。
SQL> select rowid,t1.* from sale partition(p1) t1;
ROWID PRODU SALES_COUNT
------------------ ----- -----------
AAASvUAAEAAAAGVAAA 1 600
SQL> update sale set sales_count=1200 where sales_count=600;
update sale set sales_count=1200 where sales_count=600
*
第 1 行出现错误:
ORA-14402: 更新分区关键字列将导致分区的更改
SQL> alter table sale enable row movement;
SQL> update sale set sales_count=1200 where sales_count=600;
已更新 1 行。
SQL> select rowid,t1.* from sale partition(p2) t1;
ROWID PRODU SALES_COUNT
------------------ ----- -----------
AAASvVAAEAAAAGdAAA 2 1000
AAASvVAAEAAAAGdAAB 1 1200
SQL>create index sale_idx on sale(sales_count) local;
SQL>select * from user_ind_partitions;
如果还想建全表索引(不分区)则(不能与分区表索引同时存在)
SQL>create index sale_idx on sale(sales_count) global
SQL>select * from user_indexes;
create table my_emp(
empno number, ename varchar2(10)
)
partition by hash(empno)
(
partition p1, partition p2
);
select * from user_tab_partitions where table_name='MY_EMP';
插入几个值,看是否均匀插入。
insert into my_emp values(1,'A');
insert into my_emp values(2,'B');
insert into my_emp values(3,'C');
select * from my_emp partition(P1);
select * from my_emp partition(P2);
create table personcity(
id number, name varchar2(10), city varchar2(10)
)
partition by list(city)
(
partition east values('tianjin','dalian'),
partition west values('xian'),
partition south values ('shanghai'),
partition north values ('herbin'),
partition other values (default)
);
insert into personcity values(1,'sohu','tianjin');
insert into personcity values(2,'sina','herbin');
insert into personcity values(3,'yahoo','dalian');
insert into personcity values(4,'360','zhengzhou');
insert into personcity values(5,'baidu','xian');
看结果
select * from personcity partition(east);
把范围分区和散列分区相结合或者 范围分区和列表分区相结合。
create table student(
sno number, sname varchar2(10)
)
partition by range(sno)
subpartition by hash(sname)
subpartitions 4
(
partition p1 values less than(1000),
partition p2 values less than(2000),
partition p3 values less than(maxvalue)
);
有三个range分区,对每个分区会有4个hash分区,共有12个分区。
SQL> select * from user_tab_partitions where table_name='STUDENT';
SQL> select * from user_tab_subpartitions where table_name='STUDENT';
用OEM查看,看scott的student table子分区里的名字是oracle取名。
Oracle11g新增分区
Partition(分区),一直是Oracle数据库引以为傲的一项技术,正是分区的存在让Oracle高效的处理海量数据成为可能。在Oracle11g在10g的分区技术基础上又有了新的发展,使分区技术在易用性和可扩展性上再次得到了增强。
也称为间隔分区,实际上是由range分区引申而来,最终实现了range分区的自动化。
间隔分区的特点:
1).以定长宽度创建分区(比如年、月、具体的数字(比如100、500等))
2).分区字段必须是number或date类型
3).必须至少指定一个range分区(永久分区)
4).当有记录插入时,系统根据需要自动创建新的分区和本地索引
5).已有的范围分区可被转换成间隔分区(通过ALTER TABLE SET INTERVAL选项完成)
又一个人性化的分区类型,System Partitioning,在这个新的类型中,我们不需要指定任何分区键,数据会进入哪个分区完全由应用程序决定,实际上也就是由SQL来决定,终于,我们在Insert语句中可以指定插入哪个分区了。
在10g中,我们知道复合分区只支持Range-List和Range-Hash,而在在11g中复合分区的类型大大增加,现在Range,List,Interval都可以作为Top level分区,而Second level则可以是Range,List,Hash,也就是在11g中可以有3*3=9种复合分区,满足更多的业务需求。
所谓的虚拟列,是指该列数据并不实际存储于磁盘上,只有当读取的时候才实时计算。
(IOT表:如果表经常以主键为索引查询,可建立索引组织表,加快表的访问速度
heap table 数据的存放也是随机的,获取表中的数据时没有明确的先后之分,在进行全表扫描的时候,并不是先插入的数据就先获取。而IOT 就是类似一个全是索引的表,表结构按照索引(主键)有序组织,因此数据存放是按照严格规定的,在数据插入以前就已经确定了其位置,所以不管插入的先后顺序,它在那个物理上的那个位置与插入的先后顺序无关。
由于IOT表是把普通表与其索引合二而一了,这样在进行查询的时候就可以少访问很多blocks,但是插入的时候,速度就比普通的表要慢一些。
IOT表的叶子节点存储了所有表列,因为按主键排序,不需要存储rowid。
设置溢出段将主键和溢出数据分开来存储以提高效率。
说明:pctthreshold制定了在叶子节点中主键和其他列的百分比,当行数据在叶子节点占用大小超出时,将该行的其他列放入溢出段,即overflow到指定的存储空间去,溢出段不是必选的。
create table iot_timran(id int, name char(50), sal int,
constraint pk_timran primary key (id))
organization index pctthreshold 30 overflow tablespace users;
使用select * from user_indexes 查看是否单独有索引。
SQL> select index_name,index_type,table_name from user_indexes;
INDEX_NAME INDEX_TYPE TABLE_NAME
------------------------------ --------------------------- ------------------------------
PK_TIMRAN IOT - TOP IOT_TIMRAN
PK_EMP NORMAL EMP
PK_DEPT NORMAL DEPT
两个相互关联的表的数据,同时放到一个簇数据块中,当以后进行关联读取时,只要扫描一个数据块就可以了,极大地提高了效率。
建立簇表的三个步骤:
1)建立簇段cluster segment
2)基于簇,创建两个相关表,每个表都关联到cluster segment上。
3)为簇创建索引。
create cluster cluster1(code_key number);
create table student(sno1 number, sname varchar2(10)) cluster cluster1(sno1);
create table address(sno2 number,zz varchar2(10)) cluster cluster1(sno2);
create index index1 on cluster cluster1;
查看簇的信息:
select * from user_clusters;
select * from user_clu_columns;
删除簇:
drop table student;
drop table address;
drop cluster cluster1;
用于电子商务的网上购物
临时表用于存放临时数据, 临时表被每个session单独使用,即:不同session看到的临时表中的数据可能不一样。
临时表在临时表空间中存储。没有约束,索引,日志,节省资源,访问数据快。
两种模式:
1)在事务提交时,就会自动删除记录,on commit delete rows。
2)当用户退出session 时,才会自动删除记录, on commit preserve rows。
例:scott:
create global temporary table tmp_student(sno int,sname varchar2(10), sage int) on commit preserve rows;
再用Scott开一个session
两边插入记录看看, 你可以在两个session里插入同样的记录,井水不犯河水!
要删除临时表,先要断开连接,使用disconnect命令,这时临时表消失了,再来删除。
drop table tmp_table
在以前版本中,有只读表空间但没有只读表。11g中增加了新特性----只读表。
SQL> alter table t read only;
SQL> update t set id=2;
update t set id=2
*
第 1 行出现错误:
ORA-12081: 不允许对表 "SCOTT"."T" 进行更新操作
SQL> alter table t read write;
13.1 审计的功能:监控用户在database 的 action (操作)
13.2 审计分类:
1) session :在同一个session,相同的语句只产生一个审计结果(默认)
2) access : 在同一个session,每一个语句产生一个审计结果
13.3 启用审计(默认不启用)
09:54:18 SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/admin/timran/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string NONE (不启用)
09:54:56 SQL> alter system set audit_trail=db scope=spfile;
09:55:02 SQL> startup force;
09:55:23 SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/admin/timran/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string DB
09:55:29 SQL>
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)、应用审计(触发器审计)等。
精细审计Fine Grained Auditing (FGA),操作可以使用dbms_fga包或OEM。
1)添加一个精细度审计策略
sys:
begin
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:28 SQL> conn scott/scott
2)测试一下步骤,再查看审计结果
11:31:35 SQL> select * from emp;
11:31:41 SQL> select * from emp where deptno=20;
11:31:48 SQL> update emp set deptno=10 where empno=7788;
11:32:12 SQL> update emp set sal=8000 where deptno=20;
16:04:54 SQL> update emp set sal=8000 where deptno=10;
11:32:21 SQL> commit;
3)验证审计结果
11:32:24 SQL> conn /as sysdba
11:33:52 SQL> select db_user,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') "time" ,sql_text from dba_fga_audit_trail;
DB_USER time SQL_TEXT
---------- ------------------- --------------------------------------------------
SCOTT 2011-08-11 11:31:42 select * from emp
SCOTT 2011-08-11 11:31:49 select * from emp where deptno=20
SCOTT 2011-08-11 11:32:12 update emp set sal=8000 where empno=7788
SCOTT 2011-08-11 11:32:21 update emp set sal=8000 where deptno=20
精细审计结果存放到fga_log$的基表里,通过dba_fga_audit_trail 查看。
11:34:36 SQL> select count(*) from fga_log$;
COUNT(*)
----------
4
11:36:20 SQL> delete from fga_log$;
11:36:26 SQL> select db_user,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') "time" ,sql_text from dba_fga_audit_trail;
no rows selected
4)禁止、激活、删除FGA的PL/SQL API命令
禁止精细审计
04:08:08 SQL>
exec dbms_fga.disable_policy(-
object_schema=>'scott',
object_name=>'emp',-
policy_name=>'chk_emp');
PL/SQL procedure successfully completed.
激活精细审计
04:10:33 SQL>
exec dbms_fga.enable_policy(-
object_schema=>'scott',
object_name=>'emp',-
policy_name=>'chk_emp');
PL/SQL procedure successfully completed.
删除FGA策略
04:11:52 SQL>
exec dbms_fga.drop_policy(object_schema=>'scott',object_name=>'emp',policy_name=>'chk_emp');
PL/SQL procedure successfully completed.
删除精细审计的结果
04:12:43 SQL> delete from sys.fga_log$;
commit;
(比如文本型)数据导入oracle database。(用于数据导入、不同类型数据库数据迁移)
在段(segment 表)insert 记录
1)normal:将记录插入到segment的HWM(高水位线)以下的块,要首先访问bitmap ,来确定那些block 有free space
2)direct: 将记录插入到segment的HWM(高水位线)以上的从未使用过的块,加快插入速度
SQLLDR keyword=value [,keyword=value,...]
看帮助信息
$/u01/oracle/bin/sqlldr(回车)
*考点:sql*loader与data dump的一个区别:data dump只能读取由它导出的文件,而sql*loader可以读取任何它能解析的第三方文件格式
1)模拟生成数据源
SQL> set time on
11:02:13
SQL>select empno||','||ename||','||job||','||mgr||','||hiredate||','||sal||','||comm||','||deptno from scott.emp;
EMPNO||','||ENAME||','||JOB||','||MGR||','||HIREDATE||','||SAL||','||COMM||','||DEPTNO
------------------------------------------------------------------------------------------------------------------------
7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
14 rows selected.
2)建个目录
[oracle@timran]$mkdir -p /home/oracle/sqlload
[oracle@timran]$cd /home/oracle/sqlload
[oracle@timran sqlload]$vi emp.dat --生成外部表
--------查看数据源
[oracle@timran sqlload]$ more emp.dat
7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
3)普通模式导入
建立控制文件
[oracle@work sqlldr]$ vi emp.ctl
load data
infile '/home/oracle/sqlload/emp.dat'
insert --insert 插入表必须是空表,非空表用append
into table emp1
fields terminated by ','
optionally enclosed by '"'
(
empno,
ename,
job,
mgr,
hiredate,
comm,
sal,
deptno)
4)在scott下建立emp1表(内部表),只要结构不要数据
11:10:13 SQL> create table emp1 as select * from emp where 1=2;
5)执行导入(normal)
[oracle@timran timran]$ sqlldr scott/scott control=emp.ctl log=emp.log
SQL*Loader: Release 10.2.0.1.0 - Production on Thu Aug 11 12:18:36 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Commit point reached - logical record count 14
5)验证:
11:07:12 SQL>
11:07:12 SQL> select * from emp1;
上例的另一种形式是将数据源和控制文件合并在.ctl里描述
[oracle@work sqlldr]$ vi emp.ctl
load data
infile *
append
into table emp1
fields terminated by ','
optionally enclosed by '"'
(
empno,
ename,
job,
mgr,
hiredate,
comm,
sal,
deptno)
begindata
7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
[oracle@timran sqlload]$ sqlldr scott/scott control=emp.ctl log=emp.log
Commit point reached - logical record count 15
[oracle@timran sqlload]$
[oracle@timran sqlload]$
[oracle@timran sqlload]$
[oracle@timran sqlload]$ ll
总计 12
-rw-r--r-- 1 oracle oinstall 1 07-17 11:09 emp.bad
-rw-r--r-- 1 oracle oinstall 782 07-17 11:09 emp.ctl
-rw-r--r-- 1 oracle oinstall 2055 07-17 11:09 emp.log
[oracle@timran sqlload]$ more emp.bad
11:09:34 SQL>SQL> select count(*) from emp1;
COUNT(*)
----------
28
1)listener:在oracle server 上启动,负责接收client process 并派生server process ,与client process 建立session
2)建立listener :通过 netca
3)listener 配置
4)lsnrctl start|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.1 HOST=目标机的IP,如果是windows平台,习惯使用主机名。PORT=1521这是动态注册的默认端口号。
2.2 SERVICE_NAME 是目标机的instance名,不能写错。
2.3 myoracle是连接符,代表的是等号后面整个网络连接字符串,为了便于记忆,它常常和SERVICE_NAME同名。但含义不同。
C:\Documents and Settings\timran>sqlplus sys/oracle@myoracle as sysdba
告诉listener ,database的instance name 和 service name
1)动态注册:listener 采用的是默认端口(1521),当实例启动时,由pmon 自动将instance name 和service name 注册到listener
2)静态注册:当listener 使用的是非标准端口(1521),在listener.ora的文件里手工注册(添加instance name 和 service name)
静态注册:
1)静态注册不需要监听器启动,数据库关闭时可以完成静态注册,因而可以进行远程启动/关闭数据库的任务。
2)静态注册使用用户指定的端口号(非1521),相对隐蔽,安全。
3)静态注册需要listener.ora描述。
动态注册:
1)需要监听器启动,而监听器依赖数据库打开才能开启。所以动态注册无法远程启动数据库。
2)使用标准1521端口,自动注册。
3)可以不使用listener.ora
例子:动态注册和静态注册搭配使用
[oracle@timran admin]$ cat listener.ora
# listener.ora Network Configuration File: /u01/oracle/network/admin/listener.ora
# Generated by Oracle configuration tools.
LSN2 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(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_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/oracle)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = timran.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
--以上是动态监听默认描述
[oracle@timran admin]$
--启动lsn2
[oracle@timran admin]$ netstat -an|grep 1522
tcp 0 0 0.0.0.0:1522 0.0.0.0:* LISTEN
tcp 0 0 192.168.8.240:1522 192.168.8.248:3371 ESTABLISHED
tcp 0 0 192.168.8.240:33187 192.168.8.240:1522 ESTABLISHED
tcp 0 0 192.168.8.240:1522 192.168.8.240:33187 ESTABLISHED
启动静态监听器
[oracle@timran admin]$ lsnrctl start lsn2
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 12-AUG-2011 11:13:33
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /u01/oracle/network/admin/listener.ora
Log messages written to /u01/oracle/network/log/lsn2.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.66)(PORT=1522)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.66)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias lsn2
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 12-AUG-2011 11:13:33
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/oracle/network/admin/listener.ora
Listener Log File /u01/oracle/network/admin/log/lsn2.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.66)(PORT=1522)))
Services Summary...
Service "prod" has 1 instance(s).
Instance "prod", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
----------查看lsn2 status
[oracle@timran admin]$ lsnrctl status lsn2
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 12-AUG-2011 11:16:18
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.66)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias lsn2
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 12-AUG-2011 11:13:33
Uptime 0 days 0 hr. 2 min. 44 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/oracle/network/admin/listener.ora
Listener Log File /u01/oracle/network/log/lsn2.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.66)(PORT=1522)))
Services Summary...
Service "prod" has 1 instance(s).
Instance "prod", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
//status unknown 表示instance 是以静态注册方式注册
客户端的tnsnames.ora配置文件
lsn2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.88)(PORT = 1522))
)
(CONNECT_DATA =
(SERVICE_NAME =timran11g)
)
)
timran11g =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = timran11g)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
说明:lsn2是静态注册链接,端口号1522。timran11g是动态注册链接,端口号1521.
*考点:
1)如果没有使用RAC,那么监听器必须与实例在同一台主机上运行。在RAC环境下,集群中任何主机的任何监听器都可以任何主机的任何实例。
2)如果监听器停止运行,那么不能启动任何新的服务器进程,但不会影响先前已经建立的会话。
3)共享连接方式下,会话与调度进程在会话期间持久存在,而与监听器的连接是短暂的。
自动存储管理即ASM(Automatic Storage Management),是Oracle提供的一项管理磁盘的功能,它是一种以纯软件方式实现的逻辑卷管理器,功能上提供了基于Oracle数据文件的条带化和可选的镜像。ASM的知识同时涉及了数据库管理和系统管理两大领域。
物理卷:指的是独立磁盘,或磁盘分区或磁盘RAID结构。
逻辑卷:LVM(Logical Volume Manager),以软件方式将虚拟磁盘呈现给用户,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文件的。
可以通过ALTER DISKGROUP MOUNT手动加载ASM磁盘,也可以通过指定参数ASM_DISKGROUP动态加载。
AU是建立磁盘组时确定的,缺省是1M,可以指定为1,2,4,8,16,32或64M。
striping分为粗粒度条带(coarse),细粒度条带(fine),相对1M的AU,粗粒度也是1U,而细粒度是128K,它们是针对不同的数据文件制定的不同的条带策略,这些策略已由Oracle模板缺省定义了,比如datafile是粗粒度,control file是细粒度,若有特殊需求,可自定义模板,然后在建立表空间时引用自定义模板,
AU是跨一个磁盘组中的所有磁盘。
striping是跨一个磁盘组中所有磁盘文件。
ASM的镜像是建立在striping上的,是extent级的。这也是对LVM的一个优势。
缺省ASM容错有点类似RAID0+1,磁盘镜像是normal redundancy(两个副本),还可以调整为EXTERNAL REDUNDANCY(无镜像),以及HIGH REDUNDANCY(三个副本)。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实例先shutdwon immediate,ASM实例后退出.
3) 如果ASM实例崩溃,RDBMS也崩溃。如果RDBMS shutdown abort,ASM实例什么也不做。
1)建立条带是必须的,而镜像则是可选的。但ASM文件的默认特性是:同时条带化和镜像文件。
2)ASM文件是由RDBMS实例打开,不是ASM实例打开。
1).Oracle ASMlib 安装
ASMlib是Oracle针对linux 操作系统做的ASM管理套件,ASMlib 简化磁盘管理,取代原来我们在linux 上常用rawdevices 服务。
根据linux不同的内核版本,对应有不同的ASMlib包,下载地址:http://www.oracle.com/technetwork/server-storage/linux/asmlib/index-101839.html
真正需要安装的ASMlib一般是三个包,如下:
oracleasm-kernel-version.arch.rpm
oracleasmlib- version .arch.rpm
oracleasm-support-version.arch.rpm
比如,我的linux内核版本是:
[root@timran ~]# uname -a
Linux timran.localdomain 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:02 EDT 2007 i686 athlon i386 GNU/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
将这三个包加载到linux kernel中
[root@timran oracle]# rpm -qa |grep asm
[root@timran oracle]# rpm -ivh *.rpm
warning: oracleasmlib-2.0.4-1.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing... ########################################### [100%]
1:oracleasm-support ########################################### [ 33%]
2:oracleasm-2.6.18-53.el5########################################### [ 67%]
3:oracleasmlib ########################################### [100%]
[root@timran oracle]# reboot //重启一下,看看主控台显示ASM驱动能否正常加载.
Broadcast message from root (pts/1) (Thu Nov 15 16:23:30 2012):
The system is going down for reboot NOW!
ASMlib包装好后会在/etc/init.d/下出现oracleasm这个service,它可以支持很多关于ASM的操作。
2).启用css服务(Cluster Synchronization Services ),用于同步ASM实例与RDBMS实例
使用root帐户进行配置,配置程序位于$ORACLE_HOME/bin
[root@timran ~]# /u01/oracle/bin/localconfig add
/u01/oracle/bin/localconfig add
/etc/oracle does not exist. Creating it now.
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
Configuration for local CSS has been initialized
Cleaning up Network socket directories
Setting up Network socket directories
Adding to inittab
Startup will be queued to init within 30 seconds.
Checking the status of new Oracle init process...
Expecting the CRS daemons to be up within 600 seconds.
Cluster Synchronization Services is active on these nodes.
timran
Cluster Synchronization Services is active on all the nodes.
Oracle CSS service is installed and running under init(1M)
[root@timran ~]#
3).创建ASM参数文件(使用VI或VIM)
[root@timran dbs]# 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@timran dbs]# chown oracle:oinstall init+ASM.ora
4).创建密码文件
[oracle@timran ~]$orapwd file=$ORACLE_HOME/dbs/orapw+ASM password=redhat entries=5
[oracle@timran ~]$export ORACLE_SID=+ASM
[oracle@timran ~]$sqlplus / as sysdba
Connected to an idle instance.
SQL> startup
ASM instance started
Total System Global Area 284565504 bytes
Fixed Size 1299428 bytes
Variable Size 258100252 bytes
ASM Cache 25165824 bytes
ORA-15110: no diskgroups mounted
实例启动了,可以在linux下看一下+ASM进程
[root@timran dbs]# ps -ef |grep +ASM
oracle 3993 1 0 14:31 ? 00:00:00 asm_pmon_+ASM
oracle 3995 1 0 14:31 ? 00:00:00 asm_vktm_+ASM
oracle 3999 1 0 14:31 ? 00:00:00 asm_diag_+ASM
oracle 4001 1 0 14:31 ? 00:00:00 asm_psp0_+ASM
oracle 4005 1 0 14:31 ? 00:00:00 asm_dia0_+ASM
oracle 4007 1 0 14:31 ? 00:00:00 asm_mman_+ASM
oracle 4009 1 0 14:31 ? 00:00:00 asm_dbw0_+ASM
oracle 4011 1 0 14:31 ? 00:00:00 asm_lgwr_+ASM
oracle 4013 1 0 14:31 ? 00:00:00 asm_ckpt_+ASM
oracle 4015 1 0 14:31 ? 00:00:00 asm_smon_+ASM
oracle 4017 1 0 14:31 ? 00:00:00 asm_rbal_+ASM
oracle 4019 1 0 14:31 ? 00:00:00 asm_gmon_+ASM
oracle 4021 3988 0 14:31 ? 00:00:00 oracle+ASM (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root 4032 3235 0 14:37 pts/2 00:00:00 grep +ASM
如果实例不能启动,可以使用DBCA工具中-Configure Automatic-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 (m for help): p
Disk /dev/sdb: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 123 987966 83 Linux
/dev/sdb2 124 246 987997+ 83 Linux
/dev/sdb3 247 369 987997+ 83 Linux
/dev/sdb4 370 492 987997+ 83 Linux
Command (m for help): w
The partition table has been altered!
[root@timran init.d]# /etc/init.d/oracleasm configure
Configuring the Oracle ASM library driver.
This will configure the on-boot properties of the Oracle ASM library
driver. The following questions will determine whether the driver is
loaded on boot and what permissions it will have. The current values
will be shown in brackets ('[]'). Hitting <ENTER> without typing an
answer will keep that current value. Ctrl-C will abort.
Default user to own the driver interface []: oracle
Default group to own the driver interface []: dba
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done
Initializing the Oracle ASMLib driver: [OK]
[root@timran init.d]# reboot
如果你前面加的ASMlib包正确的话,你将有上面的显示,否则有初始化ASMlib driver失败的提示。
[root@timran dev]#ls /dev/oracleasm/disks //现在还没有创建ASM磁盘,所以没有显示。
创建ASM磁盘,执行下面四行命令:
[root@timran disks]# /etc/init.d/oracleasm createdisk VOL1 /dev/sdb1
Marking disk "VOL1" as an ASM disk: [ OK ]
[root@timran disks]# /etc/init.d/oracleasm createdisk VOL2 /dev/sdb2
Marking disk "VOL2" as an ASM disk: [ OK ]
[root@timran disks]# /etc/init.d/oracleasm createdisk VOL3 /dev/sdb3
Marking disk "VOL3" as an ASM disk: [ OK ]
[root@timran disks]# /etc/init.d/oracleasm createdisk VOL4 /dev/sdb4
Marking disk "VOL4" as an ASM disk: [ OK ]
[root@timran disks]#
[root@timran dev]# ls /dev/oracleasm/disks
VOL1 VOL2 VOL3 VOL4
此时ASM磁盘已经建好,接下来可以建ASM磁盘组了。
6).创建ASM磁盘组
建磁盘组有两个办法,一个是使用DBCA工具,另一个是使用sqlplus命令
使用sqlplus命令:
注意:加磁盘组必须在+ASM启动以后
#su - oracle
$export ORACLE_SID=+ASM
$sqlplus / as sysdba
SQL>
SQL> startup
[oracle@timran ~]$export ORACLE_SID=+ASM
[oracle@timran ~]$sqlplus as sysdba
Connected to an idle instance.
SQL> startup
ASM instance started
ORA-15110: no diskgroups mounted
加磁盘组前要改一下这个参数
SQL> alter system set asm_diskstring='/dev/oracleasm/disks/VOL*';
create diskgroup DG1 normal redundancy
failgroup FG1 disk '/dev/oracleasm/disks/VOL1'name VOL1,'/dev/oracleasm/disks/VOL2' name VOL2
failgroup FG2 disk '/dev/oracleasm/disks/VOL3'name VOL3,'/dev/oracleasm/disks/VOL4' name VOL4;
SQL> col name for a10;
SQL> select NAME,STATE,FREE_MB,REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB from v$asm_diskgroup;
NAME STATE FREE_MB USABLE_FILE_MB
---------- ----------- ---------- --------------
DG1 MOUNTED 3750 964
SQL> col failgroup for a10;
SQL> select GROUP_NUMBER,DISK_NUMBER,NAME,FAILGROUP,STATE,TOTAL_MB from v$asm_disk;
GROUP_NUMBER DISK_NUMBER NAME FAILGROUP STATE TOTAL_MB
------------ ----------- ---------- ---------- -------- ----------
1 3 VOL4 FG2 NORMAL 964
1 2 VOL3 FG2 NORMAL 964
1 1 VOL2 FG1 NORMAL 964
1 0 VOL1 FG1 NORMAL 964
重新启动前将参数文件的第一行#去掉
[root@timran dbs]# vi /u01/oracle/dbs/init+ASM.ora
*.asm_diskgroups='DG1'
到此,建立ASM的基本内容已经完成了。重启系统,检查一下看看磁盘组是否能够自动mounted了。
SQL> exit
[oracle@timran ~]$ export ORACLE_SID=timran11g
[oracle@timran ~]$ sqlplus / as sysdba
[root@timran ~]# su - oracle
[oracle@timran ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.1.0.6.0 - Production on Thu Nov 15 21:11:29 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORA-32004: obsolete and/or deprecated parameter(s) specified
ASM instance started
Total System Global Area 284565504 bytes
Fixed Size 1299428 bytes
Variable Size 258100252 bytes
ASM Cache 25165824 bytes
ASM diskgroups mounted
SQL>
7)测试ASM是否可以工作
启动了+ASM实例正常后,再启动RDBMS实例,然后建立一个+ASM上的表空间testasm做测试。
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL*Plus: Release 11.1.0.6.0 - Production on Thu Nov 15 21:26:00 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1300352 bytes
Variable Size 339740800 bytes
Database Buffers 75497472 bytes
Redo Buffers 6131712 bytes
Database mounted.
Database opened.
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
2 UNDOTBS1 YES NO YES
4 USERS YES NO YES
3 TEMP NO NO YES
6 EXAMPLE YES NO YES
6 rows selected.
SQL> create tablespace testasm datafile '+DG1';
Tablespace created.
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
2 UNDOTBS1 YES NO YES
4 USERS YES NO YES
3 TEMP NO NO YES
6 EXAMPLE YES NO YES
7 TESTASM YES NO YES
7 rows selected.
SQL>select file#,name from v$datafile;
FILE# NAME
---------- --------------------------------------------------
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
6 rows selected.
SQL> conn scott/scott
SQL> create table test(id int) tablespace testasm;
SQL> insert into test values(1);
SQL> commit;
SQL> select * from test;
ID
----------
1
8)删除ASM
SQL> drop tablespace testasm including contents and datafiles;
[root@timran ~]# su - oracle
[oracle@timran ~]$ export ORACLE_SID=+ASM
[oracle@timran ~]$ sqlplus / as sysdb
SQL> drop diskgroup dg1 including contents; //删除ASM组和ASM磁盘要在实例启动时做。
#/etc/init.d/oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
#/etc/init.d/oracleasm deletedisk vol1
#/etc/init.d/oracleasm deletedisk vol2
#/etc/init.d/oracleasm deletedisk vol3
#/etc/init.d/oracleasm deletedisk vol4
SQL>shutdown abort //关闭ASM实例
#/u01/oracle/bin/localconfig delete //删除css信息
#rm /u01/oracle/dbs/*ASM* //删除ASM参数文件及口令文件
#vi /etc/oratab //删除/etc/oratab文件中的ASM实例相关行
[root@timran init.d]# rpm -qa |grep asm //查询asm有关的rpm包,
oracleasm-2.6.18-53.el5-2.0.4-1.el5
oracleasm-support-2.1.7-1.el5
oracleasmlib-2.0.4-1.el5
[root@timran init.d]# rpm -e oracleasmlib-2.0.4-1.el5 //删除这三个rpm包
[root@timran init.d]# rpm -e oracleasm-2.6.18-53.el5-2.0.4-1.el5
[root@timran init.d]# rpm -e oracleasm-support-2.1.7-1.el5
[root@timran init.d]#
[root@timran init.d]# ll /etc/init.d/oracleasm //确信oracleasm文件删掉了
ls: /etc/init.d/oracleasm: No such file or directory
[root@timran init.d]# shutdown -h now 关闭系统, 去window下直接删除小魔方(后加入的虚盘)。
重启系统 看看sdb已经没有了。
[root@timran dev]# ll /dev/sd*
brw-r----- 1 root disk 8, 0 Dec 28 17:35 sda
brw-r----- 1 root disk 8, 1 Dec 28 17:35 sda1
brw-r----- 1 root disk 8, 2 Dec 28 17:35 sda2
[root@timran dev]#
9)安装测试完成后碰到了一个问题:当启动ASM实例后再启动RDBMS实例时报错:
ORA-00845: MEMORY_TARGET not supported on this system
这个问题是由于设置SGA的大小超过了操作系统/dev/shm的大小:
查看并更改/etc/fstab文件后,问题解决。
[root@timran ~]# df -h /dev/shm
Filesystem Size Used Avail Use% Mounted on
tmpfs 506M 158M 348M 32% /dev/shm
[root@timran ~]#
[root@timran ~]#
[root@timran ~]#
[root@timran ~]# vi /etc/fstab
LABEL=/ / ext3 defaults 1 1
tmpfs /dev/shm tmpfs defaults,size=800m 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda2 swap swap defaults 0 0
*再强调一下以下考点:
1)ASM只能存储数据库文件,不能存储二进制文件。即只能用于数据库和恢复文件,因此Oracle的主目录以及跟踪、告警、口令及静态参数文 件务必保存在常规文件系统上。
2)ASM使用RAC,但不是必须的,因为可以使用第三方的集群卷管理器,ASM不仅仅使用RAC,因为它同样适用于单实例的非集群数据库。
3)ASM镜像默认是单镜像,但是可以设置为无镜像或双镜像,不能禁用条带化。
4)常规的磁盘活动不涉及ASM实例,ASM的功能是实现对文件可用性管理和控制,它不执行实际的I/O操作。
expdp/impdp:数据泵
传统的导出导入程序指的是exp/imp,用于实施数据库的逻辑备份和恢复。
导出程序exp将数据库中的对象定义和数据备份到一个操作系统二进制文件中。
导入程序imp读取二进制导出文件并将对象和数据载入数据库中
传统的导出导入程序是客户端工具。在$ORACLE_HOME/bin下
导出和导入实用程序的特点有:
1)可以按时间保存表结构和数据
2)允许导出指定的表,并重新导入到新的数据库中
3)可以把数据库迁移到另外一台异构服务器上
4)在两个不同版本的Oracle数据库之间传输数据
5)在联机状态下进行备份和恢复
6)可以重新组织表的存储结构,减少链接及磁盘碎片
使用以下三种方法调用导出和导入实用程序:
1,交互提示符:以交互的方式提示用户逐个输入参数的值。
2,命令行参数:在命令行指定执行程序的参数和参数值。
3,参数文件:允许用户将运行参数和参数值存储在参数文件中,以便重复使用参数
导出和导入数据库对象的四种模式是:
1,数据库模式:导出和导入整个数据库中的所有对象
2,表空间模式:导出和导入一个或多个指定的表空间中的所有对象
3,用户模式:导出和导入一个用户模式中的所有对象
4,表模式:导出和导入一个或多个指定的表或表分区
1)scott导入导出自己的表,一般是从服务器导出到客户端(在cmd下操作)
SQL> create table emp1 as select * from emp;
SQL> create table dept1 as select * from dept;
C:\Documents and Settings\timran>exp scott/scott@timran11g file=d:empdept1.dmp tables=(emp1,dept1)
连接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 UTF8 NCHAR 字符集
即将导出指定的表通过常规路径...
. . 正在导出表 EMP1导出了 14 行
. . 正在导出表 DEPT1导出了 4 行
成功终止导出, 没有出现警告。
sysdba下导入导出其他用户的表
再导入server里
SQL> drop table emp1 purge;
SQL> drop table dept1 purge;
C:\Documents and Settings\timran>imp scott/scott@timran11g file=d:empdept1.dmp
连接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
已经完成 ZHS16GBK 字符集和 UTF8 NCHAR 字符集中的导入
. 正在将 SCOTT 的对象导入到 SCOTT
. 正在将 SCOTT 的对象导入到 SCOTT
. . 正在导入表 "EMP1"导入了 14 行
. . 正在导入表 "DEPT1"导入了 4 行
成功终止导入, 没有出现警告。
使用sys导出scott的两个表
C:\Documents and Settings\timran>exp 'sys/system@timran11g as sysdba' file=d:scott.dmp tables=(scott.emp1, scott.dept1)
连接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 UTF8 NCHAR 字符集
即将导出指定的表通过常规路径...
当前的用户已更改为 SCOTT
. . 正在导出表 EMP1导出了 14 行
. . 正在导出表 DEPT1导出了 4 行
成功终止导出, 没有出现警告。
SQL> drop table emp1 purge;
SQL> drop table dept1 purge;
使用sys再导入scott的这两个表
C:\Documents and Settings\timran>imp 'sys/system@timran11g as sysdba' file=d:scott.dmp fromuser=scott
Import: Release 11.1.0.6.0 - Production on 星期一 7月 30 21:59:58 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
已经完成 ZHS16GBK 字符集和 UTF8 NCHAR 字符集中的导入
. 正在将 SYS 的对象导入到 SYS
. 正在将 SCOTT 的对象导入到 SCOTT
. . 正在导入表 "EMP1"导入了 14 行
. . 正在导入表 "DEPT1"导入了 4 行
成功终止导入, 没有出现警告。
sys导出scott表, scott导入(报错)
C:\Documents and Settings\timran>exp 'sys/system@timran11g as sysdba' file=d:sysscott.dmp tables=(scott.emp1,scott.dept1)
Export: Release 11.1.0.6.0 - Production on 星期五 8月 3 14:34:52 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 UTF8 NCHAR 字符集
即将导出指定的表通过常规路径...
当前的用户已更改为 SCOTT
. . 正在导出表 EMP1导出了 14 行
. . 正在导出表 DEPT1导出了 4 行
成功终止导出, 没有出现警告。
scott导入
C:\Documents and Settings\timran>imp scott/scott@timran11g file=d:sysscott.dmp
连接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件
IMP-00000: 未成功终止导入
C:\Documents and Settings\timran>
当前用户scott导出自己的所有对象, 注意仅仅导出的是schema的object,也就是说这个导出不包括数据字典中的信息,比如用户账户,及原有的一些系统权限等等。
C:\Documents and Settings\timran>exp scott/scott@timran11g file=d:scott.dmp owner=scott
SQL> drop user scott cascade;
SQL> create user scott identified by scott;
SQL> grant connect,resource to scott;
C:\Documents and Settings\timran>imp scott/scott@timran11g file=d:scott.dmp
连接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
已经完成 ZHS16GBK 字符集和 UTF8 NCHAR 字符集中的导入
. 正在将 SCOTT 的对象导入到 SCOTT
. . 正在导入表 "BONUS"导入了 0 行
. . 正在导入表 "DEPT"导入了 4 行
. . 正在导入表 "DEPT1"导入了 4 行
. . 正在导入表 "EMP"导入了 14 行
. . 正在导入表 "EMP1"导入了 14 行
. . 正在导入表 "SALGRADE"导入了 5 行
即将启用约束条件...
成功终止导入, 没有出现警告。
//如果用sys来完成也可以使用如下命令:
C:\Documents and Settings\timran>imp 'sys/system@timran11g as sysdba' file=d:scott.dmp fromuser=scott touser=scott
//sys用户也可以将导出的scott的内容导入给其他用户
C:\Documents and Settings\timran>imp 'sys/system@timran11g as sysdba' file=d:scott.dmp fromuser=scott touser=tim
17.1.3 导入导出表空间
Oracle10g后,引入了导入导出可传输表空间技术,使表空间的迁移更加快速高效
模拟场景:xp/orcl到linux/timran11g(中文字符集)可传输表空间的导入导出:
1)在xp/orcl上建立表空间
sys:
create tablespace tb1 datafile 'd:/mytb1.dbf' size 5m;
scott:
create table 测试 (姓名 char(10),年龄 int) tablespace tb1;
insert into 测试 values('张三',20);
insert into 测试 values('王小二',18);
commit;
2)导出tb1表空间,先设为只读;
sys:
alter tablespace tb1 read only;
xp:cmd下
exp 'sys/system@orcl as sysdba' tablespaces=tb1 transport_tablespace=y file=d:\exp_tb1.dmp
Export: Release 11.1.0.6.0 - Production on 星期五 8月 3 16:11:25 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
注: 将不导出表数据 (行)
即将导出可传输的表空间元数据...
对于表空间 TB1...
. 正在导出簇定义
. 正在导出表定义
. . 正在导出表 测试
. 正在导出引用完整性约束条件
. 正在导出触发器
. 结束导出可传输的表空间元数据
成功终止导出, 没有出现警告。
3)以xmanager把exp_tb1.dmp和MYTB1.DBF都传输到linux/timran里
目录如下:/u01/oradata/timran11g
4)在linux的$下执行导入
[oracle@timran ~]$ imp userid=\'sys/system as sysdba\' tablespaces=tb1 file=/u01/oradata/timran11g/exp_tb1.dmp transport_tablespace=y datafiles=/u01/oradata/timran11g/MYTB1.DBF
Import: Release 11.1.0.6.0 - Production on 星期五 8月 2 22:19:50 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
Export file created by EXPORT:V10.02.01 via conventional path
About to import transportable tablespace(s) metadata...
import done in ZHS16GBK character set and UTF8 NCHAR character set
export server uses AL16UTF16 NCHAR character set (possible ncharset conversion)
. importing SYS's objects into SYS
. importing SYS's objects into SYS
. importing SCOTT's objects into SCOTT
. . importing table "测试"
. importing SYS's objects into SYS
Import terminated successfully without warnings.
5)进入linux/timran下验证
sys:
select tablespace_name,status from dba_tablespaces;
6)重设回读写方式
alter tablespace tb1 read write;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMP ONLINE
USERS ONLINE
EXAMPLE ONLINE
TB1 ONLINE
TEXT ONLINE
TEST1 ONLINE
TIMRAN ONLINE
6)验证
scott:
select * from tab;
select * from 测试;
select table_name,tablespace_name from user_tables;
17.1.4 导出整个数据库的对象
C:\Documents and Settings\timran>exp 'sys/system@timran11g as sysdba' file=d:full.dmp full=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> create directory MY_DIR as '/u01/oradata/timran11g/dir1';
3)为scott授予目录权限
SQL> grant read,write on directory MY_DIR to scott;
4)导出scott的emp dept表, 导出过程中在server端有MT表出现SYS_EXPORT_TABLE_01,导出完成后MT表自动消失
C:\Documents and Settings\timran>expdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp tables=(emp,dept)
Export: Release 11.1.0.6.0 - Production on 星期二, 31 7月, 2012 9:54:45
Copyright (c) 2003, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
Starting "SCOTT"."SYS_EXPORT_TABLE_01": scott/********@timran directory=MY_DIR dumpfile=expdp_scott1.dmp tables=(emp,de
pt)
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 128 KB
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
. . exported "SCOTT"."DEPT" 5.648 KB 4 rows
. . exported "SCOTT"."EMP" 7.812 KB 14 rows
Master table "SCOTT"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SCOTT.SYS_EXPORT_TABLE_01 is:
/u01/oradata/timran11g/dir1/expdp_scott1.dmp
Job "SCOTT"."SYS_EXPORT_TABLE_01" successfully completed at 09:51:14
看看目录下的导出的文件
[oracle@timran dir1]$ ll /
总计 132
-rw-r----- 1 oracle oinstall 126976 07-30 09:51 expdp_scott1.dmp
-rw-r--r-- 1 oracle oinstall 1387 07-30 09:51 export.log
[oracle@timran dir1]$
5)导入expdp_scott1.dmp实验 先删掉原来的emp,dept 两个表
SQL> conn scott/scott
SQL> drop table emp purge;
SQL> drop table dept purge;
C:\Documents and Settings\timran>impdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp
Import: Release 11.1.0.6.0 - Production on 星期二, 31 7月, 2012 10:16:04
Copyright (c) 2003, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP and Data Mining options
Master table "SCOTT"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SCOTT"."SYS_IMPORT_FULL_01": scott/********@timran directory=MY_DIR dumpfile=expdp_scott1.dmp
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."DEPT" 5.648 KB 4 rows
. . imported "SCOTT"."EMP" 7.812 KB 14 rows
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Job "SCOTT"."SYS_IMPORT_FULL_01" successfully completed at 10:04:37
6)导出scott的emp detp的数据,但不导出结构
expdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp tables=(emp,dept) content=data_only reuse_dumpfiles=y
impdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp_scott1.dmp
7)导出scott用户
expdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp1.dmp schemas=scott //注意与exp的区别,schemas代替了owner的写法
impdp scott/scott@timran11g directory=MY_DIR dumpfile=expdp1.dmp
18.1、物化视图作用
1) 数据仓库中的物化视图主要用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,从而快速的得到结果。
2) 物化视图和表一样可以直接进行查询。物化视图还用于复制、移动计算等方面。
18.2 物化视图创建时的权限
如果创建基于主键的物化视图,则必须具有访问主表、访问主表的日志、create MATERIALIZED VIEW这三个权限。
如果创建基于rowid的物化视图,则必须具有访问主表、create MATERIALIZED VIEW这两个权限。
18.3 创建物化视图语法
create materialized view [view_name]
refresh [fast|complete|force]
[
on [commit|demand] |
start with (start_time) next (next_time)
]
as
{创建物化视图用的查询语句}
18.4 物化视图创建时的选项
1) 查询重写(Query Rewrite):查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果。默认为DISABLE QUERY REWRITE。
2) 物化视图日志:如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。
3) 刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。ON COMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND。
18.5 示例
测试环境:生产库(linux)+备份库(xp)
1)建立link连接
备份库:
C:\Documents and Settings\timran>sqlplus sys/system@orcl as sysdba
sys:
SQL> create public database link my_link connect to scott identified by scott using 'timran11g';
//如果以前建立过,提示重名的话可以使用下面语句删掉 SQL> drop public database link my_link;
若想查看所有的数据库链接,进入系统管理员SQL>操作符下,运行命令:
SQL>select owner,object_name from dba_objects where object_type='DATABASE LINK';
OWNER OBJECT_NAME
---------------------------------- ---------------------------------------
PUBLIC MY_LINK.REGRESS.RDBMS.DEV.US.ORACLE.COM
2)在备份库上测试与生产库(启动监听)的访问连接是否成功。
scott:
SQL> select * from tab; //看备份库(自己)
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
测试 TABLE
SQL> select * from tab@my_link; //看生产库(别人)
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
范例1 基于主键的物化视图
生产库:(远端linux)
scott:
SQL>create table test(id int primary key,name char(10));
SQL>create materialized view log on test;
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
MLOG$_TEST TABLE
RUPD$_TEST TABLE
SALGRADE TABLE
TEST TABLE
备份数据库(本地xp)
sys:
SQL>grant create materialized view to scott;
scott:
SQL>create materialized view test_view refresh
fast
start with sysdate
next sysdate+1/2880
with primary key
as select * from scott.test@my_link;
//1440分钟时24小时,1/1440是1分钟,1/2880是30秒。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
TEST_VIEW TABLE
测试 TABLE
生产库 scott:
SQL>insert into test values(1,'sina');
SQL>commit;
备份库 scott:
SQL> select * from test_view;
未选定行
---30秒以后...
SQL> select * from test_view;
ID NAME
---------- ----------
1 sina
生产库 scott:
SQL> insert into test values(2,'sohu');
SQL> commit;
备份库 scott:
SQL> select * from test_view;
ID NAME
---------- ----------
1 sina
2 sohu
范例2 基于rowid的物化视图
生产库 scott:
SQL>drop table test purge;
SQL>SQL> create table emp1 as select * from emp;
备份库 scott:
SQL>drop materialized view test_view;
SQL>create materialized view emp1_view refresh with rowid
start with sysdate
next sysdate+1/2880
as select deptno,sum(sal),avg(sal) from scott.emp1@my_link group by deptno;
备份库 scott:
SQL> select * from emp1_view;
DEPTNO SUM(SAL) AVG(SAL)
---------- ---------- ----------
30 9400 1566.66667
20 10875 2175
10 8750 2916.66667
生产库 scott:
SQL> update emp1 set sal=sal+100;
SQL>commit;
备份库 scott:
SQL> select * from emp1_view;
DEPTNO SUM(SAL) AVG(SAL)
---------- ---------- ----------
30 10000 1666.66667
20 11375 2275
10 9050 3016.66667
范例3 使用job, 执行基于primary key 的物化视图
生产库 scott:
SQL>drop table test purge;
SQL>create table test(id int primary key,name char(10));
SQL>create materialized view log on test;
备份库 scott:
SQL>drop materialized view test_view
SQL>create materialized view test_view
as select * from scott.test@my_link;
create or replace procedure testview as
begin
dbms_mview.refresh('TEST_VIEW');
end;
/
variable job1 number;
begin
dbms_job.submit(:job1,'testview;',sysdate,'sysdate+1/2880');
end;
/
begin
dbms_job.run(:job1);
end;
/
测试结果:
生产库 scott:
SQL> insert into test values(1,'tim');
SQL> commit;
备份库 scott:
SQL> select *from test_view;
ID NAME
---------- ----------
1 tim
生产库 scott:
SQL> insert into test values(2,'ran');
SQL> commit;
备份库 scott:
SQL> select *from test_view;
SQL> commit;
ID NAME
---------- ----------
1 tim
2 ran
生产库 scott:
SQL> delete test where id=2;
SQL> update test set name='timran' where id=1;
SQL> commit;
备份库 scott:
SQL> select * from test_view;
ID NAME
---------- ----------
1 timran