golang多驱动数据库备份到不同目标的一键配置插件库onedump的使用

Golang多驱动数据库备份到不同目标的一键配置插件库onedump的使用

Onedump

Onedump是一个数据库管理工具,可以简化跨多个数据库和存储目的地的备份和恢复任务。

主要特性

  • 支持从不同数据源备份到不同目标
  • MySQL零依赖备份(内置原生MySQL dumper)
  • 支持依赖mysqldump和pg_dump的dumper
  • MySQL binlog备份到AWS S3
  • 从binlog恢复MySQL
  • MySQL慢查询日志解析器
  • 可恢复和并发的SFTP文件传输
  • 从S3桶加载配置
  • Slack通知
  • 维护包含所有依赖的Docker镜像

支持的源数据库

  • MySQL
  • PostgreSQL

支持的存储目标

  • 本地文件系统
  • AWS S3
  • Google Drive
  • Dropbox
  • SFTP

安装

二进制安装

从GitHub releases页面下载适合您操作系统的最新版本二进制文件,将其移动到PATH环境变量中的目录(例如/usr/local/bin/onedump),并赋予可执行权限:

sudo chmod +x /usr/local/bin/onedump

然后运行:

$ onedump

Docker镜像

Docker镜像可在Docker Hub获取。

何时使用Docker镜像

  1. 想在Kubernetes、ECS或其他容器环境中运行onedump
  2. 需要PostgreSQL支持(镜像已包含pg_dump)
  3. 当前原生MySQL dumper不满足需求,需要使用mysqldump

使用特定pg_dump版本

Docker镜像包含mysql客户端、postgresql15-clientpostgresql16-client。默认使用postgresql16-client,但可以通过设置PG_VERSION环境变量切换版本:

docker run -e PG_VERSION=15 julianli/onedump:v1.5.0-arm64 -f config.yaml

生产环境Linux机器通常需要AMD64镜像,例如:julianli/onedump:v1.5.0-amd64

使用示例

1. 从本地数据库备份到2个本地目录

jobs:
- name: local-dump
  dbdriver: mysql
  dbdsn: root@tcp(127.0.0.1)/test_local
  gzip: true
  storage:
    local:
      - path: /Users/jack/Desktop/mydb.sql
      - path: /Users/jack/Desktop/mydb2.sql

2. 通过SSH备份远程数据库到本地目录和S3桶

jobs:
- name: ssh-dump
  dbdriver: mysql
  dbdsn: user:password@tcp(127.0.0.1:3306)/mydb
  sshhost: mywebsite.com
  sshuser: root
  sshkey: |-
    -----BEGIN OPENSSH PRIVATE KEY-----
    b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn...
    -----END OPENSSH PRIVATE KEY-----
  storage:
    local:
      - path: /Users/jack/Desktop/db.sql
    s3:
      - bucket: mys3bucket
        key: backup/mydb.sql
        region: ap-southeast-2
        access-key-id: awsaccesskey
        secret-access-key: awssecret
        session-token: <session-token> # 可选,如果假设角色则指定值

3. 多个备份到不同存储

jobs:
- name: local-dump
  dbdriver: mysql
  dbdsn: root@tcp(127.0.0.1)/test_local
  storage:
    local:
      - path: /Users/jack/Desktop/mydb.sql
- name: ssh-dump
  dbdriver: mysql
  dbdsn: user:password@tcp(127.0.0.1:3306)/mydb
  sshhost: mywebsite.com
  sshuser: root
  sshkey: |-
    -----BEGIN OPENSSH PRIVATE KEY-----
    b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn...
    -----END OPENSSH PRIVATE KEY-----
  storage:
    s3:
      - bucket: mys3bucket
        key: backup/mydb.sql
        region: ap-southeast-2
        access-key-id: awsaccesskey
        secret-access-key: awssecret
        session-token: <session-token> # 可选,如果假设角色则指定值

4. Slack通知

notifier:
    slack:
      - incomingwebhook: https://hooks.slack.com/services/A0B8A11N4N/...
jobs:
- name: local-dump
  dbdriver: mysql
  dbdsn: root@tcp(127.0.0.1)/test_local
  gzip: true
  storage:
    local:
      - path: /Users/jack/Desktop/mydb.sql

