mysql 데이터베이스 백업
최근에는 시험
비로 운영과 유지 보수를하고 있는데, Xiao Diaosi만이 이해할 수있는 것으로 추정됩니다. .
샤오 디아 오시는 불만을 표명했다. . . .
데이터를 백업하고 싶기 때문에 스크립트를 작성하고 스스로 실행하게 했어요 ~~
# -*- coding:utf-8 -*-
# @Time : 2020-07-29
# @Author : Dingjs
#DB基本信息
import os
import time
import datetime
import glob
import shutil
"""
Python3.7 来执行mysql数据备份操作
自动保持7天的数据
备份的sql文件名精确到时分秒,这样即使一天备份多次,也不会进行覆盖
"""
#数据库基本信息设定
DB_HOST = '输入数据库地址'
DB_USER = '输入数据库账号'
DB_USER_PASSWORD = '输入数据库密码'
DB_PORT = '端口号3306'
#多库备份
#写法一:把需要备份的库名写到txt文件中,然后读取txt文件内的数据
#DB_NAME = '/backup/dbnames.txt'
#写法二:通过执行sql语句来匹配下载的库
# sqlStr1 = "show databases like 'iot%'"
#单库备份
DB_NAME = 'iot_test'
#备份路径
BACKUP_PATH = '../conn_DB/sql_path/'
#设置编码格式
DB_CharSet = 'utf8'
#创建datatime,作为备份文件名称
DATETIME = time.strftime('%Y%m%d')
#这里主要是做.sql文件的日期区分
DT_time = time.strftime("%Y%m%d_%H%M%S")
TODAYBACKUPPATH = BACKUP_PATH + DATETIME
#保留7天的备份文件
print ('del folder seven days ago')
folders = glob.glob('/backup/dbbackup/*')
today = datetime.datetime.now()
for item in folders:
try:
foldername = os.path.split(item)[1]
day = datetime.datetime.strptime(foldername, "%Y%m%d")
diff = today - day
if diff.days >= 7:
shutil.rmtree(item)
except:
pass
print("creating backup folder")
#查看备份文件夹是否存在,不存在,则创建
if not os.path.exists(TODAYBACKUPPATH):
os.makedirs(TODAYBACKUPPATH)
# Code for checking if you want to take single database backup or assinged multiple backups in DB_NAME.
#开始备份文件
print ("checking for databases names file.")
if os.path.exists(DB_NAME):
file1 = open(DB_NAME)
multi = 1
print("Databases file found...")
print ("Starting backup of all dbs listed in file " + DB_NAME)
else:
print ("Databases file not found...")
print ("Starting backup of database " + DB_NAME)
multi = 0
# Starting actual database backup process.
if multi:
in_file = open(DB_NAME,"r")
flength = len(in_file.readlines())
in_file.close()
p = 1
dbfile = open(DB_NAME,"r")
while p <= flength:
# 从数据库读取文件
db = dbfile.readline()
db = db[:-1]
#在python中通过cmd执行mysqldump备份语句
# dumpcmd = "mysqldump -u " + DB_USER + "-h"+DB_HOST + " -p" + DB_USER_PASSWORD + " " + db + " > " + TODAYBACKUPPATH + "/" + db + ".sql"
# os.system(dumpcmd)
#在python中通过cmd来执行mysqldump命令的另一种写法
os.system( "mysqldump -h%s -u%s -p%s %s --default_character-set=%s > %s/%s_%s.sql" % (
DB_HOST, DB_USER, DB_USER_PASSWORD, db, DB_CharSet, TODAYBACKUPPATH, DT_time, db))
p = p + 1
dbfile.close()
else:
db = DB_NAME
# dumpcmd = "mysqldump -u " + DB_USER + " -p" + DB_USER_PASSWORD + " " + db + " > " + TODAYBACKUPPATH + "/" + db + ".sql"
# os.system(dumpcmd)
os.system("mysqldump -h%s -u%s -p%s %s --default_character-set=%s > %s/%s_%s.sql" % (
DB_HOST, DB_USER, DB_USER_PASSWORD, db, DB_CharSet, TODAYBACKUPPATH,DT_time, db))
#结束后,打印执行状态信息
print ("Backup script completed")
print("Your backups has been created in '" + TODAYBACKUPPATH + "' directory")
실행 중에 문제가
발생했습니다 . 이 문제가 발생했습니다 . 대부분은 mysql 구성 문제입니다.
mysqldump.exe가 지정된 경로에 있는지 또는 시스템 환경 변수로 구성되어 있는지 확인하십시오.
> 오늘 mysql을 다시 설치했는데 이런 종류의 문제가 더 이상 존재하지 않습니다 <
실행 결과를 게시하고 하나의 데이터베이스를
실행하고 여러 데이터베이스를 실행합니다.
백업 데이터 파일을 로컬로 다운로드
백업 파일
import os
import paramiko
def RemoteScp(host_ip, host_port, host_username, host_password, remote_file, local_file):
scp = paramiko.Transport((host_ip, host_port))
scp.connect(username=host_username, password=host_password)
sftp = paramiko.SFTPClient.from_transport(scp)
sftp.get(remote_file, local_file)
scp.close()
return ("success")
if __name__ == '__main__':
host_ip = '输入远程服务器的ip'
host_port = 22
host_username = '输入远程服务器的账号'
host_password = '输入远程服务器的密码'
remote_path = '输入要备份的文件名称:/conn_DB/test.sql'
local_path = '输入备份到本地的文件路径就名称:/DB_backup/test.sql'
RemoteScp(host_ip, host_port, host_username, host_password, remote_path, local_path)
백업 폴더
import os
import paramiko
def RemoteScp(host_ip, host_port, host_username, host_password, remote_path, local_path):
scp = paramiko.Transport((host_ip, host_port))
scp.connect(username=host_username, password=host_password)
sftp = paramiko.SFTPClient.from_transport(scp)
try:
remote_files = sftp.listdir(remote_path)
for file in remote_files: #遍历读取远程目录里的所有文件
local_file = local_path + file
remote_file = remote_path + file
sftp.get(remote_file, local_file)
except IOError: # 如果目录不存在则抛出异常
return ("remote_path or local_path is not exist")
scp.close()
if __name__ == '__main__':
host_ip = '输入远程服务器的ip'
host_port = 22
host_username = '输入远程服务器的账号'
host_password = '输入远程服务器的密码'
remote_path = '输入要备份的文件夹目录:/conn_DB/'
local_path = '输入备份到本地的文件夹目录:/DB_backup/'
RemoteScp(host_ip, host_port, host_username, host_password, remote_path, local_path)