프로그램에 파일을 불러들여 BLOB 타입에 Insert, Update 하는 것을

구현하긴 했으나 쿼리문 수정 등 귀찮은 바가 몇개 있었다.

 

용량이 작은 파일을 BLOB에 업데이트할 때 유용할 것으로 보인다.

 

1. 파일의 HEX 값을 구한다.

나같은 경우, 회사에서도 무료인 HxD Hex Editor 를 사용한다.

장점은 파일을 읽은 후, 복사, 붙여넣기 하면 Hex 값만 깔끔하게 가져온다.

 

파일을 읽은 후, 복사 붙여넣기 하면 HEX 값만 얻는다.

5E58410D0A5E4259322C322E305E46530D0A5E5345453A5548414E47554C2E4441545E46530D0A5E4357312C453A4B464F4E54332E464E545E434932365E46530D0A5E464F35302C35305E41314E2C34302C34305E4644C7D1B1DBC3E2B7C2C5D7BDBAC6AE5E46530D0A5E5051322C312C312C595E46530D0A5E585A0D0A

 

이 후, 얻은 HEX 값을 아래 쿼리문에 넣으면 된다.

나는 common_key 테이블 밑에 data 라는 BLOB 에 값을 넣었다.

(원래 데이터보다 짧게 기재했다. 실제는 훨씬 길 것이다.)

 

update common_key set data=UNHEX('5E58410D0A5E425932~~~') where no=10 ;

 

♣ 확인

값을 넣었으니 CRC32 값을 비교하여 올바르게 들어갔는지 확인한다.

Select hex(crc32(data)) from common_key where no=10 ;

 

 

그리고 실제 파일의 CRC32 를 구해본다.

 7-Zip 프로그램을 쓰면 우클릭 시, Checksum 값을 쉽게 얻을 수 있다.

위와 같이, 실제 파일과 DB 값 간에 CRC32값이 일치하였고,

원하는대로 DB에 파일을 업로드 됨을 확인하였다.

 

뭐, 각자 툴 있으면 그거 쓰면 되고, 가끔 귀차니즘 발동할 때 쓸 수 있겠다.

 

Linux 서버(Ubuntu Server)에 파일을 옮기거나 할 때 FTP를 사용해도 되지만

FTP 설치 등의 귀차니즘이 발동한다면......

 

Linux 서버의 IP : 192.168.15.25 라 하고...

(hahaite 는 제 계정입니다. 예시로 그냥 적음. ㅋ)

 

♣ SFTP 접속 후, 업로드하기

 $ sftp hahaite@192.168.15.25

password : (패스워드 입력)

SFTP > put test.tar

SFTP > quit

 

♣ SFTP 접속하면서로드하기

 $ sftp hahaite@192.168.15.25 <<< $'put test.tar'

 

♣ SSH Private Key 를 사용하여 접속하기

(ssh key 사용법은 본 글에서는 다루지 않는다.)

-I 옵션 뒤에 SSH Private Key 위치를 적어주면 password 없이 접속이 된다.

 $ sftp -i ~/.ssh/hahaite 192.168.15.25  (hahaite 는 제 SSH Private Key 임)

 

만약 private Key 가 ~/.ssh/id_rsa 로 되어 있으면 따로 안적어도 된다.

 $ sftp 192.168.15.25

(접속 끝)

 

 

♣ Batch File 을 이용한 업로드

SFTP 접속 시, Batch File 을 적어주면 접속 후, Batch File 안의 SFTP 명령어를 수행한다.

 

ex) mysftp.sh 란 파일을 만들고 아래 내용을 추가한다.

cd backup

put test.tar

 

그리고 -b 옵션에 위 파일을 기재해 준다.

 $ sftp -b ./mysftp.sh 192.168.15.25

 

♣ SFTP 자동 업로드 구성

매일 새벽 1시에 자동으로 DB 가 백업되고,

이 백업 파일을 다른 서버에 SFTP 로 옮긴다고 가정해 보자.

 

매일 새벽 1시가 되면 backup.sh 란 쉘스크립트가 자동 실행된다.

 

DB Backup 시, 날짜 + 시간이 기록되도록 한다.

(Root2020 은 root 계정의 MariaDB의 비밀번호임)

 

