質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.53%

Python3でMySQLに接続しようとしたときに出るエラー"Host is not allowed to connect to this MySQL server"の対処法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 120

Abeginner

score 26

初めてPython3でMySQLを使おうとしている初心者です。
プログラミング以前に基礎知識が足りていないかもしれませんがご容赦ください。

前提として、自分のPC(Windows10)のCドライブにPython3とMySQLをインストールし、パスも設定してあります。
関係あるかわかりませんが、エディタはVisual Studio Codeです。

本題に入ります。
現在、Python3を用いて、以下のようなコードでMySQLを試してみようとしたのですが、

#!/usr/bin/python
#! coding: utf-8

import datetime
import MySQLdb

# 現在の日付を取得
now = datetime.datetime.now()

# データベース接続とカーソル生成
connection_to_tests = MySQLdb.connect(user='root',  passwd='****',  host='****',  db='tests')
cursor_tests = connection_to_tests.cursor(MySQLdb.cursors.DictCursor)
table_name = 'test'
cursor_tests.execute("CREATE TABLE IF NOT EXISTS %s (date DATE, number INTEGER, string VARCHAR(4);" %table_name)

# データ登録
sql =   "INSERT INTO %s VALUES(%s, %d, %s);"
cursor_tests.execute = (sql, (table_name, now.date, 1234, 'test'))

# データ検索
cursor_tests.execute = ("SELECT * FROM %s WHERE (DATE_FORMAT(date, '%m') = %s);" %(table_name, now.month))

print(cursor_tests.fetchall())


その結果、

MySQLdb._exceptions.OperationalError:(1130, "Host '****' is not allowed to connect to this MySQL server")


というエラーが出てしまいます。

python3もMySQLもpyファイルも全て同じCドライブに入っているのに、pythonでMySQLへの接続が許されないものなのでしょうか?
Google検索はしてみたものの調べ方の問題か、知識不足で説明を理解できていないのか、対処法がわかりません。
どのような設定や対処をすれば、pythonを使ってMySQLを使えるようになるか教えて下さい。

もし、コードの方の問題だとしたら、それも正して頂けると助かります。

【追記】

>mysqlは実行されているのか
タスクマネージャーで見ると、mysqld.exeが動いていますが、実行されていることになりますか?
>他のクライアントからの接続確認
自分のPCにMySQLを入れて一人で練習しようとしているだけなので、他の端末からは試していません。コマンドプロンプトからであれば「mysql -u root -p」で接続し操作できました。

【追記2】

mysql -u root -p**** -h **** tests


これをコマンドプロンプトでやってみた結果、

mysql  Ver 8.0.19 for Win64 on......


から始まる非常に長いメッセージが返ってきました。

しかし、ついでに

>mysql -u root -p**** -h ****


これも試してみたのですが、
ERROR 2005 (HY000): Unknown MySQL server host **** (0)
というエラーが出て実行できませんでした。

自分がホスト名を間違えているのかと思い、

mysql> show variables like 'hostname';


で確認したのですが、ホスト名は正しいようです。

逆に、pythonのコードの方からホスト名を消して

connection_to_tests = MySQLdb.connect(user='root',  passwd='****')


としてみたところ、当初の質問の
MySQLdb._exceptions.OperationalError:(1130, "Host '****' is not allowed to connect to this MySQL server")
というエラーが出なくなりました。

現在、この使い方が正しいのか判断がつかなくて止まっているのですが、pythonで同じPC内に入っているMySQLを使うときには、ホスト名は指定しなくて大丈夫なものなのでしょうか?
逆に、ホスト名を指定した時だけエラーになるのは、どういうことなのでしょうか?

