乌秋博客
梦想在左,生活在右。   

盖茨给腾讯总裁的信
Dear Pony,
  冒昧给你写email,听说你对我有些意见,我想和你做一些私人交流,以下是我的5点意见,不代表microsoft官方态度:)

  1、人在江湖飘,谁能不挨刀

  听说你的注册用户数有两三亿,同时在线人数都超过1000万了,虽然我有点怀疑,不过还是很让我震惊啊,你们干得真的很不错,我很庆幸我还有windows,还有捆绑的看家本领,否则我基本上就没什么办法了,感谢伟大的IBM,感谢伟大的盗版事业,感谢我的爸爸妈妈……

  我承认我的这个看家本领是有点不太厚道,真的,我很理解老弟你的心情,但是,business is business,网络太open了,占领终端很重要啊,当年我好不容易搞定Netscape,用IE占领了地址栏,才过上了几年幸福的网络生活,IM的时代,我怎么能缺席呢?所以我必须捆绑MSN啊,人在江湖飘,谁能不挨刀啊,马克·安德森同学至今都很郁闷。

  2、这年头,谁的屁股都不干净

  再说捆绑,老弟你也不陌生啊,只是用得不太熟练。你还记得99年的OICQ多大嘛?1M?还是800K?小巧玲珑啊,现在呢?QQ都快50M了吧?几年膨胀了几十倍啊,那些游戏、音乐、硬盘、邮箱以及一堆乱七八糟的东西不都是捆绑嘛?搞得大家都说QQ臃肿,其实只不过因为你的根基太小,只是一个IM软件,加点东西太明显了,而我的windows可是OS,你的家当还是不够丰厚啊。

  所以老弟也不用抱怨太多,周鸿祎同学说过,这年头,谁的屁股都不太干净,还是比较话糙理不糙的。

  3、你太低调,太不酷了,找个CEO吧,代理的也行

  tencent上市了,不错,但上市之后都干了什么?除了QQ变得越来越大,好像什么都没干,虽然在读《老子》之余,我的朋友陈天桥把好公司都收购了,但你也别干瞪眼不动手啊,好歹有点资本运作,给投资人一个想象的空间也好啊。

  其实我明白你的压力,上市了嘛,每个季度都要发财报,投资人的德行大家都知道,一个季度业绩不增长就要发飙,做CEO日子难过啊。不过你其实可以过得潇洒一点,Jerry和David(Yahoo 创始人)有Terry Semel(Yahoo CEO)、Larry Page和Sergey Brin(Google创始人)有Schmidt打理一切,多省心啊,不光活得自在,大家还觉得他们很酷。我有Ballmer帮我打理,也才有时间去写点《the road ahead》之类的畅销书,给microsoft接下来要干的事做点科普工作也不错。其实私下地说,我对新技术的迟钝地球人都知道……

  建议你向丁丁学习,找一个象Ted(孙德棣)一样CEO,你就可以象丁丁一样有时间学中医玩了:)

  4、你知道我为什么让他们那么折腾MSN.com.cn嘛?

  msn.com.cn来了,我知道你们那天也去“观摩”了,相信老弟你也看出来了,现在的MSN.com.cn看上去真是一个灾难。我让他们折腾是因为反正MSN迟早总要进来的,不如先来占个地儿,别老让中国用户觉得MSN就是MSN Messenger,那也很糟糕啊。

  新浪已经把中国的门户带入了死胡同,用近乎抢劫的方式抢夺报纸、杂志、电视的内容堆积出一个海量信息的门户,搜狐已经证明,谁也无法复制出另一个新浪,很可惜,看上去qq.com正在走这一条道路,尽管你可以用qq来推高用户数量,但价值何在?

  所以我让他们折腾MSN.com.cn,随便折腾,只要不太过分就行,反正N年之内,干过新浪还是比较困难的,我有充分的时间来做我的MSN服务,那时longhorn应该也会捆绑一些新东西来帮忙的,暂时保密:)


  5、QQ群不是社会网络
  现在社会网络很流行,似乎大家都很明白,实际上怎么收费心里都还没谱呢,没准就是一个bubble,所以QQ也该掺和掺和,说不定有一天大家都恍然大悟了呢,到时候再干可就来不及拉。

  IM软件做社会网络似乎是水到渠成,但实际上太不一样了。可能是技术难度太低了,我的那帮高薪软件工程师觉得很不适应,想了好久才弄出那个spaces的,虽然美国人不怎么喜欢,但中国用户好像反响还不错,聊胜于无吧。

  其实你们那个QQ群真的很好玩,尤其是有个叫“新花社”的群,真的太“胜总”了(谁想了解这个词的含义,请留言^_^),但不是社会网络,不过绝大部分的QQ用户似乎都兴趣不大,可能太年轻了。QQ该怎么弄社会网络,相信你也很困扰,但千万不要放弃啊,老弟。

  其实我应该感谢你,是QQ普及了中国小朋友对IM的了解,等他们长大了,工作了,有钱了,就慢慢转移到了MSN,无缝切换,配合默契啊:)

  可能这些都不太中听,哥们也不要太担心,中国市场很大,让我们一起去开拓吧,与君共勉!

yours,Bill
Regards
posted at 05/09/27 01:13 | 技术文摘 | 浏览(25) | 引用(1) | 评论

网页播放器秘笈
1、参数设置:
    MediaVisual(exobudset.js)、MediaMp3(exobudset.js)、Winamp(set.js)、AutoHide(musicx.vbs)源码中有说明,这里不再赘述。若有问题,请个别交流。可自行在本机修改測試調較。下同。
    Aquamp(player.config.js):
var mediaURL = "playlist.asx";媒体路径
var view_bitrate = true;
var view_duration = true;
var view_player = 2; // 0 : hide(隐藏), 1 : normal, 2 : extension (if rows2 and id "table_action")(本站演示设置)
var set_autoPlay = true;自动播放
var set_autoRewind = true;
var set_shuffle = false;循环、随机播放
var set_loop = true;
var set_mute = false;
var set_volume = 100;
var pl_window_width = 350;
var pl_window_height = 450;
var pl_window_options = "scrollbars=yes,resizable=no,status=no";
var ml_window_width = 650;
var ml_window_height = 600;
var ml_window_options = "scrollbars=yes,resizable=no,status=no";
var use_marquee = true; // true, false(是否用走馬燈)
var marquee_behavior = "scroll"; // scroll, alternate, slide(這是走馬燈的表現方式[ 捲動、交替、滑動])
var marquee_direction = "left"; // left, right(由左或右開始)
// 以下兩個是速度的參數。
var marquee_scrollamount = 1; //(數量參數)
var marquee_scrolldelay = 15; //(廷遲參數)