OPTIONS="-u root -pRoot2020 --routines --extended-insert --quick --single-transaction"

BACKUP_DIR=/home/hahaite/MDB_Backup

 

♣ SFTP를 이용한 Database Backup 수행

mysqldump $OPTIONS $DB_NAME > $BACKUP_DIR/DB_$(date "+%Y-%m-%d_%H").sql

# SFTP 에 사용할 Batch File 을 생성한다.

# 이 때, 위에서 언급한 SSH Key 를 사용해 자동 로그인되도록 한다. password 를 물으면 안되니까...

# 첫줄은 > 가 한개, 둘째줄은 > 가 두개 ( >> ) 임을 주의한다.

echo "cd dbTest" > mysftp.sh
echo "put ${DB_NAME}_$(date "+%Y-%m-%d_%H").sql" >> mysftp.sh
cat ./mysftp.sh

 

batch File 을 사용하여 업로드한다.

sftp -b ./mysftp.sh 192.168.15.25

=============================

아래는 내가 만든, 여러개의 DB 를 백업하는 쉘스크립트 예제이다.

 

#!/bin/sh

 

OPTIONS="-u root -pRootPassword --routines --extended-insert --quick --single-transaction"
BACKUP_DIR=/home/hahaite/MDB_Backup

DB_LIST="mydb_1"
DB_LIST="$DB_LIST mydb_2"
DB_LIST="$DB_LIST mydb_3"
DB_LIST="$DB_LIST mydb_4"

for DB_NAME in $DB_LIST
do
        mysqldump $OPTIONS $DB_NAME > $BACKUP_DIR/${DB_NAME}_$(date "+%Y-%m-%d_%H").sql
        echo "cd dbTest" > mysftp.sh
        echo "put ${DB_NAME}_$(date "+%Y-%m-%d_%H").sql" >> mysftp.sh
        cat ./mysftp.sh
        sftp -b ./mysftp.sh 192.168.15.25
done

 

♣ SFTP를 이용한 Database Backup 수행

위 스크립트는 내가 직접 실행하면 문제가 없지만 타이머에 의해서 실행되면 에러가 난다.

내가 직접 실행하면 내 계정으로 실행하는 것이지만,

타이머로 실행되면 root 계정으로 실행되기 때문이다.

 

이에 위 do ~ done 부분을 아래와 같이 수정하여 해결하였다.

-u 옵션에 내 계정(hahaite)를 지정해 주고, ssh private key 를 사용하여 백업서버에 접속하도록 하였다.

 

do
        mysqldump $OPTIONS $DB_NAME > $BACKUP_DIR/${DB_NAME}_$(date "+%Y-%m-%d_%H").sql
        echo "cd dbTest" > mysftp.sh
        echo "put ${DB_NAME}_$(date "+%Y-%m-%d_%H").sql" >> mysftp.sh
        cat ./mysftp.sh
        sudo -uhahaite sftp -i /home/hahaite/.ssh/hahaite -b $BACKUP_DIR/mysftp.sh 192.168.15.25

done

 

은근히 자주 쓰이는 Alter 명령어를 정리함.

아래 없는 내용은 계속 추가할 예정임.

 

앞에 my, old, new 가 붙은 건 사용자가 정의한 값이다.

 

♣ Primary Key 설정

Alter Table my_table Add constraint primary key (my_field) ;

 

♣ 열 삭제

Alter Table my_table Drop my_column ;

 

♣ 열 추가

(뒤에 열 type 은 맞게 수정해 준다)

Alter Table my_table Add new_column VARCHAR(32) ;

 (my_column 뒤에 new_column 을 추가함)

Alter Table my_table Add new_column VARCHAR(32) After my_column ;

 (맨 앞에 new_column 을 추가함)

Alter Table my_table Add new_column VARCHAR(32) First ;

 

 

♣ 열 이름 변경

(새 열 뒤에 type 이 추가돼야 함)

Alter Table my_table Change old_column new_column VARCHAR(32) ;

 

♣ 열 속성 변경

Alter Table my_table Modify my_column VARCHAR(32) ;

 

♣ AUTO_INCREMENT 열 재정렬

아래와 같이 하면 10번부터 입력이 되게 된다.

Alter Table my_table AUTO_INCREMENT=10 ;

 

♣ 인덱스에 새 항목 추가

Alter Table my_table ADD INDEX(my_column) ;

 

 

 

 

 

 

♣ 도움받은 사이트

 

♣ Open SSH Server 설치

2017년 후반 쯤에 Windows 10 에서 Open SSH Server Beta 버전을 지원하기 시작한 것 같다.

지금(18년 7월) 은 Beta 버전이 아닌 정식 버전으로 지원하고 있다.

베타버전과 정식 버전은 설정상 약간의 차이가 있으며, 현재 구글링해서 나오는 부분은 대부분 Beta 버전을 기준으로 설명하고 있다.

본 문서는 정식버전을 기준으로 설명한다. 

 

1. Windows 10 이 아니면 Windows 10 으로 업그레이드 한다.
   현재 (2018년 7월) Windows 10 에서 OpenSSH 설치를 제공하고 있다.
   이것저것 조사하고 설치해 본 후 내린 결론은, Windows 10 에서 제공하는 Open SSH Server를 서버를 설치하는게 정신건강에 이롭다.

 

2. 설정 -> 앱 -> 선택적 기능관리 -> 기능추가 -> OpenSSH 서버 선택하여 설치한다.

---------------------------------------------------------------------------

 

 

 

------------------------------------------------------------------------------

 

 

 

♣ OpenSSH Server 경로

C:\Windows\System32\OpenSSH 에 설치된다.

 

Beta 버전인 경우, SSH Key 를 직접 생성해야 했는데

현 버전은 OpenSSH 를 구동시키니 자동으로 생성되었다. 아래 경로에 키가 없으면 생성하는 듯 하다.

아래 경로는 시스템 경로이므로 탐색기에서 보기 -> 숨김항목을 체크해야 탐색기에 나타난다.

 

c:\ProgramData\ssh

 

authorized_keys 에는 인증받은 public key 가 저장되며 각 윈도우 계정 디렉토리의 .ssh 에 저장된다.

만약 윈도우 계정이 hahaite 라면,

 

C:\Users\hahaite\.ssh\authorized_keys

 

에 위치한다.

 

참고로,

.ssh 디렉토리는 앞에 점(dot) 이 있어 탐색기 -> 새폴더로 생성이 안된다.

이에 Dos 나 PowerShell 에서 "mkdir .ssh" 라고 명령어로 디렉토리를 생성하였다.

 

♣ OpenSSH Server 실행

PowerShell 을 관리자 모드로 실행한다.

 

 

 

PowerShell 에서,

Get-Service sshd 로 현재 OpenSSH 의 실행 여부를 확인할 수 있다.

 

아래 명령어로 실행, 중지, 재실행할 수 있다.

 

Start-Service sshd

Stop-Service sshd

Restart-Service sshd

 

 

♣ OpenSSH Server 접속

Linux 에선 아래와 같이 접속하여 OpenSSH 접속을 확인한다.

$ ssh hahaite@172.16.253.10

 

Windows 에선 Putty 를 사용하여 접속됨을 테스트하였다.

만약 putty 접속 때 아래와 같은 메시지가 나타나면,

(Disconnected: Server protocol violation: unexpected SSH2_MSG_UNIMPLEMENTED packet. )

 

 

아래와 같이 Putty -> 설정에서 Diffie-Hellman group 14 항목을 맨 위로 올린다.

 

 

 

 

 

 

 

 

 

 

공유기에 내 PC 와 잉여 노트북에 MariaDB 설치함.

C++ 기반 MariaDB API 를 포팅하고 for 문을 약 25만번 돌면서

select 를 날려 값이 중복되는지 체크하는, 복잡하지 않은 테스트였다.

 

노트북에서 테스트가 잘 되어 회사 서버(Ubunru) 에 설치하여 똑같이 테스트를 진행하는데

Lost connection to MySQL server during query.

가 뜨는 것이었다.

 

구글링해보니 이래저래 많은 해결책이 있어 금방 해결하겠다 싶었는데, 뭘 해도 해결이 안됨.

정말, 검색해서 나오는 건 다 해본듯 하다. 심지어 OS 문제인가 싶어 VirtualBox에 Ubuntu 14, 16도 설치해보고,

MariaDB Upgrade, Downgrade 도 해보고, 쿼리 사이에 Sleep 도 줘보고,

심지어 DB 연결 -> 쿼리 하나 전송 -> 연결해제 -> DB 연결 -> 쿼리 하나 전송 -> 연결 해제~~

이런 식으로도 테스트를 해 보았지만 위 증상은 여전했다.

 

♣ Error Log 체크

그러다 MariaDB 의 에러로그를 봤다.

[Warning] Aborted connection 16 to db: 'base_station' user: 'mesteam' host: '192.168.10.25' (Got an error reading communication packets).

 

혹시나 하고 위 error 내역으로 구글링을 진행하고 아래 사이트까지 가게 됨.

https://www.percona.com/blog/2016/05/16/mysql-got-an-error-reading-communication-packet-errors/

그야말로 이 이슈에 대해 할 수 있는 건 다 정리해 놓은 듯 했다.

그 중 tcpdump 를 떠 보라는 내용이 보여 MariaDB Server 에서 TCP Dump 를 실행하고 쿼리를 날려보았다.

 $ sudo tcpdump port 3306

 

♣ TCP Dump

그렇게, 양단이 쿼리와 ACK 를 다다다~ 주고 받다가, 위 증상이 나타났을 때 어~! 뭔가 이상함을 발견함.

14:16:57.598731 IP 192.168.10.25.51060 > 192.168.109.5.mysql: Flags [P.], seq 1860445:1860525, ack 3837097, win 251, length 80
14:16:57.598987 IP 192.168.109.5.mysql > 192.168.10.25.51060: Flags [P.], seq 3837097:3837262, ack 1860525, win 237, length 165
14:16:57.599944 IP 192.168.10.25.51060 > 192.168.109.5.mysql: Flags [P.], seq 1860525:1860605, ack 3837262, win 256, length 80
14:16:57.600200 IP 192.168.109.5.mysql > 192.168.10.25.51060: Flags [P.], seq 3837262:3837427, ack 1860605, win 237, length 165
14:17:49.661117 IP 192.168.109.5.mysql > 192.168.10.25.51060: Flags [P.], seq 9712582:9712747, ack 4709245, win 237, length 165
14:17:49.661515 IP 192.168.109.5.mysql > 192.168.253.200.51060: Flags [P.], seq 2639052253:2639052418, ack 1996360229, win 237, length 165
14:17:52.424828 IP 192.168.10.25.51060 > 192.168.109.5.mysql: Flags [P.], seq 4709165:4709245, ack 9712582, win 254, length 80
14:17:52.424854 IP 192.168.109.5.mysql > 192.168.10.25.51060: Flags [.], ack 4709245, win 237, options [nop,nop,sack 1 {4709165:4709245}], length 0
14:17:52.425088 IP 192.168.109.5.mysql > 192.168.253.200.51060: Flags [.], ack 1, win 237, options [nop,nop,sack 1 {4294967217:1}], length 0
14:17:56.205151 IP 192.168.109.5.mysql > 192.168.10.25.51060: Flags [P.], seq 9712582:9712747, ack 4709245, win 237, length 165
14:17:56.205610 IP 192.168.109.5.mysql > 192.168.253.200.51060: Flags [P.], seq 0:165, ack 1, win 237, length 165
14:18:02.025159 IP 192.168.10.25.51060 > 192.168.109.5.mysql: Flags [R.], seq 4709245, ack 9712582, win 0, length 0
 

192.168.109.5 : DB Server

192.168.10.25 : 회사에서 부여받은 내 IP -> 공유기에 세팅해서 사용함.

192.168.253.200 : 공유기에서 DHCP 로 할당한, 내 PC 의 IP.

 

즉 어느 시점에서 DB Server 가 공유기가 아닌, 내 PC 로 패킷을 날리기 시작한 것이다.

이것은, 공유기 문제?

 

그래서 공유기를 빼고 라인을 직접 내 PC 에 연결하여 테스트를 진행해 보았더니, 잘된다.

하아~~

 

공유기 설정문제인지, 공유기 자체 버그인지는 아직 모른다.

공유기를 다른 회사 제품으로 바꾸어 테스트해보니 이상없이 잘 돌아간다.

하~ 회사 이름을 밝힐 수도 없고... 일단 공유기를 교체하고 진행하자.

 

 

+ Recent posts