✔️ 모듈 사용

import pandas as pd
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager as fm
from sqlalchemy import create_engine
import urllib.parse

✔️ 추가 설정

np.set_printoptions(precision=3)            # 소수점 3번째 자리에서 반올림
pd.set_option('display.max_rows', None)     # Row 생략없이 출력
pd.set_option('display.max_columns', None)  # Column 생략없이 출력
pd.set_option('display.max_colwidth', None) # 컬럼의 내용이 길어도 생략없이 출력
pd.set_option('display.width', None)
pd.set_option('display.float_format', '{:.5f}'.format) # 8.500000e+01 이런 형식의 지수표현을 하고 싶지 않을 경우

 

✔️ DB 접속 및 쿼리 실행

# DB 접속 객체 생성
sqlEngine = create_engine("mysql+pymysql://root:Qwer1234%21%40%23%24@10.240.71.71:25000", encoding='utf8', pool_recycle=3600)
dbConnection = sqlEngine.connect()   # DB 접속
user_data = pd.read_sql("select * from a209.user_info where user_id = 'a209' ", dbConnection); # 쿼리 실행
dbConnection.close() # 접속 종료

 

Jupyter notebook에 이미지를 추가하는 방법입니다. (Jupyter notebook 버전 6.4.8)

 

1. 코딩으로 이미지 출력

명령창은 Code로 설정하고 아래와 같이 입력 후 실행하면 화면에 이미지가 표시됩니다..

코딩창이 보이기에 이쁘지는 않습니다.

from IPython.display import Image
Image('images/방수어사_라온테크_min.jpg')

 ✔️ 아래는 출력 결과입니다.


2. markdown으로 이미지 출력 - 1

코딩창을 Markdown으로 설정 후 아래와 같이 입력후 실행하시면 코딩영역 없이 이미지를 화면에 출력합니다.

# Markdown으로 설정 후 실행하면 이미지가 출력됩니다.
![nn](images/방수어사_라온테크_min.jpg)

 ✔️ 출력 결과

 

3. markdown으로 이미지 출력 - Img 태그 사용

# Markdown에서 이미지 태그를 사용할 수 있고 스타일도 정의할 수 있습니다.
<img src="Images/방수어사_라온테크_min.jpg" style='margin-left:20px; width:700px; height:200px'>

✔️ 출력 결과

 

⭐ 본 이미지는 동생 창업기념으로 제가 레이저로 나무에 각인한 작품입니다.

Jupyter Notebook QHD 해상도의 모니터에서는 최대 화면으로 실행하게되면 좌우 여백이 너무 넓어서 불편합니다.

아래 경로의 파일에서

C:\ProgramData\Anaconda3\Lib\site-packages\notebook\static\style\style.min.css

아래와 같이 수정 후 페이지를 새로고침 하시면

@media (min-width: 1200px) {
  .container {
    /* width: 1140px; -- 기존 코드는 주석처리 */ 
	width: 98%;  /* 가로폭의 98% 가득 차도록 설정 */
  }
}

코딩 영역이 가로폭에 꽉 차서 표시됩니다.

 

외부 인터넷 접속이 되지 않는 환경에서  모듈을 설치하는 방법 입니다.

자주 사용하는 MySQL 모듈을 기준으로 설명드리겠습니다. 

1. https://pypi.org/ 사이트에 접속하여 다운받을 모듈과 버전 정보를 결정합니다.

    - https://pypi.org/project/PyMySQL/

    - https://pypi.org/project/PyMySQL/#history 버전 정보를 확인합니다.

 

2.  cmd를 실행하여 아래와 같이 모듈 정보를 입력합니다.

pip download -d ./ PyMySQL==1.0.1

    위와 같이 실행시 SSL  오류가 발생하며 다운로드가 안된다면 아래와 같이 실행합니다.

pip --trusted-host pypi.org --trusted-host files.pythonhosted.org download -d ./ PyMySQL

 

    - 버전을 명시하지 않을 경우 최신 버전이 다운로드 됩니다.

 

3. 파일을 폐쇄망으로 이동시킵니다.

 

4. 아래 명령어를 통해서 다운받은 모듈을 설치합니다.

pip install --no-index --find-links=./ PyMySQL          << 특정 위치의 모듈을 설치할 경우

pip install --no-index --find-links=./ PyMySQL==1.0.2   << 특정 버전의 모듈을 설치할 경우

pip install --no-index PyMySQL                          << 모듈이 위치한 폴더에서 실행할 경우

 

5. 설치된 모듈과 버전 정보를 확인합니다.

pip list

파일명 혹은 변수에 '-'가 제거된 날짜값을 사용하게 되는데(20220715)

날짜 형식으로 변환할 때 MySQL 에서는 str_to_date 함수를 사용할 수 있습니다.

%Y 4자리 년도 %T hh:mm:ss
%y 2자리 년도 %r hh:mm:ss AM/PM
%m 2자리 월(01, 02, 10, 11 ...) %M 월 (영문 전체 March, July ...)
%c 월(1, 2, 10, 11 ...) %b 월 (영문 축약 Mar, Jul ...)
%d 2자리 일(01, 01, 10, 11 ...) %W 요일 (영문 전체 Monday, Thursday ...)
%e 일(1, 2, 10, 11 ...) %a 요일 (영문 축약 Mon, Thu ...) 
%H 24시간제 시간    
%l 12시간제 시간    
%i 2자리 분 (05, 15 ...)    
%S 2자리 초 (05, 15 ...)    

사용 방법은 위 포맷을 참고하여 아래와 같이 사용해 주시면 됩니다.

하지만 아래와 같이 31을 넘어가는 날짜가 입력되면 null을 출력하지만 

4월31을 입력할 경우 4월30일 에서 하루 지난 5월1일을 출력하는 오류가 있습니다.

-- MySQL 5.7.37 / MySQL 8.0.23 / MariaDB 10.1.48 모두에서 아래와 같이 출력 됩니다.

select str_to_date(20220230, '%Y%m%d');   -- 2022-03-02 출력 (Error: 22년 2월은 28일 까지만 존재)
select str_to_date(20220430, '%Y%m%d');   -- 2022-04-30 출력
select str_to_date(20220431, '%Y%m%d');   -- 2022-05-01 출력 (Error: 4월은 30일 까지만 존재함)
select str_to_date(20220432, '%Y%m%d');   -- null 출력
select str_to_date(20220531, '%Y%m%d');   -- 2022-05-31 출력
select str_to_date(20220532, '%Y%m%d');   -- null 출력

입력된 날짜의 무결성이 중요하다면 함수를 만들어 사용하는 것이 좋을 것 같습니다.

쿼리창에서 괄호를 열때 자동으로 닫음이 추가되어 불편하신 분들은 아래 옵션을 해제하시면 됩니다.

Editor > General > Smart Keys 메뉴에 들어가셔서.

✳️ 첨부 파일은 Visual Studio 2017 프로젝트 파일입니다.

Python_Windows_Service.7z
0.09MB

Python으로 제작한 프로그램을 Windows Service로 만드는 가장 확실한 방법 입니다. 

준비물 : 

1. nssm : https://nssm.cc/download

 

NSSM - the Non-Sucking Service Manager

