# Author:xmh

import os,time,datetime
import subprocess

# defin server、user、password and database name and backup path
DB_HOST = 'localhost'
DB_USER = 'root'
DB_USER_PASSWD = '123456'
DB_NAME = '/data/db_backup/dbnames.txt'  # 存放数据库名
IP=subprocess.getoutput("ifconfig eth1 |awk 'NR==2{print $2}'")
IP_ADDR=IP+"/"
BACKUP_PATH = '/backup/mysql/'  # 数据库备份路径
MYSQLDUMP_OPT='--hex-blob --complete-insert=false --extended-insert=false --quick --skip-comments --compress --default-character-set=utf8 --set-gtid-purged=OFF --single-transaction'
DAYTIME =  time.strftime('%Y-%m-%d')  # 目录时间

# defin rsync --> server、user、mode、password
RSYNC_SERVER = '172.16.1.41'
RSYNC_USER = "rsync_backup"
RSYNC_MODE = "backup"
RSYNC_PASSWORD = "/etc/rsync.pass"

DIR_PATH = BACKUP_PATH + IP_ADDR + DAYTIME

"""
----------- mysqldump备份参数 -----------
--hex-blob  #使用十六进制法来转存二进制列
--complete-insert  #是否使用包含列名的insert语句
--extended-insert  #是否是否多行的insert语句
--quick            #每次从服务器中逐行检索表的行
--skip-comments    #不向dump file添加注释
--compress         #压缩客户端和服务端之间发送的所有信息
--default-character-set=utf8  #指定默认字符集
--set-gtid-purged=OFF         #是否添加set语句
--single-transaction    #备份的时候对数据进行快照,然后在对快照进行备份,不会影响到数据库业务
--------------------------------------------
"""

print('createting backup dir')

# 创建以本机IP地址和当天时间命名的备份文件夹(/backup/mysql/10.0.0.200/2019-03-25/)
if  not os.path.exists(DIR_PATH):
    os.makedirs(DIR_PATH)

print('checking for database names file')

# 获取数据库名
os.chdir('/data/db_backup/')
if os.path.exists(DB_NAME):  # 如果存在dbnames.txt文件先将其删除
    os.remove('dbnames.txt')
    os.system('mysql -u%s -p%s -e "show databases;"|sed 1d |grep -v "_schema" >%s' %(DB_USER,DB_USER_PASSWD,DB_NAME))

# 定义执行备份脚本,读取文件中的数据库名称,并按行读写,将每行数据库判断是否已备份,如果已备份则不需要再次备份
def run_backup():
    in_file = open(DB_NAME,"r")
    for dbname in in_file.readlines():
        dbname = dbname.strip()
        print('now starting backup database %s' %dbname)
        dumpcmd = 'mysqldump -u' + DB_USER + ' -p' + DB_USER_PASSWD +' ' + MYSQLDUMP_OPT +' '  +dbname + ' |gzip' + ' >' + DIR_PATH + '/' + dbname + '_' +DAYTIME +'.sql' +'.gzip'
        os.system(dumpcmd)
    in_file.close()

# 定义rsync脚本,将备份文件推送到rsync服务端
def rsync_backup():
    rsync_cmd = "rsync -avz %s %s@%s::%s --password-file=%s"  %(BACKUP_PATH,RSYNC_USER,RSYNC_SERVER,RSYNC_MODE,RSYNC_PASSWORD)
    os.system(rsync_cmd)

# 运行函数
run_backup()
rsync_backup()