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