NSSM - the Non-Sucking Service Manager Windows 10, Server 2016 and newer 2017-04-26: Users of Windows 10 Creators Update or newer should use prelease build 2.24-101 or any newer build to avoid an issue with services failing to start. If for some reason you

nssm.cc

➔ 테스트 Project 파일과 함께 첨부해 놓았으나 최신 버전이 필요하시면 위 링크에서 다운로드 하시면 됩니다.

 

Service 등록 절차

✔️ Python 예제 프로그램

#_*_ coding: utf-8 _*_
import os
import sys
import time
import logging
from datetime import datetime, timedelta

def init():
    current_directory = os.path.dirname(os.path.realpath(__file__)) # .py 파일 위치
    current_log_directory = os.path.join(current_directory, "Log")  # 생성할 로그 폴더
    try:
        if not os.path.exists(current_log_directory):   # 로그 폴더 존재여부 검사
            os.makedirs(current_log_directory)          # 폴더 생성
    except OSError:
        print('----------------- Error -----------------')
        return -1

    # 로그파일 설정
    now_date_str = datetime.now().strftime('%Y%m%d_%H%M%S') # 현재 시간을 파일명으로 사용
    errorlogfilename = os.path.join(current_log_directory , "Log_%s.log" % (now_date_str))  # 로그파일의 전체 경로

    # 로그파일 생성
    logging.basicConfig(
        filename=errorlogfilename, 
        level=logging.DEBUG, 
        format='[%(asctime)s][%(name)s][%(levelname)s] - %(message)s'
    )
    return 1

def main():

    # 1초마다 로그파일에 현재 시간을 기록
    for i in range(10):
        out_message = "Now Time : %s" % (datetime.now().strftime('%Y-%m-%d_%H:%M:%S'))
        logging.info("Now Time : %s" % (out_message))
        print("Now Time : %s" % (out_message))
        time.sleep(1)

    return

if __name__ == '__main__':
    if (init() >= 1):
        while True:
            main()
            time.sleep(10)  # 10초마다 main() 함수 실행
    else:
        print("Exit")

✔️ 관리자 권한으로 CMD를 실행하여 nssm이 보관된 폴더로 이동합니다.

✔️ nssm install [서비스명]을 입력합니다.

 

✔️ Path : Python 실행파일을 선택합니다. (Startup directory는 자동으로 채워집니다.)

     ex) C:\Users\kirum\AppData\Local\Programs\Python\Python39\python.exe

✔️ Arguments : xxxx.py 파일을 전체 경로를 입력합니다.

     ex) D:\T\Python_Windows_Service\Python_Windows_Service\Python_Windows_Service.py

✔️ Install service 클릭

 

✔️ 정상적으로 Service가 등록되었으며 시작/중지 모두 정상적으로 작동합니다.

Nifi 를 Windows Service로 등록 및 운용하는 방법입니다. 

Python Flask 프로그램의 경우도 동일한 방법으로 Service로 등록할 수 있습니다.

http://nssm.cc/

 

NSSM - the Non-Sucking Service Manager

NSSM - the Non-Sucking Service Manager nssm is a service helper which doesn't suck. srvany and other service helper programs suck because they don't handle failure of the application running as a service. If you use such a program you may see a service lis

nssm.cc

- 저장한 NSSM 압축 파일의 압축을 해제합니다.

 

Nifi 서비스 등록 방법

1. 관리자 권한으로 CMD를 실행

2.  nssm 설치폴더 에서 nssm install [서비스명] 형태로 실행

3. 설정화면이 표시되면 Path의 선택버튼을 눌러 run-nifi.bat 파일을 선택

4. Install service 버튼을 눌러 서비스 등록 완료

5. 서비스 등록 확인

6. 서비스 관리자 에서는 nssm.exe를 실행하는것으로 보이지만 [레지스트리 편집기]를 보시면 nssm에 파라메터를 등록하여 nifi를 실행하고 있는것을 확인할 수 있습니다.

PC 재시작 / 서비스관리자를 통한 서비스 실행/중지 모두 정상적으로 동작하는것을 확인하였습니다.

 

Python Flask 웹 프로그램의 경우도 Python 파일을 실행하도록 xxx.bat 파일을 만들고

nssm으로 해당 xxx.bat 파일을 실행하도록 등록하면 됩니다.

'기타' 카테고리의 다른 글

[배터리] 18650 vs 14500 규격(사이즈)  (0) 2023.03.12
[가죽] 프레스  (0) 2023.03.10
Zotac egpu 와 2018 LG gram 연결 정보  (0) 2021.01.08
마우스 스위치 모음  (0) 2020.02.15
MAC PowerPoint 및 Word 의 탭 간격 조정 방법  (0) 2016.02.26

레드마인의 검색 기능에서 검색된 결과들은 클릭시 동일 탭에서 표시됩니다.

일반 일감의 경우는 크게 상관이 없으나 

보통 검색 작업은 검색 -> 항목 클릭 -> 내용 확인 -> 다른 검색 결과 항목 클릭 -> 내용 확인을

반복하게 되는데 이때 항목을 클릭했을 때 내용이 별도 탭으로 표시되면

재 검색하는 시간이 감소 합니다.

우클릭 / [새 탭에서 링크 열기] 메뉴를 사용해도 되지만 이를 깜박 잊고 클릭하게 되면 검색 페이지를 벗어났기 때문에

뒤로 가기로 검색시 첫 페이지 부터 표시되는 불상사가 발생합니다.

 

아래와 같이 레드마인 소스를 수정 및 적용하게 되면 검색 결과의 모든 링크는 

클릭시 자동으로 별도 탭에 표시 됩니다. 

 

- 레드마인 : 4.2.3 버전을 기준으로 설명 드립니다. (다른 버전도 파일명 위치 등이 비슷하기 때문에 이 글을 참고로 쉽게 수정하실 수 있습니다.)

- 레드마인의 설치 경로는 C:\Bitnami\redmine-4.2.3-3 라고 가정하겠습니다. 

1. C:\Bitnami\redmine-4.2.3-3\apps\redmine\htdocs\app\views\search\index.html.erb  파일을 메모장으로 열어

2.  link_to 함수에 아래와 같이 , :target => "_blank" 키워드를 추가 합니다.

<% if @results %>
    <div id="search-results-counts">
      <%= render_results_by_type(@result_count_by_type) unless @scope.size == 1 %>
    </div>
    <h3><%= l(:label_result_plural) %> (<%= @result_count %>)</h3>
    <dl id="search-results">
      <% @results.each do |e| %>
        <dt class="<%= e.event_type %> icon icon-<%= e.event_type %>">
          <%= content_tag('span', e.project, :class => 'project') unless @project == e.project %>
          <%= link_to(highlight_tokens(e.event_title.truncate(255), @tokens), e.event_url, :target => "_blank") %>
        </dt>
        <dd><span class="description"><%= highlight_tokens(e.event_description, @tokens) %></span>
        <span class="author"><%= format_time(e.event_datetime) %></span></dd>
      <% end %>
    </dl>
<% end %>

3.  redmineThin 서비스 2개를 모두 재시작 합니다.

4. 검색 결과에 target="_blank" 키워드가 추가된것이 보입니다.

 

