Browse Source

mysql 数据库备份,可以排查某些表

master
453530270@qq.com 1 year ago
parent
commit
00cf9f7c62
  1. 3
      README.md
  2. 5
      mysqlbk_v1/build.bat
  3. 32
      mysqlbk_v1/conf/conf.go
  4. 7
      mysqlbk_v1/go.mod
  5. 4
      mysqlbk_v1/go.sum
  6. 9
      mysqlbk_v1/mail.conf
  7. 69
      mysqlbk_v1/main.go
  8. BIN
      mysqlbk_v1/mtool
  9. 7
      mysqlbk_v1/release/README.md
  10. 103
      mysqlbk_v1/release/dbbk.sh
  11. 9
      mysqlbk_v1/release/mail.conf
  12. BIN
      mysqlbk_v1/release/mtool
  13. 32
      mysqlbk_v1/util/fsutil.go

3
README.md

@ -0,0 +1,3 @@
# go 工具集合
mysqlbk_v1 mysql备份工具v1 版本

5
mysqlbk_v1/build.bat

@ -0,0 +1,5 @@
color D7
set GOOS=linux
set GOARCH=amd64
set CGO_ENABLED=0
go build -o mtool main.go

32
mysqlbk_v1/conf/conf.go

@ -0,0 +1,32 @@
package conf
import (
"os"
"strings"
)
// 配置文件
// InitConfig : read configFile to return map config and error info
func InitConfig(configPath string) (config map[string]string, err error) {
config = make(map[string]string)
data, err := os.ReadFile(configPath)
if err != nil {
return config, err
}
lines := strings.Split(string(data), "\n")
for _, line := range lines {
// spik empty line , remark line and the line without =
if strings.TrimSpace(line) == "" || strings.HasPrefix(line, "#") || (strings.Contains(line, "=") == false) {
continue
}
// wipe out remark content
line = strings.Split(line, "#")[0]
// get key and value
item := strings.Split(line, "=")
if strings.TrimSpace(item[0]) == "" {
continue
}
config[strings.TrimSpace(item[0])] = strings.TrimSpace(item[1])
}
return config, nil
}

7
mysqlbk_v1/go.mod

@ -0,0 +1,7 @@
module mtool
go 1.22.1
require gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
require gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect

4
mysqlbk_v1/go.sum

@ -0,0 +1,4 @@
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=

9
mysqlbk_v1/mail.conf

@ -0,0 +1,9 @@
fromEmail = noreple@moabcoin.com #发送邮件的邮箱
fromName = Moabcon Db # 发送人名称
password = M%097361787474uc #邮箱密码
SMTP_host = smtp.office365.com #smtp服务器
SMTP_port = 587
toEmail = kkmkao@hotmial.com #如果有多个邮箱以,为分隔符
saveLastIP = true #是否记录最后的IP到文件
savePublicIP = true #是否记录每次获取到的IP
interval = 1m #合法的单位有"s"、"m"、"h" ,默认是1m

69
mysqlbk_v1/main.go

