广告
返回顶部
首页 > 资讯 > 数据库 >使用golang怎么实现mysql数据库备份
  • 236
分享到

使用golang怎么实现mysql数据库备份

2024-04-02 19:04:59 236人浏览 八月长安
摘要

这期内容当中小编将会给大家带来有关使用golang怎么实现Mysql数据库备份,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。map & JSON,在处理主键与外键

这期内容当中小编将会给大家带来有关使用golang怎么实现Mysql数据库备份,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

  1. map & JSON,在处理主键与外键信息时,需要用到json数据结构来存储中间结果,因为要灵活处理,在Golang中只能用map[string]interface{}来处理。

  2. interface{} 相当于java中的object,能接受任意数据类型,方便但在使用时要做到心中有数,不然一旦数据类型不匹配,程序就会崩溃。

  3. xfffd ,utf8中的占位符,超出范围的utf8mb4入库后,会被存储为xfffd,数据导出时,需要过滤掉。

  4. goroutine, golang的并发支持很独特,我们的工具支持多个库同时备份,很容易使用goroutine来实现并行。

代码解析

按功能模块对核心代码进行说明

main.go,并发、命令行参数

使用命令行参数,接受一个参数,来指定备份的内容

package common

type OpFlag struct {
  Tables bool      //表结构
  Datum bool       //表结构和数据
  Views bool       //视图
  Funcs bool       //函数与存储过程
}

main.go,程序入口,处理命令行参数  

 if len(os.Args) > 1 {
    flag = common.OpFlag{
      Tables: false,
      Datum: false,
      Views: false,
      Funcs: false,
    }
    switch os.Args[1] {     //接受一个参数
    case "table":
      flag.Tables = true    //根据参数设定标识量
    case "data":
      flag.Tables = true
      flag.Datum = true
    case "views":
      flag.Views = true
    case "funcs":
      flag.Funcs = true
    default:          //参数不正确,报错退出
      log.Fatal("You arg must be in : table, data, views or funcs.")
    }
  }else{            //无参数,默认导出所有
    flag = common.OpFlag{
      Tables: true,
      Datum: true,
      Views: true,
      Funcs: true,
    }
  }
  err := backUp.Export(flag) 根据参数进行数据库备份

Export.go

备份主流程,根据configs.json生成goroutine来备份数据库,并等待完成。

var configs interface{}
  fr, err := os.Open("./configs.json")
  if err != nil {
    return err
  }
  decoder := json.NewDecoder(fr)         //解析配置文件
  err = decoder.Decode(&configs)
  confs := configs.(map[string]interface{})
  workDir := confs["workDir"].(string)
  ch := make(chan string)            //通道变量
  for key, value := range confs {
    if strings.HasPrefix(key, "db_") {
      dbConf := value.(map[string]interface{})
      dbConn := common.DbConnFields{   //数据库相应配置
        DbHost:  dbConf["db_host"].(string),
        DbPort:  int(dbConf["db_port"].(float64)),
        DbUser:  dbConf["db_user"].(string),
        DbPass:  dbConf["db_pass"].(string),
        DbName:  dbConf["db_name"].(string),
        DbCharset: dbConf["db_charset"].(string),
      }
      if dbConf["file_alias"] != nil {  //生成sql备份文件的命名
        dbConn.FileAlias = dbConf["file_alias"].(string)
      }
      go ExportOne(dbConn, workDir, ch, flag) //创建协程
    }
  }
  for key := range confs {            //阻塞主进程,待所有协程完成工作
    if strings.HasPrefix(key, "db_") {
      fmt.Print( <- ch )
    }
  }
  return nil

你需要编写如下的配置文件来描述你要备份的数据库:

{
  "db_name1": {
    "db_host": "192.168.1.8",
    "db_port": 3306,
    "db_user": "root",
    "db_pass": "123456",
    "db_name": "name1",
    "db_charset": "utf8mb4",
    "file_alias": "file name1"
  },
  "db_name2": {
    "db_host": "localhost",
    "db_port": 3306,
    "db_user": "root",
    "db_pass": "123456",
    "db_name": "name2",
    "db_charset": "utf8mb4"
  },
  "database_dialect": "mysql",
  "workDir": "/home/zhoutk/gocodes/goTools/"
}

