python 使用mysqldb模块通过SSHTunnelForwarder隧道连接mysql

来源:互联网 发布:linux 看网站访问ip 编辑:程序博客网 时间:2024/05/16 23:48

python 使用mysqldb模块通过SSHTunnelForwarder隧道连接mysql

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

如下图所示:




(2)talk is cheap,让我们直接看代码吧:

# coding:utf-8'''# 希望对大家有帮助哈,请多提问题create by yyzdate: 2017/09/05'''import sysimport MySQLdbimport osfrom sshtunnel import SSHTunnelForwarderdef 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