发布于2026-06-30 阅读(0)
扫一扫,手机访问
在实际开发中,数据库表的备份算是一个常见需求,今天我们不妨来看看几种常规的数据库备份方式。

第一种方式:直接登录 MySQL 数据库,通过 SQL 命令把查询结果导出为文件。
SELECT * FROM account_auth INTO OUTFILE 'yourpath' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'n'
这条命令执行后,会把 account_auth 表的所有数据导出成一个 CSV 文件,字段之间用逗号分隔,字段值用双引号包裹。使用起来很方便。
第二种方式:使用 mysqldump 命令直接备份指定的表。
mysqldump -h host -Pyourport -u yourdatabase -p'youpassword' --fields-terminated-by=',' --fields-enclosed-by='"' --fields-escaped-by='\' --tab=/yourpath database table;
这里的思路其实和前一种类似,只不过把导出的控制权交给了 mysqldump。需要留意的是,以上两种方式都要求登录数据库的账号具备数据导出权限,否则操作会失败。这一点在实际使用中很容易被忽略,值得提前确认。
还是说回程序员的日常——如果需要在 Go 代码中完成数据库表的导出,又该怎么做?下面这个实现或许能给你一些启发。
package database
import (
"fmt"
"os"
"strings"
)
//var log = logger.GetLogger()
func Backup(sql string, backupFile string) {
log.WithField("sql", sql).WithField("backupFilename", backupFile).Info("begin to backup sql")
if !strings.Contains(sql, "limit") {
if strings.Contains(sql, ";") {
strings.Replace(sql, ";", " ", -1)
}
sql = fmt.Sprintf("%s %s", sql, "limit 10;")
}
sqlDB, err := GetDB().DB()
defer func() {
err = CloseDB()
if err != nil {
log.Fatalf("close database failed %s", dsn)
}
}()
if err != nil {
log.Fatalf("get sql db failed")
}
rows, err := sqlDB.Query(sql)
if err != nil {
log.Fatalf("query database failed", err)
}
defer rows.Close()
columns, _ := rows.Columns()
//values用于存储数据库的查询结果
values := make([]interface{}, len(columns))
//valuePtrs用于存储scan指针
valuePtrs := make([]interface{}, len(columns))
for i := range columns {
valuePtrs[i] = &values[i]
}
var content string
for rows.Next() {
//columns, _ := rows.Columns()
err := rows.Scan(valuePtrs...)
if err != nil {
log.Fatalf("get data from rows failed ", err)
}
rowData := make([]string, len(columns))
for i, val := range values {
if val == nil {
rowData[i] = "NULL"
} else {
//将查询结果转成string,否则输出为asicc码
rowData[i] = fmt.Sprintf("%s", val)
}
}
result := strings.Join(rowData, ",")
result += "n"
log.Info("the row result: %s", result)
content += result
}
err = os.WriteFile(backupFile, []byte(content), 0644)
if err != nil {
log.Fatalf("backup file failed ", backupFile)
}
}
这段代码的核心逻辑并不复杂:先执行指定的 SQL 查询,然后逐行读取结果,把每一行拼接成逗号分隔的字符串,最后写入目标文件。有几个关键点值得注意。
第一,如果 SQL 语句中没有显式加上 limit 子句,代码会自动追加一个 limit 10,防止一次性导出海量数据导致内存溢出。这个设计在实际批量导出场景中非常实用。
第二,rows.Columns() 获取的是查询结果的所有列名,而 Scan 时需要传入与列数一致的指针切片,代码中用 valuePtrs 这个中介切片来处理。读取出来的 values 是 interface{} 类型,如何转换为可读的字符串?代码中直接用 fmt.Sprintf("%s", val) 做了转换——这个方法看似简单,但在处理数值或日期类型时可能还需要根据实际情况做更精细的处理。
第三,结果拼接完成后,通过 os.WriteFile 写入本地文件,权限设为 0644。整体流程清晰明了:查询 → 读取 → 拼接 → 落盘。可以说是一套非常典型的 Go 数据库导出模板了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8