2、歌词字幕制作
    这里仅提供基本知识,具体根据源码或源码中的路径下载后研究(RealVisual、MediaVisual源码中比较详尽),也可搜阅INTERNET上的有关教案。
    基于RealPlayer播放:源码中有具体例子,很容易看懂。
    a.对SMIL的理解
  SMIL(Synchronized Multimedia Integration Language)通常称作同步多媒体集成语言。SMIL语言属于扩展型标记语言XML(Extension Mark-up Language)的范畴,基于XML语法,是一种标记文本语言,包含了URL资源管理、基于CSS的页面编排控制、HTML超媒体链接。采用SMIL可以方便地描述各种媒体之间的时间同步关系和空间编排关系,是Internet上用于集成多媒体节目,尤其是流媒体的主要语言工具,它可以实现视频/音频、导航区的标题与电子讲稿三者的同步。Real Networks公司的Real System支持SMIL语言,而微软的Media则不支持。用SMIL语言制作的同步多媒体课件用RealPlayer播放。
    SMIL是纯文本类型的语言,使用SMIL编写的多媒体文件也是标准的纯文本文件,可以用任何文本编辑器,很方便实现编辑和修改。SMIL语言和其它多媒体集成工具相比,有着突出的特点:
  (1)SMIL语言将各种媒体文件(如音频、视频、文字及图片等)关联起来,并没有将它们融为一体。当想要重新组合生成新的多媒体节目时,只需要重新编辑SMIL文件而无需对各媒体文件做任何改变,可以极大程度地提高媒体素材的重用性。
  (2)运用SMIL可以精确安排整个窗口的(播放)布局,使得各媒体相得益彰,用户一目了然,充分体现网络多媒体的丰富效果。
  (3)由于SMIL为每一个关联的媒体文件都列出了一个独立的URL地址,在编制多媒体节目时,可以使用存放在网络中任何一台服务器上的媒体文件,有利于网络服务器的有效使用。
  (4)SMIL语言可以很方便地建立和控制多媒体节目以及各关联文件的时间线。
  b.SMIL的设计和实现
  (1)SMIL基本规则:
  ①文件由头部(head)和正文(body)两部分组成;
  ②每个标签必须构成闭路:由头部标签与尾标签组成闭路,或单个标签以“/”结束,自成闭路。
  (2)SMIL语言具体实现同步框架结构的代码如下:
  <smil>
  <head>
  <meta name="title" content="Time Line 1900 - 2000"/>
  <meta name="author" content="Daniel Jaffa"/>
  <meta name="copyright" content="RealNetworks"/>
  <meta name="keywords" content=""/>
  <meta name="description" content=""/>
  <meta name="robots" content="all"/>
  <layout type="text/smil-basic-layout">
    <root-layout width="600" height="500" background-color="black"/>
   <region id="text_region" left="250" top="0" width="350" height="500"/>
    <region id="syllabus_region" left="0" top="250" width="250" height="250"/>
    <region id="video_region" left="0" top="0" width="250" height="250"/>
    </layout>
    </head>
    <body>
   <par>
   <text src="rtsp://202.*.142.33:554/syllabus.rt" region="syllabus_region"/>
    <text src="rtsp://202.*.142.33:554/text.rt" region="text_region"/>
    <video src="rtsp://202.*.142.33:554/cengjing.rm" region="video_region" begin="0.000" fill="freeze"/> 
    </par>
    </body>
    </smil>
    其中头部定义了播放窗口及窗口内的区域划分,<root-layout>定义了播放器主窗口的大小,<region>定义了各区域的id、位置及尺寸。
  从上面的代码可知,将播放窗口划分为三个区域,左上角是播放器视频显示区域video_region,左下角是导航标题区域syllabus_region,右侧是文本显示区域text_region。其中<par>和</par>这对组合标记指定可以同时播放多个媒体对象。这样在text.rt文件中通过对时间代码的设定<time begin="起始时间" end="结束时间"/>,即可实现右侧文本文件与左上角的视频同步。
  在syllabus.rt文件中,通过<a href="command:seek(time)" target="_player">导航区的标题</a>指令语句,可指示RealPlayer跳转到当前RealText文件时间线上的某一时间点开始播放。实现左下角的导航区标题与右侧RealText文件同步。
    可见,通过SMIL语言和指令语句便可以实现三者的同步,即实现视频/音频、导航区标题与RealText文件的同步。
    c.SMIL(相对具体)基本知识 
    下面我们看一个实际的SMIL的例子(用记事本编写就可以,注意:在英文状态下编辑。也就是不要打开中文输入法。因为SMIL播放器不认识中文的标点符号!): 
    <smil> 
    <head> 
    <meta name="copyright" content="Your Name"/> 
    <layout> 
    < !-- layout 标记 --> 
    </layout> 
    </head> 
    <body> 
    <!—媒体标记 --> 
    <img src="image1.jpg"/> 
    </body> 
    </smil> 
    显然,SMIL和HTML语言的语法格式非常相像!所以,如果大家对HTML熟悉的话,SMIL学习起来就很容易。但是,二者的差别是很大的,所以如果想学的很好,大家一定要认真地学! 
    从上面这个例子可以看出: 
   (1)SMIL程序以<smil>开始,以</smil>结束。 
    SMIL必须以<smil>开始,以</smil>结束,其他的一切标记都在这二者之间。这个和HTML好像是一样的。 
   (2)整个程序由body和head两个部分组成 
    其中body是必须要有的。而head部分则看实际情况。如果需要的话,我们就写。若是整个SMIL程序非常简单并且没有必要用head部分,那么,我们可以不写。从个人的经验来看,如果要写出一个效果好的演示,head部分是必不可少的! 
   (3)属性和标记要求小写 
    SMIL要求其标记和标记的属性必须小写! 
    我们在这里不想给出属性和标记的定义。SMIL语言就是由标记组成的。每一行都是标记,而标记基本上都有属性。例如:<img src="image1.jpg"/>中,img是标记,而src是属性,image1.jpg是src的属性值。注意:属性值可以大小写都可以。后面我们会碰到有些属性值要求骆驼写法。什么是骆驼写法?像fadeTocolor这样的属性值(看看,中间高,两边低,是不是非常像骆驼的驼峰?J)就是骆驼写法。 
   (4)有些标记必须有一斜杠作为结束标记 
    在SMIL中,如果标记不是配对标记(例如:<smil></smil>、<head></head>、<body></body>等),那么,必须有一斜杠作为结束标记(例如:<img src="image1.jpg"/>)。 
   (5)属性值必须用双引号括起来 
    例如:src="image1.jpg"。注意:SMIL文件中出现的文件名必须和服务器上的文件名一致,其路径一定要正确。否则,SMIL播放器找不到该文件。 
   (6)SMIL文件的拓展名为*.smil或者*.smi 
    我们必须以*.smil或者*.smi的拓展名来保存SMIL文件。这样SMIL播放器才能认出SMIL文件,以采用正确的解码方式解码、播放。为了防止与其它类型文件的拓展名冲突,强烈建议采用*.smil这个拓展名!注意:文件名必须是以数字、字母开始的,中间可以有下划线,不可以有空格。例如:test_one.smil可以,而test one.smil坚决不行!如果你喜欢的话,可以用我们上面讲的骆驼写法testOne.smil。注意:上面的例子大家可以原版复制,保存为testOne.smil。并且找一个图片放到testOne.smil同一个文件夹下,并将image1.jpg改成你的图片的名字(后面如果没有特殊说明,都得这么做),就可以用Realone player打开该源程序,看看我们的第一个演示的效果了。
   (7)附加信息写在<head></head>之间 
    如果我们有些关于源代码的一些说明也就是附加信息,例如版权、作者、标题、基地址等等,我们可以在<head></head>中说明。其基本的格式是:<meta name="" content=""/>,例如:<meta name="author" content="litterone"/><meta name="title" content="I want to learn SMIL"/>。 
   (8)用<!-- … -->进行注释 
    这个标记和HTML里面的是一扬的。我们可以对我们的源文件进行注释。SMIL播放器遇到这个标记后,将跳过去而不予理睬。例如:我们可以在写源代码以前,将我们想要实现的效果在<!-- … -->中写出来,然后在编写源代码,假如我们忘记了删除该段说明,也不会影响演示的执行。 
    上面简单介绍了SMIL语言的基本知识,接下来要详详细细地学习SMIL! 
    d.SMIL详细解析
    SMIL语言的内容很多,我们从最常用的开始谈起。
    1、多媒体片断结构组织
   (1)<seq></seq>标记
    我们首先看下面这个例子:
    <smil>
    <head>
    </head>
    <body>
    <seq>
    <img src="image1.jpg"/>
    <img src="image2.jpg"/>
    </seq>
    </body>
    </smil>
    请保存(记得要用*.smil这样的文件格式)并运行该源程序看看效果。我相信如果大家看到的是这样的效果:Realone player先显示image1.jpg,然后显示image2.jpg。这就是我们这里用<seq></seq>这对顺序播放标记规定的结果。<seq></seq>规定的是:在<seq></seq>中间的多媒体片断顺序播放。
   (2)<par></par>标记 
    接下来瞧瞧这个例子:
    <smil>
    <head>
    </head>
    <body>
    <par>
    <img src="image1.jpg"/>
    <img src="image2.jpg"/>
    </par>
    </body>
    </smil>
    保存->运行->看效果。Realone player同时显示image1.jpg和image2.jpg。这就是我们这里用<par></par>这对并行播放标记所得到的结果。<par></par>规定的是:在<par></par>中间的多媒体片断并行播放。
   (3)<seq></seq>和<par></par>标记协同使用分析下面这个例子:
    <smil>
    <head>
    </head>
    <body>
    <seq>
    <img src="image1.jpg"/>
    <par>
    <img src="image2.jpg"/>
    <img src="image3.jpg"/>
    </par>
    <img src="image4.jpg"/>
    </seq>
    </body>
    </smil>
    这个例子的效果是这样的:Realone player先显示image1.jpg,接下来同时显示image2.jpg和image3.jpg,然后显示image4.jpg。为什么会这样?其中原因我想大家一定非常清楚了。我就不罗嗦了。
    有了<seq></seq>和<par></par>这样两对标记后,我们对多媒体片断播放的先后顺序的控制就变得非常方便了。但是,我们上面的这些演示虽说是演示了。但是,它们的显示时间好像没有受到我们的控制。接下来着手解决这个问题。 
    2、时间控制 
   (1)dur属性 
    请大家看看下面这段代码的效果。 
    <smil> 
    <head> 
    </head> 
    <body> 
    <seq> 
    <img src="image1.jpg" dur="5s"/> 
    <img src="image2.jpg" dur="10s"/> 
    </seq> 
    </body> 
    </smil> 
    相信大家已经看出门道了!对了,我们这里对image1.jpg和image2.jpg的持续时间做了规定。其中image1.jpg持续时间5秒,image2.jpg持续时间10秒。 
   (2)begin和end属性 
    上面规定的是播放多长时间,我们也想规定在什么时候开始播放。请看下面的程序。 
    <smil> 
    <head> 
    </head> 
    <body> 
    <img src="image1.jpg" begin="2" dur="5s"/> 
    </body> 
    </smil> 
    上面的这段程序规定就是图片image1.jpg在整个演示进行2秒后,开始显示,持续的时间是5秒。对于图片的控制是这样,而我们常常需要对视频/音频的时间进行控制。下面这个例子来说明这个问题。
    <smil> 
    <head> 
    </head> 
    <body> 
    <video src="test.rm" begin="5s" end="40s"/> 
    </body> 
    </smil> 
    test.rm这个视频文件(如果大家手头上没有*.rm格式文件,就用Realone player的firstrun.rm或者找个*.avi的也可以。但是文件名要写对!)在整个演示开始5秒后开始播放,在整个演示播放40秒以后,就结束播放。实际的播放时间是:40-5=35秒。但是,一般情形下,我们的视频总在一个组中,这时候,他就的服从组的时间了。我们那下面的这个例子来解释这问题。 
    <smil>  
    <body> 
    <seq dur="5"> 
    <img src="image1.jpg" begin="2" dur="10"/> 
    </seq> 
    </body> 
    </smil> 
    image1.jpg所在的组的持续时间为5秒,而image1.jpg自己要求持续10秒,这是不行的。实际上image1.jpg的显示时间只有5-2=3秒!大家在以后写程序的时候要注意这个问题。 
   (3)clip-begin和clip-end属性 
    考虑这样一种效果: 
    我们只要test.rm播放这个视频/音频的5~10秒这个时间断,怎么办???J有了clip-begin和clip-end,问题就很简单了!请看: 
    <smil>
    <body>
    <video src="test.rm" clip-begin="5s" clip-end="10s"/>
    </body>
    </smil>
    clip-begin和clip-end属性是用内部时间控制的属性。这里的内部指的就是多媒体片断自己的时间线(timeline)。前者规定在什么地方开始播放,后者规定放到什么地方结束播放。为了更清楚的理解这些时间控制,我们看下面的这个例子:
    <smil>
    <body>
    <par>
    <audio src="testone.rm" clip-begin="5" dur="10s"/>
    <audio src="testtwo.rm" begin="7s" clip-begin="2s"clip-end="15s"/>
    </par>
    </body>
    </smil>
    显然,首先是testone.rm从自己的5秒处开始播放,播放7秒以后,testtwo.rm从自己的2秒处开始与testone.rm一起播放,testone.rm播放到自己得15秒处停止播放,testone.rm播放了15-5=10秒。testtwo.rm播放到自己得15秒处停止播放,testone.rm播放了15-2=13秒。             
    接下来我们对时间的表示方法做个说明(默认的时间是秒,所以"2s" 、"2.0s"和"2"都是一样的 ): 
            时间标记 指代 例子 说明 
            h 小时 1.5h 1小时30分钟 
            min 分钟 4.75min 4分45秒 
            s 秒 10.45 10秒450毫秒 
    正确的时间写法是: 
    hh:mm:ss.xy。hh表示小时;mm表示分钟;ss表示秒;x表示1/10秒;y表示1/100秒。例如:begin="01:40.0"表示的是1分40秒处开始,而begin="01:40"表示的是1小时40分处开始。真的注意呀。 
    时间控制非常重要,它直接影响我们演示的效果。而我们上面讲的这部分是最重要的,所以大家一定要理解上面的各个时间概念及其含义。 
   (4)fill属性 
    当演示中的某个片断播放完成以后,我们可以用fill属性来规定它的显示状态。简单的说就是我们是清屏还是冻结屏幕。看下面这个例子: 
    <smil>  
    <body> 
    <video src="test.rm" dur="30s" fill="freeze"/> 
    </body> 
    </smil> 
    假设test.rm的长度是20秒,那么我们这里规定的就是:在test.rm播放终了以后,屏幕上显示的是test.rm的最后一帧(通俗的说就是最后一幅画面),显示的时间是30-20=10秒;如果是图片的话,那么显示就是图片。 
    Fill属性只有remove和freeze两个,默认的值为remove。建议大家在演示的最后的一个多媒体片断上用冻结(freeze),以防止屏幕上空空如也!
   (5)repeat属性 
    如果我们希望我们演示中的某个片断或者全部的片断重复播放若干次(姑且设为2次)。那么我们可以后用repeat属性来实现该效果。分析下面这个例子: 
    <smil>  
    <body> 
    <vedio src="test.rm" dur="1min" repeat="2"/> 
    </body> 
    </smil> 
    上面这个例子就是让test.rm播放两次。如果我们想让某个片断一直播放下去(网络光广告上可以考虑这个),那么repeat="indefinite"就可以了。当然,想要它停下来的一种方法是按下播放器stop(停止)键(在网页插件中就是右键菜单中的stop);另外的一种办法(大家都知道的)是关闭计算机!J 
    3、布局设计 
    我们这里所说的布局就是在我们的屏幕上定出各个多媒体片断显示的位置(单纯的声音文件是不需要布局的!为什么?J 
    因为我们的耳朵听不出声音在屏幕上的什么地方;而我们的眼睛可以看到图片、动画和文字在什么地方!),准确地说是在播放器中。从前面我们并行播放的例子可以看出来,如果我们不对布局进行设计,那么显示的效果一塌糊涂!这里是SMIL的重点和精华部分之一,打起精神! 
   (1)定义基本显示窗口 
    看下面的代码: 
    <smil> 
    <head> 
    <layout> 
    <root-layout width="300" height="200" background-color="white"/> 
    </layout> 
    </head> 
    <body> 
    </body> 
    </smil> 
    说明:a、布局标记必须以<layout>开头,以</layout>结束,其他具体的标记都在这中间。<layout></layout>必须放在<head></head>之间。 
    b、root-layout标记表明的是规定最基本的、最底层的窗口。其他一切窗口都在它的基础上划分出来。 
    c、width="300" 
    表明窗口宽为300个像素点;height="200"表明窗口高为200个像素点;background-color="black"表明窗口的背景颜色为黑色。这里也可以用颜色代码。例如:background-color="#000000"。个人更喜欢代码,因为颜色代码表达颜色众多,但是代码不直观。 
   (2)定义多媒体片断显示窗口 
    分析下面这段源程序: 
    <smil> 
    <head> 
    <layout> 
    <root-layout width="300" height="300" background-color="yellow"/> 
    <region id="vedio_region" left="5" top="5" width="290" height="260"/> 
    <region id="text_region" left="5" top="270" width="290" height="25" background-color="white"/> 
    </layout> 
    </head> 
    <body> 
    <par> 
    <vedio src="test.rm" region="vedio_region"/> 
    <text src="test.txt" region="text_region"/> 
    </par>  
    </body> 
    </smil> 
    说明: 
    a、<region id="vedio_region" left="5" top="5" width="290" height="260"/>定义多媒体片断显示窗口,它的id是vedio_region,这个id是必须要的(在SMIL中,有的id号是可以省略的,但是我们建议大家都写上,这样很容易把整个SMIL文件的脉络弄清楚)!离顶端和左段各有5个像素点的距离(注意:这里的坐标是相对基本显示窗口而言!)。窗口宽为290个像素点;高为260个像素点。下面的显示窗口的定义和这个是一样的。 
    b、<vedio src="test.rm" region="vedio_region"/>声明了多媒体片断test.rm在vedio_region这个区域播放;<text test.txt" region="text_region"/>声明了文本文件test.txt在vedio_region这个区域显示。 
    上面我们对多媒体片断显示窗口的采用的是绝对定义的方法。多媒体片断显示窗口也可以用相对定义的方法来定义。例如: 
    <region id="vedio_region" top="10%" left="10%" width="80%" height="80%"/> 
    上面的比例是相对基本显示窗口而言的。这样的定义方法更为直观。 
   (3)fit属性 
    在实际制作演示的时候,我们碰到了这样的问题:我们定义的显示窗口的大小和我们的多媒体片断的尺寸大小不一致,或大了或小了。相信大家也会碰到这样的问题。解决的办法有: 
    a、修改窗口的大小(但是,很多时候我们没有办法修改。因为,如果修改的话,那么会影响其他窗口的显示。相应的其它窗口也得修改。实际情况是:我们很多的不同尺寸的多媒体片断都可能在同一个窗口中显示!)。 
    b、使用恰当的多媒体片断和窗口的匹配方式。 
    看小面这段代码: 
    <region id="vedio_region" width="80%" height="80%" fit="meet"/> 
    它的意思就是窗口vedio_region以meet方式显示多媒体片断。 
    fit属性的属性值有hidden、meet、fill、scroll和slice四个。其中hidden是默认的属性值。 
    Hidden表示保持多媒体片断的尺寸不变,从窗口的左上角开始显示。如果多媒体片断尺寸比窗口的尺寸小,那么空白的地方将用背景色填充。如果多媒体片断尺寸比窗口的尺寸大,那么多媒体片断超出窗口部分被裁去,不被显示。个人不喜欢这样的方式。 
    meet表示在保持多媒体片断宽/高比例不变的情况下,对多媒体片断的尺寸进行缩放。从左上角开始显示,缩放到高度和宽度中的一个尺寸等于窗口的相应的尺寸,而另外的一个小于窗口的相应的尺寸。空白处用背景色填充。我喜欢这个! 
    fill表示缩放多媒体片断使得其大小正好和窗口的大小一致。如果多媒体片断的宽/高比例和窗口的宽/高比例不等,那么多媒体片断就会变形,非常难看。强烈建议不要采用这种方式! 
    scroll表示对多媒体片断的尺寸不做什么修改,它以正常的尺寸大小显示。但是,如果多媒体片断的尺寸超出了窗口的尺寸,那么将会相应出现水平或者垂直滚动条。该种发式适合于长时间的多媒体片断的显示。如果多媒体片断的显示时间很短,建议不要使用! 
    slice表示在保持多媒体片断宽/高比例不变的情况下,对多媒体片断的尺寸进行缩放。从左上角开始显示,缩放到高度和宽度中的一个尺寸等于窗口的相应的尺寸,而另外的一个大于窗口的相应的尺寸。超出的不分被裁去而不显示。 
   (4)z-index属性 
    先试运行下面的源程序: 
    <smil> 
    <head> 
    <layout> 
    <root-layout width="300" height="300"/> 
    <region id="vedio1_region" width="300" height="300"/> 
    <region id="vedio2_region" left="270" top="270" width="30" height="30"/> 
    </layout> 
    </head> 
    <body> 
    <par> 
    <vedio src="testone.rm" region="vedio1_region"/> 
    <vedio src="testtwo.rm" region="vedio2_region"/> 
    </par>  
    </body> 
    </smil> 
    我想大家已经看出来了:我们这里想做的就是那种电视的画中画效果。但是在实际显示的时候,我们的小画面有时候被大画面所覆盖。我的苦心也白费了。z-index属性这个时候是我们的救星。 
    修改< region id="vedio1_region" width="300" height="300"/> 
    <region id="vedio2_region" left="270" top="270" width="30" height="30"/> 
    成:<region id="vedio1_region" width="300" height="300" z-index="0"/> 
    <region id="vedio2_region" left="270" top="270" width="30" height="30" z-index="1"/> 
    看看效果,行了吗? 
    z-index属性规定相互重叠的窗口的显示次序。数字大那么显示就在上面。这个很容易理解,我们就不说太多。但是以下几点要注意: 
    a、root层窗口总是在最后一层,并且不用z-index属性。 
    b、z-index属性值可以是负数。当然它就的排在0以后。 
    c、  没有重叠的窗口可以使用同一z-index属性值。 
    4、链接制作 
    传统的流媒体的最大的一个弊端是没有交互性(Interaction)。现在如日中天的flash本质上就是一种可交互性的流!由此可见可交互性的流的市场潜力。而SMIL是解决大部分流媒体交互性的最好的工具!这部分要求大家必须掌握,如果没有的话,那么我们学习SMIL就失去了意义。因为这里是SMIL的主要特色(与其他的视频编辑软件相比较),就好像指针是C语言的特色一样。 
   (1)<a></a>标记 
    运行下面这个程序: 
    <smil> 
    <head> 
    <layout> 
    <root-layout width="300" height="300"/>       
    <region id="videoregion" top="0" left="0" width="300" height="300"/>       
    <layout> 
    </head> 
    <body> 
    <a href="1.rm"> 
    <video src="videotest.rm" region="videoregion"/> 
    </a> 
    </body> 
    </smil> 
    正常情况下,我们看到播放器播放videotest.rm,如果我们把鼠标放到正在播放的videotest.rm上面,鼠标将有指针形状变为小手形状。单击鼠标左键,播放器播放将停止播放videotest.rm而播放1.rm这个文件。这里我们就成功的创建了一个很简单的链接。<a></a>属性就是用于链接标记,href表示的是所要链接的文件。这种方法非常简单,我们就不做过多的介绍。 
    如果我们要创建更加复杂的链接,我们就要用到下面的这个属性。 
   (2)<anchor>属性 
    将上例中的< body>< /body>换成下面这段代码,看看效果是不是有区别? 
    <body> 
    <video src="videotest.rm" region="videoregion"> 
    <anchor href="1.rm"/> 
    </video> 
    </body> 
    我们看到的效果是完全一样的!那么<anchor>属性不就多余了吗? 那是不会的!请看: 
    a、分时段链接 
    考虑这样一个问题:我们要在0~10秒链到一个文件,10~20秒链到另一个文件,该怎么办?看我们的: 
    <body> 
    <video src="1.avi" region="videoregion"> 
    <anchor href="1.jpg" begin="0s" end="10s"> 
    <anchor href="videotest.rm" begin="10s" end="20s"/> 
    </video> 
    大家将看到的效果:播放器播放1.avi,在0~10秒链到1.jpg,在10~20秒链到videotest.rm。警告:dur、clip-begin和clip-end这里不支持! 
    B、链接部分SMIL 
    我们的链接可以链接的文件很多,几乎所用的多媒体片断都可以。*.smil和*.html也可以。但是,下面我们要讨论的是如何链接部分SMIL。请看例子。 
    第一个SMIL文件,取名test11.smil 
    <smil> 
    <head> 
    <layout> 
    <root-layout width="400" height="300"/>       
    <region id="videoregion" top="0" left="0" width="400" height="300" fit="meet"/>       
    </layout> 
    </head> 
    <body> 
    <video src="1.avi" region="videoregion"> 
    <anchor href="test11app.smil#testlink"/>   
    </video> 
    </body> 
    </smil> 
    第一个SMIL文件,取名test11app.smil 
    <smil> 
    <head> 
    <layout> 
    <root-layout width="400" height="300"/>       
    <region id="videoregion" top="0" left="0" width="400" height="300" fit="meet"/>       
    </layout> 
    </head> 
    <body> 
    <video id="testlink" src="1.avi" clip-begin="150" region="videoregion"/> 
    </body> 
    </smil> 
    大家一定看出来了!我就是在test11app.smil中为我们要链接的那部分内容设上id,然后在test11.smil中的链接中用“#”来指向该标记id。应用的很多的时候是组内内容。我们把test11app.smil修改为: 
    <body> 
    <par id="testlink"> 
    <video src="1.avi" clip-begin="150" region="videoregion"/> 
    </par> 
    </body> 
    到这里,链接可以说已经很完美了。但是,如果要锦上添花,那么下面这个属性是必不可少的。 
   (3)coords属性 
    将上面的<anchor href="1.rm"/>代码修改为: 
    <anchor href="1.rm" coords="0, 0,150,300"/> 
    或者: 
    <anchor href="1.rm" coords="0%, 0%,50%,100%"/> 
    运行,看看效果。JJ我们看到左半部分有链接效果,而右半部分却没有!这是我们采用了坐标规定链接区的缘故。coords属性值的第一、二个数分别表示的是链接区的左上角点的水平(left)和垂直(top)坐标;第三、四个数分别表示的是链接区的右下角点的水平(left)和垂直(top)坐标。上面用的是像素点的绝对定义方法,下面用的是比例的相对定义方法。喜欢哪一个就看你的喜好了。 
   (5)链接注意 
    我们的演示最后基本上都要放到服务器上。因此,文件的位置的规定就非常重要,如果文件位置出错,那么播放器将找不到文件而不能播放。这是我们最不希望看到的!下面我们就来讨论这个问题。 
    A、创建基地址 
    看下面的代码: 
    <head> 
    <meta name="base" content="rtsp://abc.5dmedia.com/"/> 
    </head> 
    上面就是在<head></head>中用附加信息的方式规定了整个smil文件的基地址为rtsp://abc.5dmedia.com/。规定了基地址以后,我们在用该地址下的文件的时候,就只需要给出路径就可以了。例如: 
    <body> 
    <video src="video/first.rm"/> 
    <video src=" video /second.rm"/>   
    <audio src="rtsp://abc.mysite.com/audio/test.mp3"/> 
    <img src="http// www.5dmedia.com/image/welcome.jpg"/> 
    </body> 
    这个例子中的前面的两个文件用的是基地址服务器上的文件,所以,可以之写出相对地址。但是,后面的两个文件用的是其他服务器上的文件,我们必须给出绝对地址。其中rtsp是实时流传输协议,它保证SMIL播放器正确地从流服务器abc.mysite.com上的audio文件夹下获得我的所要的文件test.mp3。554为流服务器的端口。http是超文本传输协议。它保证SMIL播放器正确地从web服务器www.5dmedia.com上的image文件夹下获得我的所要的文件welcome.jpg。
    <audio src="rtsp://abc.mysite.com:554/audio/test.mp3"/>说明的是该文件不在上面的基地址下,而在rtsp://abc.mysite.com:554/audio/这个地方法,所我们必须修改地址。 
    如果我们用的是本地机器硬盘上的文件就可以用src="file:/c:\audio\first.rm"进行读取该文件。 
    大家在调用文件之前,一定要弄清楚文件的位置! 
    5、语言选择和智能流 
   (1)语言选择 
    如果,我们想要扩大我们演示的收看人群,那么我们的听众就会有中国人、美国人、法国人、俄罗斯等等。那么怎样才能提供这种多国语言的支持呢? 
    Switch属性是该问题的“杀手”! 
    请看例子: 
    <smil> 
    <body> 
    <switch> 
    <video src="English.rm" system-language="en-us"/>  
    <video src="Chinese.rm" system-language="zh-cn"/> 
    </switch> 
    </body> 
    </smil> 
    在SMIL播放器播放该SMIL文件时,检测你的播放器设置的是什么语言,如果是美国英语(en-us),那么就从服务器下载English.rm播放;如果是简体中文(zh-cn),那么就从服务器下载Chinese.rm文件播放。你可以设置很多的国家的选项。当然你的语言的版本也就很多了。J下面我们给出经常使用的一些语言的代码。 
            代码 语言 
            zh-cn 中文 (中华人民共和国) 
            en-us 英语 (美国) 
            fr 法语 (标准法语) 
            de 德育(标准德语) 
            it 意大利语(标准意大利语) 
            ja 日语 
            es 西班牙语(西班牙) 
   (2)智能流(surestream) 
    用户的联网速度是不尽相同的。有的可能只有50K左右,有的可能有几百K。如果我们满足了高速用户的要求,那么低速用户可能由于速度太慢而不能收看。如果我们满足了低速用户的要求,那么高速用户看到的效果就打了不少的折扣,浪费了高速的带宽。怎么办? 
    <smil> 
    <body> 
    <switch>  
    <vedio src="highspeed.rm" system-bitrate="250000"/> 
    <vedio src="midspeed.rm" system-bitrate="80000"/>  
    <vedio src="lowspeed.rm" system-bitrate="20000"/> 
    </switch> 
    </body> 
    </smil> 
    当用户的联网速度大于250kbps时,播放器就从服务器下载highspeed.rm播放;如果用户的联网速度大于80kbps小于250kbps时,播放器就从服务器下载midspeed.rm播放;如果用户的联网速度大于20kbps小于80kbps时,播放器就从服务器下载lowspeed.rm播放。所谓的“众口难调”在各位的手里就变得如此简单!
    上面讲的就是智能流(surestream)的本质实现方法!我们下面看一个复杂的一点的例子。 
    <body> 
    <switch> 
    <par system-bitrate="225000"> 
    <!--联网速度大于250kbps时,播放该组--> 
    <audio src="audio/music1.rm"/> 
    <video src="video/video1.rm" region="videoregion"/> 
    <text src="words/narration.txt" region="textregion"/> 
    </par> 
    <par system-bitrate="80000"> 
    <!--联网速度大于80000bps而小于250000bps时,播放该组--> 
    <audio src="audio/music2.rm"/> 
    <video src="video/video2.rm" region="videoregion"/> 
    <textstream src="words/narration.rt" region="textregion"/> 
    </par> 
    <par system-bitrate="20000"> 
    <!--联网速度大于20kbps而小于80kbps时,播放该组--> 
    <audio src="audio/music3.rm"/> 
    <video src="video/video3.rm" region="videoregion"/> 
    <text src="words/narration.txt" region="textregion"/> 
    </par> 
    </switch> 
    </body> 
    (3)语言与速度的同时检测
    <body>
    <switch>
    <!—简体中文并且速度大于28kbps-->
    <text src=" Chinese_14000.txt" system-language="zh-cn" 