5. 이제 검색된 결과의 항목을 클릭하게 되면 별도 탭으로 해당 게시물이 열립니다.

Tencent 공식 문서 : https://tendbcluster.net/book-en/

설치 필요 사항

(1) Docker 설치

  1. yum 패키지 업데이트

      $ yum -y update

  2. yum-utils 설치

      $ sudo yum install -y yum-utils

  3. Docker 저장소 등록

      $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  4. Docker 버전 조회

      $ yum list docker-ce --showduplicates | sort -r

  5. 특정 버전의 Docker 설치

      $ sudo yum install docker-ce-20.10.7-3.el7 docker-ce-cli-20.10.7-3.el7 containerd.io

  6. 버전 확인

      $ docker --version

  7. 서비스 시작

      $ systemctl start docker

      $ systemctl enable docker

      $ systemctl status docker

 

(2) Docker-compose 설치

  1. 설치 버전 확인

      https://github.com/docker/compose/tags

      https://github.com/docker/compose/releases/tag/1.27.4

  2. usr/local/bin 폴더에 다운로드

  $ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

  3. 실행 권한 부여

      $ sudo chmod +x /usr/local/bin/docker-compose

  4. 심볼링링크 설정
      $ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

  5. 버전 확인

      $ docker-compose --version

(3) helm 설치

  1. 설치할 버전 확인

      https://github.com/helm/helm/releases?page=3

  2. 다운로드

      $ wget https://get.helm.sh/helm-v2.17.0-linux-amd64.tar.gz

  3. 압축 해제

      $ tar xvzf helm-v2.17.0-linux-amd64.tar.gz

  4. 파일 이동

      $ sudo cp linux-amd64/tiller /usr/local/bin

      $ sudo cp linux-amd64/helm /usr/local/bin

  5. 권한 설정

      $ sudo chown root:docker /usr/local/bin/tiller

      $ sudo chown root:docker /usr/local/bin/helm

  6. 심볼릭 링크 설정
      $ sudo ln -s /usr/local/bin/helm /usr/bin/helm
      $ sudo ln -s /usr/local/bin/tiller /usr/bin/tiller

 

  7. 버전 확인

      $ helm version

      $ tiller --version

 

(4) Tendbcluster 도커 설치

  1. 환경설정파일 다운로드

      $ sudo curl -L "https://github.com/TenDBCluster/TenDBCluster-DockerCompose/archive/refs/heads/master.zip" -o tendbcluster-docker-compose.zip

  2. 압축 해제

      $ unzip tendbcluster-docker-compose.zip

  3. 폴더명 변경

      $ mv TenDBCluster-DockerCompose-master/ tendbcluster-docker-compose/

  4. Docker 이미지 다운로드

      $ cd tendbcluster-docker-compose && docker-compose pull

  5. 이미지 마운트

      $ docker-compose up -d

  6. 상태 조회

      $ docker ps -a

  7. 노란색 영역의 Port 번호로 MySQL 접속 테스트 

 

✳️ Tspider 가 설치된 CentOS 7 이미지 공유(VmWare)

OS : CentOS7OS

접속 정보 : root / Qwer1234!@#$ , tspider / Qwer1234!@#$

Tspider 접속 정보 : tendbcluster / tendbclusterpass

Google Drive : https://drive.google.com/file/d/17AnTdSycpYfAJDCXOF2uz_XwwZQXeDqL/view?usp=sharing

파일 용량 정보 : 

  - 압축 : 2.5 GB

  - 압죽 해제 : 10.9 GB

'Database & Data > Tspider' 카테고리의 다른 글

(1) 텐센트의 TSpider 소개  (2) 2021.01.03

데이터를 모으고 DB화하여 공유하는게 취미 입니다.

이번에는 다음 사이트에서 확인 가능한 대한민국 환율정보를 모아봤습니다.

✳️ MySQL DB에 저장 후 백업 파일로 공유드립니다.

https://finance.daum.net/exchanges/FRX.KRWUSD

 

 

환율 상세 | 다음 금융

 

finance.daum.net

✅ 일자별 환율 정보를 DB에 저장

 

✅ 대상 국가

currencyCode item_count min_date max_date nation_name
AED 3837 2006-01-02 2021-06-18 아랍에미리트
AUD 3837 2006-01-02 2021-06-18 호주
BDT 3837 2006-01-02 2021-06-18 방글라데시
BHD 3837 2006-01-02 2021-06-18 바레인
BND 3837 2006-01-02 2021-06-18 브루나이
BRL 3806 2006-01-02 2021-06-18 브라질
CAD 3817 2006-01-02 2021-06-18 캐나다
CHF 3837 2006-01-02 2021-06-18 스위스
CNY 3827 2006-01-02 2021-06-18 중국
CZK 1884 2013-11-01 2021-06-18 체코
DKK 3820 2006-01-02 2021-06-18 덴마크
EGP 3837 2006-01-02 2021-06-18 이집트
EUR 3837 2006-01-02 2021-06-18 유로
GBP 3836 2006-01-02 2021-06-18 영국
HKD 3837 2006-01-02 2021-06-18 홍콩
HUF 3311 2007-06-01 2021-06-18 헝가리
IDR 3837 2006-01-02 2021-06-18 인도네시아
ILS 3673 2006-01-02 2021-06-18 이스라엘
INR 3817 2006-01-02 2021-06-18 인도
JOD 3653 2006-01-02 2021-06-18 요르단
JPY 3837 2006-01-02 2021-06-18 일본
KWD 3837 2006-01-02 2021-06-18 쿠웨이트
KZT 1884 2013-11-01 2021-06-18 카자흐스탄
MNT 1884 2013-11-01 2021-06-18 몽골
MXN 3837 2006-01-02 2021-06-18 멕시코
MYR 3830 2006-01-02 2021-06-18 말레이시아
NOK 3837 2006-01-02 2021-06-18 노르웨이
NZD 3830 2006-01-02 2021-06-18 뉴질랜드
PHP 3837 2006-01-02 2021-06-18 필리핀
PKR 3827 2006-01-02 2021-06-18 파키스탄
PLN 3321 2007-06-01 2021-06-18 폴란드
QAR 1884 2013-11-01 2021-06-18 카타르
RUB 3462 2006-11-08 2021-06-18 러시아
SAR 3837 2006-01-02 2021-06-18 사우디
SEK 3837 2006-01-02 2021-06-18 스웨덴
SGD 3837 2006-01-02 2021-06-18 싱가포르
THB 3837 2006-01-02 2021-06-18 태국
TRY 1884 2013-11-01 2021-06-18 터키
TWD 3816 2006-01-02 2021-06-18 대만
USD 3837 2006-01-02 2021-06-18 미국
VND 3485 2006-09-29 2021-06-18 베트남
ZAR 3455 2006-11-17 2021-06-18 남아공

✅ 기간 : 2006-01-02 ~ 2021-06-18

✅ MySQL 백업 파일

db_exchange_rate_backup_20210619.7z
2.61MB

DataGrip 을 사용하다 보면 다양한 편의성 및 기능으로 인해 편리한 경우도 있지만, 의외로 불편한 경우도 많습니다. 

sp/함수 인자의 이름이 표시되는 아래 기능이 그런 경우가 아닐까 싶습니다. 

