1. 程式人生 > >linux 使用python3 定時備份mysql資料庫指令碼 修改配置直接可用。親測!

linux 使用python3 定時備份mysql資料庫指令碼 修改配置直接可用。親測!

# Time : 2018/12/24 
# Author : [email protected]
#依賴包 pip install schedule
#注意事項
#1. linux中 使用os.system()包裹的命令有特殊字元如)(請使用轉義\)\(或'(' ')'
#2. 輸入的資料庫密碼 -p+密碼 無空格
import os
import time
import shutil
import schedule
import datetime
# 定義伺服器,使用者名稱、密碼、資料庫名稱(多個庫分行放置)和備份的路徑
DB_HOST = 'localhost'
DB_USER = 'dbuser'#root
DB_USER_PASSWD = 'dbpwd'#123456
#備份的資料庫的名字 把資料庫名字放在dbname.txt文字中,每個資料庫佔一行不加雙引號
DB_NAME = r'D:\webtest\untitled1\dbname.txt'
BACKUP_PATH = 'D:/import備份/test/'

class Run_backups:
def __init__(self):
self.DATETIME = time.strftime('%Y%m%d-%H%M%S')
self.TODAYBACKUPPATH = BACKUP_PATH + self.DATETIME
print("createing backup folder!")
#建立備份資料夾
if not os.path.exists(self.TODAYBACKUPPATH):
os.makedirs(self.TODAYBACKUPPATH)
print("checking for databases names file")
self.run()
#定義執行備份指令碼,讀取檔案中的資料庫名稱,注意按行讀寫,不校驗是否存在該庫
def run_backup(self):
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+" " +dbname+" > "+self.TODAYBACKUPPATH +"/"+dbname+".sql"
print(dumpcmd)
os.system(dumpcmd)
in_file.close()
#執行壓縮的函式
def run_tar(self):
compress_file = self.TODAYBACKUPPATH + ".tar.gz"
compress_cmd = "tar -czvf " +compress_file+" "+self.DATETIME
os.chdir(BACKUP_PATH)
os.system("pwd")
os.system(compress_cmd)
print("compress complete!")
#刪除備份資料夾
remove_cmd = "rm -rf "+self.TODAYBACKUPPATH
os.system(remove_cmd)
#備份資料庫檔案存在就執行備份和壓縮,否則退出
def run(self):
if os.path.exists(DB_NAME):
print("starting backup of all db listed in file "+DB_NAME)
self.run_backup()
self.run_tar()
print("backup success!")
else:
print("database file not found..")

def rmAssignDir(path,day=3):
dirs = os.listdir(path)
current_date=datetime.datetime.utcnow()+datetime.timedelta(hours=8)
for dir in dirs:
print (dir)
_date=dir.split('-')[0]
_date=datetime.datetime.strptime(_date,"%Y%m%d")+datetime.timedelta(days=day)
if _date<current_date:
filename,filetype=os.path.splitext(dir)
if not filetype:
shutil.rmtree(path+dir)
print('delete file success path==%s' % path + dir)
if filetype=='.zp':
os.remove(path+dir)
print('delete compressfile success path==%s'%path+dir)

def job(path,day,message='stuff'):
print("I'm working on:", message)
Run_backups()
rmAssignDir(path,day)
#定時任務
def runSchedule(job,path,day,message):
#schedule.every(1).minutes.do(job,path,day,message)
schedule.every(5).seconds.do(job,path,day,message)
#schedule.every(1).to(7).days.do(job,path,day,message)
#schedule.every().hour.do(job,path,day,message)
#schedule.every(1).to(5).seconds.do(job,path,day,message)
#schedule.every().day.at("16:27").do(job,path,day,message)

if __name__ == '__main__':

#備份資料庫路徑
#刪除所有小於該天數的資料備份
day=3
#列印資訊
message='執行定時任務'
runSchedule(job,BACKUP_PATH,day,message)
while True:
schedule.run_pending()
time.sleep(1)