system-bitrate="28000"/>
    <!--简体中文并且速度大于14kbps-->
    <text src="Chinese_28000.txt" system-language="zh-cn" 
system-bitrate="14000"/>
    <!—美国英文并且速度大于28kbps-->
    <text src="english_14000.txt" system-language="en-us" 
system-bitrate="28000"/>
    <!--美国英文并且速度大于14kbps-->
    <text src="english_28000.txt" system-language="en-us" 
system-bitrate="14000"/>
    </switch></body>
   (4)演示速度的控制上面我们讲的是在演示文件已经创建好的条件下进行的。那么,我们怎样制作好多媒体片断。下面是我们的建议:
    a、用Realproducer或者其他的压缩工具制作流文件时,选择正确的压缩比例。为高速用户准备的文件的压缩比可以小一些,对于低速用户准备的文件的压缩比要大一点。b、 
    在网络传输过程中,视频占用的带宽是最多的,音频次之,接下来是动画、图片,文字是最少的。所以,我们充分考虑我们的演示的结构。例如:如果并行播放多个视频,这显然是不合适的。我们可以用图片来替代一部分视频效果。 
    c、我们在传输中不能全部占用用户的带宽,必须留出一部分给用户浏览网页或者是干其它用途的。我们很多的年轻人当然是用于QQ聊天!下表列出了我们的建议。 
            用户速度 建议最大流占用带宽 
            14.4 Kbps modem 10 Kbps 
            28.8 Kbps modem 20 Kbps 
            56 Kbps modem 34 Kbps 
            64 Kbps ISDN 45 Kbps 
            112 Kbps dual ISDN 80 Kbps 
            Corporate LAN 150 Kbps 
            256 Kbps DSL/cable modem 225 Kbps 
            384 Kbps DSL/cable modem 350 Kbps 
            512 Kbps DSL/cable modem 450 Kbps 
    在我们以后的制作中。上面的这些知识是非常实用的。大家一定要努力掌握! 
    6、动画效果 
    我们前面学习的内容是SMIL1.0规定的。在SMIL2.0中添加了不少的内容,其中动画就是其中一个。很多的国外的教程上把flash文件*.swf归为这一类。我们不能同意这样的分类方法。我们认为把这样已经做好的动画该归为视频一类。真正的动画(从SMIL2.0规范中可以看出来)是有SMIL规定的并有SMIL播放器解释产生的动画。 
    从实际情况来看,动画效果主要是针对图片产生的。所以,我们在这里用图片来做例子。其他的多媒体的制作方法是类似的。有兴趣的GG、JJ、DD和MM可以自己做做。 
   (1)运动动画 
    为先睹为快,请在Realone player中运行下面的程序: 
    <smil xmlns="<a href="http://www.w3.org/2000/SMIL20/CR/Language">" target=_blank>http://www.w3.org/2000/SMIL20/CR/Language"></a> 
    <head>  
    <layout> 
    <root-layout width="800" height="600"/>   
    <region id="Images" left="0" width="800" height="600"/> 
    </layout>      
    </head>   
    <body>        
    <img region="Images" src="g03.jpg" dur="6s">   
    <animateMotion from="0 0" to="600 400" dur="4s"/>         
    </img>          
    </body> 
    </smil> 
    解释:
    a、我们这里用到的是SMIL2.0规范中的规定的内容的。所以,在第一行里(xmlns="<a href="http://www.w3.org/2000/SMIL20/CR/Language")我们必须声明我们所用的规范。不然的话,播放器可能不能正确解码、播放。" target=_blank>http://www.w3.org/2000/SMIL20/CR/Language")我们必须声明我们所用的规范。不然的话,播放器可能不能正确解码、播放。</a>
    b、animateMotion标记声明的是我们所要的动画类型。注意:这里就是我们所说的骆驼写法,还记得吧!JJ 
    c、from="0,0" to="600,400"属性及其属性值声明的是动画从坐标点(0,0)运动到坐标点(600,400)。这里我们也可以写成:
    <animateMotion from="0,0" to="600,400" dur="4s"/> 
    d、dur="4s"属性及其属性值声明的是动画在4秒内完成。在我们这个例子中,图片的存在时间是6秒,那么动画完成后,将有2秒钟的时间静止不动。如果图片的存在时间小于动画存在时间,那么动画运动到半路上就的停止,这样的情况是该避免的。 
   (2)缩放动画 
    下面我们看看另外的一种动画形式:缩放动画。先看效果!
    <smil xmlns="<a href="http://www.w3.org/2000/SMIL20/CR/Language">" target=_blank>http://www.w3.org/2000/SMIL20/CR/Language"></a> 
    <head>  
    <layout> 
    <root-layout width="800" height="600"/>   
    <region id="Images" left="0" width="800" height="600"  
fit="meet"/> 
    </layout>        
    </head> 
    <body>    
    <img region="Images" dur="10s" src="g03.jpg" width="400" height="320">                       
    <animate attributeName="height" from="320" to="160" 
fill="freeze" dur="10s"/> 
    </img>    
    </body> 
    </smil> 
    解释:animate attributeName="height" from="320" to="160"声明了动画的类型和参数。大家看了效果以后,在结合上面的参数的意义,各参数是什么意思我们也就不用多讲了。
    7、转场效果   
    首先解释一下什么是转场效果。我们的演示中多媒体片断是很多的,不可避免的会有两个片断之间的切换。例如:一个图片演示完了,该接着演示下一个图片,两图片中间是有一个过渡的。这个过渡我们就称谓转场效果。如果我们不设置转场效果,那么,过渡的效果肯定不好。LSMIL中的转场效果大致分为wipe和fade两类。
   (1)fade类型从名字就可以看出,这个是淡入淡出的效果。先睹为快!请看例子!
    <smil xmlns="<a href="http://www.w3.org/2001/SMIL20/Language">" target=_blank>http://www.w3.org/2001/SMIL20/Language"></a>
    <head>
    <transition id="fade1" type="fade" subtype="fadeToColor" dur="4s"/>
    <transition id="fade2" type="fade" subtype="fadeFromColor" dur="4s"/>
    </head>
    <body>
    <img src="g04.jpg" dur="10s" transIn="fade2" transOut="fade1"/>
    </body>
    </smil>
    解释:a、transition声明我们要设置转场效果。id="fade1"设置了该转场效果的id号。id号必须设置。type="fade"设置了转场效果的基本类型为fade。 
    subtype="fadeToColor"设置了转场效果的具体类型(子类型)为fadeToColor(注意这里又是我们提到的骆驼写法!)。dur="4s"设置了该场效果完成的时间。b、transIn="fade2"设置了图片g04.jpg显示时采用转场效果fade2; 
    transOut="fade1"规定图片g04.jpg完成显示时采用转场效果fade1。c、fade只有三个子类型。上面我们用了2个。还有一个是crossfade,这个也是缺省设置。 
   (2)wipe类型 
    wipe为擦去类型。该类型的效果很多很多。我们这里所说的wipe只是他们的总称(注意wipe不能作为type的属性值,而是它的子类作为type的属性值,子类的子类作为subtype的属性值!J谁让它的属性值这么多!!!)。具体的有barWipe、boxWipe、fourBoxWipe等36大类!!!不管它有多少类,先看看怎么弄。请看例子: 
    <smil xmlns="<a href="http://www.w3.org/2001/SMIL20/Language">" target=_blank>http://www.w3.org/2001/SMIL20/Language"></a> 
    <head>      
    <transition id="wipe1" type="slideWipe" subtype="fromTop"/> 
    <transition id="wipe2" type="waterfallWipe"/>   
    </head> 
    <body>     
    <img  src="g03.jpg" transIn="wipe1" transOut="wipe2" dur="5s"/>  
    </body> 
    </smil> 
    解释:a、和上面的写法基本上是一致的! 
    b、type="waterfallWipe"后面没有子类型表示使用的是waterfallWipe类型的默认子类型。 
   (3)综合应用 
    我们上面都只是用在单个多媒体片断上的转场效果。下面看看在多个多媒体片断上怎样设置转场效果。还得看例子:J 
    <smil xmlns="<a href="http://www.w3.org/2001/SMIL20/Language">" target=_blank>http://www.w3.org/2001/SMIL20/Language"></a> 
    <head>   
    <layout> 
    <root-layout width="400" height="300"/> 
    </layout> 
    <transition id="fade" type="fade" subtype="fadeToColor" fadeColor="green" dur="4s"/> 
    <transition id="fade1" type="fade" subtype="fadeFromColor" fadeColor="red" dur="4s"/> 
    <transition id="fade2" type="fade" subtype="crossfade" dur="2s"/> 
    <transition id="push" type="snakeWipe" dur="4"/> 
    </head> 
    <body>     
    <seq> 
    <img dur="5s" src="g06.jpg"  transIn="fade1" fill="transition"/> 
    <img dur="4s" src="g05.jpg"  transIn="fade2" fill="transition"/> 
    <img dur="4s" src="g06.jpg"  transIn="fade2" fill="transition"/> 
    <img dur="4s" src="g05.jpg"  transIn="push" transOut="fade"/> 
    </seq>       
    </body> 
    </smil> 
    解释:a、fadeColor="green"设置了谈出谈入色为绿色(green)。在这里表示的就是从当前的多媒体片断渐变为绿色。下面的fadeColor="red"则表示从红色渐变为当前的多媒体片断(如果是图片则变为图片,如是视频则变为第一帧)。 
    b、fill="transition"表示的是最后的完成效果有下面的转场效果来决定。 
    c、最后一个就不能用fill="transition"了。想想,它就是最后一个了,上哪里去找下面的转场效果呢?
    最后列举三个特技效果
    反复播放
<smil> 
<body> 
<video src="你的宣传片地址" repeat="indefinite"/> 
</body> 
</smil>
    电视台的台标
<smil xmlns="<a href="http://www.w3.org/2001/SMIL20/Language"" target=_blank>http://www.w3.org/2001/SMIL20/Language"</a> xmlns:rn="<a href="http://features.real.com/2001/SMIL20/Extensions">" target=_blank>http://features.real.com/2001/SMIL20/Extensions"></a>
<head>
<layout>
<root-layout width="352" height="288" backgroundColor="black"/>
<region id="video_region" width="100%" height="100%" fit="meet">
<region id="video_region_logo" left="0" top="0" height="42" width="50"/>
</region>
</layout>
</head>
<body>
<par>
<!-- .jpg 做为台标图片,可实现半透明叠印效果 -->
<img src="images/11.jpg" region="video_region_logo" rn:mediaOpacity="100%" fill="hold"/>
<video src="lh.rm" region="video_region" regPoint="center" regAlign="center" fill="remove"/>
</par>
</body>
</smil>  
    滚动字幕(RT文件)
<window type="tickertape" duration="50:00" width="400" height="60" loop="true" underline_hyperlinks="false" link="white">
<br/><b>
<tu><a href="<a href="http://aboutplayer.com/"" target=_blank>http://aboutplayer.com/"</a> target="_black">http://aboutplayer.com</a></tu>
<tl>tel:0×××-××××××××</tl>
<tu>linkman:aboutplayer</tu><tl>phone:139×××××××× , 139×××××××× E_Mail:cwlhb098@126.com</tl>
</b> 
</window>

    演示(在第6-8页)

    基于Windows Media Player播放:从源码显示路径下载,很容易看懂。
    还有asx文件的特殊用法(外部改变媒体如作者等信息、图标链接等,Real & Media Player源码中有下载路径。

    演示

    3、简单连续播放功能
    RealPlayer:Ram文件、M3u文件。(无特殊语法)
    Windows Media Player:Wpl文件、Asx文件、M3u文件。(有固定格式)
    源码中有或可以下载(注:M3u<源码中没提供>同Ram,可以相互换扩展名)。
posted at 05/09/24 07:39 | 技术文摘 | 浏览(275) | 引用(1) | 评论(1)

ORACLE备份策略(ORACLE BACKUP STRATEGY)
概要
1、了解什么是备份
2、了解备份的重要性
3、理解数据库的两种运行方式
4、理解不同的备份方式及其区别
5、了解正确的备份策略及其好处

一、了解备份的重要性
可以说,从计算机系统出世的那天起,就有了备份这个概念,计算机以其强大的速度处理能力,取代了很多人为的工作,但是,往往很多时候,它又是那么弱不禁风,主板上的芯片、主板电路、内存、电源等任何一项不能正常工作,都会导致计算机系统不能正常工作。当然,这些损坏可以修复,不会导致应用和数据的损坏。但是,如果计算机的硬盘损坏,将会导致数据丢失,此时必须用备份恢复数据。
其实,在我们的现实世界中,已经就存在很多备份策略,如RAID技术,双机热备,集群技术发展的不就是计算机系统的备份和高可用性吗?有很多时候,系统的备份的确就能解决数据库备份的问题,如磁盘介质的损坏,往往从镜相上面做简单的恢复,或简单的切换机器就可以了。
但是,上面所说的系统备份策略是从硬件的角度来考虑备份与恢复的问题,这是需要代价的。我们所能选择备份策略的依据是:丢是数据的代价与确保数据不丢失的代价之比。还有的时候,硬件的备份有时根本满足不了现实需要,假如你误删了一个表,但是你又想恢复的时候,数据库的备份就变的重要了。ORACLE本身就提供了强大的备份与恢复策略,这里我们只讨论ORACLE备份策略,以下的备份都是指ORACLE数据库备份,恢复将放到下一讲中。
所谓备份,就是把数据库复制到转储设备的过程。其中,转储设备是指用于放置数据库拷贝的磁带或磁盘。
能够进行什么样的恢复依赖于有什么样的备份。作为 DBA,有责任从以下三个方面维护数据库的可恢复性:
·使数据库的失效次数减到最少,从而使数据库保持最大的可用性;
·当数据库不可避免地失效后,要使恢复时间减到最少,从而使恢复的效率达到最高;
·当数据库失效后,要确保尽量少的数据丢失或根本不丢失,从而使数据具有最大的可恢复性。
灾难恢复的最重要的工作是设计充足频率的硬盘备份过程。备份过程应该满足系统要求的可恢复性。例如,如果数据库可有较长的关机时间,则可以每周进行一次冷备份,并归档重做日志,对于24*7的系统,或许我们考虑的只能是热备份。如果每天都能备份当然会很理想,但要考虑其现实性。企业都在想办法降低维护成本,现实的方案才可能被采用。只要仔细计划,并想办法达到数据库可用性的底线,花少量的钱进行成功的备份与恢复也是可能的。
二、了解ORACLE的运行方式
ORACLE数据库有两种运行方式:一是归档方式(ARCHIVELOG),归档方式的目的是当数据库发生故障时最大限度恢复数据库,可以保证不丢失任何已提交的数据;二是不归档方式(NOARCHIVELOG),只能恢复数据库到最近的回收点(冷备份或是逻辑备份)。我们根据数据库的高可用性和用户可承受丢失的工作量的多少,对于生产数据库,强烈要求采用为归档方式;那些正在开发和调试的数据库可以采用不归档方式。
如何改变数据库的运行方式,在创建数据库时,作为创建数据库的一部分,就决定了数据库初始的存档方式。一般情况下为NOARCHIVELOG方式。当数据库创建好以后,根据我们的需要把需要运行在归档方式的数据库改成ARCHIVELOG方式。
1、改变不归档方式为为归档方式
a.关闭数据库,备份已有的数据,改变数据库的运行方式是对数据库的重要改动,所以要对数据库做备份,对可能出现的问题作出保护。
b. 修改初试化参数,使能自动存档
修改(添加)初始化文件init[SID].ora参数:
log_archive_start=true #启动自动归档
log_archive_format=ARC%T%S.arc #归档文件格式
log_archive_dest=/arch12/arch #归档路径
在8i中,可以最多有五个归档路径,并可以归档到其它服务器,如备用数据库(standby database)服务器
c.启动Instance到Mount状态,即加载数据库但不打开数据库:
$>SVRMGRL
SVRMGRL >connect internal
SVRMGRL >startup mount
d.发出修改命令
SVRMGRL >alter database archivelog;
SVRMGRL>alter database open;
2、改变归档状态为不归档状态
与以上步骤相同,但有些操作不一样,主要是在以上的b操作中,现在为删除或注释该参数,在d操作中,命令为
SVRMGRL >alter database noarchivelog;
注意,从归档方式转换到非归档方式后一定要做一次数据库的全冷备份,防止意外事件的发生。
三、ORACLE备份的分类
简单的按照备份进行的方式,可以分为逻辑备份、冷备份(脱机备份)、热备份(联机备份),其实冷备份与热备份又可以合称为物理备份
按照备份的工具,可以分为EXP/IMP备份、OS拷贝、RMAN、第三方工具,如VERITAS
以下我们将从多个角度来说明以上的各种备份方式
1、EXP/IMP逻辑备份
导入/导出是ORACLE幸存的最古老的两个命令行工具了,其实我从来不认为Exp/Imp是一种好的备份方式,正确的说法是Exp/Imp只能是一个好的转储工具,特别是在小型数据库的转储,表空间的迁移,表的抽取,检测逻辑和物理冲突等中有不小的功劳。当然,我们也可以把它作为小型数据库的物理备份后的一个逻辑辅助备份,也是不错的建议。
对于越来越大的数据库,特别是TB级数据库和越来越多数据仓库的出现,EXP/IMP越来越力不从心了,这个时候,数据库的备份都转向了RMAN和第三方工具。下面我们还是简要介绍一下EXP/IMP的使用。
i、使用方法
Exp parameter_name=value
Or Exp parameter_name=(value1,value2……)
只要输入参数help=y就可以看到所有帮助
如:
C:\>set nls_lang=simplified chinese_china.zhs16gbk
C:\>exp -help
Export: Release 8.1.6.0.0 - Production on 星期四 4月 10 19:09:21 2003
(c) Copyright 1999 Oracle Corporation. All rights reserved.

通过输入 EXP 命令和用户名/口令,您可以
在用户 / 口令之后的命令:

实例: EXP SCOTT/TIGER
或者,您也可以通过输入跟有各种参数的 EXP 命令来控制“导出”
的运行方式。要指定参数,您可以使用关键字:

格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
实例: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
或 TABLES=(T1: P1,T1: P2),如果 T1 是分区表
USERID 必须是命令行中的第一个参数。
关键字 说明(默认) 关键字 说明(默认)
--------------------------------------------------------------------------
USERID 用户名/口令 FULL 导出整个文件 (N)
BUFFER 数据缓冲区的大小 OWNER 所有者用户名列表
FILE 输出文件 (EXPDAT.DMP) TABLES 表名列表
COMPRESS 导入一个范围 (Y) RECORDLENGTH IO 记录的长度
GRANTS 导出权限 (Y) INCTYPE 增量导出类型
INDEXES 导出索引 (Y) RECORD 跟踪增量导出 (Y)
ROWS 导出数据行 (Y) PARFILE 参数文件名
CONSTRAINTS 导出限制 (Y) CONSISTENT 交叉表一致性
LOG 屏幕输出的日志文件 STATISTICS 分析对象 (ESTIMATE)
DIRECT 直接路径 (N) TRIGGERS 导出触发器 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
FILESIZE 各转储文件的最大尺寸
QUERY 选定导出表子集的子句

下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
TABLESPACES 将传输的表空间列表
在没有警告的情况下成功终止导出。
C:\>
帮助已经很详细的说明了参数的意义和使用方法,并列举了几个简单的例子,注意的是,从8i开始,已经开始支持数据子集的方法,就是可以指定自己的Where条件,可以从表中导出一行或多行数据。
注意上面的set nls_lang=simplified chinese_china.zhs16gbk,通过设置环境变量,可以让exp的帮助以中文显示,如果set nls_lang=American_america.字符集,那么你的帮助就是英文的了。
增量和累计导出必须在全库方式下才有效,而且,大多数情况下,增量和累计导出并没有想象中的那么有效。ORACLE从9i开始,不再支持增量导出和累计导出。
ii、表空间传输
表空间传输是8i新增加的一种快速在数据库间移动数据的一种办法,是把一个数据库上的格式数据文件附加到另外一个数据库中,而不是把数据导出成Dmp文件,这在有些时候是非常管用的,因为传输表空间移动数据就象复制文件一样快。
关于传输表空间有一些规则,即:
·源数据库和目标数据库必须运行在相同的平台上。
·源数据库与目标数据库必须使用相同的字符集。
·源数据库与目标数据库一定要有相同大小的数据块(9i已经不用)
·目标数据库不能有与迁移表空间同名的表空间
·SYS的对象不能迁移
·必须传输自包含的对象集
·有一些对象,如物化视图,基于函数的索引等不能被传输
可以用以下的方法来检测一个表空间或一套表空间是否符合传输标准:
exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true);
select * from sys.transport_set_violation;
如果没有行选择,表示该表空间只包含表数据,并且是自包含的。对于有些非自包含的表空间,如数据表空间和索引表空间,可以一起传输。
以下为简要使用步骤,如果想参考详细使用方法,也可以参考ORACLE联机帮助。
a.设置表空间为只读(假定表空间名字为APP_Data 和APP_Index)
alter tablespace app_data read only;
alter tablespace app_index read only;
b.发出EXP命令
SQL>host exp userid=”””sys/password as sysdba”””
transport_tablespace=y tablespace=(app_data, app_index)
以上需要注意的是
·为了在SQL中执行EXP,USERID必须用三个引号,在UNIX中也必须注意避免“/”的使用
·在816和以后,必须使用sysdba才能操作
·这个命令在SQL中必须放置在一行(这里是因为显示问题放在了两行)
c.拷贝数据文件到另一个地点,即目标数据库
可以是cp(unix)或copy(windows)或通过ftp传输文件(一定要在bin方式)
d.把本地的表空间设置为读写
e.在目标数据库附加该数据文件
imp file=expdat.dmp userid=”””sys/password as sysdba”””
transport_tablespace=y
“datafile=(c:\temp\app_data,c:\temp\app_index)”
f.设置目标数据库表空间为读写
alter tablespace app_data read write;
alter tablespace app_index read write;
iii、导出/导入与字符集
明白ORACLE的多国语言设置,ORACLE多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示,货币形式,排序方式和CHAR, VARCHAR2,CLOB,LONG字段的数据的显示等有效。ORACLE的多国语言设置最主要的两个特性就是国家语言设置与字符集设置,国家语言设置决定了界面或提示使用的语言种类,字符集决定了数据库保存与字符集有关数据(如文本)时候的编码规则。正如刚才上面的一个小例子,环境变量 NLS_LANG的不同,导致EXP帮助发生变化,这就是多国语言设置的作用(NLS_LANG包含国家语言设置与字符集设置,这里起作用的是国家语言设置,而不是字符集)。
ORACLE字符集设定,分为数据库字符集和客户端字符集环境设置。在数据库端,字符集在创建数据库的时候设定,并保存在数据库props$表中,对于 8i以上产品,已经可以采用“Alter database character set 字符集”来修改数据库的字符集,但也仅仅是从子集到超集,不要通过update props$来修改字符集,如果是不支持的转换,可能会失去所有与字符集有关的数据,就是支持的转换,也可能导致数据库的不正常工作。字符集分为单字节字符集与多字节字符集,US7ASCII就是典型的单字节字符集,在这种字符集中length=lengthb,而ZHS16GBK就是常用的双字节字符集,在这里lengthb=2*length。
在客户端的字符集环境比较简单,主要就是环境变量或注册表项NLS_LANG,注意NLS_LANG的优先级别为:参数文件à注册表à环境变量 àalter session。NLS_LANG的组成为“国家语言设置.字符集”,如nls_lang=simplified chinese_china.zhs16gbk。客户端的字符集最好与数据库端一样(国家语言设置可以不一样,如zhs16gbk的字符集,客户端可以是 nls_lang =simplified chinese_china.zhs16gbk或Ameircan_America.zhs16gbk,都不影响数据库字符的正常显示),如果字符集不一样,而且字符集的转换也不兼容,那么客户端的数据显示与导出/导入的与字符集有关的数据将都是乱码。
使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里需要一个2进制文件编辑工具即可,如uedit32。用编辑方式打开导出的 dmp文件,获取2、3字节的内容,如00 01,先把它转换为10进制数,为1,使用函数NLS_CHARSET_NAME即可获得该字符集:
SQL> select nls_charset_name(1) from dual;
NLS_CHARSET_NAME(1)
-------------------
US7ASCII
可以知道该dmp文件的字符集为US7ASCII,如果需要把该dmp文件的字符集换成ZHS16GBK,则需要用NLS_CHARSET_ID获取该字符集的编号:
SQL> select nls_charset_id('zhs16gbk') from dual;
NLS_CHARSET_ID('ZHS16GBK')
--------------------------
852
把852换成16进制数,为354,把2、3字节的00 01换成03 54,即完成了把该dmp文件字符集从us7ascii到zhs16gbk的转化,这样,再把该dmp文件导入到zhs16gbk字符集的数据库就可以了。(注意,十进制数与十六进制之间的转换,想明白其中的道理)
Iv、跨版本使用Exp/Imp
Exp/Imp很多时候,可以跨版本使用,如在版本7与版本8之间导出导入数据,但这样做必须选择正确的版本,规则为:
·总是使用IMP的版本匹配数据库的版本,如果要导入到816,则使用816的导入工具。
·总是使用EXP的版本匹配两个数据库中低的那个版本,如在815与816之间互导,则使用815的EXP工具。
2、OS备份
操作系统备份有两类,冷备份(Cold backup)与热备份(Hot backup),操作系统备份与以上的逻辑备份有本质的区别。逻辑备份提取数据库的数据内容,而不备份物理数据块。而操作系统备份则是拷贝整个的数据文件。
i、冷备份
在文件级备份开始前数据库必须彻底关闭。关闭操作必须用带有normal、immediate、transaction选项的shutdown来执行。
数据库使用的每个文件都被备份下来,这些文件包括:
☆所有数据文件
☆所有控制文件
☆所有联机REDO LOG 文件
☆INIT.ORA文件(可选)
作冷备份一般步骤是:
a.正常关闭要备份的实例(instance);
b.备份整个数据库到一个目录
c.启动数据库

SVRMGRL>connect internal
SVRMGRL >shutdown immediate
SVRMGRL >! cp <file> <backup directory>

SVRMGRL >!tar cvf /dev/rmt/0 /u01/oradata/prod
SVRMGRL >startup
注意:如果利用脚本对数据库进行冷备份,必须对关闭数据库的命令进行逻辑检查,如果发生关闭数据库的命令不能正常执行而导致数据库没有正常关闭,那么,所有的冷备份将回是无效的。
ii、热备份
热备份是当数据库打开并对用户有效是的OS级的数据备份。热备份只能用于ARCHIVELOG方式的数据库。在数据文件备份之前,对应的表空间必须通过使用ALTER TABLESPACE …… BEGIN BACKUP以备份方式放置。然后组成表空间的数据文件可以使用类似冷备份的操作系统命令进行拷贝。在数据文件用操作系统命令拷贝后,应使用ALTER TABLESPACE …… END BACKUP命令使表空间脱离热备份方式。
热备份没有必要备份联机日志,但必须是归档状态,在实例恢复的时候,可能需要用到归档日志。当前联机日志一定要保护好或是处于镜相状态,当前联机日志的损坏,对于数据库的损坏是巨大的,只能以数据的丢失来进行数据库的恢复工作。
对于临时表空间,存放的是临时信息,在热备份是也可以考虑不用备份,如果临时文件发生故障,可以删除该数据文件与表空间,重建一个临时表空间。
热备份的优点是显而易见的
---- a.可在表空间或数据文件级备份,备份时间短。
---- b.备份时数据库仍可使用。
---- c.可达到秒级恢复(恢复到某一时间点上)。
---- d.可对几乎所有数据库实体作恢复。
---- e.恢复是快速的,在大多数情况下在数据库仍工作时恢复。
操作系统作热备份的一般步骤为:
①连接数据库
SVRMGRL>connect internal;
②将需要备份的表空间(如User)设置为备份方式
SVRMGRL>Alter tablespace User begin backup;
③拷贝数据文件
SVRMGRL>!cp /u01/oradata/prod/user01.ora /backup/prod/user01.ora
Or
$cp cp /u01/oradata/prod/user01.ora /backup/prod/user01.ora
④在数据文件拷贝完成后,将表空间拖体备份方式
SVRMGRL>Alter tablespace User end backup;
⑤对所有需要备份的表空间重复2,3,4
⑥使用如下的命令备份控制文件ALTER DATABSE …… BACKUP CONTROLFILE
如备份成二进制文件
alter database backup controlfile to ‘new fielname’;
备份成文本文件
alter database backup controlfile to trace;
因为热备份的时候,用户还在操作数据库,所以,最好是每个表空间处于备份状态的时间最短,这样就要求一个表空间一个表空间的备份,不要一起使表空间处于备份状态而同时拷贝数据文件。
注意:如果在热备份的时候如果数据库中断(如断电),那么在重新启动数据库的时候,数据库将提示有数据文件需要恢复,你需要把正在断电时候的处于备份状态的数据文件通过ALTER TABLESPACE …… END BACKUP结束备份方式。具体哪个数据文件或表空间处于备份状态,可以通过v$backup与v$datafile来获得。
3、RMAN(备份与恢复管理器)
i.使用RMAN进行备份
Recovery manager(RMAN)是ORACLE提供的DBA工具,用语管理备份和恢复操作。RMAN只能用于ORACLE8或更高的版本中。它能够备份整个数据库或数据库部件,其中包括表空间、数据文件,控制文件和归档文件。RMAN可以按要求存取和执行备份和恢复。
RMAN备份有如下优点
☆支持在线热备份
☆支持多级增量备份
☆支持并行备份、恢复
☆减少所需要备份量
☆备份、恢复使用简单
重要的是,使用恢复管理器允许您进行增量数据块级的备份(这个与导出/导入的增量截然不同)。增量RMAN备份是时间和空间有效的,因为他们只备份自上次备份以来有变化的那些数据块。另一个空间有效的RMAN特性是它只备份数据文件中使用的数据块,忽略空的,未用的数据块,这个对于预分配空间的表空间有很大的好处。
从9i开始,还增加了RMAN的数据块级别的恢复,可以进一步减少数据库恢复时间。
RMAN支持以下不同类型的备份
FULL 数据库全备份,包括所有的数据块
INCREMENTAL 增量备份,只备份自上次增量备份以来修改过的数据块。需要一个0级的增量作为增量的基础,可以支持5级增量。
OPEN 在数据库打开的时候使用
CLOSED 在数据库安装(MOUNT)但不打开的时候备份,关闭备份可以是CONSISTENT或IN CONSISTENT类型的。
CONSISTENT 在数据库安装,单不打开,并且在安装之前数据库被彻底关闭(而不是被破坏或异常退出)时使用。CONSISTENT备份可以简单的进行复原(RESTORE)而不是恢复(RECOVER)
INCONSISTENT 在数据库打开或安装(但不打开)时使用。在该数据库正常关闭或崩溃后,INCONSISTENT备份需要恢复。
理解BACKUP,RESTORE,RECOVER命令,这是RMAN最基本的三个命令,可以进行数据库的备份,复原以及恢复操作。
理解恢复目录,RMAN可以在没有恢复目录(NOCATALOG)下运行,这个时候备份信息保存在控制文件。保存在控制文件的备份信息是很危险的,如果控制文件的破坏将导致备份信息的丢失与恢复的失败,而且,没有恢复目录,很多RMAN的命令将不被支持。所以对于重要的数据库,建议创建恢复目录,恢复目录也是一个数据库,只不过这个数据库用来保存备份信息,一个恢复目录可以用来备份多个数据库。
创建RMAN目录,以下步骤说明了在一个数据库中尽力RMAN目录的过程。
a.为目录创建一个单独的表空间
SQL>Create tablespace tools datafile ‘fielname’ size 50m;
b.创建RMAN用户
SQL>Create user RMAN identified by RMAN default tablespace tools temporary tablespace temp;
c.给RMAN授予权限
SQL>Grant connect , resource , recovery_catalog_owner to rman;
d.打开RMAN
$>RMAN
e.连接数据库
RMAN>connect catalog rman/rman
f.创建恢复目录
RMAN>Create catalog tablespace rman
注册目标数据库,恢复目录创建成功后,就可以注册目标数据库了,目标数据库就是需要备份的数据库,一个恢复目录可以注册多个目标数据库,注册目标数据库的命令为:
$>RMAN target internal/password catalog rman/rman@rcdb;
RMAN>Register database;
数据库注册完成,就可以用RMAN来进行备份了,更多命令请参考ORACLE联机手册或《ORACLE8i备份与恢复手册》。
RMAN使用脚本来备份数据库,以下是RMAN进行备份的几个例子。
a.备份整个数据库
backup full tag ‘basicdb’ format ‘/bak/oradata/full_%u_%s_%p’ database;
b.备份一个表空间
backup tag ‘tsuser’ format ‘/bak/oradata/tsuser_%u_%s_%p’ tablespace users;
c.备份归档日志
backup tag ‘alog’ format ‘/bak/archivebak/arcbak_%u_%s_%p’ archivelog all delete input;
ii.维护RMAN
RMAN的维护主要分为几个方面
1、 查看RMAN的信息
检查现有备份
RMAN>list backup
列出过期备份
RMAN>report obsolete
删除过期的备份
RMAN>allocate channel for maintenance type disk;
RMAN>change backupset id delete;
RMAN>release channel;
2、 同步或重置RMAN
如果目标数据库物理对象发生了变化,如添加了一个数据文件,需要用如下命令同步:
RMAN>resync catalog;
如果目标数据库reset了数据库,需要用如下命令同步
RMAN>reset database;
当手工删除了数据库的归档文件后,要执行以下脚本同步
RMAN>allocate channel for maintenance type disk;
RMAN> change archivelog all crosscheck;
RMAN>release channel;
当手工删除了数据库的RMAN备份后,要执行以下脚本来同步
RMAN>allocate channel for maintenance type disk;
RMAN>crosscheck backup;
RMAN>delete expired backup;
RMAN>release channel;
四、定制恰当的备份策略
i.定制正确的策略
正确的备份策略不仅能保证数据库服务器的24*7的高性能的运行,还能保证备份与恢复的快速性与可靠性。我们将以RMAN的多级增量备份作为一个备份策略的例子来讨论。采用多级备份就是为了减少每天备份所需要的时间,而又保证系统有良好的恢复性。恢复时间与备份时间要有一个权衡。比如只要进行一个数据库的全备份,然后就只备份归档也可以保证能把数据库恢复到最新的状态,但是这样的恢复时间将是不可容忍的。多级备份也正是 为了解决这种问题,以下就是一个多级备份的例子:
每半年做一个数据库的全备份(包括所有的数据和只读表空间)
每一个月做一次零级备份(不包含只读表空间)
每个星期做一次一级备份
每天做一次二级备份
任何数据库的更改需要重新同步CATALOG目录并重新备份(如添加数据文件)或重新备份(如修改表空间为只读)
每次备份后都可以备份归档日志或定期备份归档日志。
如果可能,可以直接备份到磁带上。
数据库全备份的脚本
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
backup full tag ‘dbfull’ format ‘/u01/oradata/backup/full%u_%s_%p’ database
include current controlfile;
sql ‘alter system archive log current’;
backup fileaperset 3 format ‘/u01/oradata/backup/arch%u_%s_%p’
archivelog all delete input; #备份归档可选,可以单独定期备份
release channel c1;
release channel c2;
release channel c3;
}
零级备份的脚本
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
backup incremental level 0 tag ‘db0’ format ‘/u01/oradata/backup/db0%u_%s_%p’
database skip readonly;
sql ‘alter system archive log current’;
backup fileaperset 3 format ‘/u01/oradata/backup/arch%u_%s_%p’
archivelog all delete input; #备份归档可选,可以单独定期备份
release channel c1;
release channel c2;
release channel c3;
}
同理,我们可以得到一级备份,二级备份的脚本,如一级备份的脚本
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
backup incremental level 1 tag ‘db1’ format ‘/u01/oradata/backup/db1%u_%s_%p’
database skip readonly;
sql ‘alter system archive log current’;
backup fileaperset 3 format ‘/u01/oradata/backup/arch%u_%s_%p’
archivelog all delete input; #备份归档可选,可以单独定期备份
release channel c1;
release channel c2;
release channel c3;
}
如果按照以上备份策略,则每天的所需要备份的数据量只有一天的改变量。而做恢复时最多要恢复当月的一个零级备份+三个一级备份+6个二级备份+当天的归档文件。如果不能接受这样的恢复时间,可以减少零级备份之间的时间间隔。
在每次备份后,原则上在该备份点之前的归档日志就可以删除掉了,但是为了进一步的安全以及日后需要(如使用LOGMNR查找所需信息),建议有条件的话,归档日志保存一年,可以保存在磁带等廉价存取设备上。
ii.与RMAN备份有关的优化
备份操作主要是完成以下三个步骤
1、从磁盘上读取数据
2、在内存中处理数据块
3、写入数据到磁盘或磁带
以上的读写操作可以同步或异步的完成,在同步I/O操作中,一个时间只允许有一个IO操作,但是在异步I/O操作中,一个时间允许有多个IO操作。因此,备份与恢复的调优主要集中在以下几个方面:
1、 提高同步或异步I/O操作能力
在支持异步操作的操作系统上,可以通过设置TAPE_AYSNCH_IO,DISK_ASYNCH_IO和BACKUP_TYPE_IO_SLAVES来支持异步操作,提高写的能力。
2、 提高磁盘读能力
可以在backup命令后通过设置DISKRATIO来保证从多个磁盘上读取数据,保证连续的数据流。
3、 正确设置缓冲区与参数值
设置LARGE_POOL_SIZE,使备份可以使用连续的缓冲池,通过设置DB_FIL_DIRECT_IO_COUNT可以提高缓冲区的利用。如果使用磁带备份,还可以设置BACKUP_TYPE_IO_SLAVES来提高磁带的写能力。
4、 采用并行备份
开辟多个通道,可以实现并行备份与恢复

