• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    如何利用Golang解析读取Mysql备份文件

    前言

    前期误操作,导致数据库表删除,虽然数据量不多,但是通过binlog恢复比较麻烦,通过备份文件来恢复,备份文件达36个G打开都是问题;

    使用备份文件恢复

    大文件编辑器,glogg-latest-x86_64-setup通过该文件打开备份文件,虽然过程稍慢,但是能够打开,且正常读取编辑信息,要恢复的数据量不大时采取是没问题的,但是如果表几十万行,操作起来就比较麻烦了;

    Golang读取备份文件

    采用Golang读取,借助编程语言的优势来读取备份,经过测试读取指定备份文件(约36GB)表,大约需要12min,其实主要就是读取遍历备份文件的过程;

    **
    * @Author: ws
    * @File: main
    * @Date: 2019/11/16 0016 14:35
    * @Remark: 
    */
    var(
     _INSERT_INTO="INSERTINTO${table}VALUES"
     _Dir="temp"
    )
    var TABLE_CAR="T_SCM_CAR"
    
    func ReadSqlFile(){
     t1 := time.Now() // get current time
     f, err := os.Open("E:\\update\\crm_20191112_210001.sql\\crm_20191112_210001.sql")
     defer f.Close()
     if err != nil {
     }
     buf := bufio.NewReader(f)
     nfs:=getTxtFile(TABLE_CAR)
     for {
      s, err := buf.ReadString('\n')
      if(err!=nil){
       logger.ERROR(err.Error())
       break
      }
      if err == nil {
       if s==""{
        continue
       }
       sqlstr:=getSqlStr(s,TABLE_CAR)
       if(sqlstr!=""){
        nfs.Write([]byte(sqlstr))
       }
      }
     }
     elapsed := time.Since(t1)
     fmt.Println("App elapsed: ", elapsed)
    }
    /**
    调整验证每一行数据的格式化,并与预设是否一致,如果一致则读取加载到
     */
    func getSqlStr(sqlstr,tableName string)string{
     var realTableName=strings.Replace(_INSERT_INTO,"${table}",tableName,-1)
     replaceEmptyStr:=strings.Replace(sqlstr," ","",-1)
     tempS:=strings.ToUpper(strings.Replace(replaceEmptyStr,"`","",-1))
     if(len(tempS)>=len(realTableName)) {
      tabName := tempS[0:len(realTableName)]
      if (tabName ==realTableName) {
       return sqlstr
      }
     }
     return ""
    }
    
    /**
    打开txt文件
     */
    func getTxtFile(fileName string)os.File{
     txtFile:=createToFile(fmt.Sprintf("%v/%v.txt",_Dir,fileName))
     nfs, err := os.OpenFile(txtFile.Name(), os.O_APPEND |os.O_RDWR|os.O_CREATE, 0644)
     if err != nil {
      logger.ERROR(fmt.Sprintf("打开文件失败:%v",err.Error()))
     }
     defer nfs.Close()
     nfs.Seek(0, io.SeekEnd)
     return *nfs
    }
    
    
    func readLine(r *bufio.Reader) (string, error) {
     line, isprefix, err := r.ReadLine()
     for isprefix  err == nil {
      var bs []byte
      bs, isprefix, err = r.ReadLine()
      line = append(line, bs...)
     }
     return string(line), err
    }
    
    func createToFile(fileName string)os.File{
     _, err := os.Stat(_Dir)
     if err == nil {
     }
     if os.IsNotExist(err) {
      os.MkdirAll(_Dir, os.ModePerm)
     }
     newFile, err := os.Create(fileName)
     if err != nil {
      logger.ERROR(fmt.Sprintf("文件创建失败:%v",err.Error()))
     }
     defer func() {
      newFile.Close()
     }()
     newFile.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM,防止中文乱码
     return *newFile
    }
    
    func main() {
     ReadSqlFile()
    }

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • golang文件读取-按指定BUFF大小读取方式
    • golang逐行读取文件的操作
    • Golang 实现分片读取http超大文件流和并发控制
    • 浅谈Golang是如何读取文件内容的(7种)
    • golang 使用 viper 读取自定义配置文件
    • golang读取文件的常用方法总结
    • Golang 实现超大文件读取的两种方法
    上一篇:Golang开发动态库的实现
    下一篇:golang切片内存应用技巧详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    如何利用Golang解析读取Mysql备份文件 如何,利用,Golang,解析,读取,