|
|
|
# coding: utf-8
|
|
|
|
#-----------------------------
|
|
|
|
# 网站备份工具
|
|
|
|
#-----------------------------
|
|
|
|
|
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
import re
|
|
|
|
|
|
|
|
if sys.platform != 'darwin':
|
|
|
|
os.chdir('/www/server/mdserver-web')
|
|
|
|
|
|
|
|
|
|
|
|
chdir = os.getcwd()
|
|
|
|
sys.path.append(chdir + '/class/core')
|
|
|
|
|
|
|
|
# reload(sys)
|
|
|
|
# sys.setdefaultencoding('utf-8')
|
|
|
|
|
|
|
|
import mw
|
|
|
|
import db
|
|
|
|
import time
|
|
|
|
|
|
|
|
class backupTools:
|
|
|
|
|
|
|
|
def getDbBackupList(self,dbname=''):
|
|
|
|
bkDir = mw.getRootDir() + '/backup/database'
|
|
|
|
blist = os.listdir(bkDir)
|
|
|
|
r = []
|
|
|
|
|
|
|
|
bname = 'mongodb_' + dbname
|
|
|
|
blen = len(bname)
|
|
|
|
for x in blist:
|
|
|
|
fbstr = x[0:blen]
|
|
|
|
if fbstr == bname:
|
|
|
|
r.append(x)
|
|
|
|
return r
|
|
|
|
|
|
|
|
def backupDatabase(self, name, count):
|
|
|
|
db_path = mw.getServerDir() + '/mongodb'
|
|
|
|
db_name = 'mongodb'
|
|
|
|
name = mw.M('databases').dbPos(db_path, db_name).where('name=?', (name,)).getField('name')
|
|
|
|
|
|
|
|
startTime = time.time()
|
|
|
|
if not name:
|
|
|
|
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
|
|
|
|
log = "数据库[" + name + "]不存在!"
|
|
|
|
print("★[" + endDate + "] " + log)
|
|
|
|
print(
|
|
|
|
"----------------------------------------------------------------------------")
|
|
|
|
return
|
|
|
|
|
|
|
|
backup_path = mw.getBackupDir() + '/database'
|
|
|
|
if not os.path.exists(backup_path):
|
|
|
|
mw.execShell("mkdir -p " + backup_path)
|
|
|
|
|
|
|
|
time_now = time.strftime('%Y%m%d_%H%M%S', time.localtime())
|
|
|
|
backup_name = "mongodb_" + name + "_" + time_now + ".tar.gz"
|
|
|
|
filename = backup_path + "/"+backup_name
|
|
|
|
|
|
|
|
|
|
|
|
cmd = db_path + "/bin/mongodump --port 27017 -d test -o "+backup_path
|
|
|
|
mw.execShell(cmd)
|
|
|
|
cmd_gz = "cd "+backup_path+"/"+name+" && tar -zcvf "+filename + " ./"
|
|
|
|
mw.execShell(cmd_gz)
|
|
|
|
mw.execShell("rm -rf "+ backup_path+"/"+name)
|
|
|
|
|
|
|
|
if not os.path.exists(filename):
|
|
|
|
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
|
|
|
|
log = "数据库[" + name + "]备份失败!"
|
|
|
|
print("★[" + endDate + "] " + log)
|
|
|
|
print("----------------------------------------------------------------------------")
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
endDate = time.strftime('%Y/%m/%d %X', time.localtime())
|
|
|
|
outTime = time.time() - startTime
|
|
|
|
|
|
|
|
# print(outTime)
|
|
|
|
log = "数据库MongoDB[" + name + "]备份成功,用时[" + str(round(outTime, 2)) + "]秒"
|
|
|
|
mw.writeLog('计划任务', log)
|
|
|
|
print("★[" + endDate + "] " + log)
|
|
|
|
print("|---保留最新的[" + count + "]份备份")
|
|
|
|
print("|---文件名:" + filename)
|
|
|
|
|
|
|
|
backups = self.getDbBackupList(name)
|
|
|
|
|
|
|
|
# 清理多余备份
|
|
|
|
num = len(backups) - int(count)
|
|
|
|
if num > 0:
|
|
|
|
for backup in backups:
|
|
|
|
mw.execShell("rm -f " + backup_path + "/"+backup)
|
|
|
|
num -= 1
|
|
|
|
print("|---已清理过期备份文件:" + backup)
|
|
|
|
if num < 1:
|
|
|
|
break
|
|
|
|
|
|
|
|
def backupDatabaseAll(self, save):
|
|
|
|
db_path = mw.getServerDir() + '/mongodb'
|
|
|
|
db_name = 'mongodb'
|
|
|
|
databases = mw.M('databases').dbPos(
|
|
|
|
db_path, db_name).field('name').select()
|
|
|
|
for db in databases:
|
|
|
|
self.backupDatabase(db['name'], save)
|
|
|
|
|
|
|
|
def findPathName(self, path, filename):
|
|
|
|
f = os.scandir(path)
|
|
|
|
l = []
|
|
|
|
for ff in f:
|
|
|
|
if ff.name.find(filename) > -1:
|
|
|
|
l.append(ff.name)
|
|
|
|
return l
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
backup = backupTools()
|
|
|
|
stype = sys.argv[1]
|
|
|
|
if stype == 'all':
|
|
|
|
backup.backupDatabaseAll(sys.argv[2])
|
|
|
|
if stype == 'db':
|
|
|
|
backup.backupDatabase(sys.argv[2], sys.argv[3])
|