iii.备份RMAN数据库
RMAN自己的数据库也需要备份,但是本身很小,而且不是经常发生变化,所以在每次RMAN备份完成后,都可以用如下脚本对RMAN数据库备份。
EXP pafile =exprman.sql
exprman.sql为
USERID=RMAN/RMAN
BUFFER=32768
OWNER=RMAN
FILE=RMAN.DMP
ROWS=Y
GRANTS=Y
COMPRESS=Y
CONSISTENT=Y
iv.使自动备份数据库
自动备份数据库不外乎以下三种方式
WINDOWS下的任务计划(At命令)
UNIX下的Crontab
第三方工具如Viritas
在以上三种方式中Viritas属于第三方工具,很多人可能都没有接触,主要说一下windows的任务计划与unix的cron
1、生成脚本文件,如backup.rcv
假定文件内容如下:
$>cat backup.rcv
connect target sys/password rcvcat rman/rman@localname;
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
backup fileaperset 3 format ‘/u01/oradata/backup/arch%u_%s_%p’
archivelog all delete input;
release channel c1;
release channel c2;
release channel c3;
}
2、生成执行文件
在windows上生成backup_archive.bat,内容包括
rman cmdfile = backup.rcv
在unix下生成 backup_archive.sh,内容包括
/oracle/ramn/rman cmdfile = backup.rcv
3、加入调度
在windows中用任务计划向导即可,或使用at命令。
在unix中,在目标机器上编写一个文件,用以启动自动备份进程。假定文件名为ORACLE,文件将放在/var/spool/cron/crontabs目录下
$>cat oracle
0 23 * * 0 backup_archive.sh
#表示星期天23点对数据库备份
0 12,18 * * * backup_archive.sh
#表示每天12点,18点备份
Crontab文件的每一行由六个域(minutes,hours,day of month,month,day of week,command)组成,域之间用空格或Tab分隔开来
五、常见误区
1、使用EXP/IMP备份
EXP/IMP不是一个良好的备份工具,在以后的发展之中,ORACLE对EXP/IMP用于备份的支持会越来越低。ORACLE只是把EXP/IMP当作一个好的工具而不是备份工具,在对于大型数据库,如TB级数据库或数据仓库,EXP/IMP肯定会力不从心。
2、在应用程序中备份数据库
在论坛上,有很多这样的要求,“我怎么在程序中备份与恢复数据库?”。首先说,这个并不是不可以实现,但是实现的过程会很复杂而且意外会很多。就我的感觉,提出这样问题的人,首先一点就是对ORACLE或DBA的不了解,如果ORACLE可以这么轻松的实现备份与恢复,那么我可以说,就不需要DBA了。
3、冷备份比热备份更容易,效果会更好
有人认为,冷备份是关闭数据库进行的一致性备份,肯定比热备份要好,使用也容易,其实不尽然,在热备份中,一样可以实现数据库的全备份,而且不会影响到数据库的运行。建议所有的生产机,都运行在归档方式下,采用热备份方式。
六、常见问题
1、我导出的数据为什么不能导入,提示不支持的字符集转换
答:参考上面的字符集原则,导出数据时客户端与数据库字符集一致,导入时修改为与目标数据库字符集一致。
2、我的归档日志越来越多,我什么时候可以删除归档日志?
答:在每一次全备份(如OS全冷备份或全热备份)或基于全备份的增量备份(如RMAN基于0级备份上的增量备份)后都可以删除该备份点之前的归档日志,建议在磁带上保留一年。
3、全备份时一定需要备份所有数据文件吗?
答:不需要,起码有两类数据文件可以不备份,一类就是临时数据文件,如果丢失,可以删除后重建;一类是只读表空间数据文件,如果上次备份以来,没有修改过表空间的只读属性,就可以不需要备份。
4、联机日志需要备份吗?
答:如果是归档方式热备份,就没有必要备份联机日志。但是对于冷备份,可以备份联机日志,特别是不归档状态。备份过联机日志后的冷备份,因为数据库是一致的,可以恢复到该备份点。
七、小结
1、什么是数据库备份,数据库备份就是把数据库复制到转储设备的过程。
2、数据库的运行方式,可以分为归档方式和非归档方式,建议运行在归档方式下运行热备份。
3、了解了数据库的备份方式,逻辑备份、冷备份、热备份
4、了解数据库的备份工具,EXP/IMP执行逻辑备份,OS脚本可以执行冷备份或热备份,RMAN也可以执行冷备份或热备份
5、了解ORACLE的备份策略,并怎样选择最佳的备份策略
6、知道怎么样启动自动备份,了解Windows的at命令与unix的cron进程。
参考文献:
Expert One-on-one Oracle [美] Thomas Kyte 著 清华大学出版社
Oracle 8i Web开发指南 [美] Dan Hotka,et al. 著 清华大学出版社
Oracle 8i DBA Architecture & Administration and backup & Recovery Study Guide
[美] Dong Stuns Biju Thomas著 电子工业出版社
Oracle 数据库管理员技术指南 [美] Sumit Sarin著 机械工业出版社
posted at 05/09/14 13:50 | 技术文摘 - MySQL | 浏览(15) | 引用(1) | 评论