우측 설정시/비 설정시 이미지를 보시고 어떤 기능인지 확인해 보시면 될것 같습니다. 

기본은 활성화 입니다.

Autohotkey 에서 창 크기 조정 단축키 코드 입니다.

가로 세로를 아래 코드를 응용하시면 됩니다. 

본인은 Ctrl + Shift + Left/Right 단축키를 줄선택으로 정의해 놓아서 창 크기 조정은 정의하지 않았습니다.

; 활성창의 높이를 증가
^+Down::
	; 활성창 타이틀 조회
	WinGetActiveTitle, title
	; 활성창 위치,크기 조회
	WinGetPos, x, y, Width, Height, %title%
	; 활성창의 크기 조정
	WinMove, %title%, , x, y, Width, Height + 20
	Return
	
; 활성창의 높이를 축소	
^+Up::
	; 활성창 타이틀 조회
	WinGetActiveTitle, title
	; 활성창 위치,크기 조회
	WinGetPos, x, y, Width, Height, %title%
	; 활성창의 크기 조정
	WinMove, %title%, , x, y, Width, Height - 20
	Return

AutoHotKey 소스코드 입니다.

; 활성창을 해당 모니터 영역의 좌측 1/2영역에 배치
^+1::
	WinGetActiveTitle, title
	WinGetPos, x, y, Width, Height, %title%
	SysGet, MonitorCount, MonitorCount
	Loop, %MonitorCount%
	{
		SysGet, Monitor, Monitor, %A_Index%
		SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%
		if (MonitorWorkAreaLeft < MonitorWorkAreaRight){
			half_width := (MonitorWorkAreaRight - MonitorWorkAreaLeft) / 2
		}
		else {
			half_width := (MonitorWorkAreaLeft - MonitorWorkAreaRight) / 2
		}
		if ( x >= MonitorWorkAreaLeft && x < MonitorWorkAreaRight )
		{
			;MsgBox, 'Target Monitor NO: ' %A_Index%
			WinMove, %title%, , MonitorLeft, MonitorTop, half_width, MonitorWorkAreaBottom
			Break
		}
	}
	return

; 활성창을 해당 모니터 영역의 우측 1/2영역에 배치
^+2::
	WinGetActiveTitle, title
	WinGetPos, x, y, Width, Height, %title%
	SysGet, MonitorCount, MonitorCount
	Loop, %MonitorCount%
	{
		SysGet, Monitor, Monitor, %A_Index%
		SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%
		if (MonitorWorkAreaLeft < MonitorWorkAreaRight){
			half_width := (MonitorWorkAreaRight - MonitorWorkAreaLeft) / 2
		}
		else {
			half_width := (MonitorWorkAreaLeft - MonitorWorkAreaRight) / 2
		}
		if ( x >= MonitorWorkAreaLeft && x < MonitorWorkAreaRight )
		{
			;MsgBox, 'Target Monitor NO: ' %A_Index%
			WinMove, %title%, , MonitorLeft + half_width, MonitorTop, half_width, MonitorWorkAreaBottom
			Break
		}
	}
	return

15년간 항상 가벼운 노트북만

(노트북을 항상 가지고 다니며 업무와 개인 취미 생활(코딩, 크롤링 등)을 하다보니)

사용하다보니 게임을 못하는건 차지하고라도

아이들 동영상 편집하는 것도 버벅여서 힘들었습니다.

제가 LG gram을 2018년에 구매하고 2019년 후반인가? LG gram 사은품으로 Zotac egpu를 주더라고요,

각종 sns의 설명으로는 2019년 제품부터 지원한다고 하는데

제 노트북이 썬더볼트도 지원하는데 정말 안될까? 하지만 테스트해볼 곳도 없어 1~2년을 망설였습니다.

물론 여러 게시물에 보면 호환성이 나쁘다는 말도 많았고요,

돈 버린다 생각하고 질렀습니다.

결과는 대 만족

발로란트 & 녹스 에뮬레이터 1대 를 월활하게 구동 가능 하더군요.

혹시 구매 의향이 있으나 선능 및 연결이 어떻게 되는지 궁금해 하실 분들을 위해서 

제 노트북 및 그래픽 카드 정보 & 연결 정보 공유 합니다.

설치
연결 정보

TSpider 는 MariaDB의 Spider 엔진을 기반으로 텐센트에서 기능을 추가하여 수정한 엔진 입니다.

Spider 에 대한 자세한 설명은 : https://rastalion.me/spider-%EC%97%94%EC%A7%84%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%83%A4%EB%94%A9-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95-01/

 

SPIDER 엔진을 이용한 샤딩 환경 구축 #01 - RastaLion's IT Blog

  Spider 엔진? Spider 스토리지 엔진은 샤딩 기능이 내장 된 스토리지 엔진입니다. 파티셔닝 및 xa 트랜잭션을 지원하며 다른 MariaDB 인스턴스의 테이블을 마치 동일한 인스턴스에있는 것처럼 처리

rastalion.me

 

Spider 와 달리 TSpider에서는 샤드키를 정의하기위해 CRC32()함수를 사용할 수 있다는 점이 큰 차이점 입니다.

crc32 함수를 통하여 문자형 컬럼도 샤드키로 사용할 수 있습니다.

Spider TSpider

 

 

 

 

또한 tdbcl 을 통하여 TSpider DB에서 일반적은 Create 구문을 실행하면 tdbcl이 자동으로 Spider 구문으로 변경하여

Spider DB에 테이블을 생성하며, 또한 자동으로 각 node 에 도 동일한 구조의 테이블을 생성 합니다.

이후 Spider DB에서 조회 쿼리등을 실행하여 됩니다.

자세한 사항은 아래 주소의 공식 문서를 참고하시면 됩니다.

✔ TenDB Cluster(TSpider) 공식 문서 : tendbcluster.net/book-en/

 

Introduction · TenDB Cluster Manual

No results matching ""

tendbcluster.net

TenDB Cluster 구성도

TSpider 구성도

 

다음으로는 TendbCluster(TSpider)를 Docker 환경으로 구축하는 방법을 설명 드리겠습니다.

단일 PC에 동일 버전의 MySQL(MariaDB)을 2개 설치하기 위해서는 Installer 파일로는 설치가 되지 않습니다.

그럴경우 직접 기존 설치된 폴더를 복사하여 MySQL을 구동하는 방법을 설명 드리겠습니다.

현재 제 노트북에는 MySQL 이 2개 , MariaDB 가 2개 설치되어 있습니다.

이 중 MySQL 8.0버전의 DB를 하다 더 설치 및 구동해 보겠습니다.

 

1. MySQL Server 8.0 설치 & 데이터 폴더 복사

  - 총 2개 폴더를 복사하여 다른 이름으로 붙여넣기 해주셔야 합니다.

  - 저는 _Sub_1 으로 복사하겠습니다.

    ✔ 프로그램 폴더

원본 복사
c:\Program Files\MySQL\MySQL Server 8.0\ c:\Program Files\MySQL\MySQL Server 8.0_Sub_1\

    ✔ 데이터 폴더

원본 복사
c:\ProgramData\MySQL\MySQL Server 8.0\  

 

