小花狸ITPUB部落格備份工具

壹頁書發表於2015-04-12
小花狸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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章