原生MySQL dumper

原生MySQL dumper提供了类似mysqldump的用户体验,但有以下限制:

  1. 不支持MySQL空间数据类型(如GEOMETRY、POINT或POLYGON)
  2. 不支持所有mysqldump选项,目前仅支持--skip-add-drop-table--skip-add-locks

如果需要更高级功能,可以切换到mysqldump:

jobs:
- dbdriver: mysqldump
  ...

慢查询日志解析器

onedump内置慢查询日志解析功能:

# 解析单个文件
$ onedump slow -f /path/to/file/slow.log

# 解析文件夹
$ onedump slow -f /path/to/folder 

# 按模式匹配文件名
$ onedump slow -f /path/to/folder-or-file -p="*slow.log"

# 用?屏蔽查询值
$ onedump slow -f /path/to/file -m="true"

输出JSON格式:

{"ok":true,"error":"","results":[{"time":"2023-10-15T12:36:05.987654Z","user":"admin[admin]","host_ip":"[192.168.1.101]","query_time":12.890323,"lock_time":0.001456,"rows_sent":100,"rows_examined":100000,"thread_id":0,"errno":0,"killed":0,"bytes_received":0,"bytes_sent":0,"read_first":0,"read_last":0,"read_key":0,"read_next":0,"read_prev":0,"read_rnd":0,"read_rnd_next":0,"sort_merge_passes":0,"sort_range_count":0,"sort_rows":0,"sort_scan_count":0,"created_tmp_disk_tables":0,"created_tmp_tables":0,"count_hit_tmp_table_size":0,"start":"","end":"","query":"SELECT customer_id, COUNT(*) as order_count FROM orders GROUP BY customer_id HAVING order_count > ?"}]}

运行方式

1. 从本地目录加载配置文件

$ onedump -f /path/to/config.yaml

2. 从S3桶加载配置

$ onedump -f backup-config/config.yaml --s3-bucket mybucket

3. 设置定时任务

$ onedump -f /path/to/config.yaml -c 21h

工作原理

onedump主要通过一个配置文件运行,支持两种连接数据库的方式:

  1. 直接网络连接
jobs:
- name: exec-dump
  dbdriver: mysql
  dbdsn: user:password@tcp(10.10.10.1)/dbname
  1. 通过SSH连接
jobs:
- name: ssh-dump
  dbdriver: mysql
  dbdsn: user:password@tcp(127.0.0.1:3306)/dbname
  sshhost: mywebsite.com
  sshuser: root
  sshkey: |-
    -----BEGIN OPENSSH PRIVATE KEY-----
    b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn...
    -----END OPENSSH PRIVATE KEY-----

更多关于golang多驱动数据库备份到不同目标的一键配置插件库onedump的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang多驱动数据库备份到不同目标的一键配置插件库onedump的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


onedump - Golang多驱动数据库备份工具

onedump 是一个用 Go 语言编写的数据库备份工具,支持多种数据库驱动,可以将数据备份到不同的目标存储位置。它提供了一键配置功能,简化了数据库备份流程。

主要特性

  1. 支持多种数据库驱动:MySQL、PostgreSQL、SQLite、MongoDB等
  2. 支持多种备份目标:本地文件系统、S3、FTP、SFTP等
  3. 简单的配置方式
  4. 定时备份功能
  5. 备份压缩和加密

安装

go get github.com/komodorio/onedump

基本使用示例

1. 简单备份MySQL到本地文件

package main

import (
	"github.com/komodorio/onedump/pkg/onedump"
	"log"
)

func main() {
	config := onedump.Config{
		DBDriver:   "mysql",
		DBDSN:      "user:password@tcp(localhost:3306)/dbname",
		OutputPath: "/backups/mysql_backup.sql",
	}

	dumper, err := onedump.NewDumper(&config)
	if err != nil {
		log.Fatalf("Failed to create dumper: %v", err)
	}

	err = dumper.Dump()
	if err != nil {
		log.Fatalf("Backup failed: %v", err)
	}
	
	log.Println("Backup completed successfully")
}

2. 多数据库备份到不同目标

package main

import (
	"github.com/komodorio/onedump/pkg/onedump"
	"log"
	"time"
)

