目的
在我们后端写项目时,数据一般都是保存在MySQL数据库里。但是有时我们不能只是简单的把数据保存在MySQL数据库里(删库跑路)。在这里我们就要经常备份一下我们的数据库或者是数据库里面的某一个表。
Navicat
在这里我们使用的是MySQL可视化工具里最棒的navicat,所以先安装:Navicat下载
连接
先点击左上角的连接,然后连接名是自己随便取的,主机名填想要连接数据库的IP,自己用一般默认为localhost,用户名和密码填自己MySQL的用户名和密码。
Go代码实现
导入包
import (
"io/ioutil"
"log"
"os/exec"
"time"
)
在这里我们要使用一个平常很少使用的包os/exex, exec包执行外部命令,详情可以去参考Go语言标准文档。
全代码
package main
import (
"io/ioutil"
"log"
"os/exec"
"time"
)
func main() {
BackupMySqlDb("localhost", "3306", "root", "123456", "school", "", "E:/")
}
/**
*
* 备份MySql数据库
* @param host: 数据库地址: localhost
* @param port: 端口: 3306
* @param user: 用户名: root
* @param password: 密码: root
* @param databaseName: 需要被分的数据库名: test
* @param tableName: 需要备份的表名: user
* @param sqlPath: 备份SQL存储路径: D:/backup/test/
* @return backupPath
*
*/
func BackupMySqlDb(host, port, user, password, databaseName, tableName, sqlPath string) (error,string) {
//定义Cmd结构体对象指针
var cmd *exec.Cmd
//在这里如果没有传输表名,那么将会备份整个数据库,否则将只备份自己传入的表
if tableName == "" {
cmd = exec.Command("mysqldump", "--opt", "-h"+host, "-P"+port, "-u"+user, "-p"+password, databaseName)
} else {
cmd = exec.Command("mysqldump", "--opt", "-h"+host, "-P"+port, "-u"+user, "-p"+password, databaseName, tableName)
}
//StdinPipe方法返回一个在命令Start后与命令标准输入关联的管道。
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Println(err)
return err,""
}
if err := cmd.Start(); err != nil {
log.Println(err)
return err,""
}
bytes, err := ioutil.ReadAll(stdout)
if err != nil {
log.Println(err)
return err,""
}
//获得一个当前的时间戳
now := time.Now().Format("20060102150405")
var backupPath string
//设置我们备份文件的名字
if tableName == "" {
backupPath = sqlPath+databaseName+"_"+now+".sql"
} else {
backupPath = sqlPath+databaseName+"_"+tableName+"_"+now+".sql"
}
//写入文件并设置文件权限
err = ioutil.WriteFile(backupPath, bytes, 0644)
if err != nil {
log.Println(err)
return err,""
}
return nil,backupPath
}
示例
上述代码以school数据库为例,由于表名为空所以在这里是备份一整个数据库,运行程序即可
然后会在我们设置的路径下找到我们代码生成的sql文件
运行sql文件
右键点击我们的数据库或者表里面有个运行SQL文件,然后选中自己生成的SQL文件即可,但是导入SQL文件会把相同表名的表数据替换,所以导入时一般选择一个额外的数据库显示。