我有一个托管在“arvixe”中的 MySQL 数据库(由 cPanel 管理)。我可以通过我的电脑上的“MySQL Workbech”连接到它,所以我认为我正确地创建了它。
我有一个托管在 Cloud9 中的 python 应用程序(Telegram 机器人),因此我使用以下代码连接到数据库:
import MySQLdb
# Open database connection
db = MySQLdb.connect("weongame.com","weonwii_ceux","<here my pass>","weonwii_Forms_Bot")
结果是,经过很长一段时间(我认为任何类型的“超时”),控制台显示下一个回溯:
Traceback (most recent call last):
File "/home/ubuntu/workspace/bot.py", line 9, in <module>
db = MySQLdb.connect("weongame.com","weonwii_ceux","<here my pass>","weonwii_Forms_Bot")
File "/usr/local/lib/python3.4/dist-packages/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
File "/usr/local/lib/python3.4/dist-packages/MySQLdb/connections.py", line 204, in __init__
super(Connection, self).__init__(*args, **kwargs2)
_mysql_exceptions.OperationalError: (2003, "Can't connect to MySQL server on 'weongame.com' (110)")
所以我重点关注主要错误:_mysql_exceptions.OperationalError: (2003, "Can't connect to MySQL server on 'weongame.com' (110)")
我刚刚在 cPanel 上找到了“Remote MySQL”部分。我不知道必须在那里引入的确切 IP,因此我编写了 c9.io(作为主机名和 IP 地址),与 https://forms-bot-ceuxdruman.c9users.io 相同。 (其中 Cloud9 表示我的应用程序正在运行,尽管它是一个简单的脚本,而不是网页/Web 应用程序)以及询问我的 Cloud9 工作区的 Ubuntu 控制台的 IP 地址。但在引入所有这些之后(考虑到IP可能是动态的),结果是完全相同的。
我也知道 arvixe 允许这种外部连接,所以这不是一个可能的原因。
知道什么可能导致错误吗?提前致谢。
编辑:我用过
import socket
socket.gethostbyname(socket.gethostname())
找出运行我的机器人的真实IP,然后我将其像其他人一样包含在“远程MySQL”部分中,但结果再次完全相同。
最佳答案
- 远程主机的 IP。如果你写主机名,这个主机名必须解析为IP并且mysql必须配置为解析主机名(配置mysql有不同的方法)
主机名-f
主机 c9.io
- 验证远程服务器上的 3306 端口是否打开或远程计算机的 IP
iptables -L -n |grep 3306
iptables -L -n |grep IP_remote_machine
- 如果防火墙打开或没有防火墙,请在mysql上搜索问题。 mysql 服务器上的朗姆酒 mysql 控制台(在某些情况下,用于 Cpanel 帐户界面远程访问的 Cpanel 工具失败)
尝试下面的代码(可能需要凭据,具体取决于您的 mysql 服务器 mysql -u root -p 的配置)
root@hostanme:~# mysql
MariaDB [(none)]> SELECT user, host, password FROM mysql.user WHERE user LIKE 'user_with_permission';
+----------------+--------------------+-------------------------------------------+
| user | host | password |
+----------------+--------------------+-------------------------------------------+
| user_perm_remo | XXX.31.31.227 | *3ED850F72DSHWBDS195D51D6A18EEFE0149DDA3F |
| user_perm_remo | XX.45.170.221 | *3ED850F72DSHWBDS195D51D6A18EEFE0149DDA3F |
| user_perm_remo | localhost | *3ED850F72DSHWBDS195D51D6A18EEFE0149DDA3F |
| user_perm_remo | XX.184.17.102 | *3ED850F72DSHWBDS195D51D6A18EEFE0149DDA3F |
| user_perm_remo | kvm401.xxxxxxx.com | *3ED850F72DSHWBDS195D51D6A18EEFE0149DDA3F |
| user_perm_remo | xxxxxxx.com | *3ED850F72DSHWBDS195D51D6A18EEFE0149DDA3F |
| user_perm_remo | %.xxxxxxx.com | *3ED850F72DSHWBDS195D51D6A18EEFE0149DDA3F |
| user_perm_remo | xxx.33.112.218 | *3ED850F72DSHWBDS195D51D6A18EEFE0149DDA3F |
+----------------+--------------------+-------------------------------------------+
8 rows in set (0.00 sec)
如果您的远程连接没有一对用户/主机/密码,您将在 mysql 服务器上获得错误的权限。您需要手动添加用户。
GRANT ALL PRIVILEGES ON DATABASESNAME TO 'USERNAME'@'HOSTNAME_FDQN_OR_IP' IDENTIFIED BY 'PASSWORD'; FLUSH PRIVILEGES;
如果在此之后没有连接(也在最佳实践之前),您必须检查:
通过计算机的远程连接测试防火墙和 mysql 设置
telnet mysql_server 3306
你的 mysql 日志。阅读 my.conf 以了解 mysql 错误日志在哪里(通常在/var/lib/mysql/.err 上)并读取错误。如果错误是mysql问题,就在这里。
注意:如果您的主机有动态 IP,则必须使用 % 来授予对动态 IP 的远程访问权限。您可以使用 %.%.%.% 并调整为仅授予对远程计算机的可能 Ip 的阻止。
关于python - 无法从 Cloud9 python 应用程序连接到 MySQL 数据库(托管在 arvixe 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36815205/