自己投資としてチャレンジしている内容を Blog で公開しています。
今回は python で MySQL に接続した際の「エラーハンドリング」と「リトライ」方法について紹介します。
Summary
▼1. 接続時のエラーハンドリング & リトライ の必要性について
クラウドサービスに接続する際、ネットワークの瞬断の影響を受けることはよくあります。そのため、接続失敗時にエラーハンドリングし、インターバルの間隔を入れてリトライすることが必須の設定となっております。
今回は Ubuntu にインストールされた MySQL を使って、MySQL 接続時、どのようにエラーハンドリングし、リトライするのか説明します。
▼2. 事前準備
以前本 blog で紹介したコードに、エラーハンドリング及び、リトライ設定を追加します。
Python – pyodbc で MySQL on Ubuntu 20.04 に接続する方法 No.98
▼3. 接続時のエラーハンドリング & リトライ の実装
3-1. エラーハンドリング & リトライを行う python コードを作成
以下のコードでは While を使って、エラーになった場合 15 秒のインターバルで 3 回のリトライを実施しています。エラーを発生させるため、MySQL がリスニングしている port 3306 ではなく、3305 を接続文字列に指定し接続しています。
# runmysqlquery_retry.py
import pyodbc
import time
import datetime
driver = '{MYSQL ODBC 8.0 Driver}'
server = 'localhost'
dbname = 'testdb'
user = 'hiveuser'
pw = 'hivepassword'
query = "select * from testtbl"
success = False
retryc = 0
max_retries = 3
while not success and retryc < max_retries:
try:
conn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=3305;DATABASE='+dbname+';UID='+user+';PWD='+pw+';')
cursor = conn.cursor()
cursor.execute(query)
row = cursor.fetchone()
while row:
print(str(row[0]) + " " + str(row[1]))
row = cursor.fetchone()
success = True
except pyodbc.Error as ex:
retryc += 1
print("Current Timestamps:" + str(datetime.datetime.now()) + "retry count: " + str(retryc))
print("==========================")
print("Error: " + str(ex))
print("==========================")
time.sleep(15)
# if success is success, close the cursor and connection
if success:
cursor.close()
conn.close()
3-2. 実行結果
15 秒のリトライインターバルを入れているため、リトライは接続失敗後の 15 秒後となっています。
python3 ./runmysqlquery_retry.py Current Timestamps:2022-12-16 20:16:58.126307retry count: 1 ========================== Error: ('HY000', "[HY000] [MySQL][ODBC 8.0(w) Driver]Can't connect to MySQL server on 'localhost:3305' (111) (2003) (SQLDriverConnect)") ========================== Current Timestamps:2022-12-16 20:17:13.140861retry count: 2 ========================== Error: ('HY000', "[HY000] [MySQL][ODBC 8.0(w) Driver]Can't connect to MySQL server on 'localhost:3305' (111) (2003) (SQLDriverConnect)") ========================== Current Timestamps:2022-12-16 20:17:28.155940retry count: 3 ========================== Error: ('HY000', "[HY000] [MySQL][ODBC 8.0(w) Driver]Can't connect to MySQL server on 'localhost:3305' (111) (2003) (SQLDriverConnect)") ==========================
▼4. その他 : MySQL の待ち受け Port の確認方法
以下のクエリで MySQL がリスニングしている待ち受け Port を確認することができます。
MySQL に接続し以下のクエリを実行します。
mysql> show global variables like 'PORT'
-> ;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 3306 |
+---------------+-------+
1 row in set (0.00 sec)
▼5. 参考情報
以上です。参考になりましたら幸いです。