animeic 1 year ago
commit
6a15ae76ef

+ 23 - 0
config/baishuihu-mongo[all].yaml

@@ -0,0 +1,23 @@
+scheduler:
+  # run every day at 6:00 and 18:00 UTC
+  cron: "0 17 */1 * *"
+  # number of backups to keep locally
+  retention: 14
+  # backup operation timeout in minutes
+  timeout: 60
+target:
+  # mongod IP or host name
+  host: "baishuihu-mongo"
+  # mongodb port
+  port: 27017
+  # mongodb database name, leave blank to backup all databases
+  database: ""
+  # leave blank if auth is not enabled
+  username: "root"
+  password: "baishuihu_vxxx"
+  # add custom params to mongodump (eg. Auth or SSL support), leave blank if not needed
+  params: "--authenticationDatabase admin"
+  # params: "--ssl --authenticationDatabase admin"
+
+  # 对应数据库配置
+  # mongodb://root:baishuihu_vxxx@baishuihu-mongo:27017/user?authSource=admin

+ 23 - 0
docker-compose.yaml

@@ -0,0 +1,23 @@
+version: '3.8'
+
+# 网络
+# 与需要备份的mongo在同一个网络
+networks:
+  default:
+    name: default-network
+    external: true
+
+services:
+  # mgob
+  mgob:
+    image: stefanprodan/mgob:1.1
+    container_name: mongo-backup
+    restart: always
+    volumes:
+      - ./config:/config
+      - /data/mongobackupdata/storage:/storage
+      - /data/mongobackupdata/tmp:/tmp
+      - /data/mongobackupdata/data:/data
+    ports:
+      - 8090:8090
+

BIN
format-backup-file/format-backup-file


+ 3 - 0
format-backup-file/go.mod

@@ -0,0 +1,3 @@
+module format-backup-file
+
+go 1.19

+ 68 - 0
format-backup-file/main.go

@@ -0,0 +1,68 @@
+package main
+
+import (
+	"fmt"
+	"os"
+	"path"
+	"regexp"
+	"strconv"
+	"strings"
+	"time"
+)
+
+func main() {
+	_, err := GetAllFile("/data/mongobackupdata/storage")
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	fmt.Println("备份文件命名成功")
+
+}
+func GetAllFile(pathname string) ([]string, error) {
+	result := []string{}
+
+	fis, err := os.ReadDir(pathname)
+	if err != nil {
+		fmt.Printf("读取文件目录失败,pathname=%v, err=%v \n", pathname, err)
+		return result, err
+	}
+
+	// 所有文件/文件夹
+	for _, fi := range fis {
+		fullname := pathname + "/" + fi.Name()
+		// 是文件夹则递归进入获取;是文件,则压入数组
+		if fi.IsDir() {
+			temp, err := GetAllFile(fullname)
+			if err != nil {
+				fmt.Printf("读取文件目录失败,fullname=%v, err=%v", fullname, err)
+				return result, err
+			}
+			result = append(result, temp...)
+		} else {
+			// 匹配时间戳命名的文件
+			re := regexp.MustCompile(`\d{10}`)
+			strs := re.FindAllString(fullname, -1)
+			if len(strs) > 0 {
+				// 格式化匹配到的时间
+				backupTime := strs[0]
+				backup, _ := strconv.Atoi(backupTime)
+				tm := time.Unix(int64(backup), 0)
+				timestr := tm.Format("2006-01-02 15:04:05")
+
+				// 拼接需要重命名的文件带路径字符串
+				suffix := path.Ext(fullname)
+				fileSlice := strings.Split(fullname, "-")
+				filePrefix := fileSlice[:len(fileSlice)-1]
+				renamefile := strings.Join(filePrefix, "-") + "-" + timestr + suffix
+
+				// 重命名文件
+				os.Rename(fullname, renamefile)
+			}
+
+			result = append(result, fullname)
+		}
+	}
+
+	return result, nil
+}

+ 34 - 0
readme.md

@@ -0,0 +1,34 @@
+# 数据库备份
+
+> 文档:`https://github.com/stefanprodan/mgob`
+
+## 使用
+
+1. 在config/添加配置
+   config/3dshow.yaml
+2. 启动服务:`docker-compose up -d`
+
+## webapi
+
+mgob-host:8090/storage file server  
+mgob-host:8090/status backup jobs status  
+mgob-host:8090/metrics Prometheus endpoint  
+mgob-host:8090/version mgob version and runtime info  
+mgob-host:8090/debug pprof endpoint  
+
+## 恢复数据
+
+1. 进入容器
+   docker exec -it mongo-backup sh
+2. 恢复命令
+   mongorestore --gzip --archive=/storage/local-3dshow/local-3dshow1-1668757800.gz --host 3dshow-mongo:27017 --drop -u root -p 3dshow --authenticationDatabase admin
+
+## 格式化备份文件
+
+cd ./format-backup-file
+
+go build -o format-backup-file
+
+chmod +x format-backup-file
+
+sh format-backup-file