2. 복사한 데이터 폴더의 my.ini 수정

    ✔ port, report_port, datadir, basedir 항목의 값을 변경합니다. 4개 항목 외 기존 경로 및 port가 지정된 항목은 함께 수정해 주어야 합니다.

원본 복사

 

3. MySQL Install 명령어 실행 & 서비스 등록

    ✔ 복사한 프로그램 폴더로 이동하여 아래와 같이 Install 명령 실행

    ✔ [복사한프로그램폴더\bin\mysqld.exe] --install  [서비스명] --defaults-file="복사한 데이터 폴더의 ini파일"

    ✔ Ex:  "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe" --install MySQL57_25000 --defaults-file="F:\MySQL\MySQL Server 5.7_25000\my.ini"

  • 위에서 입력한 서비스명으로 서비스탭에 등록 됩니다.
  • 반드시 관리자 권한으로 CMD를 실행하셔야 서비스가 정상 등록됩니다.
  • 꼭 복사한 프로그램폴더의 mysqld 실행 파일의 경로를 명시해 주시길 바랍니다.

 

4. 서비스 시작

    ✔ 서비스 탭에서 시작 버튼을 눌러 주시면 됩니다.

설명에 사용한 MySQL 버전 : 5.7.20

 

1. Scheduler 확인

show global variables like '%schedule%';

사용 가능할 경우 ON, 그렇지 않을 경우 OFF 로 표시 됩니다.

1-1. Scheduler 사용 설정

   ini를 수정하게 되면 MySQL 을 재시작 해주어야 합니다. 그렇지 않을 경우 ini 수정 후 set global 명령어를 통해서

   수동으로 설정을 변경해 주시면 됩니다. 추후 재시작 하게되면 그때부터는 ini의 설정에 따라서 동작 하게 됩니다.

    ini 에 아래 구문을 추가합니다. 

event_scheduler = 1

혹은 

event_scheduler = ON

   "1" 이나 "ON" 이나 동일하게 동작(설정) 됩니다.

1-2. Process 확인

show processlist;

 Scheduler 설정을 정상적으로 완료하였을 경우 아래와 같이 event_scheduler 데몬이 접속 중임이 확인 됩니다.

 

2. Schedule 생성

  ◈ Schedule 은 DB에 종속되기에 명령을 실행할 DB가 선택된 상태에서 생성해야 합니다.

DROP EVENT IF EXISTS `calc_ranking`;
DELIMITER $
CREATE EVENT IF NOT EXISTS `calc_ranking`
ON SCHEDULE
	EVERY 5 HOUR                  -- 5시간 마다 실행 (사용 가능 형식: second, minute, day)
	STARTS '2020-01-01 00:00:00'  -- 지정하지 않을 경우 현재 시간부터 5시간 경과 후에 첫 스케줄러가 동작됨
ON COMPLETION PRESERVE
ENABLE
COMMENT 'calc_profile_ranking'
DO 
BEGIN
    call test_procedure(1);
    UPDATE tbl_test set action_status = 1;
END$
DELIMITER ;

  - 매일 5시에 실행되는 작업을 만들고 싶을 경우 ON SCHEDULE 부분을 아래와 같이 수정 합니다.

ON SCHEDULE
	EVERY 1 DAY                   -- 하루에 한번
	STARTS '2020-01-01 05:00:00'  -- 기준 시각이 05시 이기 때문에 매일 5시에 스케줄러 실행

  - 특정 문서의 경우 매일 특정 시간에 실행되는 스케줄을 등록하기 위해 아래와 같은 구문을 사용하는데

그럴 필요 없이 과거 날짜의 특정 시간을 시작시간으로 설정하면 해당 시간 을 기준으로 하루에 한번 실행 됩니다.

STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR)

 

3. Schedule 확인

  ◈ Schedule 은 DB에 종속되기에 명령을 실행할 DB가 먼저 선택되어 있어야 합니다.

SHOW EVENTS;	-- 현재 선택된 DB에 등록된 Schedule을 조회 합니다.
or
SELECT * FROM information_schema.EVENTS;  -- 모든 DB에 등록된 설정을 조회 합니다.

SHOW EVENTS
SELECT * FROM information_schema.EVENTS

- Schedule 등록 스크립트를 확인하실 수 있습니다.

SHOW CREATE EVENT `Schedule Name`;
SHOW CREATE EVENT `calc_ranking`;

- Create Event 컬럼의 내용은 아래와 같습니다.

CREATE DEFINER=`root`@`%` EVENT `calc_ranking` 
ON SCHEDULE EVERY 5 HOUR STARTS '2020-01-01 00:00:00' 
ON COMPLETION PRESERVE ENABLE COMMENT 'calc_profile_ranking' 
DO BEGIN
    call test_procedure(1);
    UPDATE tbl_test set action_status = 1;
 END

 

4. 삭제

DROP event `이벤트명`;
DROP EVENT `calc_ranking`;

 

이상 입니다.

특정 테이블의 조회 결과(대량 ROW)를 파일로 저장하고

저정된 결과 파일을 다시 DB(Table)로 저장하는 방법 입니다.

대량의 Row(수백 MB)이기 때문에 쿼리를 통한 Insert가 아닌 load data 명령을 통해 수행 합니다.

  대상 테이블 구조

tbl_user_mode_score

 

  다량의 조회 결과를(1000만건) 파일로 저장하는 쿼리 입니다.

select * from tbl_user_mode_score limit 10000000
INTO OUTFILE 'e:\query_result_1000man.txt'
FIELDS TERMINATED BY '\t'
ENCLOSED BY ''
LINES TERMINATED BY '\n';

  - 조회 결과는 아래와 같습니다. (Field 와 Field 는 탭으로 구분)

Row 수: 1000만건, 시간: 7.203 sec, 파일 크기: 367 MB

 

 

 위 조회 결과를 별도 Table에 저장하는 방법 입니다.

    1. 데이터를 저장할 DB에 조회 내용과 동일한 구조의 테이블을 생성 합니다.

    2. cmd 창에서 mysql 콘솔에 접속 합니다.

    3. 아래 명령어를 실행하여 데이터를 입력 합니다.

load data infile 'e:/query_result_1000man.txt' into table tbl_user_mode_score ( usn, mode_idx, win_cnt, lose_cnt, last_play_date ) ;

    - 입력 완료시 메시지 : 입력 건수 및 오류 상황이 표시 됩니다.

Row 수: 1000만건, 시간: 1 min 6.337 sec

 

이상 입니다.

Oracle 과 MSSQL에 있는 DB Link 서비스를 MySQL에서 지원하는 FEDERATED 엔진을 이용하여 구현하는 방법 입니다.


1. 설치되어 있는 엔진 확인

  - CentOS에서 yum 으로 설치했을때 기본적으로 사용 가능한 엔지들의 목록 입니다.

2. 엔진을 사용할 수 있도록 설치

 

3. FEDERATED 엔진의 설치여부 확인

  - FEDERATED 엔진이 목록에 표시되지만 사용 가능하지 않은 상태 입니다.


4. 엔진 사용 가능 하도록 my.cnf 수정

  - [mysqld] 하위에  federated 항목을 추가 합니다.


5. 엔진의 상태를 확인 합니다.

 - FEDERATED 엔진의 Support 상태가 YES 로 변경 되었습니다.