@ -0,0 +1,69 @@
package main
//原始代码 https://www.jianshu.com/p/0fc63a13c82e
import (
"fmt"
"log"
"mtool/conf"
"mtool/util"
"os"
"strconv"
"time"
"gopkg.in/gomail.v2"
)
// 邮件正文
// rfile 邮件附件名称
func mailbody(rfile string) string {
ctime := time.Now().Format("2006-01-02 15:04:05")
body := fmt.Sprintf("At %s,send to you! And the file's HASH:%s", ctime, util.CalacHash(rfile))
return body
}
func main() {
// 从上下文中读取发送的文件
args := os.Args
if args == nil || len(args) < 2 {
fmt.Printf("Usage: ./mtool -c demo.tar.gz -f /www/mail.conf \n")
os.Exit(1)
}
//操作配置文件
if args[3] == "-c" {
confpath := args[4]
config, err := conf.InitConfig(confpath)
if err != nil {
fmt.Printf("read config file faild.%s\n", err)
}
//邮件的附件
if args[1] == "-f" {
// 待发送的文件
arfile := os.Args[2]
// 发送文件
bdstr := mailbody(arfile)
port, _ := strconv.Atoi(config["SMTP_port"])
subject := fmt.Sprintf("%smysql databakup(without PLANTS'COIN)", time.Now().Format("20060102150405"))
m := gomail.NewMessage()
m.SetHeader("From", m.FormatAddress(config["fromEmail"], config["fromName"])) // 添加别名
m.SetAddressHeader("Cc", config["fromEmail"], config["fromName"]) //抄送自己一份
m.SetHeader("To", config["toEmail"]) // 发送给用户(可以多个)
m.SetHeader("Subject", subject) // 设置邮件主题
m.SetBody("text/html", bdstr) // 设置邮件正文
m.Attach(arfile) //邮件的attache
// 发送邮件
d := gomail.NewDialer(config["SMTP_host"], port, config["fromEmail"], config["password"]) // 设置邮件正文
err := d.DialAndSend(m)
if err != nil {
log.Print(err)
fmt.Printf("send mail failed! %s\n", err)
return
}
fmt.Printf("send successfully!\n")
} else {
os.Exit(1)
}
// end
}
}

BIN
mysqlbk_v1/mtool

Binary file not shown.

7
mysqlbk_v1/release/README.md

@ -0,0 +1,7 @@
# 使用说明
1、三个文件上传 到指定目录
2、对dbbk.sh、mtool 赋予 执行权限 744 即可
3、修改mail.conf的信息
4、修改dbbk.sh的数据库链接信息
5、在dbbk.sh 的末尾留意,mtool的位置。默认放在/www下

103
mysqlbk_v1/release/dbbk.sh

