Post

mariaDB, mysql on 라즈베리파이

라즈베리 파이에서 mysql사용해보기

1. 기본 업데이트

sudo apt-get update
sudo apt-get upgrade

1-1. 업데이트시 ign 뜨며 무한 로딩

sudo nano /etc/resolv.conf

나같은 경우에는 그냥 os만 설치하고 따로 network 설정을 건드리지 않았다

하지만 ssh 연결을 위해 wpa_supplicant.conf을 이용한 세팅을 하였고 그렇게 아래와 같은 네임서버만 연결되어있었다

# Generated by NetworkManager
search mshome.net
nameserver 192.xxx.xxx.x

nameserver(구글) 추가

# Generated by NetworkManager
search mshome.net
nameserver 192.168.137.1
#google nameservers
nameserver 8.8.8.8

2. mariadb 설치

1
sudo apt-get install mariadb-server

확인을 위해

1
systemctl status mysql

를 통해

1
Active: active (running)

가 뜬다면 잘 작동하는 중인 것이다

3. db 접속

1
sudo mysql -u root

4. DB 확인 및 생성

1
show databases;

확인하면

1
2
3
4
5
6
7
8
9
10
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.001 sec)

이라고 나오고, 아래와 같이 db를 추가적으로 생성해주었다

1
2
MariaDB [(none)]> create database TestDB;
Query OK, 1 row affected (0.001 sec)

5. 생성된 DB에 접속

매우 간단하다

1
2
3
MariaDB [(none)]> use TestDB
Database changed
MariaDB [TestDB]>

[ ]안의 이름이 변경되었다

6. user 생성

두가지 고려해야할 것이 있다

내부에서만 접속할 것이라면

1
2
3
4
5
create user '계정'@'127.0.0.1' identified by '비밀번호';

혹은 

create user '계정'@'localhost' identified by '비밀번호';

외부접속도 허용할 것이라면

1
create user '계정'@'%' identified by '비밀번호';

이번에 나는 user dev를 만들어보겠다

비밀번호는 pwd로 설정할 것이다

1
2
MariaDB [TestDB]> create user 'dev'@'%' identified by 'pwd';
Query OK, 0 rows affected (0.004 sec)

7. user에게 권한 부여

  • [ ]는 제외
1
grant all privileges on [DB이름].[테이블] to '계정'@'접속 위치';

직접 해보면

1
2
MariaDB [TestDB]> grant all privileges on TestDB.* to 'dev'@'%';
Query OK, 0 rows affected (0.003 sec)

그리고 권한을 적용하려면

1
flush privileges;

그럼 이제 권한을 확인해 볼 차례이다

1
2
3
4
5
6
7
8
9
10
MariaDB [TestDB]> show grants for 'dev'@'%';
+----------------------------------------------------------------------------------------------------+
| Grants for dev@%
  |
+----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `dev`@`%` IDENTIFIED BY PASSWORD '*975B2CD4FF9AE554FE8AD33168FBFC326D2021DD' |
| GRANT ALL PRIVILEGES ON `TestDB`.* TO `dev`@`%`
  |
+----------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)

비밀번호가 마치 암호처럼 써있기는 한데 그 아래 TestDB로 권한이 물려있으니 안심이다

8. 계정 혹은 권한 삭제

지금은 안하지만 나중에 필요하다면

  • 계정 삭제
    1
    
    drop user '유저'@'접속위치';
    
  • 권한 삭제
1
 reboke all on [DB이름].[테이블] from '계정아이디'@'접속위치';

9. DB 테이블 목록 확인

1
show tables;

지금은 비어있다고 하네요

1
2
MariaDB [TestDB]> show tables;
Empty set (0.001 sec)

10. 테이블 삭제

  • [ ] 제외
1
DROP TABLE [테이블 이름];

추가 _ 외부 접속

1
sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf

에서

bind-address = 127.0.0.1#bind-address = 127.0.0.1으로 변경

즉 주석처리

마지막

그리고 모든 작업이 끝났다면 한번 다시 시작

1
asde2@raspberrypi2:~ $ sudo service mysql restart

