golang多驱动数据库备份到不同目标的一键配置插件库onedump的使用
Golang多驱动数据库备份到不同目标的一键配置插件库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镜像
- 想在Kubernetes、ECS或其他容器环境中运行onedump
- 需要PostgreSQL支持(镜像已包含pg_dump)
- 当前原生MySQL dumper不满足需求,需要使用mysqldump
使用特定pg_dump版本
Docker镜像包含mysql
客户端、postgresql15-client
和postgresql16-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的用户体验,但有以下限制:
- 不支持MySQL空间数据类型(如GEOMETRY、POINT或POLYGON)
- 不支持所有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主要通过一个配置文件运行,支持两种连接数据库的方式:
- 直接网络连接
jobs:
- name: exec-dump
dbdriver: mysql
dbdsn: user:password@tcp(10.10.10.1)/dbname
- 通过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
更多关于golang多驱动数据库备份到不同目标的一键配置插件库onedump的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
onedump - Golang多驱动数据库备份工具
onedump 是一个用 Go 语言编写的数据库备份工具,支持多种数据库驱动,可以将数据备份到不同的目标存储位置。它提供了一键配置功能,简化了数据库备份流程。
主要特性
- 支持多种数据库驱动:MySQL、PostgreSQL、SQLite、MongoDB等
- 支持多种备份目标:本地文件系统、S3、FTP、SFTP等
- 简单的配置方式
- 定时备份功能
- 备份压缩和加密
安装
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
最佳实践
- 加密敏感数据: 始终对包含敏感信息的备份进行加密
- 定期测试恢复: 定期测试备份文件是否可以成功恢复
- 监控备份作业: 设置监控以确保备份作业正常运行
- 版本控制配置: 将备份配置纳入版本控制系统
- 合理的保留策略: 根据业务需求设置备份保留周期
onedump 提供了简单而强大的方式来管理数据库备份,通过灵活的配置可以满足各种备份需求。