oracle联机热备份的原理,及rman增量备份原理
要求归档模式
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 14
Next log sequence to archive 16
Current log sequence 16

-------------
先看用户管理的热备份

看看下面这个关键的操作,将备份的内容置于backup模式,用户管理的联机热备份必需的操作,不然copy备份的数据文件不能用来恢复,即使用某些放时恢复了也会丢数据
SQL> alter tablespace users begin backup;
Tablespace altered.
SQL> list
1 select d.file_name filename,d.tablespace_name ts_name,b.status
2 from dba_data_files d,v$backup b
3* where d.file_id=b.file#
SQL> /
FILENAME TS_NAME STATUS
---------------------------------------- ---------- ------------------
/u02/oradata/sales/system01.dbf SYSTEM NOT ACTIVE
/u02/oradata/sales/undotbs01.dbf UNDOTBS1 NOT ACTIVE
/u02/oradata/sales/sysaux01.dbf SYSAUX NOT ACTIVE
/u02/oradata/sales/users01.dbf USERS ACTIVE
/u02/oradata/sales/example01.dbf EXAMPLE NOT ACTIVE
/u02/oradata/sales/perfstat.dbf PERFSTAT NOT ACTIVE

USERS表空间现在处于backup模式,究竟这时候怎么了?
在我们alter tablespace users begin backup 的时候是锁定了users表空间对应的数据文件头的change scn。
首先考虑一下数据库怎么用日志文件做恢复:查找不一致的数据文件(根据文件头中旧的scn)
如果锁定了文件头,这个文件头中的scn就不会改变(当然了数据块还是会变化的,还可以做读写)。 然后就会应用这个scn到现在的日志。
那我锁定了scn,不管你后边怎么修改,总之做恢复的时候是应用锁定的时候的scn一直到现在的日志(完全恢复的话)