----------------------------- FEDERATED 엔진을 사용하여 테이블을 생성하여 원격지 테이블과 연결 -------------------------

1. 원격지에 테이블을 생성 합니다.

- 실제 데이터가 입력되는 테이블 입니다.

- 데이터 폴더에는 .frm(구조) / .ibd(데이터) 파일이 생성 됩니다.

CREATE TABLE `cityholic_db`.`cart_product` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '아이디',

  `users_id` bigint(20) unsigned NOT NULL COMMENT '고객아이디',

  `product_id` bigint(20) NOT NULL COMMENT '상품아이디',

  `option_code` varchar(50) NOT NULL COMMENT '상품옵션코드',

  `quantity` int(11) NOT NULL DEFAULT '0' COMMENT '상품 개수',

  PRIMARY KEY (`users_id`,`product_id`,`option_code `),

  UNIQUE KEY `id_UNIQUE` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='카트에 담긴 상품';


◈ 만약 원격지 DB의 비밀번호에 특수문자'@' 를 사용하는 경우 2번 방식으로는 테이블을 생성할 수 없으니

     2번을 제외하고 3번 항목부터 진행해 주시면 됩니다.


2. 로컬에 테이블을 생성 합니다.

 - 원격지의 테이블을 참조하기 위한 테이블 입니다

 - 데이터 폴더에는 .frm(구조) 파일만 생성 됩니다.

CREATE TABLE `cityholic_db`.`cart_product` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '아이디',

  `users_id` bigint(20) unsigned NOT NULL COMMENT '고객아이디',

  `product_id` bigint(20) NOT NULL COMMENT '상품아이디',

  `option_code` varchar(50) NOT NULL COMMENT '상품옵션코드',

  `quantity` int(11) NOT NULL DEFAULT '0' COMMENT '상품 개수',

  PRIMARY KEY (`users_id`,`product_id`,`option_code `),

  UNIQUE KEY `id_UNIQUE` (`id`)

) ENGINE=FEDERATED DEFAULT CHARSET=utf8 COMMENT='카트에 담긴 상품'

CONNECTION='mysql://root:dldusrn1@10.3.0.27:3306/cityholic_db/cart_product';

   - CONNECTION 옵션의 구성 = 'mysql://[계정]:[비밀번호]@[서버ip]:[port]/[원격지DB명]/[원격지 테이블명]'

   - Pass 에서 특수문자 '@' 를 사용하는 경우 아래와 같이 테이블 생성시 오류가 발생합니다.

     



3. 테이블 생성시 사용할 SERVER 개체를 생성 합니다.

1
2
3
CREATE SERVER [서버명]
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'root', PASSWORD 'XXXX@XXXX', HOST '192.168.197.128', PORT 3306, DATABASE 'db_link_test');
cs

      - 생성된 서버 정보를 조회합니다.

1
SELECT * FROM mysql.servers;
cs


4. 생성된 서버로 테이블을 생성 합니다.

- 로컬에 생성하는 테이블과 원격지 테이블이 동일하다면 CONNECTION 옵션에서 테이블명은 생략 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `cityholic_db`.`cart_product` (
  `id`             bigint(20)     NOT NULL AUTO_INCREMENT COMMENT '아이디',
  `users_id`     bigint(20)     unsigned NOT NULL COMMENT '고객아이디',
  `product_id`     bigint(20)     NOT NULL COMMENT '상품아이디',
  `option_code` varchar(50NOT NULL COMMENT '상품옵션코드',
  `quantity`     int(11)     NOT NULL DEFAULT '0' COMMENT '상품 개수',
 
  PRIMARY KEY (`users_id`,`product_id`,`option_code `),
  UNIQUE KEY `id_UNIQUE` (`id`)
ENGINE=FEDERATED DEFAULT CHARSET=utf8 COMMENT='카트에 담긴 상품'
CONNECTION='[서버명]/cart_product';
cs


>> . 이상 모든 설정을 완료 했다면 로컬에서 원격지의 Table을 로컬 테이블 처럼 사용 가능합니다. select, insert, update, delete 모두 가능 합니다.


현재 활성화된 창을 특정 위치로 이동하는 명령 입니다.

1
2
3
4
5
; 활성창을 특정 위치로 이동
^1::
    WinGetActiveTitle, title
    WinMove, %title%, , 2020
    return

 

사용해본 클램프 중에서는 Dewalt 제품이 가장 만족도가 높았습니다.

그중에서 M사이즈의 12인치 DWHT83140-KR 제품이 활용도가 높습니다.

Dewalt 규격표
디월트 클램프 짱 좋음

'기타 > 공구' 카테고리의 다른 글

[DeWalt] 퀵 체인지 드릴 드라이버  (0) 2023.03.12
Dremel 액세서리 중 절단비트에 대해서  (0) 2016.09.11

MySQL / MariaDB에서 Slow Query Log를 활성화하기 위한 방법과 실시간으로 변경 가능한 Variable에 대해서 설명드리겠습니다. 

개인적으로는 Slow Query Log를 테이블로 관리하는것을 좋아합니다. 실행된 쿼리 검색 및 통계내가가 편리하기 때문입니다.

아래 3개의 쿼리를 실행하여 설정 가능한 변수를 확인할 수 있습니다. 쿼리 결과

show global variables like '%slow%';

show global variables like '%long%';

show global variables like '%log_output%';

 

>> my.ini 파일 수정 : 노란색 영역의 3개 항목을 추가하신 후 MySQL / MariaDB 서비스를 재시작해주시면 됩니다.

set global 쿼리를 사용해서 설정을 변경할 수 있습니다.

하지만 long_query_time 변수는, 쿼리로는 변경은 가능하지만 실제 반영은 안 되고 있기에 ini 파일에서 설정해 주셔야 합니다.

my.ini 수정

slow_query_log, log_output 은 운용 중인 상태에서 서비스 재시작 없이 설정 변경이 가능하며 즉시 해당 설정이 적용됩니다.

제어판 > 서비스 > 재시작

 

>> 테이블에 기록된 Slow Query 결과입니다.

Slow Query Log in Table

Index 정보를 조회하여 하나의 컬럼에 Key 컬럼을 ','로 구분하여 출력하는 쿼리 입니다.
 
실행 결과)
쿼리)

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
select ta.table_name
    , index_name, max(tb.constraint_type) INDEX_DESCRIPTION  
    , concat_ws(', ', max(col_1), max(col_2), max(col_3), max(col_4), max(col_5)  
    , max(col_6), max(col_7), max(col_8), max(col_9), max(col_10)) INDEX_KEYS  
from (  
        select table_schema, `table_name`  
        , (CONSTRAINT_NAME) INDEX_NAME  
        , ('') INDEX_DESCRIPTION  
        , (case ordinal_position when 1 then column_name else null end) col_1  
        , (case ordinal_position when 2 then column_name else null end) col_2  
        , (case ordinal_position when 3 then column_name else null end) col_3  
        , (case ordinal_position when 4 then column_name else null end) col_4  
        , (case ordinal_position when 5 then column_name else null end) col_5  
        , (case ordinal_position when 6 then column_name else null end) col_6  
        , (case ordinal_position when 7 then column_name else null end) col_7  
        , (case ordinal_position when 8 then column_name else null end) col_8  
        , (case ordinal_position when 9 then column_name else null end) col_9  
        , (case ordinal_position when 10 then column_name else null end) col_10  
        from information_schema.KEY_COLUMN_USAGE  
        where table_schema = 'db_schema' and `table_name` like '%info%'  
    ) ta  