質問ばかりで申し訳ありませんが、何卒ご教示頂けると幸いです。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Abeginner

    2020/03/26 17:13

    > yukky1201さん
    アドバイスありがとうございます。
    > mysql -u root -p**** -h **** tests
    これをコマンドプロンプトでやってみた結果、
    mysql Ver 8.0.19 for Win64 on......
    から始まる非常に長いメッセージが返ってきました。

    しかし、ついでに
    > mysql -u root -p**** -h ****
    これも試してみたのですが、
    ERROR 2005 (HY000): Unknown MySQL server host **** (0)
    というエラーが出て実行できませんでした。

    自分がホスト名を間違えているのかと思い、
    mysql> show variables like 'hostname';
    で確認したのですが、ホスト名は正しいようです。

    逆に、pythonのコードの方からホスト名を消して
    connection_to_tests = MySQLdb.connect(user='root', passwd='****')
    としてみたところ、
    MySQLdb._exceptions.OperationalError:(1130, "Host '****' is not allowed to connect to this MySQL server")
    というエラーが出なくなりました。

    エラーが出なければ結果オーライな気もしますが、何が起きたのか理解できず、先に進んでよいものかわかりません。
    ホスト名は指定しなくて大丈夫なものなのでしょうか?

    > asahina1979さん
    > コマンドプロンプト(ソケット通信)とパイソン(TCP通信:ネットワーク経由)なのですよ。
    初めて知りました…勉強になります。
    TCPはちょっとわからなかったですが、ソケットは(No default value)となっていました。

    キャンセル

  • yukky1201

    2020/03/26 17:29

    >非常に長いメッセージが返ってきました。
    そこに私が知りたい情報があります。きっと。

    キャンセル

  • Abeginner

    2020/03/26 17:37

    > yukky1201さん
    Usageは省きましたが、これで良いでしょうか?
    ----------------------------------------------------
    MySQL\MySQL Server 8.0\my.cnf
    The following groups are read: mysql client
    The following options may be given as the first argument:
    --print-defaults Print the program argument list and exit.
    --no-defaults Don't read default options from any option file,
    except for login file.
    --defaults-file=# Only read default options from the given file #.
    --defaults-extra-file=# Read this file after the global files are read.
    --defaults-group-suffix=#
    Also read groups with concat(group, suffix)
    --login-path=# Read this path from the login file.

    Variables (--variable-name=value)
    and boolean options {FALSE|TRUE} Value (after reading options)
    --------------------------------- ----------------------------------------
    auto-rehash TRUE
    auto-vertical-output FALSE
    bind-address (No default value)
    binary-as-hex FALSE
    character-sets-dir (No default value)
    column-type-info FALSE
    comments FALSE
    compress FALSE
    database (No default value)
    default-character-set auto
    delimiter ;
    enable-cleartext-plugin FALSE
    vertical FALSE
    force FALSE
    histignore (No default value)
    named-commands FALSE
    ignore-spaces FALSE
    init-command (No default value)
    local-infile FALSE
    no-beep FALSE
    host 'ホスト名'
    html FALSE
    xml FALSE
    line-numbers TRUE
    unbuffered FALSE
    column-names TRUE
    sigint-ignore FALSE
    port 0
    prompt mysql>
    quick FALSE
    raw FALSE
    reconnect TRUE
    shared-memory-base-name (No default value)
    socket (No default value)
    server-public-key-path (No default value)
    get-server-public-key FALSE
    ssl-ca (No default value)
    ssl-capath (No default value)
    ssl-cert (No default value)
    ssl-cipher (No default value)
    ssl-key (No default value)
    ssl-crl (No default value)
    ssl-crlpath (No default value)
    tls-version (No default value)
    tls-ciphersuites (No default value)
    table FALSE
    user root
    safe-updates FALSE
    i-am-a-dummy FALSE
    connect-timeout 0
    max-allowed-packet 16777216
    net-buffer-length 16384
    select-limit 1000
    max-join-size 1000000
    show-warnings FALSE
    plugin-dir (No default value)
    default-auth (No default value)
    binary-mode FALSE
    connect-expired-password FALSE
    compression-algorithms (No default value)
    zstd-compression-level 3

    キャンセル

回答 2

checkベストアンサー

+1

connection_to_tests = MySQLdb.connect(user='root',  passwd='****',  host='****',  db='tests')


で、伏せてますけど、host='localhost'ではないのですか?

SELECT user,host FROM mysql.user;
| user | host |
+------------------+-----------+
| root | localhost |

 
上記ですので、これがマッチしないと違うアカウントと認識されて接続失敗している可能性があります。

>pythonのコードの方からホスト名を消して
ホストを指定しないとデフォルトのlocalhostに接続しますので、結果的にrootアカウントで、localhostに接続しに行ってます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/26 18:06

    > 伏せてますけど、host='localhost'ではないのですか?
    いえ、
    mysql> show variables like 'hostname';
    で出てきた
    +---------------+-----------------+
    | Variable_name | Value |
    +---------------+-----------------+
    | hostname | 'ホスト名' |
    +---------------+-----------------+
    この'ホスト名'を入れていました。
    仰る通り、
    host='localhost'
    にすると、ホスト名を消した場合と同じ結果となりました。
    その結果、こんなメッセージ
    MySQLdb._exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the
    right syntax to use near '' at line 1")
    が出てくるのですが、これはたぶん別の問題ですよね?

    結果として、pythonから自分のPCのMySQLに接続する場合は、
    host='localhost'
    とすれば良いのでしょうか?

    コマンドプロンプトで、
    mysql -u root -p**** -h 'localhost'
    とすると、
    ERROR 2005 (HY000): Unknown MySQL server host ''localhost'' (0)
    と出てしまうのですが、これはなぜでしょう?

    キャンセル

  • 2020/03/26 18:56

    mysql -u root -p**** -h localhost
    で実行してください。(「'」が不要)

    このあたりのコマンドについては、公式マニュアルを見るくせをつけた方が良いです(正確な情報を得られます)

    キャンセル

  • 2020/03/26 22:03

    ありがとうございます。
    できました!

    キャンセル

0

そのHOSTとユーザーにGRANT権限はありそうですか?
https://qiita.com/PallCreaker/items/0b02c5f42be5d1a14adb

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/26 10:58

    情報ありがとうございます。

    とりあえずコマンドプロンプトで
    SELECT user,host FROM mysql.user;
    というコマンドを試した結果、
    +------------------+-----------+
    | user | host |
    +------------------+-----------+
    | mysql.infoschema | localhost |
    | mysql.session | localhost |
    | mysql.sys | localhost |
    | root | localhost |
    +------------------+-----------+
    という結果が得られました。

    続いて、
    SHOW GRANTS FOR root@'localhost';
    を実行しましたが、とりあえず目ぼしい権限は全て付与されているように見えます。

    自分のPCのpythonを用いて自分のPCのMySQLに接続しようとしているとき、自分はrootからrootに接続しようとしているのだと思っているのですが、合ってますか?
    たぶんGRANT権限はあるのだと思います。

    キャンセル

  • 2020/03/26 11:20

    むむむっ、pythonで接続しているHOSTが、127.0.0.1ではなくlocalhostということなら、GRANT権限はありそうですね。。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • MySQLに関する質問
  • Python3でMySQLに接続しようとしたときに出るエラー"Host is not allowed to connect to this MySQL server"の対処法