ExportOne.go

备份一个数据库      

fileName := fields.FileAlias
  setSqlHeader(fields, fileName)      //设置导出文件说明
  if flag.Tables {            //如果表设置为真,导出表结构
    err := exportTables(fileName, fields, flag)  //具体算法请参照源代码
    if err != nil {
      ch <- fmt.Sprintln("Error: ", fields.DbName, "\t export tables throw, \t", err)
      return
    }
  }
  if flag.Views {            //如果视图设置为真,导出视图
    err := exportViews(fileName, fields)//具体算法请参照源代码,或python算法
    if err != nil {
      ch <- fmt.Sprintln("Error: ", fields.DbName, "\t export views throw, \t", err)
      return
    }
  }
  if flag.Funcs {        //如果函数设置为真,导出函数和存储过程
    err := exportFuncs(fileName, fields)//具体算法请参照源代码
    if err != nil {
      ch <- fmt.Sprintln("Error: ", fields.DbName, "\t export funcs throw, \t", err)
      return
    }
  }
  //导出工作完成,向通道输入信息
  ch <- fmt.Sprintln("Export ", fields.DbName, "\t success at \t", time.Now().FORMat("2006-01-02 15:04:05"))

MysqlDao.go

数据库查询通用封装,此工具只使用了ExecuteWithDbConn。灵活的使用map与interface{},将结果转化为键值对象返回。

func ExecuteWithDbConn(sql string, values []interface{}, fields common.DbConnFields) (map[string]interface{}, error) {
  rs := make(map[string]interface{})
  dao, err := mysql.Open("mysql", fields.DbUser + ":"+fields.DbPass+"@tcp("+fields.DbHost+":"+
    strconv.Itoa(fields.DbPort)+")/"+fields.DbName+"?charset="+fields.DbCharset)
  defer dao.Close()
  if err != nil {
    rs["code"] = 204
    return rs, err
  }
  stmt, err := dao.Prepare(sql)
  if err != nil {
    rs["code"] = 204
    return rs, err
  }
  rows, err := stmt.Query(values...)
  if err != nil {
    rs["code"] = 204
    return rs, err
  }
  columns, err := rows.Columns()    //取出字段名称
  vs := make([]mysql.RawBytes, len(columns))
  scans := make([]interface{}, len(columns))
  for i := range vs {         //预设取值地址
    scans[i] = &vs[i]
  }
  var result []map[string]interface{}
  for rows.Next() {
    _ = rows.Scan(scans...)    //塡入一列值
    each := make(map[string]interface{})
    for i, col := range vs {
      if col != nil {
        each[columns[i]] = FilterHolder(string(col)) //过滤/xfffd
      }else{
        each[columns[i]] = nil
      }
    }
    result = append(result, each)
  }
  rs["code"] = 200
  //data, _ := json.Marshal(result)
  rs["rows"] = result
  return rs, err
}

项目地址

https://GitHub.com/zhoutk/goTools

使用方法

git clone Https://github.com/zhoutk/goTools
cd goTools
go get
go run main.go
go buid main.go
./main         #export all things of database
./main table      #export tables
./main data       #export tables & data
./main views      #export views
./main funcs      #export funcs & stored procedures

golang的优点

golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的依赖,所以golang的性能优于其他的解释性语言,且可以在golang中使用goroutine来实现并发性,它提供了一个非常优雅的goroutine调度程序系统,可以很容易地生成数百万个goroutine。

上述就是小编为大家分享的使用golang怎么实现mysql数据库备份了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 使用golang怎么实现mysql数据库备份

