YUI Grids布局原理

YUI Grids布局原理

(对外版)

主要内容

  • 学习使用YUI Grids布局

布局

  • 布局是网页的骨架,网页开发的第一步
  • 结构 模块 最终页面

不同的布局思路

(照片出自http://flickr.com/photos/ckalinw/)
(照片出自http://flickr.com/photos/my_soul_insurance2004/)
实例 实例

YUI Grids的好处

  • 解决重复劳动
  • 稳定
  • 黑盒系统
  • 自由安排内容的下载顺序
  • ~4K,支持>1000种页面布局
  • 适应所有IAB广告标准

开始

<body>
<div>
<div id="hd"> </div>
<div id="bd"> </div>
<div id="ft"> </div>
</div>
</body>
一个页面的最原始结构

引用YUI Grids CSS文件
<link rel="stylesheet" type="text/css" href="http://cn.yui.yahooapis.com/2.5.2/build/reset-fonts-grids/reset-fonts-grids.css">

第一步:决定页面的宽度(1)

<body>
<div id="doc">
<div id="hd"> </div>
<div id="bd"> </div>
<div id="ft"> </div>
</div>
</body>
  • #doc - 750px居中 (适合800x600)
  • #doc2 - 950px居中 (适合1024x768)
  • #doc3 - 100%液态 (适合everybody)
  • #doc4 - 974px居中 (适合1024x768)
  • #doc-custom - 自定义宽度

第一步:决定页面的宽度(2)

<body>
<div id="doc-custom">
<div id="hd"> </div>
<div id="bd"> </div>
<div id="ft"> </div>
</div>
</body>
<style> div#doc-custom{width:960px;} </style>

第二步:划分基本的内容块(1)

任何结构的页面都可划分为Main block和Secondary block。

第二步:划分基本的内容块(2)

<div id="bd"> 
<!--start: 财经要闻 {> ... <!--} end: 财经要闻>
<!--start: 证券要闻 {> ... <!--} end: 证券要闻>
<!--start: 理财消费 {> ... <!--} end: 理财消费>
<!--start: 能人观点 {> ... <!--} end: 能人观点>
<!--start: 最新股票 {> ... <!--} end: 最新股票>
<!--start: 收益排行榜 {> ... <!--} end: 收益排行榜>
</div>

第二步:划分基本的内容块(3)

<div id="bd"> 

	<div class="yui-b"> 
		<!--start: 财经要闻 {> ... <!--} end: 财经要闻>
		<!--start: 证券要闻 {> ... <!--} end: 证券要闻>
		<!--start: 理财消费 {> ... <!--} end: 理财消费>
	</div>

	<div class="yui-b"> 
		<!--start: 能人观点 {> ... <!--} end: 能人观点>
		<!--start: 最新股票 {> ... <!--} end: 最新股票>
		<!--start: 收益排行榜 {> ... <!--} end: 收益排行榜>
	</div>

</div>

第二步:划分基本的内容块(4)

<div id="bd"> 

	<div id="yui-main"> 
		<div class="yui-b"> 
			<!--start: 财经要闻 {> ... <!--} end: 财经要闻>
			<!--start: 证券要闻 {> ... <!--} end: 证券要闻>
			<!--start: 理财消费 {> ... <!--} end: 理财消费>
		</div>
	</div>

	<div class="yui-b"> 
		<!--start: 能人观点 {> ... <!--} end: 能人观点>
		<!--start: 最新股票 {> ... <!--} end: 最新股票>
		<!--start: 收益排行榜 {> ... <!--} end: 收益排行榜>
	</div>

</div>

第三步:选择模板

<body>
<div id="doc" class="yui-t1">
<div id="hd"> </div>
<div id="bd"> 
......
</div>
<div id="ft"> </div>
</div>
</body>

.yui-t1 - 2栏, 窄栏在左侧, 160px
.yui-t2 - 2栏, 窄栏在左侧, 180px
.yui-t3 - 2栏, 窄栏在左侧, 300px
.yui-t4 - 2栏, 窄栏在右侧, 180px
.yui-t5 - 2栏, 窄栏在右侧, 240px
.yui-t6 - 2栏, 窄栏在右侧, 300px
 

小结一下

  • 第1步 第2步
  • 第3步 第4步
  • 第5步 效果

内嵌布局

  • 内嵌布局
  • 格子Unit (.yui-u)
  • 网格Grid (.yui-g, .yui-gb, .yui-gc, .yui-gd, .yui-ge, .yui-gf)
  • 首格子 (.first)

网格类型

  • 两列
    .yui-g 1/2 - 1/2 (均匀分布)

    .yui-gc 2/3 - 1/3
    .yui-gd 1/3 - 2/3
    .yui-ge 3/4 - 1/4
    .yui-gf 1/4 - 3/4
  • 三列
    .yui-gb 1/3 - 1/3 - 1/3 (均匀分布)

使用Grids

  • 实例
  • ~2分钟
  • Grids的灵活性: 演示

多段布局(中国特色)

  • 演示
  • 段 (.section)
    .section{margin-bottom:10px;}
    .section:after{content:".";display:block;clear:both;visibility:hidden;height:0;}
    	

Homework

实例

要求:用YUI Grids手写完成上面Mockup的布局效果。

好好学习,天天向上!

Made with Eric A Meyer's S5

检查素数的正则表达式

 

一般来说,我们会使用正规表达式来做字符串匹配,今天在网上浏览的时候,看到了有人用正则表达式来检查一个数字是否为素数(质数),让我非常感兴趣,这个正则表达式如入所示:

检查素数的正则表达式/^1?$|^(11+?) +$/

要使用这个正规则表达式,你需要把自然数转成多个1的字符串,如:2 要写成 “11”, 3 要写成 “111”, 17 要写成“11111111111111111”,这种工作使用一些脚本语言可以轻松的完成。

一开始我对这个表达式持怀疑态度,但仔细研究了一下这个表达式,发现是非常合理的,下面,让我带你来细细剖析一下是这个表达式的工作原理。

首先,我们看到这个表达式中有“|”,也就是说这个表达式可以分成两个部分:/^1?$/ 和 /^(11+?)\1+$/

  • 第一部分:/^1?$/ 这个部分相信不用我多说了,其表示匹配“空串”以及字串中只有一个“1”的字符串。
  • 第二部分:/^(11+?)\1+$/,这个部分是整个表达式的关键部分。其可以分成两个部分,(11+?) \1+$,前半部很简单了,匹配以“11”开头的并重复0n1的字符串,后面的部分意思是把前半部分作为一个字串去匹配还剩下的字符串1次或多次(这句话的意思是——剩余的字串的1的个数要是前面字串1个数的整数倍)。

可见这个正规则表达式是取非素数,要得到素数还得要对整个表达式求反。通过上面的分析,我们知道,第二部分是最重要的,对于第二部分,举几个例子,

示例一:判断自然数8。我们可以知道,8转成我们的格式就是“11111111”,对于(11+?),其匹配了“11”,于是还剩下“111111”,而\1+$正好匹配了剩下的“111111”,因为,“11”这个模式在“111111”出现了三次,符合模式匹配,返回true。所以,匹配成功,于是这个数不是质数。

示例二:判断自然数11。转成我们需要的格式是“11111111111”(十一个1),对于(11+?),其匹配了“11”(前两个1),还剩下“111111111”(九个1),而\1+$ 法为“11”匹配那“九个1”,因为“11”这个模式并没有在“九个1”这个串中正好出现N次。于是,我们的正则表达式引擎会尝试下一种方法,先匹配 “111”(前三个1),然后把“111”作为模式去匹配剩下的“11111111”(八个1),很明显,那“八个1”并没有匹配“三个1”多次。所以, 引擎会继续向下尝试……直至尝试所有可能都无法匹配成功。所以11是素数。

通过示例二,我们可以得到这样的等价数算算法,正则表达式会匹配这若干个1中有没有出现“二个1”的整数倍,“三个1”的整数倍,“四个1”的整数倍……,而,这正好是我们需要的算素数的算法。现在大家明白了吧。

下面,我们用perl来使用这个正规则表达式不停地输出素数:(关于perl的语法我就不多说了,请注意表达式前的取反操作符)

perl -e'$|++;(1 x$_)!~/^1?$|^(11+?)\1+$/&&print"$_ "while ++$_'

另外,让我们来举一反三,根据上述的这种方法,我们甚至可以用正则表达式来求证某方式是否有解,如:

  • 二元方程:17x + 12y = 51   判断其是否有解的正则表达式是:^(.*)\1{16}(.*)\2{11}$
  • 三元方程:11x + 2y + 5z = 115 判断其是否有解的正则表达式是:^(.*)\1{10}(.*)\2{1}(.*)\3{4}$

大家不妨自己做做练习,为什么上述的两个正则表达式可以判断方程是否有解。如果无法参透其中的奥妙的话,你可以读读这篇英文文章

 

源文档 <http://www.google.com/reader/view/>

用 Javascript 获取指定页面元素的位置 - top, left, document, Element, 元素, position, 位置

 

 Javascript 获取指定页面元素的位置是一个非常常见的需求,本文介绍的方法能够准确返回一个元素相对于整个文档左上角的坐标,即元素的 top left 的位置,而且能够兼容浏览器,相信对新手非常有用。

 

 

--------------------------------------------------------------

点此浏览示例文件

--------------------------------------------------------------

 

 

Javascript:

 

  1.  
  2. <script language="JavaScript" type="text/javascript">
  3. <!--
  1.  
  1. // 说明:用 Javascript 获取指定页面元素的位置
  2. // 整理:http://www.codebit.cn
  3. // 来源:YUI DOM
  1.  
  1. function getElementPos(elementId) {
  1.  
  1. var ua = navigator.userAgent.toLowerCase();
  2. var isOpera = (ua.indexOf('opera') != -1);
  3. var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof
  1.  
  1. var el = document.getElementById(elementId);
  1.  
  1. if(el.parentNode === null || el.style.display == 'none') 
  1. {
  1. return false;
  1. }
  1.  
  1. var parent = null;
  2. var pos = [];
  1. var box;
  1.  
  1. if(el.getBoundingClientRect)    //IE
  1. {
  1. box = el.getBoundingClientRect();
  1. var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
  2. var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
  1.  
  1. return {x:box.left + scrollLeft, y:box.top + scrollTop};
  1. }
  1. else if(document.getBoxObjectFor)    // gecko
  1. {
  1. box = document.getBoxObjectFor(el);
  1. var borderLeft = (el.style.borderLeftWidth)?parseInt(el.style.borderLeftWidth):0;
  1. var borderTop = (el.style.borderTopWidth)?parseInt(el.style.borderTopWidth):0;
  1.  
  1. pos = [box.x - borderLeft, box.y - borderTop];
  1. }
  1. else    // safari & opera
  1. {
  1. pos = [el.offsetLeft, el.offsetTop];
  1. parent = el.offsetParent;
  1. if (parent != el) {
  2. while (parent) {
  1. pos[0] += parent.offsetLeft;
  2. pos[1] += parent.offsetTop;
  3. parent = parent.offsetParent;
  1. }
  1. }
  1. if (ua.indexOf('opera') != -1 
  1. || ( ua.indexOf('safari') != -1 && el.style.position == 'absolute' )) 
  1. {
  1. pos[0] -= document.body.offsetLeft;
  1. pos[1] -= document.body.offsetTop;
  1. } 
  2. }
  1. if (el.parentNode) { parent = el.parentNode; }
  1. else { parent = null; }
  1. while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') 
  1. { // account for any scrolled ancestors
  1. pos[0] -= parent.scrollLeft;
  1. pos[1] -= parent.scrollTop;
  1. if (parent.parentNode) { parent = parent.parentNode; } 
  1. else { parent = null; }
  1. }
  1. return {x:pos[0], y:pos[1]};
  1. }
  1.  
  1. //-->
  1. </script>
  1.  

 

从 <http://www.codebit.cn/pub/html/javascript/tip/get_element_position/> 插入

编写跨浏览器兼容的 CSS 代码的金科玉律

作为 Web 设计师,你的网站在各种浏览器中有完全一样的表现是很多人的目标,然而这是一个永远无法真正实现的目标,很多人认为,完美的跨浏览器兼容并不必要,这样说虽然没错,但在很多情形,一种近似的兼容还是很容易实现的,本文讲的是各种跨浏览器兼容的 CSS 编码准则和技巧。

Browsers-css in The Principles Of Cross-Browser CSS Coding

理解 CSS 盒子模型

如果你想实现不需要很多奇巧淫技的跨浏览器兼容的 CSS 代码,透彻地理解 CSS 盒子模型是首要事情,CSS 盒子模型并不难,且基本支持所有浏览器,除了某些特定条件下的 IE 浏览器。

CSS 盒子模型负责处理以下事情:

  • 一个 blcok (区块)级对象占据多大的空间
  • 该对象的边界,留白
  • 盒子的尺寸
  • 盒子与页面其它元素的相对位置

CSS 盒子模型有以下准则:

  • Block (区块)对象都是矩形 (事实上所有对象都如此)
  • 其尺寸由 width, height, padding, borders, 以及 margins 决定
  • 如果不设置高度,该盒子的高度将自动适应其包含的内容,加上留白等(除非使用了 float)
  • 如果不设置宽度,一个非 float 型盒子水平上将充满其父容器(扣除父容器的留白)

处理 block 级对象时,必须注意以下事项:

  • 如果一个盒子的宽度设置为 100%,它就不能再设置 margins, padding, 和 borders,否则会撑破其父容器
  • 垂直毗邻的 margin 会引起复杂的坍塌问题,导致布局问题(比如两个垂直毗邻的 Block 对象,上面的对象的 bottom-margin 为 40,下面的对象的 top-margin 为 20,则两个对象的间距将是 40,而不是 60 - 译者)
  • 拥有相对位置和绝对位置的对象,拥有不同的行为

Css-box-model in The Principles Of Cross-Browser CSS Coding
在 Firefox 的 Firebug 中显示的盒子模型

理解 block 级和 inline 级 对象的区别

这个看似简单的问题事如果能透彻地理解,会受益匪浅

下图讲解了 block 级对象和 inline 级对象的区别:

Block-inline in The Principles Of Cross-Browser CSS Coding

下面是 block 级对象和 inline 级对象的基本区别:

  • Block 级对象会自然地水平充满其父容器,因此没有必要为之设置 100% 宽度属性
  • Block 级对象的起始摆放位置是其父容器的左上边界,并顺排在其前面的兄弟 Block 对象的下方(除非设置 float 或绝对位置)
  • Inline 级对象会忽略其宽度和高度设置
  • Inline 级对象会随着文字排版,并受排版属性的影响(如 white-space, font-size, letter-spacing)
  • Inline 级对象可以使用 vertical-align 属性控制其垂直对齐,block 级对象不可以
  • Inline 级对象的下方会保留一些自然的空间,以适应字母 g 一类的会向下探出的笔画
  • 一个设置为 float 的 inline 对象将变成 block 对象

理解 Floating 和 Clearing 属性

实现多栏排版的最好方法是使用 float 属性,float 也是一个将使你受益匪浅的属性。一个 float 对象可以居左或居右,一个设置为 float 的对象,将根据设置的方向,左移或右移到其父容器的边界,或其前面的 float 对象的边界,而紧随其后的非 float 对象或内容,则包围在其相反的方向。

Float-css in The Principles Of Cross-Browser CSS Coding

以下是使用 float 和 clear 属性的一些重要准则:

  • 一个 float 对象,将从其置身的 block 级非 float 内容流中跳出,换句话说,如果你要将一个 box 向左边 float,它后面的 block 级非 float 对象会显示到下方,inline 级内容会在旁边包围
  • 要让一段内容从一侧包围一个 float 对象,这段内容必须要么是 inline 级的,要么也设置为相同方向的 float
  • 一个 float 对象,如果没有设置宽度,则会自动缩成其包含的内容的宽度,因此最好为 float 对象明确设置宽度
  • 如果一个 block 对象包含 float 子对象,会出现本文中阐述的问题
  • 一个设置了 clear 属性的对象,将不会包围其前面的 float 对象
  • 一个既设置了 clear 又设置了 float 属性的对象,只有 clear:left 属性生效,clear:right 不起作用

首先使用 IE 进行测试

虽然我们都痛恨 IE6 和 IE7,但当你开始一个新项目的时候,最好还是首先针对这两种浏览器进行测试,否则,如果你在设计在后期才想起针对 IE6 和 IE7 进行测试,将出现以下问题:

  • 你将不得不使用一些奇巧淫技,甚至使用独立的 IE6/7 CSS,导致 CSS 文件臃肿。
  • 某些地方的布局将不得不重新设计
  • 会增加测试的时间
  • 你的布局在 IE/6/7 中和其它浏览器中不一样

如果你设计的是个人项目,Web 程序等,则不建议你针对旧版本 IE 做太多工作,而对一些公司类站点,它的用户群中有大量 IE 用户,这些技巧会让你避免大量的头痛。如果将 IE 的问题归类为 IE 的 BUG 而不去处理,会带来很多负面的影响,和 IE 和平共处是 Web 开发与设计者不可逃避的现实。

译者注:在 IE6/7 仍有大量用户基础的国内(感谢中行,建行,农行,工行,以及各级政府网站),忽视这两种浏览器是极不明智的,首先针对 IE6/7 进行设计是一种很好的方法,一般来说,在IE6/7 通过测试的站点,在 Firefox,Chrome,Safari,Opera 等标准浏览器面前基本不会出现问题,前提是,你的 CSS 设计是基于 W3C 标准的。

IE 浏览器最常见的问题

  • IE6 中不可滥用 float,否则会带来内容消失以及文字重复等稀奇古怪的问题
  • IE6 中,float 对象,在 float 方向的那边,会出现双倍 margin,将 display 设置为 inline 会解决这个问题
  • IE6/7 中,一个没有直接或间接设置 hasLayout 的对象,会发生各种稀奇古怪的问题 (译者注:对这类问题,zoom 这个 css 属性可以帮很大的忙,将 zoom 设置为除了 normal 之外的其它值,可以迫使一个对象 hasLayout 同时不影响这个对象的任何视觉外观)
  • IE6 不支持 min-width, max-width, min-height, max-height 一类的属性
  • IE6 不支持固定位置背景图
  • IE6/7 不支持很多 display 属性值(如 inline-table, table-cell, table-row
  • IE6 中,只有 a 这个对象才可以使用 :hover 这个伪类
  • IE 的某些版本对某些 CSS 选择器支持很少(如属性选择器,子对象选择器)
  • IE6~8 对 CSS3 的支持很有限 (不过有一些变通方法)

永远不要指望在所有浏览器中都一模一样

在不同浏览器实现相同的体验个功能是可能的,实现近似像素级的一致外观也是可能的,但永远不要指望一模一样。

Form 控件在不同浏览器显示总是不同

以下是 Facebook 首页中的 select 控件,在5种不同浏览器的显示差异(基于 Adobe’s Browserlab 截图)

某些 Form 控件,如果要求必须跨浏览器一致,可以找到变通办法,如,可以使用图片 替代 submit 按钮,但有一些控件,比如 radio,select, textarea,文件选择框,是永远都不可能一模一样的。

字体的表现都有差异

先不谈有的字体在有的系统中根本不存在,即时存在,它们在不同系统的渲染效果也不完全一样,比如,Windows ClearType 支持 IE7,但不支持 IE6,导致同一个字体在 IE7 和 IE6 有不同的样子。

Cleartype-ie in The Principles Of Cross-Browser CSS Coding
A List Apart’s 文章字体在 IE6 and IE7 中的区别

使用 CSS 清零

使用 CSS 清零(CSS Reset)是实现跨浏览器兼容的灵丹妙药,CSS 清零可以消除不同浏览器对 margin,padding 这些属性的默认表现,你可以更容易控制诸如对齐,间隙等等问题。推荐使用 Eric Meyer’s CSS 清零代码

Reset-wd in The Principles Of Cross-Browser CSS Coding

 

参考 SitePoint’s CSS 兼容表

SitePoint CSS Reference 是一个非常好的资源(下载离线版),可以用来检查某些 CSS 属性的跨浏览器兼容问题

Sitepoint-chart in The Principles Of Cross-Browser CSS Coding

结语

跨浏览器兼容是个永恒的话题,本文介绍的跨浏览器兼容 CSS 准则只是帮助 Web 开发设计者尽可能实现这一目标,除了这些,基于 CSS3 的渐进式增强设计也是一种趋势,Web 开发与设计者可以针对某些浏览器提供增强功能,而在不支持这些增强功能的浏览器中降级使用基本功能。

延伸阅读

本文国际来源:Smashing Magazine The Principles Of Cross-Browser CSS Coding

原文作者:Louis Lazaris

Louis Lazaris 是一位自由职业 Web 开发者,住在多伦多,他创办了 Impressive Webs, 以及 Interviews by Design,后者主要是一些著名 Web 设计师访谈,他的 Twitter 地址是 http://twitter.com/ImpressiveWebs

Oracle 备份与恢复

 


Oracle 备份与恢复

备份与恢复是数据库管理中最重要的方面之一。如果数据库崩溃却没有办法恢复它,那么对企业造成的毁灭性结果可能会是数据丢失、收入减少、客户不满等。不管公司是使用单个数据库还是多个数据库来存储数百 GB 或 TB 的数据,它们都有一个共同点,即需要制订一个备份与恢复方案来备份重要数据并使自身免于灾难。

备份与恢复基础
备份是数据的一个代表性副本。该副本会包含数据库的重要部分,如控制文件、重做日志和数据文件。备份通过提供一种还原原始数据的方法保护数据不受应用程序错误的影响并防止数据的意外丢失。备份分为物理备份和逻备份。物理备份是物理数据库文件的副本。“备份与恢复”通常指将复制的文件从一个位置转移到另一个位置,同时对这些文件执行各种操作。

相比而言,逻辑备份包含使用 SQL 命令导出并存储在二进制文件中的数据。Oracle 在重做日志缓冲区中记录提交的和未提交的更改。逻辑备份用于补充物理备份。还原物理备份意味着重建它并将其提供给 Oracle 服务器。要恢复还原的备份,需要使用事务日志中的重做记录来更新数据。事务日志记录在执行备份之后对数据库所做的更改。

Oracle 在例程故障之后自动执行崩溃恢复和实例恢复。在出现介质故障的情况下,数据库管理员 (DBA) 必须启动恢复操作。恢复备份涉及两种不同的操作:通过应用重做数据将备份前滚至一个较近的时间;将在未提交的事务中所做的所有更改回滚至其原来状态。一般而言,恢复指在还原、前滚和回滚备份中涉及的各种操作。备份与恢复指在防止数据库丢失数据和在丢失数据时重建数据库的过程中涉及的各种策略和操作。

备份与恢复操作
备份是数据文件、表空间或某个时间点的数据库等的快照。如果对数据库进行了周期性备份,则在数据丢失时用户可以将存储的重做信息应用到他们最新的备份中,从而恢复数据库的当前状态。Oracle 使用户能够还原一个较早的备份和仅应用某些重做数据,从而将数据库恢复到一个较早的时间点。这种恢复称为不完全介质恢复。如果备份是一致的,那么根本不需要用户应用任何重做数据。

下面用介质恢复的一个简单例子来解释一下这个概念。假定用户在中午为数据库作了一个备份。从中午开始,每一分钟对数据库进行一次更改。在下午 1 点时,一个磁盘驱动器出现故障,导致那个磁盘上的所有数据丢失。幸运的是,Oracle 在重做日志中记录了所有更改。则用户可以将中午的备份还原到一个正常运转的磁盘驱动器上,使用重做数据将数据库恢复到下午 1 点,从而重建丢失的更改。

备份与恢复策略要素
尽管备份与恢复操作非常复杂并随因企业而异,但基本原则均遵循这四个简单的步骤:

  1. 创建联机重做日志的多个副本
  2. 在 ARCHIVELOG 模式下运行数据库,并将重做日志存档至多个位置
  3. 维护控制文件的多个并发备份
  4. 时常备份物理数据文件,并将它们存储在一个安全的地方;如果可能,创建多个副本

只要用户在安全的存储器备份了数据库并存档了重做日志,就可以重建原始数据库。

备份与恢复的主要数据结构
在用户开始认真考虑备份与恢复策略之前,必须明确与备份和恢复操作相关的物理数据结构。本节讨论了以下物理数据结构:

数据文件
每个 Oracle 数据库都有属于称为表空间的逻辑结构的一个或多个物理数据文件。数据文件被分为更小的称为数据块的单元。逻辑数据库结构的数据(如表和索引)物理上位于为数据库分配的数据文件的块中。数据文件具有以下特性:

  • 用户自定义的特性允许数据文件在数据库空间不足时自动扩展。
  • 一个或多个物理数据文件组成了一个称为表空间的逻辑数据库存储单元。

每个数据文件的第一个块均为头 (header)。头包括诸如文件大小、块大小、表空间和创建时间戳记等重要信息。只要打开数据库,Oracle 就检查数据文件头信息是否与存储在控制文件中的信息匹配。如果不匹配,则必须进行恢复。Oracle 在正常操作期间读取数据文件中的数据,并将其存储在缓冲区高速缓存中。例如,假定用户要访问表中的一些数据。如果请求的信息尚未出现缓冲区高速缓存中,则 Oracle 将从相应的数据文件中读取它并将其存储在内存中。

控制文件
每个 Oracle 数据库都有一个控制文件,该文件包含组成数据库的所有其它文件的操作系统文件名。这个重要的文件还包含在恢复期间使用的一致性信息,如:

  • 数据库名称
  • 数据库创建时间戳记
  • 数据库的数据文件以及联机和存档重做日志文件的名称
  • 检查点 — 在重做日志中指示在这个点之前的所有数据库更改都已保存在数据文件中的一条记录。
  • 恢复管理器 (RMAN) 备份元数据

用户可以创建控制文件的多个副本,从而允许 Oracle 写控制文件的多个副本以防止灾难的发生。如果操作系统支持磁盘镜像,那么也可以创建控制文件的镜像,从而允许 O/S 将控制文件的一个副本写到多个磁盘上。每一次用户挂载 Oracle 数据库时,均使用它的控制文件来识别数据文件和联机重做日志文件(必须为数据库操作而打开)。如果更改了数据库的物理组成,如创建了一个新的数据文件或重做日志文件,则 Oracle 将修改数据库的控制文件以反映该更改。只要更改了数据库的结构,就应备份控制文件。结构更改可能包括添加、删除或更改数据文件或表空间以及添加或删除联机重做日志。

联机重做日志文件
重做日志对于恢复绝对至关重要。例如,假定一次电力中断使 Oracle 无法将修改的数据永久写入数据文件中。在这种情况下,可以把数据文件中较早版本的数据与记录在联机重做日志中的最近更改结合起来重建丢失的数据。每个 Oracle 数据库都包含一组两个或多个联机重做日志文件。Oracle 为每个重做日志文件分配一个日志序列号以唯一地标识它。该组数据库重做日志文件共同称为数据库的重做日志。

Oracle 使用重做日志记录对数据库所做的所有更改。Oracle 在重做记录(重做缓冲区中一个描述更改的条目)中记录每一个更改。例如,假定用户更新了工资单表中的一个列值(从 5 改为 7)。Oracle 将旧值记录在撤销记录中,将新值记录在重做记录中。因为重做日志存储了对数据库所做的每次更改,所以这个事务的重做记录实际上包含了三个部分:

  • 对撤消事务表所做的更改
  • 对撤消数据块所做的更改
  • 对工资单表数据块所做的更改

如果用户随后提交了对工资单表所做的更新 — 使得由 SQL 语句执行的更改变为永久性的 — 那么 Oracle 将生成另一条重做记录。通过这种方式,系统仔细地监视着在数据库中发生的一切。

重做日志文件的循环使用
日志写入器 (LGWR) 将重做日志条目写到磁盘上。重做日志数据是在系统全局区的重做日志缓冲区中生成的。随着事务的提交和日志缓冲区的充满,LGWR 将重做日志条目写到一个联机重做日志文件中。LGWR 以循环方式书写联机重做日志文件:当它写满了当前联机重做日志文件(称为活动文件)时,LGWR 将写入下一个可用非活动重做日志文件。LGWR 循环使用据库中的联机重做日志文件,覆盖旧的重做数据。根据是否启用了存档,写满的重做日志文件可按以下方式进行重用:

  • 如果禁用了存档,则一旦将记录在日志中的更改保存到数据文件中,就可再次使用写满的联机重做日志了。
  • 如果启用了存档,则一旦将更改保存到数据文件中并将文件存档后,就可再次使用写满的联机重做日志了。

存档重做日志文件
存档日志文件是 Oracle 已经在其中写满了重做条目、将其以非活动状态提供并拷贝到一个或多个日志存档目标位置的重做日志。Oracle 可以在两种模式中的任意一种之下运行:

  • ARCHIVELOG — Oracle 在周期中重用写满的联机重做日志文件之前将其存档。
  • NOARCHIVELOG — Oracle 在周期中重用写满的联机重做日志文件之前不将其存档。

在 ARCHIVELOG 模式下运行数据库有以下好处:

  • 数据库可以从实例故障和介质故障中完全恢复过来。
  • 用户可以执行联机备份,即在数据库打开并且可供使用的同时备份表空间。
  • 可将存档的重做日志传输并应用到备用数据库中
  • Oracle 支持多重存档日志,以避免存档日志上任何可能的单点故障。
  • 用户拥有更多恢复选择,如能够执行表空间时间点恢复 (TSPITR)

在 NOARCHIVELOG 模式下运行数据库有以下后果:

  • 用户只能在正常停机后、数据库完全关闭时备份数据库。
  • 一般而言,唯一的介质恢复选择就是还原整个数据库,这将导致丢最后一次备份后执行的所有事务。

自动管理的撤消
每个 Oracle 数据库都必须有一种方法来保留用于回滚或撤对数据库所做更改的信息。这种信息包含了事务的操作的记录(主要在提交这些操作之前)。Oracle 将这些记录统称为撤消。过去,Oracle 曾使用回滚段存储撤消。事实证明,对这些回滚段的空间管理十分复杂。Oracle 现在提供了存储撤消的另一种方法,它消除了管理回滚段空间的复杂性,并为 DBA 提供对撤消被覆盖前所保留时间的控制。这种方法使用一个撤消表空间。撤销记录用于:

  • 在执行 ROLLBACK 语句时回滚事务
  • 恢复数据库
  • 提供读一致性

当执行回滚语句时,撤销记录用于撤销由未提交的事务对数据库所做的更改。在数据库恢复期间,撤销记录用于撤销从重做日志应用到数据文件中的任何未提交的更改。在一个用户更改数据的同时,撤销记录将为访问数据的另一用户保留数据的前镜像,从而提供读一致性。

了解基本备份
备份策略为防止数据丢失提供了安全防护。回答以下问题可以帮助数据库管理员制订一个强大的备份策略:

  • 可能出现何种类型的故障?
  • 应当备份哪些信息?
  • 应当使用哪种备份方法?
  • 应当联机还是离线备份?
  • 备份的频率?
  • 如何避免危险的备份方法?

可能出现何种类型的故障?
数据丢失的原因各种各样。下面是可能导致数据丢失的一些最常见的故障类型。

语句故障 是 Oracle 程序在处理语句时的逻辑错误。例如,用户执行了无效 SQL 结构的语句。当发生语句故障时,Oracle 自动撤销语句的所有效果并将控制返回给用户。

进程故障 是访问 Oracle 的用户进程中出现的故障(即异常断开或进程终止)。尽管 Oracle 和其他的用户进可以继续工作,但出现故障的用户进程将不能继续工作。如果用户进程在更改数据库时出现故障,则 Oracle 后台进程将撤销未提交事务的效果。

实例故障 是使 Oracle 实例(即 SGA 和后台进程)无法继续工作的问题。实例故障可能源于硬件问题(如电力中断)或软件问题(如操作系统崩溃)。当实例出现故障时,Oracle 不会将 SGA 缓冲区中的数据写到数据文件中。

用户或应用程序错误 是导致数据丢失的用户错误。例如,用户可能无意地从工资单表中删除数据。这种用户错误可能需要将数据库或对象恢复到该错误发生前的某个时间点上。为了允许从用户错误中恢复过来并满足其他独特的恢复要求,Oracle 提供了闪回技术。了解关于闪回技术的更多信息。

介质故障 是当 Oracle 试图写或读操作数据库所需要的文件时出现的物理问题。一个常见的例子是磁盘头损坏,它将导致磁盘驱动器上的所有数据丢失。磁盘故障可能影响各种文件(包括数据文件、重做日志文件和控制文件)。因为数据库实例无法继续正常工作,所以它无法将 SGA 的数据库缓冲区中的数据写到数据文件中。

应当备份哪些信息?
一个数据库包含各种类型的数据。当制订备份策略时,DBA 必须确定他们要复制哪些信息。基本的备份类型包括:

  • 联机数据库备份
  • 离线数据库备份
  • 整个数据库
  • 表空间
  • 数据文件
  • 控制文件
  • 存档重做日志
  • 配置文件

在确定要备份的信息时,基本的原则是根据数据的重要性和更改的程度来确定数据的优先级。例如,然存档日志不发生变化,但它们对恢复数据库至关重要,因此如果可能应维护多个副本。然而,费用帐户表被用户不断更新。因此,应当经常备份该表空间,以防止在恢复时不得不应用过多的重做数据。

可以以多方式组合备份。例如,DBA 可以决定每周执行整个数据库的备份,以确保获得原始数据库信息的一个相对较新的副本,而每天备份使用最频繁的表空间。DBA 还可以为所有重要的控制文件和存档重做日志创建多个副本作为额外的安全防护。

联机数据库备份
联机备份也称为开放备份,其中所有的读-写数据文件和控制文件都没有对相同的 SCN 设置检查点。例如,一个读-写数据文件头可能包含一个为 100 的 SCN,而其他读-写数据文件头包含一个为 95 或 90 的 SCN。在所有这些头 SCN 一致前,即将联机重做日志中记录的所有更改都保存到磁盘上的数据文件前,Oracle 无法打开数据库。如果数据库必须保持不间断运行,则您除了在 ARCHIVELOG 模式下执行整个数据库的联机备份之外别无选择。

离线数据库备份
在这种备份中,所有的数据文件和控制文件在相同的时间点上都保持一致 — 例如,对相同的 SCN 保持一致。在一个一致的备份中被允许拥有旧 SCN 的唯一表空间是只读且“离线-正常”的表空间,它们与备份中的其他数据文件保持一致。这种类型的备份允许用户打开由备份创建的文件集,而无需应用重做日志,这是因为数据已经是一致的了。执行这种备份的唯一方式是正常关闭数据库,然后在数据库关闭时执行备份。一个一致的整个数据库备份是为在 NOARCHIVELOG 模式下运行的数据库提供的唯一有效的备份选择。

整个数库备份
这种最常见的备份类型 — 整个数据库备份 — 包含了控制文件以及属于该数据库的所有数据库文件。如果在 ARCHIVELOG 模式下运行,则 DBA 还可以选择在一段时间内备份数据库的不同部分,从而一部分一部分地构建整个数据库备份。

表空间备份
表空间备份是数据库的一个子集。表空间备份只有当数据库在 ARCHIVELOG 模式下运行时才有效。表空间备份对于在 NOARCHIVELOG 模式下运行的数据库有效的唯一时间是当该表空间只读或离线正常时。

数据文件备份
数据文件备份是单个数据文件的备份。数据文件备份没有表空间备份那么常见,并且只有当数据库在 ARCHIVELOG 模式下运行时才有效。数据文件备份对于在 NOARCHIVELOG 模式下运行的数据库有效的唯一时间是当数据文件是表空间中唯一的文件时。例如,备份是表空间备份,但表空间只包含一个文件并且只读或离线正常。

控制文件备份
控制文件备份是数据库控制文件的备份。如果数据库是打开的,那么用户可以通过执行以下 SQL 语句或使用恢复管理器 (RMAN) 来创建有效的备份:ALTER DATABASE BACKUP CONTROLFILE to 'location'。

存档重做日志备份
存档重做日志是成功的介质恢复的关键。您希望根据可用磁盘空间和在数据库上执行的事务的数量在磁盘上尽可能长时间地保留存档日志,并定期备份它们以确保较完整的恢复。

配置文件
配置文件可能包含 spfile 文件或 init.ora、口令文件、tnsnames.ora 和 sqlnet.ora。因为这些文件不经常变化,所以它们不需要频繁备份。如果您丢失了某个配置文件,您可以很容易地重手动创建它。当还原时间更重要时,还原配置文件的一个备份要比以特定格式手动创建一个文件要快得多。

应当使用哪种备份方法?
Oracle 为用户提供了几种创建备份的基本方法以备选择。这些方法包括:

  • 恢复管理器 (RMAN) — 建立与服务器进程的连接并使备份与恢复操作的数据转移自动化的一个组件。
  • Oracle 企业管理器 — 调用恢复管理器的 GUI 界面。
  • Oracle Data Pump — 该实用程序通过将数据以专有格式从 Oracle 数据库写入操作系统文件来创建逻辑备份。稍后可以将这种数据导入数据库中。
  • 用户管理的方法 — 通过执行特别针对用户操作系统的命令手动备份数据库。

创建恢复管理器备份
恢复管理器 (RMAN) 是一个强大的通用程序,它允许用户创建 RMAN 备份或用户数据的镜像副本。当用户使用 RMAN BACKUP 命令指定文件或存档日志时,RMAN 默认创建一个备份集作为输出。一个备份集是专有格式的一个文件或一些文件,它需要使用 RMAN RESTORE 命令来进行恢复操作。相比而言,当使用 BACKUP AS COPY 命令创建文件的镜像副本时,它是实例可用 (instance-usable) 格式的 — 用户不需要调用恢复管理器即可还原或恢复它。

当执行 RMAN 命令(如备份或还原)时,恢复管理器建立了一个与 Oracle 服务器进程的连接。然后服务器进程从目标数据库中备份指定的数据文件、控制文件或存档日志。恢复目录是包含各种对备份和恢复有用的信息的中央信息库。RMAN 自动建立备份所需的所有文件的名称和位置。恢复管理器还支持增量备份 — 仅备份那些自上次备份以来发生变化的块。在传统的备份方法中,必须备份数据文件中用到的所有数据块。

自动的基于磁盘的备份和恢复
创建不同的与备份和恢复相关的文件的组件对彼此一无所知,或者也不了解它们存储数据的文件系统的大小。利用自动的基于磁盘的备份和恢复,您可以创建一个闪回恢复区,它将使与备份相关的文件的管理自动化。在磁盘上选择一个位置和存储空间的上界,并设置一个保留策略 — 它控制需要为恢复保留备份文件的时间。数据库在这个空间内为您的数据库管理用于备份的存储器、存档日志和其他与恢复相关的文件。当 RMAN 需要为新的文件回收空间时,可以删除不再需要的文件。如果您不使用闪回恢复区,则您必须为与备份相关的文件手动管理磁盘空间并平衡不同类型文件间的空间使用。Oracle Corporation 建议您启用一个闪回恢复区以简化您的备份管理。

了解关于 RMAN 的更多信息

Oracle 企业管理器
尽管通常把恢复管理器用作一个命令行实用程序,但 Oracle 企业管理器中的备份向导是 GUI 界面,通过点击即可实现备份与恢复。Oracle 企业管理器 (EM) 支持用户常用的备份与恢复特性。

  • 备份配置,用于定义和保存常用配置以供重复使用
  • 备份与恢复向导,用于引导用户完成创建备份脚本的步骤并将其作为计划作业提交
  • 备份作业库,用于保存可以被检索并应用到多个目标上的常用备份作业
  • 备份管理,用于查看并在 RMAN 备份上进行维护。

了解关于 Oracle 企业管理器 的更多信息

使用 Data Pump 提供额外备份保护
可以使用 Data Pump 实用程序创建数据的逻辑备份来补充物理备份。逻辑备份存储为数据库创建的模式对象的相关信息。Data Pump 以专有格式将数据从数据库写入 Oracle 文件中,然后可以使用导入实用程序将这些文件导入数据库中。

了解关于 Data Pump 的更多信息

用户管理的备份
可以使用操作系统命令(如 UNIX dd 或 tar 命令)来创建备份。还可以通过编写脚本来使备份操作自动化。用户可以一次性创建整个数据库的备份或备份个别的表空间、数据文件、控制文件或存档日志。个别表空间、数据文件、控制文件和存档日志的备份可以补充整个数据库备份。如果数据库关闭或数据库进入热备份模式来执行联机备份,则还可以使用 O/S 命令来执行这些备份。

了解基本的恢复策略
基本的恢复包含两个部分:还原物理备份,然后用自最后一次备份以来对数据库所做的更改更新它。恢复的最重要方面是确保所有的数据文件就相同时间点而言是一致的。Oracle 具有完整性检查,以防止用户在所有数据文件彼此保持一致之前打开数据库。在准备恢复策略时,了解这些问题的答案至关重要:

  • 恢复如何工作?
  • 恢复的类型有哪些?
  • 应当使用哪种恢复方法?

恢复如何工作?
在每一种类型的恢复中,Oracle 都按顺序将重做数据应用到数据块中。Oracle 使用控制文件和数据文件头中的信息来确定是否必须进行恢复。恢复有两个部分:前滚和回滚。当 Oracle 前滚时,它将重做数据应到相应的数据块中。Oracle 系统地遍览重做日志,以确定它需要将哪些更改应用到哪些块中,然后更改这些块。例如,如果用户向表中添加了一行,但服务器在将更改保存到磁盘之前就崩溃了,则 Oracle 可以使用这个事务的重做记录来更新该数据块以反映该新行。

一旦 Oracle 完成了前滚阶段,就可以打开 Oracle 数据库了。回滚阶段在数据库打开后开始。回滚信息存储在事务表中。Oracle 在整个表中搜索未提交的事务,撤销它找到的任何未提交的事务。例如,如果用户从未提交添加行的 SQL 语句,则 Oracle 将在事务表中发现这一事实并撤销该更改。

恢复的类型有哪些?
有三种基本的恢复类型:实例恢复、崩溃恢复和介质恢复。Oracle 在实例启动时自动执行前两种恢复。只有介质恢复需要用户执行命令。当一个实例发现另一个实例已经崩溃时,实例恢复(只可能在 Oracle 真正应用集群配置中存在)将在打开的数据库中进行。一个幸存的实例将自动使用重做日志来恢复数据库缓冲区中已提交但在实例出现故障时丢失的数据。Oracle 还将撤销当实例崩溃时在出现故障的实例上正在进行的任何事务,然后在恢复完成之后清除崩溃的实例拥有的任何锁。

崩溃恢复在单实例数据库崩溃或多实例数据库的所有实例崩溃时发生。在崩溃恢复中,实例必须首先打开数据库,然后执行恢复操作。一般而言,在崩溃或关机退出之后第一个打开数据库的实例将自动执行崩溃恢复。

与崩溃恢复和实例恢复不同,介质恢复通常响应介质故障并根据用户的命令来执行。在介质恢复中,可以使用联机或存档重做日志来使还原的备份为最新或将其更新至一个特定的时间点。介质恢复可以还原整个数据库、一个表空间一个数据文件并将它们还原至指定的时间。无论何时使用重做日志或将数据库恢复到某个非当前时间,都将执行介质恢复。

总可以使用还原的备份来执行该种恢复。介质恢复主要分为完全恢复和不完全恢复。完全恢复涉及将重做数据与数据库、表空间或数据文件等的备份结合使用以将其更新至最新的时间点。它之所以称为完全备份是因为 Oracle 将所有重做更改应用到备份上。通常,介质恢复在介质故障损坏了数据文件或控制文件之后执行。

了解关于自动故障恢复 的更多信息

恢复选项
如果用户没有将数据库完全恢复至最新时间,那么必须指示 Oracle 要恢复到什么程度。用户可以执行:

  • 表空间时间点恢复 (TSPITR),它使用户能够将一个或多个表空间恢复至与数据库其余的部分不同的某个时间点。
  • 基于时间的恢复,也称为时间点恢复 (PITR),它将数据恢复至一个指定的时间点。
  • 基于取消的恢复,它恢复到执行 CANCEL 命令为止。
  • 基于更改的恢复或日志序列恢复。如果使用了 O/S 命令,那么基于更改的恢复将一直恢复到重做记录中一个指定的 SCN 为止。
  • 从人为错误中闪回

如果使用了恢复管理器,那么日志序列恢复将一直恢复到一个指定的日志序列号。当执行不完全恢复时,用户必须在打开数据库时重置联机重做日志。重置数据库的新版本称为一个新化身。用 RESETLOGS 选项打开数据库将告知 Oracle 丢弃一些重做。在 Oracle 数据库 10g 中,控制文件增加了新的结构,这些结构提供了利用先前化身的备份通过 RESETLOGS 操作进行恢复的能力。

从人为错误中恢复
Oracle 数据库 10g 体系结构利用了人为错误的数据库恢复领域中独有的技术进展。闪回技术提供了一组新功能,可及时查看数据并在时间上前后滚动数据。使用闪回功能,可以查询模式对象的过去版本、查询历史数据、执行变化分析,或执行自助修复,以便在数据库联机时从逻辑损坏中恢复。利用 Oracle 数据库 10g 闪回技术,您完全可以取消过去的操作!

了解关于闪回技术 的更多信息

应当使用哪种备份方法?
用户有两种物理文件恢复基本方法可以选择。他们可以:

  • 使用恢复管理器进行自动恢复。
  • 执行 SQL 命令。

使用恢复管理器进行恢复
基本的 RMAN 命令是 RESTORE 和 RECOVER。RMAN 可用于从备份集或镜像副本中将数据文件还原至它们当前的位置或一个新位置。如果需要任何存档的重做日志来完成恢复操作,RMAN 将自动还原并应用它们。在恢复目录中,RMAN 保留了一个包含与执行过的每次备份相关的所有基本信息的记录。如果没有使用恢复目录,则 RMAN 将使用控制文件来获取必需的信息。RMAN RECOVER 命令可以用来执行完全介质恢复,应用增量备份,以及执行不完全介质恢复。

了解关于 RMAN 的更多信息

使用 SQL*Plus 进行恢复
管理员能够在命令行使用 SQL*Plus 实用程序在文件上进行还原和执行介质恢复。用户可以恢复数据库、表空间或数据文件。在执行恢复之前,用户需要:

  • 确定要恢复哪些文件。通常可以使用表 V$RECOVER_FILE。
  • 还介质故障永久损坏的文件的备份。即使用户没有备份,在用户拥有必要的重做日志文件且控制文件包含损坏文件的名称时仍可以执行恢复。
  • 如果无法将文件还原至其原始位置,则用户必须重新定位还原的文件并将该新位置通知控制文件。
  • 还原必要的存档重做日志文件。

结论
Oracle 数据库的备份和恢复对于保护数据不受崩溃、硬件故障和数据故障的影响非常重要。虽然 Oracle 提供了许多特性来保护您的数据,但备份是无法替代的。