举个例子:
a,b两个数据文件,把a置于备份模式,b正常
这时候两个change scn都是100,然后开始备份
这期间有数据库的修改,备份完成的时候,Scn变成了200。但是由于a的备份模式,所以a的文件头中记录的scn还是100,b是200。
某个时间,假设scn 500
这时候a丢失
copy回a的备份,然后recover,完全恢复的话数据库就应用100—500这段的日志,自然也就不会丢失数据了。
因为不管在我copy备份的过程中你做什么操作,总之都在锁定的时change scn之后,所以应用的日志就不会有遗漏了。
这时候应该能理解为什么要数据库处于archived模式了


看看数据文件头的change scn
SQL>select NAME,TABLESPACE_NAME,STATUS,CHECKPOINT_CHANGE# from v$datafile_header;
NAME TABLESPACE STATUS CHECKPOINT_CHANGE#
-------------------------------- ---------- -------------- ------------------
/u02/oradata/sales/system01.dbf SYSTEM ONLINE 545926
/u02/oradata/sales/undotbs01.dbf UNDOTBS1 ONLINE 545926
/u02/oradata/sales/sysaux01.dbf SYSAUX ONLINE 545926
/u02/oradata/sales/users01.dbf USERS ONLINE 545498
/u02/oradata/sales/example01.dbf EXAMPLE ONLINE 545926
/u02/oradata/sales/perfstat.dbf PERFSTAT ONLINE 545926