本文链接: https://www.lsjlt.com/news/55681.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用golang怎么实现mysql数据库备份
    这期内容当中小编将会给大家带来有关使用golang怎么实现mysql数据库备份,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。map & json,在处理主键与外键...
    99+
    2022-10-18
  • mysql数据库备份怎么实现
    这篇文章主要介绍mysql数据库备份怎么实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文实例讲述了mysql 数据库备份的多种实现方式。分享给大家供大家参考,具体如下:一、使用...
    99+
    2022-10-18
  • MySQL数据库中怎么实现备份
    MySQL数据库中怎么实现备份,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.添加数据库、表、录入信息在进行备份前,先根据需...
    99+
    2022-10-18
  • 使用mysqldump怎么备份MySQL数据库
    今天就跟大家聊聊有关使用mysqldump怎么备份MySQL数据库,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  一、数据备份的重要性  工作中,...
    99+
    2022-10-18
  • 怎么使用Xtrabackup备份MySQL数据库
    这篇文章主要为大家展示了“怎么使用Xtrabackup备份MySQL数据库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么使用Xtrabackup备份MySQ...
    99+
    2022-10-18
  • mysql怎么备份数据库
    mysql怎么备份数据库?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。mysql怎么备份数据库1.进入mysql客户端连接数据库2.选择需要备...
    99+
    2022-10-18
  • MySQL数据库怎么备份
    小编给大家分享一下MySQL数据库怎么备份,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!导出表数据到一个文本文件的最简单方法是使...
    99+
    2022-10-18
  • 怎么备份MySql数据库
    这篇文章将为大家详细讲解有关怎么备份MySql数据库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。mysqldump工具备份备份整个数据库$>&nbs...
    99+
    2022-10-18
  • xtrabackup 实现MySQL数据库备份
    mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的 数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了。 这时就 需要一种好用又高效的工具,xtr...
    99+
    2018-06-08
    xtrabackup 实现MySQL数据库备份 数据库入门 数据库基础教程 数据库 mysql
  • MySQL定时备份数据库(全库备份)的实现
    目录一、MySQL数据备份 1.1、 mysqldump命令备份数据 1.2、 mysqldump常用操作示例 1.3、 还原mysql备份内容 二、 编写脚本维护备份的数据库文件 ...
    99+
    2022-11-12
  • mysql数据库中怎么实现异步备份
    本篇文章给大家分享的是有关mysql数据库中怎么实现异步备份,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1.服务器状态 服务器A:19...
    99+
    2022-10-18
  • PHP怎么实现MySQL数据库自动备份
    这篇“PHP怎么实现MySQL数据库自动备份”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP怎么实现MySQL数据库自动...
    99+
    2023-07-06
  • 怎么用innobackupex备份mysql数据库
    本篇内容主要讲解“怎么用innobackupex备份mysql数据库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用innobackupex备份mysql数...
    99+
    2022-10-18
  • 实现mysql数据库备份方法
    不知道大家之前对类似实现mysql数据库备份方法的文章有无了解,今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完实现mysql数据库备份方法你一定会有所收获的。新建一个bak文件,...
    99+
    2022-10-18
  • Mysql数据库实现数据定时备份
    为了防止数据丢失,在进行软件交付时通常会要求对数据库进行定期备份。 测试使用mysqldump进行数据库备份。 mysqldump -h 192.168.248.138 -uroot -proot d...
    99+
    2023-09-02
    数据库 mysql sql 定时备份 crontab
  • 怎么样备份MySql数据库
    小编给大家分享一下怎么样备份MySql数据库,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、数据备份捷径 因为这个方法没有得到...
    99+
    2022-10-18
  • MySQL数据库中怎么实现表级别备份
    本篇文章为大家展示了MySQL数据库中怎么实现表级别备份,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。备份脚本#!/bin/bash #this ...
    99+
    2022-10-18
  • Mysql数据库中怎么实现备份和还原
    这期内容当中小编将会给大家带来有关Mysql数据库中怎么实现备份和还原,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  1、备份MySQL数据库的命令 双击代码全选...
    99+
    2022-10-18
  • MySQL数据库中怎么实现备份与恢复
    MySQL数据库中怎么实现备份与恢复,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、数据库备份的一些概念1.造成数据丢失的原...
    99+
    2022-10-18
  • Mysql数据库中怎么实现备份与还原
    这篇文章给大家介绍Mysql数据库中怎么实现备份与还原,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。import java.io.IOException;import java.tex...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作