小花狸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期间所发博文丢失,是一个重大失误!对于我们自己更是需要深刻的反思!
DBA最不能失手的就是备份和恢复...
而有的时候,我感觉自己还是没有从开发的角色转换过来..
这个事故给我以非常大的警醒.
下阶段加紧推进
1.集中备份,集中复制,集中监控
2.演练推进binlog
3.每周测试备份有效性
4.搭建Oracle DataGuard,并使用Rman备份
我希望自己永远不要写这样的道歉信,不做那个愚蠢的人.
由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也不熟..一旦发生问题..不敢想
维护这个博客,我花了很多时间和精力..
不仅把他当作网络记事本和分享的平台.
更从中理解了数据对于用户的意义.
己所不欲勿施于人
自己不想丢数据,更要以保护自己数据的心态,维护用户的数据.
出现这个事故的原因有三
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/