python進行mysql的資料庫備份
阿新 • • 發佈:2019-01-26
python進行mysql的資料備份
主要想法是利用mysqldump的方式將mysql的庫或表備份成sql之後,利用ftp的方式轉存到啟發伺服器上,實現一個簡單的備份的功能。程式碼比較簡單,主要核心程式碼如下。
db_back.py
# -*- coding:utf-8 -*-
import ConfigParser
import os
import sched
import time
from ftplib import FTP
real_path = os.path.abspath(os.path.dirname(__file__))
def get_path_config() :
pro_dict = Properties(real_path + '/db.ini').get_properties()
conf_info = ConfigInfo
conf_info.sql_back_path = pro_dict['config']['sql_back_home']
conf_info.dump_path = pro_dict['config']['mysql_home']
return conf_info
class ConfigInfo(object):
""" config path reader """
def __init__(self, dump_path, sql_back_path):
self.dump_path = dump_path
self.sql_back_path = sql_back_path
class FileBack(object):
""" ftp operator """
def __init__(self, ip, port, username, password):
self.ip = ip
self.port = port
self.username = username
self.password = password
def _connector(self):
ftp = FTP()
ftp.set_debuglevel(2)
ftp.connect(self.ip, int(self.port))
ftp.login(self.username, self.password)
return ftp
def list_files(self):
ftp = self._connector()
print(ftp.dir())
def upload_file(self, local_file, target, filename):
ftp = self._connector()
try:
ftp.cwd(target)
except Exception as e:
ftp.mkd(target)
ftp.cwd(target)
buf_size = 1024
fp = open(local_file, 'rb')
ftp.storbinary('STOR %s' % os.path.basename(filename), fp, buf_size) # 上傳檔案
ftp.set_debuglevel(0)
fp.close() # 關閉檔案
ftp.quit()
def get_db_info():
dict_pro = Properties(real_path + '/db.ini').get_properties()
db_info = DBInfo
db_info.ip = dict_pro['db']['ip']
db_info.port = dict_pro['db']['port']
db_info.database = dict_pro['db']['database']
db_info.username = dict_pro['db']['username']
db_info.password = dict_pro['db']['password']
return db_info
class DBInfo(object):
""" database connection info """
def __init__(self, ip, port, database, username, password):
self.ip = ip
self.port = port
self.database = database
self.username = username
self.password = password
class Properties(object):
""" properties reader """
def __init__(self, path):
self.path = path
self.properties = {}
def get_properties(self):
try:
config = ConfigParser.ConfigParser()
config.read(self.path)
db = {'ip': config.get('db','ip'), 'port': config.get('db','port'), 'database': config.get('db','database'),
'username': config.get('db','username'), 'password': config.get('db','password')}
self.properties['db'] = db
config_info = {'mysql_home': config.get('config','mysql_home'),
'sql_back_home': config.get('config','sql_back_home')}
self.properties['config'] = config_info
ftp_info = {'ip': config.get('ftp','ip'), 'port': config.get('ftp','port'), 'username': config.get('ftp','username'),
'password': config.get('ftp','password')}
self.properties['ftp'] = ftp_info
except Exception, e:
raise e
return self.properties
def main():
db_info = get_db_info()
config_info = get_path_config()
time_path = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
if not os.path.isdir(config_info.sql_back_path):
os.mkdir(config_info.sql_back_path)
dump_cmd = config_info.dump_path + "mysqldump -u" + db_info.username + " -p" + db_info.password + " " + db_info.database + " > " + \
config_info.sql_back_path + "/" + db_info.database + '-' + time_path + ".sql"
os.system(dump_cmd)
scheduler = sched.scheduler(time.time, time.sleep)
scheduler.enter(2, 1, ftp_upload,(config_info, time_path, db_info,))
scheduler.run()
def ftp_upload(config_info, time_path, db_info):
ftp_info = Properties(real_path + '/db.ini').get_properties()['ftp']
file_back = FileBack(ftp_info['ip'], ftp_info['port'], ftp_info['username'], ftp_info['password'])
file_back.upload_file(config_info.sql_back_path + "/" + db_info.database + '-' + time_path + ".sql", 'sqlback',
db_info.database + '-' + time_path + ".sql")
if __name__ == '__main__':
main()
對應的配置檔案如下
[db]
ip=localhost
port=3306
database=testback
username=root
password=
[config]
mysql_home=D:/mysql-5.7.21-winx64/bin/
sql_back_home=D:/sqlback
[ftp]
ip=127.0.0.1
port=21
username=dbback
password=