2006年12月28日

URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。url重写的优点在于:

a.缩短url,隐藏实际路径提高安全性;
b.易于用户记忆和键入;
c. 易于被搜索引擎收录。

lighttpd(http://lighttpd.net/)是一款轻量级的web server,和apache一样是开源的,与apache相比,

虽然功能不及apache完善,稳定性也不如apache,但是,不管是服务静态页面,还是服务动态内容(CGI,

PHP),它都比apache快,用于ad banner之类的WEB服务器是最恰当不过了。采用lighttpd的网站不少,最

著名的是豆瓣(http://www.douban.com)。

然而,我发现网上介绍lighttpd的url重写技术的文章非常少,所以我将资料整理在这里,方便各位查看

lighttpd的url重写非常简单,只要打开lighttpd.conf文件,(该文件一般在/usr/local/etc/目录下,

如果不是自己安装的,可以用find命令找到),找到url.rewrite-once = ( ),在括号中写url重写规则

就可以了。以下是某个网站的例子:

  url.rewrite-once = (
"^/rank/([0-9]+).html$" =>"/rank.php?pid=$1",
"^/(\w+)/?$" =>"/userinfo.php?puser=$1",
"^/detail/([0-9]+).html$" =>"/detail.php?id=$1"
)

2006年12月26日

    有时你会莫名其妙地发现你的主页的内容在一个搜索引擎中被索引,即使你从未与他 们有过任何联系。其实这正是Web Robot的功劳。Web Robot其实是一些程序,它可以 穿越大量Internet网址的超文本结构,递归地检索网络站点所有的内容。这些程序有时被叫 “蜘蛛(Spider)” , “网上流浪汉(Web Wanderer)”,”网络蠕虫(web worms)”或Web crawler。常见的搜索引擎有google,yahoo,msn,百度,soso,sogou等等。

    现在所有网站都考虑seo,所谓seo就是优化网站对这些搜索引擎的友好度,让自己的网站更容易通过搜索引擎被访问到。然而,Robot程序抓你的网站页面时,有时会因为频率太高而影响你的服务器,所以,合理的设置robots.txt(注意,是robots)很重要。

    若要控制爬网你的网站的时间和方式,请在网站的顶层(根)目录创建 robots.txt 文件。在 robots.txt 中,可以指定允许或阻止哪些爬网软件。大部分爬虫程序都遵循robots.txt的规范。

    robots.txt是一个纯文本文件,通过在这个文件中声明该网站中不想被robots访问的部分,这样,该网站的部分或全部内容就可以不被搜索引擎收录了,或者指定搜索引擎只收录指定的内容。
   

    当一个搜索机器人访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果找到,搜索机器人就会按照该文件中的内容来确定访问的范围,如果该文件不存在,那么搜索机器人就沿着链接抓取。
   

    robots.txt必须放置在一个站点的根目录下,而且文件名必须全部小写。

下面是一些robots.txt基本的用法:

l 禁止所有搜索引擎访问网站的任何部分:
User-agent: *
Disallow: /

l 允许所有的robot访问
User-agent: *
Disallow:
或者也可以建一个空文件 “/robots.txt” file

l 禁止所有搜索引擎访问网站的几个部分(下例中的cgi-bin、tmp、private目录)
User-agent: *
Disallow: /cgi-bin/
Disallow: /tmp/
Disallow: /private/

l 禁止某个搜索引擎的访问(下例中的BadBot)
User-agent: BadBot
Disallow: /

l 只允许某个搜索引擎的访问(下例中的WebCrawler)
User-agent: WebCrawler
Disallow:

User-agent: *
Disallow: /

l 所有的搜索引擎抓取间隔设置(20意味着20秒):

User-agent:*

Disallow:

Crawl-delay:20

3、 常见搜索引擎机器人Robots名字

名称 搜索引擎

Baiduspider http://www.baidu.com

Scooter http://www.altavista.com

ia_archiver http://www.alexa.com

Googlebot http://www.google.com

FAST-WebCrawler http://www.alltheweb.com

Slurp http://www.inktomi.com

MSNBOT http://search.msn.com

 

发现一个生成robots.txt的工具网站,与各位朋友分享。

http://www.mcanerin.com/EN/search-engine/robots-txt.asp

2006年12月18日


以下是转贴。

What Business Can Learn from Open Source
by Paul Graham 2005.8(这篇短文来源于 2005 年在Oscon的一次谈话。)

公司最近对开源给予了更多的关注。十年前似乎真有这样的危险:微软会把它的触角伸到对服务器的垄断。现在可以说是开源阻止了这种情况的发生。一次的最近调查发现,52%的公司把windows服务器转换成了Linux 服务器。

我想更为重要的是,弄清楚这52%的来由。此时此刻,那些想在服务器上运行windows的人,应该先弄懂为什么Google、Yahoo和Amazon服务器不使用windows。

但“商业向开源学习”最重要的方面并不是关注Linux或Firefox,而是关注导致它们的力量究竟是什么。这些最终将比你使用什么软件影响更大。

我们也许能从开源和书写blog之间的稳固关系中,衡量出这些根本的力量。如同你大概注意到的,它们有很多共同点。

就 象开源,书写blog是人们为自己所做的事情,它是免费的,是因为人们喜欢这么做。象开源的黑客、bloggers与那些为钱工作的人竞争,并且常常获 胜。保证质量的方法是相同的:达尔文主义的。公司通过制定规则来防止雇员把事情搞得一团糟,但你不能把职员与职员间的通信也制止了。人们只是生产他们想要 的东西;只传播好的材料,把坏的忽略掉。并且在以上两个例子中,人们从反馈中改进工作,使之变得更好。

blog和开源的另一个共同之处就是Web。人们总是愿意不计报酬地完成伟大的工作,但是在Web诞生之前,它很难抵达观众的面前,也很难在项目中合作。

业余爱好者

我认为商业中不得不学习的、最重要的新法则就是:人们在喜欢的事务上工作得太辛苦了。是的,这对每个人来说都不新鲜了。但为什么我还要宣称商业不得不学习它呢?当我说,商业还没有认识到这一点,其实我是指商业结构没有对此进行反省。

商业仍然反映出一种旧的模式,举一个法语中形容工作的词语:travailler。它在英语中接近于“辛苦”这个词,也意味着“痛苦”。

可 这还不是形容工作的最终词语。当社会变得越来越富有,人们认识工作就非常像认识饮食一样。现在我们知道最健康的饮食习惯,是我们的农业祖先因为贫穷,饱尝 万物中形成的。而当丰富的食物摆在面前,即使你没有完全吃掉它,这种懒散也只是看起来很惬意。我想我们是被设计去工作的,就像我们被设计好了去吃一定数量 的纤维,如果我们不这么做,就会感觉有点糟糕。

人们用一个词语来形容喜爱某项工作的人:业余爱好者。现在这个词语被赋予了贬义,虽然它在凝视我们的面孔,但我们仍旧忘记了这个词语的来源。“业余爱好者”原本更接近于一个称赞的词语。而在20世纪“专业”变得重要起来,而“业余爱好者”恰恰相反。

实 际上,至少在传统媒体上使用“blog”这个词是一种时尚。他们把Blogger弄混淆了,认为blogger并不光是表现以weblog格式写作的人, 而是任何在网络上发表观点的人。这渐渐成了一个问题,就好像web成为了出版的首要媒体。我更愿意用一个词来替代在网上写作的人——“作家”,这个词如 何?

那些在传统媒体上搞混了网上写作的人,因为他们认为平均质量很低是网上写作的重要特征:没有人愿意读质量平平的blog。过去的观点 总是谈论平均质量,因为那是你是否喜欢的标准;但是现在,你可以读到你想要读的任何一个作家的作品。所以,网上写作的平均质量不再成为和传统媒体对比的一 项指标。它们和网上最好的“作品”对比,比如和微软竞争,它们常常是失利者。

我知道自己作为读者的经历。虽然大多数印刷出版物都有网络版,每当我阅读网上报刊和杂志的一篇文章,我就要阅读个人站点上的两三
篇文章。

当 我阅读的时候,比方说,《纽约时报》的故事,我从来不是从《纽约时报》首页开始读的。常常我是从Google News 或Slashdot或者Delicious的聚合进入阅读。聚合器展现出来比频道(channel)更好的阅读方式。《纽约时报》的首页是文章列表,它们 是由时报的工作人员组织排列的。Delicious是一个人们对感兴趣的文章的列表。而且,恰恰你能注意到,两者之间的交叉是很少的。

传 统印刷媒体的大多数文章很令人厌烦。例如,总统注意到大多数选民认为侵略伊拉克是错误的,因此,他为了得到支持,而向国民演讲。在那里“人咬狗” (译注:俗话说狗咬人不是新闻)是为了什么?我没有听到演讲,但是我能告诉你,他确切地讲了什么。更多是在文字意义上,像那样的演讲并不是新闻:因为在其 中并没有什么新的东西。

除了名字和地点的更改,其中并没有新的东西了,大多数事件的“新闻”正走向歧途。孩子被拐骗、龙卷风来了、轮船倾 覆了、有人被鲨鱼咬了、小型飞机失事了……你能从世界的这些故事中得到什么吗?什么也没有!它们正远离数据点(date point);这些引人注目的话题也往往和它们毫不相干。

和在软件业一样,当专家们生产者这样的垃圾时,如果业余爱好者可以做的更好就不 足为奇了。通过频道而生,通过频道而死去(Live by the channel, die by the channel)。如果你依赖于垄断,当你突然面临竞争的时候,就会很难摆脱坏习惯。

工作场所

blog 和开源的另一个共同点是:人们都可以在家里完成工作。这似乎并不奇怪,但它理应令人惊叹。这相当于一架自制的飞行器击落了一架F-18。公司为个人花费数 百万美元建立办公楼的目的就是:它是工作的地方。而人们依然在家工作,那些并不是为工作设计的场所中工作时,得到的结果却是效率提高了。

这证明过去很多事情都值得怀疑。在普通办公室中完成工作是很凄惨的一件事情。很多使办公室变坏的东西,恰恰是我们和职业化相挂钩的性质。办公室的效率低下往往被期望给予更有效的建议,但是“更有效的建议”和“实际上更有效”完全是两码事。

普通工作场所的氛围,被描绘成加速汽车两侧的火焰,看似生产效率很高。但这种方式,不是解决办公事看起来荒凉的唯一方式。实际上人们的行为就是这样的差劲。

情 况在开端有了不同。常常在公寓中就有了不同的开端。为了匹配米色的卧室,人们买了很多不同种类的家具。他们不用按照固定的时间工作,穿着最普通的衣服。他 们在网上看看想要的东西,而不必担心什么“工作环境”。淘气的幽默替代了办公室中愉快而冷漠的微笑。你还想知道什么?公司在这种情况下,可能比以前运营中 任何时候更有效率。

可能这不是巧合。可能一些专业化的方面实际上是网络的损失。

对于我来说,传统办公室最令人丧气的方面是:确切的时间你应该在那里。很多公司中的员工确实这样做,大多数员工在固定的时间工作仅仅是因为:公司无法评估他们的工作效率。

办公时间背后的理念是:如果你不能让员工工作,至少可以阻止他们获得乐趣。理论上,如果员工一天不得不在楼里呆上几个小时,禁止做与工作无关的事情,他们只能继续工作了。而实际上,他们把时间浪费在无人理睬的尴尬境地(no-man’s land),既不工作也不找乐子。

如果你能估量出人们做了多少工作,许多公司就不需要任何固定的工作日了。你也许会说:这是你不得不做的。在任何你喜欢的时间、任何你喜欢的地点做事情吧。如果你的工作需要你在公司中和同事交流,你可以在必要的时候去几次。其他方面我们就不用考虑了。

那听起来有些乌托邦,但是它能告诉我们谁是来公司做事情的。没有固定的工作时间,我从没在早晨11点之前露面。但我没有说这是仁慈的。我们说的是:如果你在那里工作,我们期望你能做得更多。不要假装做了很多,从而唬弄我们。

facetime (针对时长?)模式的问题不仅仅是因为它令人沮丧,而且许多假装工作的员工妨碍了真正工作的员工。我深信facetime模式是庞大组织总有无数会议的主 要原因。庞大组织中人均的完成量很少。但是仍然所有的人都需要在自己岗位上,每天呆上8个小时。就好比一个管道,一头进去的时间很多;另一头产生的绩效却 很小。并且会议是保持松懈的主要机制。

曾经有一年,我朝九晚五地按规律工作。我记得在一次会议中,那种奇怪而安逸的感觉涌现出来。我因为 新鲜,记忆非常深刻,那时我正在为编程而辛劳。它听起来有点疯狂,就好象在我桌上有一架机器,不管我做什么,每两分钟吐出一个美元。甚至当我在卫生间的时 候也有这种感觉!但是因为虚构的机器总在不停的运转,我感觉自己一直在工作。所以那次会议我感觉非常放松。当工作时他们计算着,就像在编程,但是做起来简 单多了。你只需要坐着,并且看起来很勤奋。

和网络的效果类似,开会就像鸦片。Email在更小的范围内也是如此。除去即时的直接费用,还有分段的费用——把人们的每天都弄得支离破碎,以至于没法用了。

你 可以看到,通过把它立即移除,你变得多么具有依赖性。所以对于大的公司,我提出以下的这个实验。尝试一天中禁止了开会,在那里人们不得不整天坐着,不能和 别人谈话,工作中不受到打扰。在大多数工作中,相互交流是必要的,但是我敢肯定,每个人单独做自己的工作,能够充分利用了8小时的工作时间。你可以叫它 “工作日”。

另一个问题是,假装工作总比实际工作看起来更真实。当我涂涂写写的时候,我所花的时间和打字时思考的时间一样多。一半的时间 我坐着喝咖啡,或者在邻里间散步。这是一个重要的阶段——想法从中诞生——在大多数办公室里我这样做就会感觉很惭愧了,尤其是别人似乎都在忙碌的时候。

除非你把它和其他事情做对比,否则很难看出来如此的实验是多么的糟糕。这是开源甚至blog显得如此重要的一个原因。它使我们看到了真实的工作情况。

我 们当时启动了八个新计划。一个朋友问,员工他们在办公室里做什么,当我告诉他我们期望员工能把工作间布置得更适宜居住时,他惊讶极了。但是我不想在此节约 金钱。我们如此做,是因为我想让他们编写的软件更好。在如此无拘无束的环境中工作,正是八个启动项目之一。当你就进入办公室,工作和生活就自然而然分开 了。

那是专业化的关键原则之一。工作和生活应该是分开的。但是我深信,这是错误的观点。

由底向上

我们可以从开源和书写blog中学到的第三课,就是我们的想法应该从底向上地冒上来。而不是以命令的形式从上至下布置下去。开源和书写blog都是从底向上的:人们制造他们想要的,所以最好的东西才会流行。

这听起来很熟悉,不是吗?这就是市场经济的原则。但是具有讽刺意味的是,遵循这条原则的,正是没有商业目的的开源和书写blog。而大多数嘴上谈论市场经济的公司们,内部的运行机制就像是共产主义。

在背后有两股驱动力来推动设计:一是关于下一步做什么的想法;二是质量监督。在渠道时代,这两股推动力的流向都是自顶向下。例如,报纸的编辑给记者指派报道的任务,然后编辑们就会编辑记者所写的稿子。

开源和书写blog告诉我们大可不必如此。有关于下一步的想法甚至是质量监督的流向都是自底向上的。在这两种情况下,产生的结果不仅仅是可以接受这么简单,而且好的多。例如,开源的软件更加可信,因为它是开源的,任何人都可以在其中找出错误。

在 写作上同样如此。当就要文章就要发表的时候,我总是对那些还没有在Hackers & Painters发表的文章担心。如果一个文章已经上线并且有了数千的浏览量,我就会对文章有相当的信心。如果没有这些审查的程序,感觉就像在没有测试软 件的情况下发布它一样。

过去所有的出版都是像这样的,如果有十个人去读你的手稿,你就够幸运了。但是我现在十分习惯把文章放在网上,所以老式的方法看起来就不那么可信了。就像你习惯了GPS导航系统以后,再让你用天文观测法来确定你的位置一样。

我 喜欢把文章放在网上的另外一个原因就是,你可以写任何你愿意写的东西,在任何一个时间发表。在今年的早些时候我写了一篇看起来还挺适合一个杂志的文章,我 把它寄给了我认识的编辑。在我等待他们回音的时候,我突然发现我其实更愿意他们拒绝这篇文章,因为这样我就可以把这篇文章发表在网上了。如果他们接受了这 篇文章,在数月之内就不会有任何人阅读到这篇文章。在这同时我还得小心地保存我的文章,让它们不被有二十五年历史的编辑器弄坏。

许多的雇 员想要为他们的公司制造一些伟大的东西,但是管理层经常不会让他们这样做。你有几次听到这样的故事:雇员对管理层说,让我们这样干吧,这一定会赚大钱的 ——然后管理层说”不”呢?最著名的例子就是Steve Wozniak,他最早为HP工作,那时他想为他的雇主制造微型计算机,但是HP拒绝了。相反,在blunderometer方面, IBM演绎了一段趣话,它接受一个非独占的DOS许可证。我们并不是经常听到这样的故事,因为如果你想要证明你是对的,你必须要辞职并且开一家你自己的公 司,就像Wozniak那样。

创业

我认为这些就是开源和书写blog教给商业的:(1)人们遇到他们喜爱的东西总会工作得更努力。(2)标准的办公室的工作环境很没有效率,还有(3)自底向上总是比自顶向下要好。

我可以想像这个时候经理们会说:这个家伙究竟在谈些什么东西?如果我知道我的程序员在家里工作会更有效率,这对我会有什么好处?我需要他们在这里为我们的3.2版本的软件工作,要不我们永远也完不成任务。

对,这是事实。经理们从讲的这些中能得到的利益基本是零。当我说商业可以从开源中学到什么的时候,我并没有说某一个特定的商业。我只是说商业可以像基因一样从新环境中学习。我并没有宣称公司会变得更聪明,只是那些聋子公司将会倒闭。

如 果公司从开源和书写blog中间学到了这些,会有什么改变呢?我想,阻止我们看到商业未来最大的阻碍,就是这个思想:所有为你工作的人都必须是你的雇员。 想想这个想法的背后是什么吧:公司有一些钱,然后他们给雇员工资,只是希望这些雇员可以为他们赚到比工资更多的钱。但是,有更好的可以组织这种关系的办 法。我们为什么不把投资代替工资,付给为我们工作的人呢?这样你就不用到办公室为你的项目工作了,他会在任何地点为他自己的项目工作。

因为几乎没有人知道雇员-雇主关系的替代品,所以我们不知道如何才能做的更好。这样的习惯以极慢的速度进化,到现在还有很多的主仆关系的基因。

两 个极端我都不喜欢:我讨厌为一个顾客工作,同样我也讨厌被我的老板叫去做这做那。自己做老板同样也是令人沮丧的。有一半的时间,你自己做某些事情要比支使 别人去完成工作要更容易。我总是愿意自己完成所有的工作,而不愿意别人对我的工作作出评价,或者是自己对别人的工作作出评价。

由于本身的 原因,雇用关系积累了大量的cruft。 (译注:随着软件的发展,以及经历了修改bug 和更新的若干周期,它的部分代码已不再使用但仍然保留在源码中。这种代码称为cruft 。 cruft 的尺寸范围可由一两行无用代码到整个源文件模块。由于很难识别cruft ,去除cruft 往往很困难。)在工作的面试中有许多你不能询问的东西,我想这些东西的列表应该是无限长的。在办公室中,你做事必须如履薄冰,以免别人说出或作出让公司上 法庭的事情。如果你想要开除某人,最好祈求上帝的祝福吧。

如果公司总是由于解雇员工被起诉的话,我从中看不到任何原本的经济关系。在一个 完全的经济关系下,你可以做任何你想要做的事情。如果你想停止从一个供应商这儿买钢管,而从别处买,你不用解释为什么。没有人可以因为你不公正的变换钢管 供应商而起诉你。公正意味着着某种像父亲般的义务,而这种义务在两个平等个体的交易之间是不存在的。

几乎所有有关雇主的法律规定都是倾向于保护雇员的。但是你不能作出对等的或者是相反的反应。你不能想象雇主对雇员有父亲般的义务,而不把雇员放在孩子的位置上。而且这样看起来也并不会有什么好结果。

下 次你到一个大城市在他们的邮局的时候,可以好好的观察一下里面工作人员的身体语言。还记得小孩子被逼去做自己不愿意做的事情时候的表情吗?他们都是这样的 怨恨的表情。他们的工会成功了提高了他们的工资,并且得到了让邮局的上一辈的工作人员羡慕的工作条件。但是他们看起来并不开心。接受这种”父亲般的”关系 看起来让人士气低落。无论这个词语看起来多么的舒服。你只要去问问你的小孩就可以了。

我看到了雇主雇员关系的的劣处,因为我找到了更好的 关系,那就是投资者-创始人关系。我并不像说这是很容易的事情。当我创业的时候,我们的投资人的想法总是让我在夜里睡不着觉。现在,我变成了投资人,我的 创业者的想法也让我晚上睡不好了。所有你试图去解决的难题仍然会让你很为难,但是如果没有和怨恨的感情混合在一起的话,痛苦会小的多。

我曾经不幸的参加过一个证明这个结论是正确的对照实验。在Yahoo买下我们之后,我们就为他们工作了。除了老板之外,我的工作没有任何变化。但是让我恐惧的是,我开始表现得像一个小孩子了。总是出现莫名其妙的错误。

正如书写blog和开源告诉我们的,投资关系与雇佣关系相比最大的好处就是人们为他们自己的项目工作。而这个时候的人们的效率总是惊人的高的。创业是一个在两个方面属于个人的项目:在经济上和想法上都是属于自己管理的。

Google就是这样一个被我所描述的力量驱动的公司,这样的例子是很少的。他们努力让自己的办公室比一般的那种布满小格子的房间更加有效率。他们给工作出色的雇员大量的股票,以模拟创业成功带来的感觉。他们甚至同意让雇员用20%的时间作自己的事情。

那为什么不让人们把100%的时间都花在他们自己的项目上呢?而不是试图去计算他们创造的价值,然后给予他们实际的市场价值。不可能?这实际上就是风险投资上正在做的事情。

为 什么我宣称以后将不再会有雇员这个概念?每个人都应该去创业吗?当然不是。但是以后会有更多的人这样做。现在,即使是最聪明的学生在离开学校的时候,满脑 子都是找工作的念头。实际上他们要做的是要创造价值。找到一个工作是创造价值的一种方法。但是更有雄心的人应该从投资人而不是雇主那里拿到钱,而且这样往 往他们也做的更好。

另一个使人们不敢创业的就是风险。如果你有孩子还有贷款要还,最好还是三思而后行。但是几乎所有的年轻人都没有这两样东西。

就像开源和写blog告诉我们的一样,即使你失败了,你也会更加的享受过程。因为你在做自己的项目,而不是到办公室去,等着别人给你下命令。在你自己的公司,你可能会有更多的麻烦事,但是痛苦绝对会少得多。

长期看来,这就是开源和书写blog背后的驱动力量带来得最好的效果:让我们忘记那种老式的如父子关系的雇佣关系,而以两个平等个体之间的,完全纯粹的经济关系替代之。

2006年12月07日

如果备份的数据库有2个文件,分别是.LDF 和 .MDF,打开企业管理器,在实例上右击---所有任务--附加数据库,然后选择那个.MDF文件,就可以了。
或者在查询分析器中输入:

sp_attach_db "数据库名称","路径\文件名.ldf","路径\文件名.MDF"

SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志文件ldf的方式。下面将主要讨论一下后者的备份与恢复。本文假定您 能熟练使用SQL Server Enterprise Manager(SQL Server企业管理器)和SQL Server Quwey Analyser(SQL Server查询分析器)

1、正常的备份、恢复方式
正常方式下,我们要备份一个数据库,首先要先将该数据库从运行的数据服务器中断开,或者停掉整个数据库服务器,然后复制文件。
卸下数据库的命令:Sp_detach_db 数据库名
连接数据库的命令:Sp_attach_db或者sp_attach_single_file_db
s_attach_db [@dbname =] ‘dbname’, [@filename1 =] ‘filename_n’ [,...16]
sp_attach_single_file_db [@dbname =] ‘dbname’, [@physname =] ‘physical_name’
使用此方法可以正确恢复SQL Sever7.0和SQL Server 2000的数据库文件,要点是备份的时候一定要将mdf和ldf两个文件都备份下来,mdf文件是数据库数据文件,ldf是数据库日志文件。
例子:
假设数据库为test,其数据文件为test_data.mdf,日志文件为test_log.ldf。下面我们讨论一下如何备份、恢复该数据库。
卸下数据库:sp_detach_db ‘test’
连 接数据库:sp_attach_db ‘test’,'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_data.mdf’,'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf’
sp_attach_single_file_db ‘test’,'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_data.mdf’
// 本文转自 C++Builder 研究 – http://www.ccrun.com/article.asp?i=986&d=oxit07

2、只有mdf文件的恢复技术
由于种种原因,我们如果当时仅仅备份了mdf文件,那么恢复起来就是一件很麻烦的事情了。
如果您的mdf文件是当前数据库产生的,那么很侥幸,也许你使用sp_attach_db或者sp_attach_single_file_db可以恢复数据库,但是会出现类似下面的提示信息
设备激活错误。物理文件名 ‘C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF’ 可能有误。
已创建名为 ‘C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.LDF’ 的新日志文件。
但是,如果您的数据库文件是从其他计算机上复制过来的,那么很不幸,也许上述办法就行不通了。你也许会得到类似下面的错误信息
服务器: 消息 1813,级别 16,状态 2,行 1
未能打开新数据库 ‘test’。CREATE DATABASE 将终止。
设备激活错误。物理文件名 ‘d:\test_log.LDF’ 可能有误。
怎么办呢?别着急,下面我们举例说明恢复办法。
A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL Server Enterprise Manager里面建立。
B.停掉数据库服务器。
C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。
D.启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。
E.设置数据库允许直接操作系统表。此操作可以在SQL Server Enterprise Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。
/*

*/
use master
go
sp_configure ‘allow updates’,1
go
reconfigure with override
go
F.设置test为紧急修复模式
update sysdatabases set status=-32768 where dbid=DB_ID(‘test’)
此时可以在SQL Server Enterprise Manager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里面的表,但是仅仅有系统表
G.下面执行真正的恢复操作,重建数据库日志文件
dbcc rebuild_log(‘test’,'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf’)
执行过程中,如果遇到下列提示信息:
服务器: 消息 5030,级别 16,状态 1,行 1
未能排它地锁定数据库以执行该操作。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL Server Enterprise Manager打开了test库的系统表,那么退出SQL Server Enterprise Manager就可以了。
正确执行完成的提示应该类似于:
警告: 数据库 ‘test’ 的日志已重建。已失去事务的一致性。应运行 DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
此时打开在SQL Server Enterprise Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。
H.验证数据库一致性(可省略)
dbcc checkdb(‘test’)
一般执行结果如下:
CHECKDB 发现了 0 个分配错误和 0 个一致性错误(在数据库 ‘test’ 中)。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
I.设置数据库为正常状态
sp_dboption ‘test’,'dbo use only’,'false’
如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。
J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL Server Enterprise Manager里面恢复,也可以使用如下语句完成
sp_configure ‘allow updates’,0
go
reconfigure with override
go
 

DBCC results for ‘x’.
DBCC results for ’sysobjects’.
There are 152 rows in 5 pages for object ’sysobjects’.
DBCC results for ’sysindexes’.
There are 165 rows in 14 pages for object ’sysindexes’.
DBCC results for ’syscolumns’.
There are 502 rows in 12 pages for object ’syscolumns’.
DBCC results for ’systypes’.
There are 26 rows in 1 pages for object ’systypes’.
DBCC results for ’syscomments’.
There are 182 rows in 14 pages for object ’syscomments’.
DBCC results for ’sysfiles1′.
There are 2 rows in 1 pages for object ’sysfiles1′.
DBCC results for ’syspermissions’.
There are 50 rows in 1 pages for object ’syspermissions’.
DBCC results for ’sysusers’.
There are 12 rows in 1 pages for object ’sysusers’.
DBCC results for ’sysproperties’.
There are 1 rows in 1 pages for object ’sysproperties’.
DBCC results for ’sysdepends’.
There are 509 rows in 3 pages for object ’sysdepends’.
DBCC results for ’sysreferences’.
There are 6 rows in 1 pages for object ’sysreferences’.
DBCC results for ’sysfulltextcatalogs’.
There are 0 rows in 1 pages for object ’sysfulltextcatalogs’.
DBCC results for ’sysfulltextnotify’.
There are 0 rows in 0 pages for object ’sysfulltextnotify’.
DBCC results for ’sysfilegroups’.
There are 1 rows in 1 pages for object ’sysfilegroups’.
DBCC results for ‘LogForUserSystem’.
There are 197355 rows in 2038 pages for object ‘LogForUserSystem’.
DBCC results for ‘ox_pics_cates’.
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:110) with values (BlockLayerID = 2 and BlockID = 447316 and owner_board_name = ‘emotion.programmer’ and MessageID = 447194) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:111) with values (BlockLayerID = 2 and BlockID = 447316 and owner_board_name = ‘emotion.programmer’ and MessageID = 447202) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:112) with values (BlockLayerID = 2 and BlockID = 447316 and owner_board_name = ‘emotion.programmer’ and MessageID = 447324) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:113) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447162) points to the data row identified by ().
There are 1 rows in 1 pages for object ‘ox_pics_cates’.
DBCC results for ‘res_faces’.
There are 81 rows in 1 pages for object ‘res_faces’.
DBCC results for ‘dtproperties’.
There are 14 rows in 1 pages for object ‘dtproperties’.
DBCC results for ‘accounts’.
There are 5962 rows in 173 pages for object ‘accounts’.
DBCC results for ‘ox_pics’.
There are 7522 rows in 129 pages for object ‘ox_pics’.
DBCC results for ‘forum_msgs’.
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:114) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447164) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:115) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447167) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:116) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447169) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:117) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447171) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:118) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447179) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:119) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447181) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:120) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447185) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:121) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447192) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:122) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447204) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:123) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447215) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:124) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447218) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:125) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447251) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:126) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447298) points to the data row identified by ().
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database ‘x’, index ‘forum_msgs.IX_forum_msgs_for_0_layer_list’ (ID 768721791) (index ID 6). Extra or invalid key for the keys:
Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:12894:127) with values (BlockLayerID = 2 and BlockID = 447318 and owner_board_name = ‘emotion.programmer’ and MessageID = 447327) points to the data row identified by ().
There are 446359 rows in 12198 pages for object ‘forum_msgs’.
CHECKDB found 0 allocation errors and 18 consistency errors in table ‘forum_msgs’ (object ID 768721791).
DBCC results for ‘ox_pics_catepics’.
There are 1 rows in 1 pages for object ‘ox_pics_catepics’.
DBCC results for ‘ox_pics_accounts’.
There are 1 rows in 1 pages for object ‘ox_pics_accounts’.
DBCC results for ‘ox_bookmarks_byaccount’.
There are 2626 rows in 21 pages for object ‘ox_bookmarks_byaccount’.
DBCC results for ‘link_tables_users’.
There are 1 rows in 1 pages for object ‘link_tables_users’.
DBCC results for ‘account_usergroups’.
There are 1 rows in 1 pages for object ‘account_usergroups’.
DBCC results for ‘account_onlines’.
There are 60 rows in 11 pages for object ‘account_onlines’.
DBCC results for ’search_actions’.
There are 2 rows in 1 pages for object ’search_actions’.
DBCC results for ‘ox_webmsg_msgs’.
There are 18791 rows in 220 pages for object ‘ox_webmsg_msgs’.
DBCC results for ‘event_logs’.
There are 546155 rows in 6897 pages for object ‘event_logs’.
DBCC results for ‘forum_boards’.
There are 28 rows in 1 pages for object ‘forum_boards’.
CHECKDB found 0 allocation errors and 18 consistency errors in database ‘x’.
repair_fast is the minimum repair level for the errors found by DBCC CHECKDB (x ).
DBCC execution completed. If DBCC printed error messages, contact your system administrator.