国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

golang實現(xiàn)mysql數(shù)據(jù)庫備份的操作方法

2024-07-24 12:50:05
字體:
供稿:網(wǎng)友

背景

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

一些關(guān)鍵點

    map & json,在處理主鍵與外鍵信息時,需要用到j(luò)son數(shù)據(jù)結(jié)構(gòu)來存儲中間結(jié)果,因為要靈活處理,在golang中只能用map[string]interface{}來處理。 interface{} 相當(dāng)于java中的object,能接受任意數(shù)據(jù)類型,方便但在使用時要做到心中有數(shù),不然一旦數(shù)據(jù)類型不匹配,程序就會崩潰。 xfffd ,utf8中的占位符,超出范圍的utf8mb4入庫后,會被存儲為xfffd,數(shù)據(jù)導(dǎo)出時,需要過濾掉。 goroutine, golang的并發(fā)支持很獨(dú)特,我們的工具支持多個庫同時備份,很容易使用goroutine來實現(xiàn)并行。

    代碼解析

    按功能模塊對核心代碼進(jìn)行說明

    main.go,并發(fā)、命令行參數(shù)

    使用命令行參數(shù),接受一個參數(shù),來指定備份的內(nèi)容

    package common

    type OpFlag struct { Tables bool //表結(jié)構(gòu) Datum bool //表結(jié)構(gòu)和數(shù)據(jù) Views bool //視圖 Funcs bool //函數(shù)與存儲過程}

    main.go,程序入口,處理命令行參數(shù)  

    if len(os.Args) > 1 { flag = common.OpFlag{ Tables: false, Datum: false, Views: false, Funcs: false, } switch os.Args[1] { //接受一個參數(shù) case "table": flag.Tables = true //根據(jù)參數(shù)設(shè)定標(biāo)識量 case "data": flag.Tables = true flag.Datum = true case "views": flag.Views = true case "funcs": flag.Funcs = true default: //參數(shù)不正確,報錯退出 log.Fatal("You arg must be in : table, data, views or funcs.") } }else{ //無參數(shù),默認(rèn)導(dǎo)出所有 flag = common.OpFlag{ Tables: true, Datum: true, Views: true, Funcs: true, } } err := backUp.Export(flag) 根據(jù)參數(shù)進(jìn)行數(shù)據(jù)庫備份

    Export.go

    備份主流程,根據(jù)configs.json生成goroutine來備份數(shù)據(jù)庫,并等待完成。

    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{ //數(shù)據(jù)庫相應(yīng)配置 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) //創(chuàng)建協(xié)程 } } for key := range confs { //阻塞主進(jìn)程,待所有協(xié)程完成工作 if strings.HasPrefix(key, "db_") { fmt.Print( <- ch ) } } return nil
    發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 鹤岗市| 镶黄旗| 沙田区| 同江市| 桃源县| 开原市| 宁武县| 哈密市| 晴隆县| 东山县| 嘉义县| 准格尔旗| 华安县| 宜黄县| 巴塘县| 南华县| 华坪县| 华池县| 广汉市| 迁西县| 巩义市| 屏南县| 抚宁县| 阳江市| 安福县| 原平市| 河池市| 石楼县| 潍坊市| 达州市| 吴旗县| 轮台县| 莎车县| 富蕴县| 丰原市| 安顺市| 河南省| 调兵山市| 景东| 巩义市| 雷州市|