func main() {
	// MySQL备份到S3
	mysqlConfig := onedump.Config{
		DBDriver:   "mysql",
		DBDSN:      "user:password@tcp(localhost:3306)/db1",
		OutputPath: "s3://my-bucket/mysql_backup.sql",
		S3Config: &onedump.S3Config{
			Endpoint:  "s3.amazonaws.com",
			AccessKey: "your-access-key",
			SecretKey: "your-secret-key",
			Region:    "us-east-1",
		},
		Compress: true,
	}

	// PostgreSQL备份到SFTP
	pgConfig := onedump.Config{
		DBDriver:   "postgres",
		DBDSN:      "postgres://user:password@localhost:5432/db2?sslmode=disable",
		OutputPath: "sftp://user:password@example.com:22/backups/pg_backup.sql",
		Encrypt:    true,
		EncryptKey: "my-secret-encryption-key",
	}

	// 创建dumpers
	mysqlDumper, err := onedump.NewDumper(&mysqlConfig)
	if err != nil {
		log.Fatalf("Failed to create MySQL dumper: %v", err)
	}

	pgDumper, err := onedump.NewDumper(&pgConfig)
	if err != nil {
		log.Fatalf("Failed to create PostgreSQL dumper: %v", err)
	}

	// 执行备份
	if err := mysqlDumper.Dump(); err != nil {
		log.Printf("MySQL backup failed: %v", err)
	} else {
		log.Println("MySQL backup completed")
	}

	if err := pgDumper.Dump(); err != nil {
		log.Printf("PostgreSQL backup failed: %v", err)
	} else {
		log.Println("PostgreSQL backup completed")
	}
}

3. 定时备份配置

package main

import (
	"github.com/komodorio/onedump/pkg/onedump"
	"log"
	"time"
)

func main() {
	config := onedump.Config{
		DBDriver:   "mysql",
		DBDSN:      "user:password@tcp(localhost:3306)/dbname",
		OutputPath: "/backups/mysql_backup_%TIMESTAMP%.sql",
		Schedule:   "@daily", // 使用cron表达式或预定义值如@daily, @hourly
	}

	dumper, err := onedump.NewDumper(&config)
	if err != nil {
		log.Fatalf("Failed to create dumper: %v", err)
	}

	// 启动定时备份服务
	stopChan := make(chan struct{})
	go func() {
		if err := dumper.StartScheduledDump(stopChan); err != nil {
			log.Fatalf("Scheduled backup failed: %v", err)
		}
	}()

	// 运行一段时间后停止
	time.Sleep(24 * time.Hour)
	close(stopChan)
}

高级配置选项

onedump 提供了丰富的配置选项:

type Config struct {
	DBDriver    string       // 数据库驱动类型: mysql, postgres, sqlite, mongodb
	DBDSN       string       // 数据库连接字符串
	OutputPath  string       // 输出路径,支持本地文件系统、S3、SFTP等
	Compress    bool         // 是否压缩备份
	Encrypt     bool         // 是否加密备份
	EncryptKey  string       // 加密密钥
	Schedule    string       // 定时备份计划
	S3Config    *S3Config    // S3配置
	SFTPConfig  *SFTPConfig  // SFTP配置
	FTPConfig   *FTPConfig   // FTP配置
	Tables      []string     // 指定要备份的表(可选)
	Exclude     []string     // 排除的表(可选)
	MaxFileSize int64        // 最大文件大小(分卷备份)
}

支持的数据库和目标

支持的数据库驱动:

  • MySQL
  • PostgreSQL
  • SQLite
  • MongoDB
  • SQL Server

支持的备份目标:

  • 本地文件系统
  • Amazon S3
  • Google Cloud Storage
  • SFTP
  • FTP
  • Azure Blob Storage

最佳实践

  1. 加密敏感数据: 始终对包含敏感信息的备份进行加密
  2. 定期测试恢复: 定期测试备份文件是否可以成功恢复
  3. 监控备份作业: 设置监控以确保备份作业正常运行
  4. 版本控制配置: 将备份配置纳入版本控制系统
  5. 合理的保留策略: 根据业务需求设置备份保留周期

onedump 提供了简单而强大的方式来管理数据库备份,通过灵活的配置可以满足各种备份需求。

回到顶部