日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 數據庫 > MySQL > 正文

golang實現mysql數據庫備份的操作方法

2024-07-25 19:08:34
字體:
來源:轉載
供稿:網友

背景

navicat是mysql可視化工具中最棒的,但是,在處理視圖的導入導出方面,它是按照視圖名稱的字母順序來處理的,若視圖存在依賴,在導入過程中就會報錯。前面已經用python寫了一個,但在使用過程中,遇到xfffd編碼,python的pymysql會直接崩潰。發現golang沒有這個問題,正好用go重寫,來熟悉golang。

一些關鍵點

  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/goToolscd goToolsgo getgo run main.gogo 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實現mysql數據庫備份的操作方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
欧美久久久久久蜜桃| 91国内在线| 久久精品一级爱片| 国产黄色在线网站| 国产一区 二区 三区一级| 精品一区二区三区中文字幕在线| 亚洲a一级视频| 精品国产31久久久久久| 黄色欧美日韩| 亚洲理论中文字幕| 欧美不卡123| 99色在线视频| 中文字幕在线看精品乱码| 在线视频一区二区三区在线播放| 一区二区三区在线不卡| 亚洲黄色一区二区| 精品熟女一区二区三区| 1区2区在线| 亚洲一区在线视频观看| 中文字幕视频在线观看| 一区二区日韩av| 日韩精品视频中文字幕| 91色在线看| 中文字幕中文字幕精品| 在线精品日韩| 日本熟女一区二区| 亚洲va韩国va欧美va精品| aaa大片在线观看| 亚洲视频一二三四| 国产欧美日韩精品在线观看| 中文字幕在线视频第一页| 日韩美女中文字幕| 中文字幕视频一区二区三区久| 亚洲第一网中文字幕| 青青久在线视频免费观看| 精人妻一区二区三区| 视频一区二区国产| 日韩在线欧美| 国产日产一区二区三区| 亚洲一区中文字幕在线| 欧美日韩在线网站| 国产日韩精品在线观看| 91精品国产高清久久久久久| 欧美日韩不卡在线视频| 日韩a一区二区| 欧美国产日韩综合| 国产福利久久久| 亚洲 欧美综合在线网络| 欧美日韩国产不卡| 日本一级一片免费视频| 亚洲视频一二三四| h片精品在线观看| 欧美婷婷精品激情| 久久久另类综合| 免费看日韩精品| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 欧美日韩中文字幕一区| 免费在线视频一区二区| 精品视频123区在线观看| 欧美日韩视频免费播放| 在线国产99| 日韩欧美资源站| av一区在线观看| 日韩国产在线观看一区| 欧美熟妇乱码在线一区| 国产一二三视频| 日韩免费久久| 日韩中文在线视频| 99综合视频| 亚洲小说春色综合另类电影| 久久精品人妻一区二区三区| 日韩在线精品视频| 中文字幕日韩欧美在线| 精品在线91| 亚亚洲欧洲精品| 国产综合精品在线| 亚洲视频色图| 亚洲福利一区二区三区| 欧美日韩高清在线| 国产性一级片| 国产综合精品在线| 中文字幕线观看| 日韩在线视频网| 天天综合色天天| 亚洲免费看av| 久久久精品欧美| 黄色在线播放网站| 精品久久久精品| 天天综合色天天| 中文字幕视频一区二区三区久| 亚洲3区在线| 日韩欧美久久久| 中文字幕在线日韩| 精品一区二区三区中文字幕| 先锋男人资源站| 精品视频国产| 首页国产欧美久久| 九九视频精品免费| 国产小视频免费在线观看| 日韩欧美在线第一页| 久久99久久久久久久噜噜| 国产欧美中文字幕| 日韩.欧美.亚洲| 一本一道综合狠狠老| 日韩一级视频在线观看| 国产欧美日韩中文字幕| 日韩欧美在线精品| 91久久精品网| 中文字幕亚洲二区| 亚洲免费精品视频| 精品国产欧美日韩不卡在线观看| 日韩欧美在线1卡| 国产天堂素人系列在线视频| 欧美变态tickling挠脚心| 欧美另类久久久品| 最新中文在线视频| 欧美日韩亚洲91| 不卡视频一区二区| 中文字幕狠狠干| 中文字幕在线欧美| 中文在线不卡视频| 国产欧美久久久久久久久| 日韩在线视频中文字幕| 中文字幕国产亚洲| 国产午夜精品久久| 欧美亚洲天堂网| 亚洲欧美日本另类| 日本不卡免费高清视频| 亚洲欧洲在线观看av| 欧美 日韩 国产在线观看| 欧美日韩精品在线播放| www中文字幕在线观看| 婷婷综合福利| 国产高清在线观看| 中文字幕国产欧美| 一区二区中文字幕在线| 亚洲福利在线观看| 欧美人妻一区二区三区| 国产成人精品三级| 亚洲福利一区| 日韩在线精品视频| 亚洲欧洲日产国码av系列天堂| 中文字幕欧美亚洲| 欧美日韩亚洲国内综合网俺| 欧美在线亚洲一区| 色www精品视频在线观看| 精品在线99| 国产卡1卡2卡三卡在线| 国产欧美久久久久久久久| 久久精品久久精品亚洲人| 99在线国产| 国产99在线 | 亚洲| 91精品久久久久久久久| 91久久精品在线| 国产一级粉嫩xxxx| 亚洲国产欧美久久| 国产69精品久久app免费版| 国产一二三精品| 日韩精品资源二区在线| 在线视频国内一区二区| 欧美成人二区| 国产综合成人久久大片91| 一级特黄aaa大片在线观看| 国产绿帽一区二区三区| 日韩免费久久| 日韩在线视频精品| 中文在线视频| 天堂中文在线视频| 精品国产综合久久| 日韩字幕在线观看| av中文天堂在线| 国产欧美日韩亚州综合| 欧美日韩亚洲一区| 欧美日韩综合在线免费观看| 深夜福利一区| 国产日韩成人精品| 国产一卡2卡3卡4卡网站免费| 日韩1区在线| 亚洲欧美中文字幕| 久久精品久久精品国产大片| 欧美三级网址| 在线视频色在线| 久久久精品福利| 精品一二三四| 日韩欧美在线中文字幕| 日韩一级在线视频| 日韩欧美三级| va中文字幕| 欧美日韩人人澡狠狠躁视频| а√天堂中文在线资源8| www.久久久精品| 日韩亚洲国产欧美| 91精品国产自产| 99国内精品| a√免费观看在线网址www| 国产久卡久卡久卡久卡视频精品| 不卡视频一区二区三区| 欧美日韩国产高清视频| 日韩中文在线字幕| 精人妻一区二区三区| 亚洲黄页一区| 91精品久久久久久久久久入口| 欧美日韩在线精品成人综合网| 欧美 日韩 国产在线观看| 在线日韩中文| 亚洲午夜91| 日本亚洲视频在线| 国产欧美日韩在线视频| 九九视频精品免费| 中文天堂在线一区| 久久电影国产免费久久电影| 国产成人综合av| 91精品在线观| 在线看的av| 中文字幕精品在线视频| 中文字幕欧美日韩va免费视频| 91精品国产乱码久久蜜臀| 亚洲乱码中文字幕| 日韩视频精品| 国产v日产∨综合v精品视频| a级在线免费观看| 一区二区欧美国产| 精品一二三区| 欧美中文字幕视频| 久久久精品国产免费观看同学| 久久人人88| 欧美.日韩.国产.一区.二区| 欧美日韩成人一区二区| 一区三区视频| 久久 天天综合| 极品久久久久久| 国产婷婷在线观看| 国产一级久久久| 亚洲第一页中文字幕| 精品色蜜蜜精品视频在线观看| 中文字幕在线播放一区| 亚洲第一视频在线观看| 欧美日韩在线播放三区四区| 欧美日韩视频免费| 日本国产在线视频| 欧美一级在线免费| 五月天久久比比资源色| 欧美色视频一区二区三区在线观看| 天堂中文在线视频| 国产一级片播放| 亚洲黄色片在线观看| 欧美一级在线观看| 91亚洲国产| 91精品国产综合久久久久久漫画| 不卡在线一区二区| 国产视频一区三区| 国产三级免费观看| 精品一二三四区| 欧美在线日韩| 日韩精品三级| 久久精品久久精品亚洲人| 在线视频第一页| 亚洲一区精品电影| 日韩欧美在线第一页| 国产欧美日韩综合精品| 国产在线日韩精品| 亚洲福利一区| 日韩精品在线免费观看| av中文在线资源| 精品欧美日韩在线| 精品免费久久久| 99精品免费观看| 午夜国产欧美理论在线播放| 中文字幕国产视频| 欧美日韩在线播放三区四区| 一区二区三区在线|网站| 精品欧美日韩在线| 欧美日韩国产免费观看视频| 91精品综合久久| 午夜伦欧美伦电影理论片| 91最新在线| 欧美精品一区二区三区在线播放| 国产免费一级| 中文字幕久久av| 欧美日韩在线不卡| 国产极品嫩模在线视频一区| 中文精品在线观看| 日韩精品视频免费在线观看| 中文字幕国产欧美| 精品视频123区在线观看| 日韩欧美国产综合| 国产一区激情在线| 国产亚洲短视频| 中文字幕精品国产| 亚洲va韩国va欧美va精品| 中文 欧美 日韩| 日韩欧美高清在线| 精品国产31久久久久久| 日韩视频在线免费播放| 亚洲成av人片| 成人一区二区不卡免费| 日韩综合精品| 一级一片免费视频| 亚洲欧洲综合另类| 国产视频1区2区| 亚洲 欧美综合在线网络| 在线视频日韩欧美| 国产最顶级的黄色片在线免费观看| 日韩中文首页| 欧美一级久久| 欧美日韩亚洲一| 国产欧美中文在线| 国产91欧美| 欧美日韩成人一区| а√天堂8资源中文在线| 国产激情在线视频| a级在线免费观看| 一区视频在线播放| 亚洲热在线观看| 欧美一级免费在线观看| 国产黄色一区| 欧美亚洲视频在线看网址| 黄色在线资源| 国产欧美日韩精品综合| 日韩久久精品成人| 久久久久久久久99精品| 色综合久久88色综合天天免费| 亚洲天堂国产视频| 日韩视频不卡中文| 在线观看精品国产| 国产欧美日产一区| 视频一区二区不卡| 久久综合九色欧美综合狠狠| 日韩在线欧美| 日韩av在线中文字幕| 欧美日韩在线第一页| 精品在线一区二区| 亚洲第一精品在线| 中文字幕在线视频网| 国产成人精品999| 精品国产网站在线观看| 国产最新在线| 国产91久久久久蜜臀青青天草二 | 日韩欧美在线影院| 中文字幕欧美亚洲| 日韩精品a在线观看91| 国产中文在线视频| 欧美日韩亚洲国产综合| 亚洲欧美韩国综合色| 999精品在线| 欧美日韩中文字幕精品| 91精品国产91久久久久久青草| 日韩精品福利视频| 日韩精品 欧美| 99久热re在线精彩视频| 亚洲永久免费视频| 亚洲欧美日本国产专区一区| 国产v日产∨综合v精品视频| 国产123在线| 中文在线一区二区| 精品在线一区二区| 高清中文字幕在线| 欧美日韩免费精品| 亚洲综合在线电影| 日韩专区视频网站| 欧美日韩日本视频| 一区二区三区免费看视频| 日韩精品视频中文在线观看| 日韩免费视频| 亚洲va韩国va欧美va精品| 亚洲国产www| 欧美成人二区| 91精品国产综合久久精品| 一区二区日韩免费看| 在线看欧美日韩| 91精品国产入口| 91精品视频播放| 在线观看一区| 精品日韩在线| 国产网站av| 国产在线中文字幕| 中文字幕国产欧美| 精品日韩av| 精品日本视频| 国产欧美日韩不卡| 国产网站欧美日韩免费精品在线观看| 欧美日韩亚洲天堂| 久久久91精品国产| 1024国产在线| 亚洲免费播放| 亚洲视频 中文字幕| 日韩国产成人精品| 午夜黄色小视频| 国产视频1区2区| 丰满少妇一区| 欧美三级在线播放| 中文欧美字幕免费| 日本亚洲视频在线| www日韩欧美| 日韩欧美中文字幕在线观看| 欧美精品一区二区三区在线播放| √新版天堂资源在线资源| 91欧美在线视频| 亚洲一区视频在线观看视频| 国产色综合网|