@ -0,0 +1,103 @@
#!/bin/bash
#Script:automysqlbackup.sh
#Version:Beta 1.0
#author:www.weibo.com/100306117
#date:2013-06-15
#以下配置信息请自己修改
mysql_user="root" #MySQL备份用户
mysql_password="" #MySQL备份用户的密码
mysql_host="localhost" #要备份的主机,一般为localhost
mysql_port="3306" #MySQL端口号,一般为3306
backup_db_arr=("db1" "db2") #要备份的数据库名称,多个用空格分开隔开 如("db1" "db2" "db3")
backup_location=/www/embk #备份数据存放位置,末尾请不要带"/",此项可以保持默认,程序会自动创建文件夹
expire_backup_delete="ON" #是否开启过期备份删除 ON为开启 OFF为关闭
expire_days=3 #过期时间天数 默认为三天,此项只有在expire_backup_delete开启时有效
#以下配置请保持默认不要修改
backup_time=`date +%Y%m%d%H%M` #定义备份详细时间
backup_cache_dir=$backup_location/cache #备份缓存文件夹全路径
backup_data_dir=$backup_location/data #备份文件夹全路径
backup_data_filename=$backup_data_dir/$backup_time.sql.tar.gz #备份文件的名称 包括路径
backup_log_dir=$backup_location/log #备份日志文件夹全路径
backup_log_mailcontent=$backup_log_dir/mailcontent.log #邮件内容缓存文件全路径
welcome_msg="Welcome to use auto MySQL backup tools!" #欢迎语
#写入欢迎信息
`mkdir -p $backup_log_dir`
`echo $welcome_msg > $backup_log_mailcontent`
#判断MYSQL是否启动,mysql没有启动则备份退出
mysql_ps=`ps -ef | grep mysql | wc -l`
mysql_listen=`netstat -an | grep LISTEN | grep $mysql_port | wc -l`
if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then
`echo "ERROR:MySQL is not running! backup stop!" >> $backup_log_mailcontent`
`mutt $adminmail -s "$subject_msg_error" < $backup_log_mailcontent`
exit
fi
#连接到mysql数据库,无法连接则备份退出
# mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password <<end
# use mysql;
# select host,user from user where user='root' and host='localhost';
# exit
# end
flag=`echo $?`
if [ $flag != "0" ]; then
`echo "ERROR:Can't connect mysql server! backup stop!" >> $backup_log_mailcontent`
`mutt $adminmail -s "$subject_msg_error" < $backup_log_mailcontent`
exit
else
#判断有没有定义备份的数据库,如果定义则开始备份,否则退出备份
if [ "$backup_db_arr" != "" ];then
#dbnames=$(cut -d ',' -f1-5 $backup_database)
#echo "arr is (${backup_db_arr[@]})"
for dbname in ${backup_db_arr[@]}
do
`mkdir -p $backup_cache_dir`
# 排除库中的平台币
prefix="data_"
dbtalbes=$(mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -D $dbname -e "SHOW TABLES LIKE '$prefix%';" | tail -n +2)
for dt in $dbtalbes; do
ignoretbs+=("--ignore-table=$dbname.$dt")
done
# 排除平台币的操作
`mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname ${ignoretbs[@]} "--ignore-table=$dbname.failed_jobs" > $backup_cache_dir/$dbname$backup_time.sql`
# 原来的操作
#`mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname > $backup_cache_dir/$dbname$backup_time.sql`
flag=`echo $?`
if [ $flag != "0" ];then
`echo "database $dbname backup fail!" >> $backup_log_mailcontent`
fi
done
else
`echo "ERROR:No database to backup! backup stop" >> $backup_log_mailcontent`
# `mutt $adminmail -s "$subject_msg_error" < $backup_log_mailcontent`
exit
fi
#如果开启了删除过期备份,则进行删除操作
backup_data_num=`ls $backup_data_dir | wc -l`
if [ "$expire_backup_delete" == "ON" -a $backup_data_num!=0 ];then
`find $backup_data_dir -type f -ctime +$expire_days -exec rm -rf {} \;`
fi
#缓存备份目录打包放到数据备份目录 删除缓存备份目录
backup_cache_num=`ls $backup_cache_dir | wc -l`
if [ $backup_cache_num!=0 ];then
`mkdir -p $backup_data_dir`
`tar zcPf $backup_data_filename $backup_cache_dir/`
`rm -rf $backup_cache_dir`
else
`echo "All database backup fail!" >> $backup_log_mailcontent`
# `mutt $adminmail -s "$subject_msg_error" < $backup_log_mailcontent`
exit
fi
`echo "All database backup success! Thank you!" >> $backup_log_mailcontent`
/www/mtool -f $backup_data_filename -c /www/mail.conf
exit
fi

9
mysqlbk_v1/release/mail.conf

@ -0,0 +1,9 @@
fromEmail = noreple@moabcoin.com #发送邮件的邮箱
fromName = Moabcon Db # 发送人名称
password = M%097361787474uc #邮箱密码
SMTP_host = smtp.office365.com #smtp服务器
SMTP_port = 587
toEmail = huanmou2023@outlook.com #如果有多个邮箱以,为分隔符
saveLastIP = true #是否记录最后的IP到文件
savePublicIP = true #是否记录每次获取到的IP
interval = 1m #合法的单位有"s"、"m"、"h" ,默认是1m

BIN
mysqlbk_v1/release/mtool

Binary file not shown.

32
mysqlbk_v1/util/fsutil.go

@ -0,0 +1,32 @@
package util
import (
"crypto/sha256"
"fmt"
"io"
"os"
)
// 计算文件的hash
func CalacHash(rfile string) string {
// 获取到真实地址
//
file, err := os.Open(rfile)
if err != nil {
panic(err)
}
defer file.Close()
// initlize hash object
hash := sha256.New()
// write file into hash object
if _, err := io.Copy(hash, file); err != nil {
panic(err)
}
// get hash value
hashBytes := hash.Sum(nil)
//converto to hash string
hastString := fmt.Sprintf("%x", hashBytes)
return hastString
}
Loading…
Cancel
Save