Raspberry Pi にある Mariadb に Ubuntu からアクセスする

Ubuntu Desktop 22.04 LTS ノウハウ
Ubuntu から
Raspberry Pi の Mariadb にアクセスする
 
Raspberry Pi の Mariadb に蓄積されているデータを、Ubuntu から Pythonを使ってアクセルしてみる。
 
ポート番号を調べるコマンド
通常 Mariadb にはポート番号「3306」が使用される。
 
 以下、Ubuntu から Raspberry Pi の Mariadb を読んで、「CSV」に書き出した記録。
 
 

 

スポンサー リンク

 

 
 
 
 
 
1. Raspberry Piでのファイアウォール(ufw)の設定
 
通常 Mariadb にはポート番号「3306」が使用される。
 
ポート番号を調べるコマンド。
sudo mariadb
MariaDB[(none)]> show variables like 'port';
 
ポート番号を調べるコマンド
 
ポート番号を変更するには、MariaDBの設定ファイルを編集する。。
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
 
「Basic Settings」に、ポート番号の記載がないので追記する。
port = 12345
「Basic Settings」に、ポート番号の記載がないので追記する
 
ファイアウォールで3306ポートを解放する。
sudo ufw allow 3306
 
変更内容を確認する。
sudo ufw status
 
sudo ufw status
 
 
 
2. Raspberry Pi側 Mariadb の設定
 
①.bind-addressを変更する
 
MariaDBの設定ファイルを編集し、bind-addressを変更する。
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
 
下記を、コメントアウトと追記。
#bind-address = 127.0.0.1
bind-address = 0.0.0.0
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
 
この設定がされていない場合に表示されるエラー。
mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on '192.168.11.112:3306' (111)
 
 
 
②.使用するユーザーに、外部からのアクセス権を設定する
 
ユーザー一覧で、user カラムと host カラムの情報を確認してみる。
sudo mariadb
MariaDB[(none)]> select user, host from mysql.user;
 
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| flaskpy     | localhost |
| mariadb.sys | localhost |
| mysql       | localhost |
| root        | localhost |
+-------------+-----------+
使用するユーザー「flaskpy」の、Host が localhost のみになっている。
 
使用するユーザーに外部アクセスを許可する権限を設定する。
CREATE USER 'flaskpy' IDENTIFIED BY '';
GRANT ALL PRIVILEGES ON *.* TO 'flaskpy'@'%' WITH GRANT OPTION;
 
+-------------+-----------+
| User        | Host     |
+-------------+-----------+
| flaskpy     | %         |
| flaskpy     | localhost |
| mariadb.sys | localhost |
| mysql       | localhost |
| root        | localhost |
+-------------+-----------+
ユーザー flaskpy が新たに追加され、Host が %(ワイルドカード)になっている。
flaskpy が新たに追加され、host が %(ワイルドカード)になっている
 
これで flaskpy に対して、ホスト側のアプリケーションからのアクセスが可能となる。
 
 
この設定がされていない場合に表示されるエラー。
mysql.connector.errors.DatabaseError: 1130 (HY000): Host '192.168.11.121' is not allowed to connect to this MariaDB server
 
 
③.Hostを外部から接続できる%にしてユーザーを作り直す
 
使用するユーザー flaskpy の Host に「localhost」 が残っていると、
+-------------+-----------+
| User        | Host     |
+-------------+-----------+
| flaskpy     | %         |
| flaskpy     | localhost |
+-------------+-----------+
使用するユーザー flaskpy に Host 「localhost」 が残っている
 
次のエラーが表示される。
mysql.connector.errors.ProgrammingError: 1045 (28000): Access denied for user 'flaskpy'@'192.168.11.121' (using password: YES)
 
 
Hostを外部から接続できる「%」にしてユーザーを作り直す。
drop user flaskpy@localhost;
grant all privileges on ondodb.* to 'flaskpy'@'%' identified by 'password' with grant option;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| flaskpy     | %         |
| mariadb.sys | localhost |
| mysql       | localhost |
| root        | localhost |
+-------------+-----------+
 
hostを外部から接続できる%にしてユーザーを作り直す
 
 
 
3. Ubuntu からアクセスする Python スクリプト
 
Raspberry Pi側の Mariadb を読んで、 Ubuntu 側で「CSV」に書き出すスクリプト。
 
# -*- coding: utf-8 -*-

import csv
import mysql.connector

# データベースに接続
connection = mysql.connector.connect(
        user="flaskpy",
        password="password",
        host="192.168.11.112",
        port="3306",
        database="ondodb"
)

# CSVファイルに書き出す際のファイルパス
csv_file_path = 'work/ondo_situdo_31.csv'

# カーソルの作成
cursor = connection.cursor()

try:
    # データの取得クエリ
    query = 'SELECT * FROM ondo_situdo'
    cursor.execute(query)

    # 取得したデータをCSVファイルに書き出す
    with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:
        csv_writer = csv.writer(csv_file)

        # ヘッダーを書き込む
        csv_writer.writerow([i[0] for i in cursor.description])

        # データを書き込む
        csv_writer.writerows(cursor.fetchall())

    print(f'Data exported to {csv_file_path}')

except Exception as e:
    print(f'Error: {e}')

finally:
    # 接続を閉じる
    cursor.close()
    connection.close()

 
「host=」で、Raspberry PiのIPアドレスを指定する。
        host="192.168.11.112",
        port="3306",
 

 

以上。
(2024.03.02)

 

 

スポンサー リンク

 

             

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください