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
컬럼 추가
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.