小花狸ITPUB博客备份工具

小花狸ITPUB/CU博客备份工具
由golang编写,运行在Linux环境(CentOS 6测试通过)

1.编译博客备份工具的源码
[lihuilin@lihuilin src]$ go build Backup.go

2.找到自己的第一篇博客.(最开始写的那篇)

这块做的有点傻,我是从第一篇博客的内容,通过正则找到后续的博客地址
其实完全可以从最后一篇博客往前推..

3.执行备份工具,备份的路径是/tmp/itpub

一定要改linux open file的设置

[lihuilin@lihuilin src]$ ulimit -n 10000
[lihuilin@lihuilin src]$ ./Backup --path http://blog.itpub.net/29254281/viewspace-775659/
2015/04/12 10:02:57 http://blog.itpub.net/29254281/viewspace-775660/
2015/04/12 10:02:58 http://blog.itpub.net/29254281/viewspace-775663/
2015/04/12 10:02:58 http://blog.itpub.net/29254281/viewspace-775788/
2015/04/12 10:02:59 http://blog.itpub.net/29254281/viewspace-775791/
...
2015/04/12 10:04:41 http://blog.itpub.net/29254281/viewspace-1482375/
2015/04/12 10:04:41 http://blog.itpub.net/29254281/viewspace-1518312/
2015/04/12 10:04:42 一共备份博客313篇

未审核通过的文章和设置为仅自己可见的文章,不能备份.



源码如下:
package main

import (
    "flag"
    "github.com/opesun/goquery"
    "io"
    "log"
    "net/http"
    "os"
    "regexp"
    "strconv"
    "strings"
)

const (
    _ITPUB = "http://blog.itpub.net"
    _PATH  = "/tmp/itpub"
)

var (
    i int
)

func main() {
    url := flag.String("path", "", "blog path")
    flag.Parse()
    getContent(*url)
    log.Printf("一共备份博客" + strconv.Itoa(i) + "篇")
}

func getContent(url string) {
    i++
    page, _ := goquery.ParseUrl(url)
    title := page.Find("title").Text()
    base := _PATH + "/" + title + "/"
    os.MkdirAll(base, 0777)

    htmlfile, _ := os.Create(base + title + ".html")
    defer htmlfile.Close()

    reg, _ := regexp.Compile("[^\"]*.png")
    piclist := reg.FindAllString(page.Html(), -1)

    //下载图片
    for _, pic := range piclist {
        if !strings.HasPrefix(pic, "/") {
            continue
        }
        dir := pic[0:strings.LastIndex(pic, "/")]
        picResp, _ := http.Get(_ITPUB + pic)
        defer picResp.Body.Close()
        os.MkdirAll(base+dir, 0777)
        picfile, _ := os.Create(base + pic)
        defer picfile.Close()
        io.Copy(picfile, picResp.Body)
    }
    htmlContent := reg.ReplaceAllString(page.Html(), ".$0")
    htmlContent = strings.Replace(htmlContent, "href=\"/css/", "href=\""+_ITPUB+"/css/", -1)
    io.WriteString(htmlfile, htmlContent)

    nextBlog, _ := regexp.Compile("下一篇:.*\"")
    nextUrl := nextBlog.FindString(htmlContent)
    if nextUrl == "" {
        return
    }
    log.Println(_ITPUB + nextUrl[21:len(nextUrl)-1])
    getContent(_ITPUB + nextUrl[21:len(nextUrl)-1])
}


缘起
4月9日ITPUB发生了重大的线上事故,丢失了一天的数据.

原文如下:
2015年4月9日ITPUB博客重大失误道歉信
尊敬的各位ITPUB博主:
   
      经过昨天博客技术团队的确认,我不得不告诉大家这个消息,并代表我们的团队诚心的向大家致歉,在此不奢求能得到大家的体谅,只愿今后,能更谨慎努力的为大家服务,以微薄之力弥补大家辛苦写作的损失!
   
     2015年4月9日15点47分20秒时由于博客上线了一个快速删除广告文及用户的功能,未测试妥当后上线的直接操作,导致了有史以来第一次无法挽回的错 误及损失,当天所有数据彻底无法找回,服务器上的备份是4月9日零晨2点的内容。具体损失内容的时间段为:4月9日02:00- 17:40所发的内容找不回来啦!真的对不住大家,在此说任何理由都是苍白的,最终结果是这样的!作为一个技术社区的博客,我深知这种错误是遭受鄙视的, 但我只能祈祷这期间发出的博文,博主自己是有备份的!


      我更深知,4月9日02:00- 17:40期间所发博文丢失,是一个重大失误!对于我们自己更是需要深刻的反思!



 博客运营
     2015年4月10日09:37  
作为一个刚入行的DBA,我反复的将这个道歉信读了很多遍.
出现这个事故的原因有三
1.没有经过完备的测试或者根本没有测试
2.遇到了一个愚蠢的研发
  很有可能一个分支没有where,导致了全部删除
3.同时遇到了一个愚蠢的DBA(大哥,都是干DBA的,小弟完全没有说您的意思,我主要是想引以为戒,您多担待)
  在恢复全备的时候,没有往前推进binlog或者没有设置binlog

仔细考察这几个因素,我们单位也存在类似的风险
大部分程序没有经过测试.全凭开发的功力.但是人员素质却可能参差不齐
Oracle采用的是Expdp每天一个备份,出现问题也是丢失一天的数据.
而且我对于前推binlog也不熟..一旦发生问题..不敢想

维护这个博客,我花了很多时间和精力..
不仅把他当作网络记事本和分享的平台.
更从中理解了数据对于用户的意义.
己所不欲勿施于人
自己不想丢数据,更要以保护自己数据的心态,维护用户的数据.


DBA最不能失手的就是备份和恢复...
而有的时候,我感觉自己还是没有从开发的角色转换过来..

这个事故给我以非常大的警醒.
下阶段加紧推进
1.集中备份,集中复制,集中监控
2.演练推进binlog
3.每周测试备份有效性
4.搭建Oracle DataGuard,并使用Rman备份

我希望自己永远不要写这样的道歉信,不做那个愚蠢的人.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-1569918/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29254281/viewspace-1569918/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值