파이썬과 mysql 데이터베이스 연동하기

컬럼 추가

1
2
3
ALTER TABLE 테이블
ADD COLUMN 컬럼명 변수종류,
ADD COLUMN 컬럼명2 변수종류;

실사용

어…?

1
2
3
4
5
6
7
8
9
10
11
asde@raspberrypi:~/iot/test $ python test.py
Traceback (most recent call last):
  File "/home/asde/.local/lib/python3.9/site-packages/pymysql/connections.py", line 644, in connect
    sock = socket.create_connection(
  File "/usr/lib/python3.9/socket.py", line 843, in create_connection
    raise err
  File "/usr/lib/python3.9/socket.py", line 831, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

간단한 추가 예제가 있기에 연결해 보려 했더니 연결 자체가 안된다 뭐지..

아!

따로 설정을 안하면 내부에서 밖에 작동을 안한다고 하더군요 bind-address가 문제라네요

1
2
3
4
5
6
# this is only for the mysqld standalone daemon                          [mysqld]                                                                                                                                          #                                                                        # * Basic Settings                                                       #                                                                                                                                                 #user                    = mysql                                         pid-file                = /run/mysqld/mysqld.pid                         basedir                 = /usr                                           #datadir                 = /var/lib/mysql                                #tmpdir                  = /tmp                                                                                                                   # Broken reverse DNS slows down connections considerably and name resolv># safe to skip if there are no "host by domain name" access grants
#skip-name-resolve

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1

파이썬으로 DB 가지고 놀기

테이블 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pymysql

conn = pymysql.connect(host='192.168.137.243', user='dev', password='pwd', db='TestDB', charset='utf8')

cur = conn.cursor()

sql = '''CREATE TABLE TempHue(Daytime varchar(50), Temperature varchar(20), Humidity varchar(20))'''

cur.execute(sql)

conn.commit()

conn.close()

print("done")

확인해 보면?

1
2
3
4
5
6
7
8
9
MariaDB [TestDB]> explain TempHue;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| Daytime     | varchar(50) | YES  |     | NULL    |       |
| Temperature | varchar(20) | YES  |     | NULL    |       |
| Humidity    | varchar(20) | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+
3 rows in set (0.002 sec)

그럼 이번에는 그 값에다가 넣어주려면?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import MySQLdb
import RPi.GPIO as GPIO
import sys
import time
import Adafruit_DHT
import pymysql

sensor = Adafruit_DHT.DHT11
conn = pymysql.connect(host="192.168.137.243",user="dev",passwd="pwd",db="TestDB")

pin = 4
try :
     with conn.cursor() as cur :
        sql="insert into TempHue values(%s,%s,%s);"
        while True :
           humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
           if humidity is not None and temperature is not None:
              print('TEMP=%0.1f*C  Humidity=%0.1f'%(temperature, humidity))
              cur.execute(sql,(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),temperature, humidity))
              conn.commit()
           else:
               print("Failed to get reading.")
           time.sleep(1)
except KeyboardInterrupt :
       exit()
finally:
       conn.close()

실행시키면 현제 방 온도와 습도가 출력된다

1
2
3
4
5
asde@raspberrypi:~/iot/test $ python saveTemphue.py
TEMP=31.0*C  Humidity=56.0
TEMP=31.0*C  Humidity=56.0
TEMP=31.0*C  Humidity=56.0
TEMP=31.0*C  Humidity=55.0

실제 테이블을 확인해 보면

1
2
3
4
5
6
7
8
9
10
MariaDB [TestDB]> SELECT * FROM TempHue;
+---------------------+-------------+----------+
| Daytime             | Temperature | Humidity |
+---------------------+-------------+----------+
| 2024-07-27 10:57:48 | 31          | 56       |
| 2024-07-27 10:57:50 | 31          | 56       |
| 2024-07-27 10:57:51 | 31          | 56       |
| 2024-07-27 10:57:53 | 31          | 55       |
+---------------------+-------------+----------+
4 rows in set (0.001 sec)

아주 잘 들어가있다

This post is licensed under CC BY 4.0 by the author.