python2实现数据库表定时全量同步sftp
需求
周边系统需要通过sftp接口,将本系统数据库的8张表吐给sftp,文件名为txt,提供的字段用#号分隔(逗号存在分隔不开的情况),8张表采用全量每天同步。
环境
操作系统centos7.9
自带的python2.7.5,
python2存在缺少MySqldb、paramiko模块情况,参考上两篇博客进行模块安装
脚本编写
本地环境编写脚本auto_table_up_sftp_v2.py代码如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import MySQLdb
import paramiko
from datetime import datetime
import os# MySQL数据库连接信息
db_host = '192.168.2.206'
db_user = 'root'
db_password = 'ze1bw0,7E[9V'
db_name = 'mysql'
table_list = ['user','db','event',]#生成的文件列表信息
file_list = []#创建生成文件的目录
directory = './AuditToPass'
# 检查目录是否存在,如果不存在则创建
if not os.path.exists(directory):os.makedirs(directory)# SFTP连接信息
sftp_host = '192.168.2.139'
sftp_user = 'ynsftp'
sftp_password = '1'
sftp_directory = './'# 获取当前日期
current_date = datetime.now().strftime('%Y-%m-%d')# 连接MySQL数据库
conn = MySQLdb.connect(host=db_host, user=db_user, passwd=db_password, db=db_name)
cursor = conn.cursor()for table_name in table_list:# 从MySQL数据库中读取数据query = "SELECT * FROM {}".format(table_name)cursor.execute(query)rows = cursor.fetchall()# 将数据写入到txt文件txt_filename = "{}{}.txt".format(table_name,current_date)with open('./AuditToPass/' + txt_filename, 'w') as file:for row in rows:file.write('#'.join(str(col) for col in row) + '\n')print('生成文件{}成功'.format(txt_filename))file_list.append(txt_filename)print('{}添加到待上传文件列表成功'.format(txt_filename))
# 关闭MySQL连接
cursor.close()
conn.close()for file_name in file_list:# 上传txt文件到SFTP目录transport = paramiko.Transport((sftp_host, 22))transport.connect(username=sftp_user, password=sftp_password)sftp = paramiko.SFTPClient.from_transport(transport)sftp.put('./AuditToPass/' + file_name, sftp_directory + file_name)print('上传文件{}成功'.format(file_name))# 关闭SFTP连接
sftp.close()
transport.close()#清理本地文件
print('开始清理本地的文件列表{}'.format(file_list))
for file_name1 in file_list:os.remove('./AuditToPass/' + file_name1)print('清理本地文件{}成功'.format(file_name1))
创建定时任务
[root@localhost ~]# crontab -l
10 16 * * * python /root/auto_table_up_sftp/auto_table_up_sftp_v2.py >> /root/auto_table_up_sftp/auto_table_up_sftp.log
实现结果如下