python 使用mysqldb模块通过SSHTunnelForwarder隧道连接mysql
python 使用mysqldb模块通过SSHTunnelForwarder隧道连接mysql
(1)出于安全考虑,数据库服务器只允许堡垒机通过ssh访问,这对日常的使用带来了麻烦。昨天的工作中,就遇到了这样的问题,MySQL数据库放在了服务器A上,只允许服务器B来访问,而我在机器C上,可以通过ssh连接服务器B。为了解决在机器C上连接mysql这个问题
如下图所示:

(2)talk is cheap,让我们直接看代码吧:
# coding:utf-8
'''
# 希望对大家有帮助哈,请多提问题
create by yyz
date: 2017/09/05
'''
import sys
import MySQLdb
import os
from sshtunnel import SSHTunnelForwarder
def write_to_txt_file(filename, results_list):
# 如果该文件已存在,则删除该文件
if os.path.exists(filename)==True:
os.remove(filename)
with open(filename, "ab") as f:
for item in results_list:
b = "\t".join([str(a) for a in item])
# print b
f.write(b + "\n")
'''
出于安全考虑,数据库服务器只允许堡垒机通过ssh访问,这对日常的使用带来了麻烦。
昨天的工作中,就遇到了这样的问题,MySQL数据库放在了服务器A上,只允许服务器B来访问,
而我在机器C上,可以通过ssh连接服务器B。
'''
# 定义MySQL操作命令
sql1="select * from sepcify_database.one_and_two_stars limit 10" # 指定了操作表所在的数据库名字
sql2="select * from one_and_two_stars limit 10" # 没有指定操作表所在的数据库名字
# 连接数据库
def ssh_connect_and_read_db(out_savename):
with SSHTunnelForwarder(
('xxx.xx.xx.xx', 4344), # B机器的配置--跳板机
ssh_username="workuser", # B机器的配置--跳板机账号
ssh_password="A=password", # B机器的配置--跳板机账户密码
remote_bind_address=('xxx.xx.xx.xxx', 3306)) as server: # A机器的配置-MySQL服务器
conn = MySQLdb.connect(host='127.0.0.1', # 此处必须是必须是127.0.0.1,代表C机器
port=server.local_bind_port,
user='zausers', # A机器的配置-MySQL服务器账户
passwd='10FN_password' # A机器的配置-MySQL服务器密码c
,charset='utf8' # 和数据库字符编码集合,保持一致,这样能够解决读出数据的中文乱码问题
#,db='sepcify_database' # 可以限定,只访问特定的数据库,否则需要在mysql的查询或者操作语句中,指定好表名
)
# print conn
# 打开数据库
cursor=conn.cursor()
# 执行sql操作
try:
# test1
cursor.execute("SELECT VERSION()")
data = cursor.fetchone()
print "Database version : %s " % data
# test2
test_sql = "select * from sepcify_database.one_and_two_stars limit 3"
cursor.execute(test_sql)
data = cursor.fetchall()
data_list = list(data)
# 写入txt文档
write_to_txt_file(out_savename,data_list)
#return data_list
except:
info = sys.exc_info()
print info[0]
print info[1]
# 关闭数据库
conn.close()
ssh_connect_and_read_db("out_savename.txt")
(3)注意哈:
(0)在查询数据库中中文会显示乱码的。经过我从网上查找,发现用一个属性有可搞定:
在Python代码 conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='python') 中加一个属性:
改为:conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='python',charset='utf8')
charset是要跟你数据库的编码一样,如果是数据库是gb2312 ,则写charset='gb2312'。
(1)在使用过程中,可能会遇到如下经典错误
:MySQL远程连接丢失问题解决方法(OperationalError: (2013, 'Lost connection to MySQL server during query'))
原因是没连接mysql服务器,问题可能是几个服务器的参数配置错误,如端口,服务器IP,密码等;或者是mysql服务器响应超时,请优化sql语句,确保能够在终端正确执行。
参见: https://stackoverflow.com/questions/38042300/gae-python-operationalerror-2013-lost-connection-to-mysql-server-during-qu
(2)sshtunnel 安装,请参照安装:
http://sshtunnel.readthedocs.io/en/latest/?badge=latest
(3)Mac或linux直接安装
pip install sshtunnel
(4)sshtunnel官方使用例子,请参照例子:
http://sshtunnel.readthedocs.io/en/latest/?badge=latest#example-1
————————————————
版权声明:本文为CSDN博主「Data_IT_Farmer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/helloxiaozhe/article/details/77850367
浙公网安备 33010602011771号