left join information_schema.table_constraints tb   
on ta.table_schema = tb.table_schema and ta.`table_name` = tb.`table_name` and ta.index_name = tb.constraint_name  
group by ta.table_name, index_name 
order by ta.table_name, index_name asc
;
 
cs

온도/습도 등의 기상 데이터를 LabVIEW를 통해 DB에 저장하고 싶다는 문의에 대한 답변 입니다. 

Q : 온도/습도 등의 몇개의 기상데이터가 10초마다 몇달을 txt파일로 저장하는데,
     DB를 쓰면 특정 구간의 평균/최대/최소 등의 통계 혹은 rawdata 값을 쉽게 뽑아 낼 수 있는지요?
A : 날짜 컬럼으로 Index(목ㅊ, 색인) 가 걸려 있다면 특정 날짜 구간의 데이터를 빠르게 추출 및 통계(MIN, AVG, MAX 등)도 빠르게 계산이 가능 합니다. 

 

어떤 DB를 사용해야 좋을 지 문의하신다면 결론부터 말해서 MSSQ(Express) 버전으로 시작하시길 권해드립니다.

Express 버전의 경우 개인사용자는 무료이고 MSSQL 자체가 GUI 환경이어 타 DB에 비해 설치 및 운용이 간편하여

접근성이 좋습니다. 물론 성능도 타 DB에 비해 절~대 뒤떨어 지지 않습니다.

MSSQL 단점 은

- Windos 계열의 OS 에서 (만?) 설치 및 운용이 가장 편리합니다. 

물론 리눅스에도 설치가 가능하다는데, 직접 설치해 본 적이 없어서, 설치 난이도가 어떤지 알지 못합니다.

https://docs.microsoft.com/ko-kr/sql/linux/sql-server-linux-setup?view=sql-server-ver15

 

SQL Server on Linux 설치 지침 - SQL Server

SQL Server on Linux를 설치, 업데이트 및 제거합니다. 이 문서에서는 온라인, 오프라인 및 무인 시나리오를 설명합니다.

docs.microsoft.com

 

------------------------------------------------------ LabVIEW ------------------------------------------------------

LabVIEW : https://www.ni.com/ko-kr.html

 

자동화 테스트 및 자동화 측정 시스템 - National Instruments

업계 최고의 측정 정확성을 제공하면서 비용, 설계 및 디바이스 관련 문제를 해결할 수 있도록 지원하는 NI 반도체 테스트 솔루션을 만나보십시오.

www.ni.com

LabVIEW 와 DB를 연동하려면 애드온을 구매해야 한다는군요.

LabVIEW DB연동 모듈
LabVIEW : ODBC 드라이버를 통한 DB 연동 가능

 

------------------ 아래 1번 부터 4번 까지 진행하시면 테스트 환경 구축은 가능하시리라 생각 됩니다.  ---------------

1. MSSQL Express 다운로드 및 설치방법 블로그 입니다. (퍼왔습니다.)

https://eine.tistory.com/entry/Microsoft-SQL-Server-2019-Express-%EC%84%A4%EC%B9%98

 

Microsoft SQL Server 2019 Express 설치 + SSMS

MS-SQL 설치 MS-SQL을 써야 할 일이 생겨서 한번 설치해보자. 테스트용으로만 필요하기 때문에 무료 테스트용 버전인 Express를 설치해보도록 하겠다. https://www.microsoft.com/ko-kr/sql-server/sql-server-dow..

eine.tistory.com

 

 

2. MSSQL DB 관리툴 입니다.

SSMS(SQL Server Management Studio)

https://docs.microsoft.com/ko-kr/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15

 

SSMS(SQL Server Management Studio) 다운로드 - SQL Server Management Studio (SSMS)

최신 버전의 SSMS(SQL Server Management Studio)를 다운로드합니다.

docs.microsoft.com

 

 

3. 설치 완료 후 DB 생성 및 DB 사용 계정 생성 방법 입니다. (퍼왔습니다.)

https://server-talk.tistory.com/248

 

MSSQL 데이터베이스(DB) 생성과 새 로그인 사용자 추가

MSSQL 데이터베이스(DB) 생성과 새 로그인 사용자 추가 알아보기 이번에는 MSSQL에서 데이터베이스(DB) 생성과 계정생성을 알아보도록 하겠습니다 이전 글 : Windows SQL Server 2014 Express 설치 - http://serv..

server-talk.tistory.com

 

4. LabVIEW - MSSQL 연동 방법입니다. (퍼왔습니다.)

https://guslabview.tistory.com/66

 

[LabVIEW] MSSQL UDL 파일 생성 및 랩뷰와 연동 하기

[LabVIEW] MSSQL UDL 파일 생성 및 랩뷰와 연동 하기 이 글에서는 LabVIEW와 MSSQL을 연동하는 방식에 대해서 설명을 드리겠습니다. 랩뷰에서 손쉽게 DB에 접속하기 위해서는 UDL 파일이 필요합니다. UDL 파일은 U..

guslabview.tistory.com

 

기타 문의 사항은 게시판에 남겨 주세요.

아래와 같은 테이블에 대하여 USERID 가 존재할 경우에는 UPD_DATE 를 현재 날짜로 갱신하고

존재하지 않을 경우에는 INSERT 하는 쿼리를 Merge Into로 만들경우 아래와 같이 작성하게 되면

UPDATE 는 되는데 INSERT 는 되지 않습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SET SERVEROUTPUT ON;
 
BEGIN 
 
MERGE INTO TBL_USER TA
USING (SELECT USERIDX, USERID, USERNAME FROM TBL_USER WHERE USERID='6') TB
ON (TA.USERIDX = TB.USERIDX)
WHEN MATCHED THEN
    UPDATE SET TA.UPD_DATE = SYSDATE
WHEN NOT MATCHED THEN
    INSERT (TA.USERIDX, TA.USERID, TA.USERNAME)
    VALUES (6'6''NM_6')
;
dbms_output.put_line(SQL%ROWCOUNT);
COMMIT;
 
END;
 

아래와 같이 변경하시면

데이터가 있을 경우 Update, 없을 경우 Insert를 수행하게 됩니다.

- 중요한 부분은 위 TB 집합을 DUAL 로 변경하고 ON 절에 Where 조건을 기입하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SET SERVEROUTPUT ON;
 
BEGIN 
 
MERGE INTO TBL_USER TA
USING DUAL
ON (TA.USERID = '6')
WHEN MATCHED THEN
    UPDATE SET TA.UPD_DATE = SYSDATE
WHEN NOT MATCHED THEN
    INSERT (TA.USERIDX, TA.USERID, TA.USERNAME)
    VALUES (6'6''NM_6')
;
dbms_output.put_line(SQL%ROWCOUNT);
COMMIT;
 
END;
 

 

실행 결과 입니다.

Merge Into 실행 결과

안녕하세요. 