6 rows selected.

显然,在将users表空间置于backup状态的时候,相应的datafile的文件头的scn就不会再发生改变,发生检查点也不会改变。

SQL> alter system checkpoint;
System altered.

SQL> select NAME,TABLESPACE_NAME,STATUS,CHECKPOINT_CHANGE# from v$datafile_header;
NAME TABLESPACE STATUS CHECKPOINT_CHANGE#
-------------------------------- ---------- -------------- ------------------
/u02/oradata/sales/system01.dbf SYSTEM ONLINE 546196
/u02/oradata/sales/undotbs01.dbf UNDOTBS1 ONLINE 546196
/u02/oradata/sales/sysaux01.dbf SYSAUX ONLINE 546196
/u02/oradata/sales/users01.dbf USERS ONLINE 545498
/u02/oradata/sales/example01.dbf EXAMPLE ONLINE 546196
/u02/oradata/sales/perfstat.dbf PERFSTAT ONLINE 546196

6 rows selected.


下面end backup,看看scn

SQL> alter tablespace users end backup;
Tablespace altered.

SQL> alter system checkpoint;
System altered.

SQL>select NAME,TABLESPACE_NAME,STATUS,CHECKPOINT_CHANGE# from v$datafile_header;

NAME TABLESPACE STATUS CHECKPOINT_CHANGE#
-------------------------------- ---------- -------------- ------------------
/u02/oradata/sales/system01.dbf SYSTEM ONLINE 546467
/u02/oradata/sales/undotbs01.dbf UNDOTBS1 ONLINE 546467
/u02/oradata/sales/sysaux01.dbf SYSAUX ONLINE 546467
/u02/oradata/sales/users01.dbf USERS ONLINE 546467
/u02/oradata/sales/example01.dbf EXAMPLE ONLINE 546467
/u02/oradata/sales/perfstat.dbf PERFSTAT ONLINE 546467

