11.23.06
403e读书笔记二–ORACLE备份恢复产品及特点
简要介绍所有ORACLE备份恢复产品及特征
Oracle支持多种备份恢复 Read the rest of this entry »
SELECT happiness,friends,technology,study FROM LIFE@DAVID.GUO
简要介绍所有ORACLE备份恢复产品及特征
Oracle支持多种备份恢复 Read the rest of this entry »
数据库服务结构
备份与恢复组件相关术语
数据库的ACID属性
REDO与UNDO的区别
1、实例与数据库
实例=进程+内存结构,启动和关闭的都是实例
数据库=磁盘上的物理文件的集合:数据文件+控制文件+日志文件
(参数文件,密码文件和归档日志文件属辅助文件)
一个完整的数据库备份应包括以上所有文件。
进程:DBWR,LGWR,CKPT,SMON,PMON,ARCn
归档模式:非归档模式+一定备份策略一般来说可以保障数据安全性,
但是在故障恢复时有较多局限性。例如不能脱机数据文件,不能进行热备。
前几天刚刚处理的一个现场故障就是因为非归档下的一个数据文件损坏而
不得不重建相应表空间,
如果是归档模式而且归档日志存在的话就不需要重建表空间了。
BLOCK and DATA BLOCK:oracle数据库文件由块组成(通常是一个块由多个
操作系统块组成)。块根据存储内容的不同可分为:
data block,index block,segment header,bitmap header,file header。
通常用data block来取代block以区别于redo和controlfile的block
数据文件与表空间:
多元化控制文件与日志文件:oracle推荐使用多元化的控制文件和日志文件
(不是磁盘镜像),因为磁盘镜像不能保护delete操作带来的文件丢失风险。
2、常见数据库操作
select:select操作也可能导致数据库发生写操作。服务器进程读取数据到缓冲区,
提取数据,返回给客户端。在这个过程中需要分配空间以容纳读取的数据块,
因此可能导致已经commit的脏数据块写入数据文件已腾出空间。
(oracle定义一些规则空间脏数据的写入,例如:达到阀值,
扫描40%的数据块仍没找到可用空闲块,checkpoint等等)。
DML:服务器进程读取相应的数据块到缓冲区,更新日志缓冲区和数据块.
更新数据块时需要首先更新回滚段和段头,这些操作均需要产生redo信息.
在需要的时候数据块被写入文件.
commit:服务器进程更新回滚段头(以释放回滚段),产生少量的redo,
然后请求LGWR进程empty日志缓存区,完成后返回‘complete’给用户。
Rollback:服务器进程读取事务所属的回滚段信息,将老的数据放回数据块中(
偶尔会将改数据块向前移,因为可能有其他事务修改了该块中的其他行,
不能恢复到原来的状态)。这里对块的改变只产生redo,不产生undo信息。
同commit一样,最后会产生标记并请求flush redo buffer。
DDL:与DML类似,在字典缓冲区完成。
3、备份与恢复
实例恢复:在断电或shutdown abort之后数据重新启动时自动执行,
只需要在线日志文件。未提交的数据的延迟回归将在数据库打开之后完成。
媒体恢复:使用recover命令执行。可能需要归档和在线日志文件。
数据库在发现数据文件头与控制文件不一致,或数据文件未正常关闭时将请求进行媒体恢复。
未提交的延迟事务回滚在数据库打开之后完成。
冷备(脱机备份):数据库关闭情况下手工备份文件或使用RMAN在mount状态下进行
热备(联机备份):数据库必须运行在归档模式下。
手工备份前需要将表空间置于热备模式。
使用RMAN将采用特殊的机制已保证块的一致性,因此不需要处于热备模式。
恢复:分成两部分restore和recover。restore从备份中恢复拷贝到数据库路径。
recover应用归档或在线日志。
不一致类型:
约束不一致:例如外健约束,这种情况一般发生在约束被disable或enable novalidate时,
属于应用上的不一致,可通过analyze table validate structure检测到
结构一致:例如数据文件丢失,数据库找不到字典中描述的文件时将无法启动数据库。
另外一种情况是索引叶结点没有指向正确的数据行,通常是异常或bug引起,
可通用analyze检测到错误
物理不一致:在数据块的内部,除了包含了表的内容的数据行之外,还有很多结构,
例如指向外健、ITL槽的指针等,如果这些指针指向了错误的块或不存在,
就会产生物理不一致。
另外数据库的不同部分,例如物理文件中的块和内存结构中的被修改过的块在
发生异常关闭后将导致数据库不一致,数据文件的各个块也可能由于某些原因
不在同一个时间点(SCN)。
这些都是物理不一致。
数据库的ACID属性—Atomicity(原子性),Consistency(一致性),
Isolation(独立性),Durability(容错性)
A-事务对数据库状态的修改具有原子性。要么成功,要么失败回退到修改之前的状态
C-事务对数据库状态的修改不违反任何完整性约束
I-对并发事务的支持,oracle的读一致性通过undo构建block的不同版本来实现
D-事务故障恢复,oracle实例恢复保障事务容错,任何提交或未提交的事务均可得到恢复
REDO与UNDO
redo—后映像,用于重复一个数据库的修改,在修改结果丢失后重做,
保障数据库的容错性,任何数据块的改动(包括表,索引,undo数据,控制文件,
数据块结构指针,文件等等)都将产生redo信息除非采用nologging忽略日志记录。
注意temp data不产生日志。
global temporary table不记录数据修改日志,但是会产生undo,进而产生redo信息.
undo—前映像,用于获取修改前的原数据,回滚事务时需要用以保障事务原子性,
保障数据库的独立性。任何用户或数据字典数据的改动都将产生undo信息。
undo信息是不能被忽略的,undo data的改变也会产生redo信息.
恢复与事务
恢复的特点:使用redo,用于非预料的数据库崩溃,通常需要手工干预
事务的特点:需要undo作读一致性,产生redo和undo,使用undo作rollback
主要内容:
描述四种使用诊断event的方法;
描述各种情况下使用event的工具以及语法;
描述event的内部工作顺序;
Read the rest of this entry »这个星期可能是流年不利.
昨天下午,福州数据库宕机,本来是因为oracle慢,结果,现场的兄弟把windows中的oracle服务给停止了,我那里是mscs的群集,结果导致ip地址很阵列在不同的机器上,先是其他兄弟折腾了会,结果我上去,开始还没发现,qq的远程连接太慢了,等我发现的时候,已经晚上8点多了.最后的原因,是因为一个备份放到我的oracle_home的盘,搞的oracle_home的盘空余0字节,整个库hant后,他们停库导致的.
今天上午,温州库宕机,原因是因为索引表空间的一个datafile有坏块,他们直接把数据库重启了,结果列,唉,起不来了,本来是个感冒,给我折腾成手术,唉.
现场的兄弟的,数据库问题不是通过重启就能解决的好不好,千万不要乱动呀,不要把感冒搞成了癌症.
这两天开发的人向我抱怨,在Sybase中写的procedure无法捕获异常,所以很多应用都出现了问题.昨天搞定了Oracle 8i中的xml的问题后,今天开始搞这玩意.
这种问题,首先当然是去google了下,发现没有啥收获,然后只能去sybase官方网站查手册,发现手册中也没有太多记载(不知道是不是不能实现的就不记载).
实在没有办法,只能call无言这小子,看看他有啥办法.没想到,他的结果是,在sybase12.5.2的procedure中无法进行异常捕获,我发了段测试代码给他,他也调试不出来这种东西.
既然如此,就call 800了(最后才call 800,是因为客户的服务已经过期了,不知道是不是我的声音比较有磁性,居然通过了接线员,到达工程师那里了),工程师要求我将测试代码以及环境发给他,发过去以后,工程师回了个邮件,内容大致如下:
@@error 的用法不正确,在事务中要使用局部变量保存@@error,再作处理!
稍候就这个问题写个程序给您!
我等,等呀等,等了2小时,没程序过来,我再次call 800,并找到刚才的工程师,开口就告诉我,不好意思,比想像的复杂,Sybase没有办法进行异常处理,而且procedure中的任何错误,会导致整个procedure直接退出,我靠,ft,简直是惊喜.
再看看我们的程序,这样的话,应用的更改还不知道多大.直接问Sybase的800,这个东西比较土的吗,没oracle好,他也直接说,是的,是不好,这个没处理好.唉.
俺又开始怀念Oracle了.没办法,只能修改所有的应用,先try,然后do,可是,正确的方法只有一种,错误的方法千千万,我该如何去try列,呵呵.这个问题,还是留给开发吧.我只能对开发说,sorry,sybase这个玩意不支持在procedure中进行异常捕获,你还是把程序的健壮性搞的更强吧.
昨天一上班就被老板喊去,一个兄弟在现场和其他公司的系统作接口的时候,需要在procedure中得到xml格式的内容然后传给接口,但是他们在作开发的时候,在9i中已经可以得到,但是在8i中,无法通过编译
我和brotherxiao两个人去查了下资料,看了下手册,原来是由于8i和9i对于xml的内容的函数有所转变,9i对xml的支持,无需任何特别操作,而8i则需要安装SQL Utility">XSU.现将过程记录如下:
首先需要安装XSU,步骤如下:
在数据库主机上,打开一个cmd窗口,然后依次执行以下命令:
Sqlplus /nolog
Connect /as sysdba
@F:oraclerdbmsadmincatxsu.sql
(注意:这里的绝对路径,要写为数据库主机上的oracle的rdbms的admin的绝对路径,我这里是在f:oraclerdbmsadmin)
因为这里我一写上代码,就提示我服务不可用,所以我将测试使用的代码放在这里 ,这个脚本在windows2000,oracle8.1.7.4上测试通过.另外,通过我们的测试发现,有些db可能在创建的时候,就没有装jvm,或者有些安装的jvm并不完全,对此,要进行如下的操作.
在plsql中执行如下的查询
SELECT count(*)
FROM dba_objects
WHERE object_type LIKE ‘%JAVA%’;
如果结果小于10400,则可以知道,该数据库没有安装JVM,该数据库将不支持java的包,需要安装JVM,而对于Oracle中,最简单的安装JVM的方法为执行?/rdbms/javavm/install/initjvm.sql,但是我在测试中发现,这个方法基本上无法成功的得到我们要的结果,为此,我们将进行如下的操作
在初始化参数中增加如下的隐含参数 SYSTEMTRIG_ENABLED = FALSE,并保证shared_pool_size>=50MB,java_pool_size>=20MB,system表空间至少100MB空间空闲,RBS空间,至少250MB空闲
启动一个dos窗口,执行svrmgrl(禁止使用sqlplus执行以下步骤)
然后依照下面的操作步骤执行
SVRMGR> connect internal
SVRMGR> shutdown immediate
SVRMGR> exit
执行这些以后,重新启动一个dos窗口(禁止因为偷懒,而不重新启动一个dos窗口,我已经偷懒过,会失败),然后再次输入svrmgrl
在提示符SVRMGR>后,输入 @c:rmjvm.sql;(注意:这里的rmjvm.sql为附件中的sql,这里写的是这个sql的绝对路径),一般这个操作需要作大约20分钟左右.这个操作完成后,系统会退出到dos提示符下.
然后输入svrmgrl,再次进入到SVRMGR>提示符下,输入 @c:jvminst.sql; (注意:这里的rmjvm.sql为附件中的sql,这里写的是这个sql的绝对路径),该操作大约需要执行30-45分钟左右,执行完成后,会退出到dos提示符下.
在初始化参数中,去掉隐含参数_SYSTEM_TRIG_ENABLED = FALSE.然后在dos窗口中,输入svrmgrl,回到提示符SVRMGR>,在此提示符后输入 startup open;以普通模式启动数据库
该方法将彻底的重新安装所有的xdk和xsu,一般来说,可解决问题.
rmjvm.sql脚本在这里
jvminst.sql脚本在这里