제가 크롤링 후 올려드리는 MySQL 백업파일의 복원방법을 문의하시는 분들이 있어서 복원 방법 설명드립니다.

제가 올리는 백업파일의 경우 아래와 같이 Database를 생성하는 구문이 없습니다.

그렇기 때문에 먼저 복원할 Database를 생성해 주셔야 합니다.
제가 올리는 백업파일의 명칭이 [db_name]_[날짜] (db_stock_20190407_010101.bak) 이기 때문에 저와 동일하게 db_stock 로 DB를 생성해주셔도 되고, 본인이 미리 생성한 db가 있다면 그대로 사용해 주셔도 됩니다. 

db를 생성할 경우에는 cmd 창을 열어 MySQL에 접속하신 후 create database [db 명]을 실행해 주시면 됩니다.

show databases; 를 실행하여 생성된 db를 확인합니다.

압축파일이 위치한 폴더로 이동 후 mysql -uroot -p [db 명] < [백업파일명]  을 실행하시면 몇분 후 DB 복원이 완료됩니다.

복원 완료 후 MySQL Workbench 로 접속한 모습입니다.

Oracle의 NEXT_DAY 함수는 입력한 날짜 이후의 찾고자 하는 요일의 첫 번째 일자를 반한 합니다.

NEXT_DAY(날짜, 찾고자 하는 요일)

- 찾고자 하는 요일 : 1=일, 2=월, 3=화, 4=수, 5=목, 6=금, 7=토 

MSSQL 에는 대응되는 함수가 없기때문에 사용자 함수를 만들어 사용하셔야 합니다.

CREATE FUNCTION [dbo].[NEXT_DAY] (@p_date DATETIME, @p_WEEKNO INT) 
RETURNS DATETIME 
AS 
BEGIN 
DECLARE @next_day DATETIME; 

SELECT @next_day = DATEADD(DAY,n, @p_date) 
FROM (VALUES (1),(2),(3),(4),(5),(6),(7)) AS t(n) 
WHERE DATEPART(WEEKDAY, DATEADD(DAY,n, @p_date)) = @p_WEEKNO 
OR CONVERT(varchar(10), DATEPART(WEEKDAY, DATEADD(DAY,n, @p_date))) = @p_WEEKNO 

RETURN @next_day 
END 

GO

Oracle 의 NEXT_DAY 와 비교한 결과는

지정일 검색
요일
Oracle MSSQL
2020-02-16 23:56:17.077 1 2020-02-23 23:05:26 2020-02-23 23:56:17.077
2020-02-16 23:56:17.077 2 2020-02-17 23:05:26 2020-02-17 23:56:17.077
2020-02-16 23:56:17.077 3 2020-02-18 23:05:26 2020-02-18 23:56:17.077
2020-02-16 23:56:17.077 4 2020-02-19 23:05:26 2020-02-19 23:56:17.077
2020-02-16 23:56:17.077 5 2020-02-20 23:05:26 2020-02-20 23:56:17.077
2020-02-16 23:56:17.077 6 2020-02-21 23:05:26 2020-02-21 23:56:17.077
2020-02-16 23:56:17.077 7 2020-02-22 23:05:26 2020-02-22 23:56:17.077
2020-02-16 23:56:17.077 1 2020-03-01 23:05:26 2020-03-01 23:56:17.077
2020-02-16 23:56:17.077 2 2020-03-16 23:05:26 2020-03-16 23:56:17.077
2020-03-20 23:56:17.077 3 2020-03-24 23:05:26 2020-03-24 23:56:17.077
2020-03-31 23:56:17.077 4 2020-04-01 23:05:26 2020-04-01 23:56:17.077
2020-04-11 23:56:17.077 5 2020-04-16 23:05:26 2020-04-16 23:56:17.077
2020-04-22 23:56:17.077 6 2020-04-24 23:05:26 2020-04-24 23:56:17.077
2020-05-03 23:56:17.077 7 2020-05-09 23:05:26 2020-05-09 23:56:17.077

 

궁금증은 덧글로 편하게 남겨주세요.

마우스 자가 수리시 참고하면 좋을 스위치 기본 스펙 입니다.

BRAND Model 버튼 힘 기계적 수명 원산지
OMRON D2F-F-3-7 0.74N 2000만 클릭 일본
D2F-F 0.74N 1000만 클릭
D2FC-F-7N 0.74N 500만 클릭 중국
D2FC-F-7N(10M) 0.74N 1000만 클릭
D2FC-F-7N(20M) 0.74N 2000만 클릭
ZF ZF(체리)골드포인트 0.74N 6000만 클릭
ZF(체리)레드포인트 0.74N 3000만 클릭
HUANO 후아노 블루 0.74N 2000만 클릭
후아노 예로우 0.74N 800만 클릭
후아노 그린 0.74N 500만 클릭
후아노 핑크 0.74N 1000만 클릭
TTC TTC 골드 0.74N 3000만 클릭

MySQL 로 작성한 트리구조 탐색 쿼리를 MSSQL로 바꿔 보았습니다.

https://devse.tistory.com/28<< MySQL 쿼리

✔ 트리 구조

✔ 쿼리

1
2
3
4
5
6
7
8
9
10
11
12
13
declare @v_id varchar(45), @v_lev int
 
set @v_id = 'a20'; -- 시작 node
 
with tree as (
    select id, pid, 0 lev
    from t_test
    where id=@v_id
    union all
    select ta.id, ta.pid, (tb.lev + 1) lev
    from t_test ta inner join tree tb on ta.id = tb.pid
)
select id, pid, lev from tree order by lev desc

✔ 결과

✔ 테스트용 자료 입력

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
USE [TEST_DB]
GO
 
CREATE TABLE [dbo].[t_test](
    [id] [varchar](45NOT NULL,
    [pid] [varchar](45NOT NULL,
    [data] [varchar](100NOT NULL,
 CONSTRAINT [PK_t_test] PRIMARY KEY CLUSTERED 
(
    [id] ASC
ON [PRIMARY]
ON [PRIMARY]
GO
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a1', N'a0', N'그림1')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a10', N'a9', N'그림10')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a11', N'a7', N'그림11')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a12', N'a8', N'그림12')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a13', N'a10', N'그림13')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a14', N'a10', N'그림14')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a15', N'a10', N'그림15')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a16', N'a13', N'그림16')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a17', N'a13', N'그림17')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a18', N'a14', N'그림18')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a19', N'a15', N'그림19')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a2', N'a1', N'그림2')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a20', N'a17', N'그림20')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a21', N'a4', N'그림21')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a22', N'a21', N'그림22')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a23', N'a5', N'그림23')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a24', N'a11', N'그림24')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a25', N'a11', N'그림25')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a26', N'a12', N'그림26')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a27', N'a9', N'그림27')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a28', N'a25', N'그림28')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a29', N'a22', N'그림29')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a3', N'a1', N'그림3')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a30', N'a2', N'그림30')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a4', N'a2', N'그림4')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a5', N'a4', N'그림5')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a6', N'a4', N'그림6')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a7', N'a6', N'그림7')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a8', N'a3', N'그림8')
INSERT [dbo].[t_test] ([id], [pid], [data]) VALUES (N'a9', N'a3', N'그림9')
GO
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

✔ 실행 계획

+ Recent posts