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语句,确保能够在终端正确执行。

(2)sshtunnel 安装,请参照安装:   

(3)Mac或linux直接安装
pip install sshtunnel

(4)sshtunnel官方使用例子,请参照例子:
展开阅读全文

没有更多推荐了,返回首页