6 rows selected.

------------------
再说说rman备份
个人认为理解了用户管理的热备份,rman就已经理解了一大半了
rman 备份是针对块一级的,支持增量备份,稍后说怎么做的增量备份

Rman备份并不需要将数据库或者表空间置于backup状态,但是它会把scn记录在catalog中对应你的backupset
准备在恢复的时候来使用

对users表空间做一个完全备份
$ rman target sys/oracle nocatalog
RMAN> run {
2> allocate channel d1 type disk;
3> backup
4> format='/u03/oraclebk/%d_%N_%s.bk' tablespace users;
5> release channel d1;
6> }


看一下备份集里都有什么,注意看Ckp SCN 546792,
RMAN> list backup of tablespace users;

List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
3 Full 1M DISK 00:00:02 31-MAR-05
BP Key: 3 Status: AVAILABLE Compressed: NO Tag: TAG20050331T153729
Piece Name: /u03/oraclebk/SALES_USERS_4.bk
List of Datafiles in backup set 3
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
4 Full 546792 31-MAR-05 /u02/oradata/sales/users01.dbf

恢复的时候应用546792开始到现在的归档日志和重做日志.

---------------
rman的增量备份的基本原理
其实原理很简单,主要就是弄明白怎么样在做增量备份时确定某个数据块需要备份,哪个不需要
rman在做1级备份的时候怎么来确定0级备份之后都有哪些数据块做了修改呢?看下面一段
Each data block in a datafile contains a system change number (SCN), which is the
SCN at which the most recent change was made to the block. During an incremental
backup, RMAN reads the SCN of each data block in the input file and compares it to
the checkpoint SCN of the parent incremental backup. If the SCN in the input data
block is greater than or equal to the checkpoint SCN of the parent, then RMAN copies
the block.
原来block里边也有一个change scn
也就是说在做level 1级备份的时候,需要扫描所有的数据块并且用块中记录修改的SCN跟level 0备份时的SCN做比较(备份记录中的Ckp SCN),来确定这个块是否需要备份。
所以扫描整个数据文件是不可避免的 !

这是传统的rman做增量备份

在10g中rman做增量备份不再需要扫描整个数据文件了
10g引入的新特性 block change tracking:
Block change tracking进程记录自从上一次备份以来数据块的变化,并把这些信息记录在跟踪文件中。RMAN使用这个文件判断增量备份中需要备份的变更数据。这极大的促进了备份性能,RMAN可以不再扫描整个文件以查找变更数据。
RMAN's change tracking feature for incremental backups improves incremental
backup performance by recording changed blocks in each datafile in a change tracking
file. If change tracking is enabled, RMAN uses the change tracking file to identify
changed blocks for incremental backup, thus avoiding the need to scan every block in
the datafile.
估计是使用的位图文件做的记录!


附:
有兴趣的可以看看dump的数据块

通过下面的查询找一个表对应的数据块
SQL> select file_id,block_id,blocks
2 from dba_extents
3 where segment_name='EMPLOYEES';

FILE_ID BLOCK_ID BLOCKS
---------- ---------- ----------
5 81 8

dump一个块到udump的trc文件
SQL> alter system dump datafile 5 block 81;

System altered.


在udump目录找到对应的trc文件,找到dump那段
Start dump data blocks tsn: 6 file#: 5 minblk 81 maxblk 81
buffer tsn: 6 rdba: 0x01400051 (5/81)
scn: 0x0000.00086c4d seq: 0x01 flg: 0x04 tail: 0x4b502001
后面省略了


scn: 0x0000.00086c4d是16进制你可以换算过来552013

你可以尝试做一下修改,不过一定要保证对应的块被修改了,并且被写了,才能反映出来
posted at 05/09/14 13:33 | 技术文摘 - MySQL | 浏览(10) | 引用(55) | 评论

虎皮青椒之做法
大厨虎皮青椒的做法之一,是将满锅的油煮沸,将整个的青椒泡油后沥出,再加进调料入味而成。家常虎皮椒则容易得多,将青椒直接入锅,干炒之下,其表皮渐渐起皱。加入色拉油后,冷油遇到热锅迅速被青椒吸收,青椒的果肉收缩,表皮膨胀皱纹剧增,形如虎皮,故而得名。配料也简单,淀粉化水,加酱油、蒜末,也可依据个人口味配以白糖、豆瓣、芝麻之类,勾芡后入味,一切即可大功告成。

主料:
青椒500g

辅料:
色拉油800g,鸡蛋2个,水淀粉,干面粉,精盐各适量

制法:
1.将青椒洗净,切成片,将鸡蛋打入盆中,搅散,放入水淀粉,干面粉,精盐,少许色拉油调成糊状,待用。
2.将青椒每片沾满蛋糊,放入六成熟得油中炸透,捞出沥油,装盘即可。

特别提示:
青椒炸至外皮脆酥为宜。

特评:
清鲜适口,口感极佳
点击放大或缩小


1。青椒洗净(5个),去蒂。放入炒锅中小火慢煎,一边煎一边用铲子压住青椒(压破了也问题不大),让青椒表皮出现焦点,一直到青椒断生(变色)。
2。向锅里加一勺油,炒1min,加糖(3g),醋(2勺),水(3勺),盐(1g)。然后,用中火烧到青椒变软,即可。(如果没软可在加些水烧)
posted at 05/09/01 15:50 | 家居生活 - 家常菜谱 | 浏览(76) | 引用(1) | 评论



      << prev    1    next >>