首页 > 数据库 >golang linux/windows下根据日期自动备份,恢复mysql数据表

golang linux/windows下根据日期自动备份,恢复mysql数据表

时间:2023-01-04 23:24:32浏览次数:58  
标签:return err windows 备份 backupPath param 数据表 databaseName mysql

由于shell不熟,所以用golang进行自动化备份mysql

备份某个数据库下指定日期的表。

比如’tb_20221210' 这样的表名

  1 package main
  2 
  3 import (
  4     "fmt"
  5     "io/ioutil"
  6     "os"
  7     "os/exec"
  8     "time"
  9 )
 10 
 11 /**
 12  *
 13  * 备份MySql数据库
 14  * @param host:         数据库地址:
 15  * @param port:         端口:
 16  * @param user:         用户名:
 17  * @param password:     密码:
 18  * @param databaseName: 需要备份的数据库名:
 19  * @param tableName:    需要备份的表名:
 20  * @param sqlPath:      备份SQL存储路径:
 21  * @return backupPath   返回备份路径
 22  *
 23  */
 24 
 25 const (
 26     BackupPath = "/home/xda/ext/backup"
 27 )
 28 
 29 //备份
 30 func BackupMySqlDb(host, port, user, password, databaseName, tableName string) (error, string) {
 31     //获得一个当前的时间戳
 32 
 33     var backupPath string
 34     // 判断文件夹不存在时自动创建
 35     if !FileExists(BackupPath) {
 36         if err := os.MkdirAll(BackupPath, os.ModePerm); err != nil {
 37             return err, ""
 38         }
 39     }
 40     //设置备份文件的路径
 41     backupPath = BackupPath + tableName + ".sql"
 42     mysqldumpCmd := `mysqldump -h ` + host + ` -P ` + port + ` -u` + user + ` -p` + password + ` ` + databaseName + ` ` + tableName + ` >` + backupPath
 43     //--ignore-table=库名.表名 表示备份忽略该表
 44 
 45     if FileExists(backupPath) {
 46         return fmt.Errorf("已经存在"), backupPath
 47     }
 48     fmt.Println(mysqldumpCmd)
 49     if err := ExecutiveCommand(mysqldumpCmd); err != nil {
 50         return err, ""
 51     }
 52 
 53     return nil, backupPath
 54 }
 55 
 56 //恢复数据表
 57 func RecoverMySqlDb(host, port, user, password, databaseName, backupPath string) error {
 58     //恢复表 mysql -h[地址] -P[端口] -u[用户名] -p[密码] [数据库名] <[备份文件]
 59     mysqldumpCmd := `mysql -h` + host + ` -P` + port + ` -u` + user + ` -p` + password + ` ` + databaseName + ` <` + backupPath
 60     if err := ExecutiveCommand(mysqldumpCmd); err != nil {
 61         return err
 62     }
 63     return nil
 64 }
 65 
 66 func ExecutiveCommand(command string) error {
 67     //需要执行命令:command
 68     cmd := exec.Command("/bin/bash", "-c", command)
 69     // 获取管道输入
 70     output, err := cmd.StdoutPipe()
 71     if err != nil {
 72         return err
 73     }
 74     if err := cmd.Start(); err != nil {
 75         return err
 76     }
 77     _, err = ioutil.ReadAll(output)
 78     if err != nil {
 79         return err
 80     }
 81     if err := cmd.Wait(); err != nil {
 82         return err
 83     }
 84     return nil
 85 }
 86 
 87 //检查文件或文件夹是否存在
 88 func FileExists(path string) bool {
 89     _, err := os.Stat(path) //os.Stat获取文件信息
 90     if err != nil {
 91         return os.IsExist(err)
 92     }
 93     return true
 94 }
 95 
 96 func parseTime(s string) string {
 97     p, _ := time.Parse("20060102", s)
 98     next_date := p.AddDate(0, 0, 1)
 99     return next_date.Format("20060102")
100 }
101 
102 func GenDate() []string {
103     dateList := []string{}
104     startDate := "20220705"
105 
106     for i := 0; i < 10; i++ {
107         startDate = parseTime(startDate)
108         full_path := "_tick_" + startDate
109         dateList = append(dateList, full_path)
110     }
111     return dateList
112 }
113 
114 func main() {
115     host := ""
116     password := ""
117     user := "root"
118     port := ""
119     db := ""
120 
121     backup := true
122 
123     dateList := GenDate()
124     fmt.Println(dateList)
125     if backup == true {
126         for _, date := range dateList {
127 
128             err, _ := BackupMySqlDb(host, port, user, password, db, date)
129             if err != nil {
130                 fmt.Println(date + "backup failed!")
131             }
132         }
133     } else {
134         for _, date := range dateList {
135 
136             err := RecoverMySqlDb(host, port, user, password, db, path)
137             if err != nil {
138                 fmt.Println(date + "recovery failed!")
139             }
140         }
141     }
142 
143 }

 

标签:return,err,windows,备份,backupPath,param,数据表,databaseName,mysql
From: https://www.cnblogs.com/30daydo/p/17026289.html

相关文章

  • MySQL数据库更改密码
    当我们忘记本机MySQL登陆密码时1:首先打开MySQL的安装目录到bin(包含MySQL.exe和mysqld.exe的文件夹)   2:复制文件路径3:使用管理员打开cmd 4:输入mysqld--skip-......
  • mysql count(*) count(1)的区别
    COUNT(字段名)和COUNT(*)的查询结果有什么不同?COUNT(1)和COUNT(*)之间的效率哪个更高?你知道答案吗?很多人都认为COUNT(1)比COUNT(*)效率高,真的是这样吗?  1、认识COUN......
  • mysql 索引相关知识
    相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构。因为索引是MySQL中比较重点的知识,相信很多人都有一定的了解,尤其是在面试中出现的频率......
  • Windows历来发布版本及编译日期版本
    WindowsVersionNumbers-VersionandbuildnumbersofMicrosoftWindows(gaijin.at)快照防止链接挂了     ......
  • 使用Windows TTS API从文本生成语音
    本文更新于2022-04-05。创建.vbs脚本(文件名自定,笔者使用say.vbs),文件内容如下:setspvoice=CreateObject("SAPI.SpVoice")setspfilestream=CreateObject("SAPI.SpFil......
  • kafka-windows启动遇到的一个小问题
    在安装kafka后启动Windows下启动文件,出现输入行太长,语法错误的问题,原因在于,kafka所在目录结构太长,将目录缩短就行了  zookeeper启动脚本zookeeper-server-start......
  • ubuntu下安装mysql + qt编译mysql插件
    sudoapt-getinstallmysql-serverapt-getisntallmysql-clientsudoapt-getinstalllibmysqlclient-dev安装成功后可以看一下有没有进程在监听sudonetstat-tap......
  • mysql使用过程中遇到的问题
    1、问题描述今早mysql还用着,下午再用的时候,就说我密码错误登不上去了。但是我从来没有动过其他配置?2、解决办法这里我重装了mysql.如果你也没有重要数据的话可以这么干。如......
  • MySQL8.0默认加密连接方式
    Mysql8.0开始默认采用新的caching_sha2_password的身份验证方式,常规老接口会因此无法连接数据库。为继续使用老的身份验证方式,需显式指定身份验证方式为mysql_native_pas......
  • Windows如何后台运行bat文件
    1、模板Bat脚本里有隐藏窗口的命令,很简单,只需要在代码头部加一段代码就可以了。@echooffif"%1"=="h"gotobeginstartmshtavbscript:createobject("wscript.shell").r......