13 changed files with 280 additions and 0 deletions
@ -0,0 +1,3 @@ |
|||||
|
# go 工具集合 |
||||
|
|
||||
|
mysqlbk_v1 mysql备份工具v1 版本 |
||||
@ -0,0 +1,5 @@ |
|||||
|
color D7 |
||||
|
set GOOS=linux |
||||
|
set GOARCH=amd64 |
||||
|
set CGO_ENABLED=0 |
||||
|
go build -o mtool main.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 |
||||
|
} |
||||
@ -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 |
||||
@ -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= |
||||
@ -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 |
||||
@ -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
|
||||
|
} |
||||
|
|
||||
|
} |
||||
Binary file not shown.
@ -0,0 +1,7 @@ |
|||||
|
# 使用说明 |
||||
|
|
||||
|
1、三个文件上传 到指定目录 |
||||
|
2、对dbbk.sh、mtool 赋予 执行权限 744 即可 |
||||
|
3、修改mail.conf的信息 |
||||
|
4、修改dbbk.sh的数据库链接信息 |
||||
|
5、在dbbk.sh 的末尾留意,mtool的位置。默认放在/www下 |
||||
@ -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 |
||||
@ -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 |
||||
Binary file not shown.
@ -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…
Reference in new issue