레이블이 SQLite인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SQLite인 게시물을 표시합니다. 모든 게시물 표시

backup grafana dashboard

# 다음과 같이 prometheus 를 설치하면
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install ysoftman-release prometheus-community/kube-prometheus-stack

# grafana 설치하면 기본으로 포함된 dashboard 들이 있다.
# sidecar.dashboards.folder: /tmp/dashboards
# grafana container > /tmp/dashboards 에는 기본 제공되는 dashboard json 파일들이 위치한다.

# 그런데 사용자가 생성한(import)한 경우 /var/lib/grafana/grafana.db 에 추가된다.

# grafana pod 의 grafana.db 를 로컬에 복사
kubectl cp ysoftman-grafana-123:/var/lib/grafana/grafana.db ./grafana.db

# sqlite 로 확인해보자
# 테이블 조회
sqlite3 ./grafana.db '.tables'

# import 했던 dashboard 를 확인할 수 있다.
sqlite3 ./grafana.db 'select * from dashboard' | grep -i 20211010

#####

# grafana in k8s 인 grafana 재시작시 db 파일 삭제로 어려움이 있다.
# 대신 api 를 이용해서 백업해보자.
# api 사용을 위해 서비스 계정 생성 및 토큰 생성한다.
grafana > administration > service accounts > add service account
이후 add service account token (no expiration) > 토큰 복사해두기

# backup / restore grafana dashboard script

use rqlite

# rqlite(분산 sqlite database)
https://rqlite.io/docs/cli/

# k8s 로 운영중인 경우 local로 port-forwarding
kubectl port-forward service/rqlite 4001:4001 -n rqlite

# 접속
rqlite -H localhost -p 4001

# usage hints
.help

# 분산 노드 확인
.nodes

# 테이블 리스트 
.tables

# 테이블 조회
# 쿼리는 일반적인 sql 사용하면 된다.
select * from 테이블;

# sql 문으로 dump
.dump ysoftman.dump

# db 백업(sqlite format 3)
.backup ysoftman.db

# exit
.exit or .quit

# mysql 쿼리문에서 사용하려면 
# 필드명을 " 대신 `로 감싸야 한다.
# primary 에 있는 AUTOINCREMENT 는 제거하고 fileld 선언시 auto_increment 로 선언해야 한다.
# cat ysoftman.dump | sed -e "s/\"/\`/g" -e "s/AUTOINCREMENT//g" | pbcopy
# 이렇게 일일히 변경하는것 보다 툴을 사용하면 편하다.
brew tap techouse/sqlite3-to-mysql
brew install sqlite3-to-mysql
sqlite3mysql --help

# sqlite3 db 파일을 mysql 특정 db 에 import
sqlite3mysql -f ysoftman.db -h localhost -P 3306 -u root -d ysoftmantest --mysql-password aaa111

drone ci 사용하기

# golang 으로 만들고 docker 환경으로 실행되는 drone ci 를 사용해보자.

# 우선 로컬에서 테스트하기 때문에 
# (reverse proxy 로 ngrok 도메인 -> localhost 로 터널링 해주는) ngrok 설치
brew install ngrok

# http://fe9b41d98488.ngrok.io -> http://localhost:80 포워딩을 위해 실행
# 참고 https (tls) 터널링은 유료 버전만 가능하고, 그외 동시접속 제한이 있다.
ngrok http 80

# github oauth 로 drone 앱(서버)를 등록
# github -> settings -> developers -> oauth apps 에서 신규 생성한다.
# homepage url : http://dd441e3e9f16.ngrok.io
# callback url : http://dd441e3e9f16.ngrok.io/login

# oauth app 생성후
# client -> DRONE_GITHUB_CLIENT_ID
# client secret -> DRONE_GITHUB_CLIENT_SECRET 로 사용한다.
# generate a new client secret(생성후 한번 볼 수 있어 복붙해둬야 한다) -> DRONE_GITHUB_CLIENT_SECRET 값으로 사용

# drone <-> runner 간 RPC 통신을 위한 secret 생성 -> DRONE_RPC_SECRET 값으로 사용
openssl rand -hex 16                         
d087c94b8155367b1982238df930c2f2

# drone 도커 이미지 다운로드
docker pull drone/drone:1

# 실행
# github enterprise 는 깃헙 서버 환경 변수 설정 필요
# --env=DRONE_GITHUB_SERVER=https://github.ysoftman.com \
# 볼륨 연결로 /data/database.sqlite -> 호스트의 /var/lib/drone/database.sqlite 로 저장
docker run \
  --volume=/var/lib/drone:/data \
  --env=DRONE_DATABASE_DRIVER=sqlite3 \
  --env=DRONE_DATABASE_DATASOURCE=/data/database.sqlite \
  --env=DRONE_GITHUB_CLIENT_ID=깃헙_클라이언트_id \
  --env=DRONE_GITHUB_CLIENT_SECRET=깃헙_클라이언트_secret \
  --env=DRONE_RPC_SECRET=d087c94b8155367b1982238df930c2f2 \
  --env=DRONE_SERVER_HOST=127.0.0.1 \
  --env=DRONE_SERVER_PROTO=http \
  --env=DRONE_WEBHOOK_ENDPOINT=http://dd441e3e9f16.ngrok.io/hook \
  --env=DRONE_WEBHOOK_SECRET=d087c94b8155367b1982238df930c2f2 \
  --env=DRONE_REPOSITORY_FILTER=ysoftman,bill \
  --publish=80:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:1

# 이제 다음 url 로 github authorize 하면 깃헙으로 로그인상태로 drone ci 를 사용할 수 있다.
http://dd441e3e9f16.ngrok.io

# DRONE_REPOSITORY_FILTER 으로 특정 저장소에만 drone과 연결 할 수 있다.
# 설정 변경 후 사용자별로 로그아웃 후 다시 로그인 해야 반영된다.

#####

# 상황에 맞는 여러 runner(러너)가 있다.
# docker(임시 컨테이너를 생성해 실행할때 사용) 러너 설치
docker pull drone/drone-runner-docker:1
docker run -d \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DRONE_RPC_PROTO=http \
  -e DRONE_RPC_HOST=dd441e3e9f16.ngrok.io \
  -e DRONE_RPC_SECRET=d087c94b8155367b1982238df930c2f \
  -e DRONE_RUNNER_CAPACITY=2 \
  -e DRONE_RUNNER_NAME=${HOSTNAME} \
  -e DRONE_DEBUG=true \
  -e DRONE_TRACE=true \
  -p 3000:3000 \
  --restart always \
  --name runner \
  drone/drone-runner-docker:1

# exec(docker 와 같은 고립된 환경이 아닌 drone 서버 장비에서 쉘 환경에서 명령을 실행할 때 사용) 러너를 설치
curl --proxy "필요한 경우 프록시 설정" -L https://github.com/drone-runners/drone-runner-exec/releases/latest/download/drone_runner_exec_linux_amd64.tar.gz | tar zx
sudo install -t /usr/local/bin drone-runner-exec
mkdir -p /home/ysoftman/.drone-runner-exec
touch /home/ysoftman/.drone-runner-exec/config
cat > /etc/drone-runner-exec/config << eof
DRONE_RPC_PROTO=http
DRONE_RPC_HOST=dd441e3e9f16.ngrok.io
DRONE_RPC_SECRET=d087c94b8155367b1982238df930c2f
DRONE_LOG_FILE=/home/ysoftman/.drone-runner-exec/log.txt
eof
drone-runner-exec service install
drone-runner-exec service start

# drone-runner-exec 서비스 상태 확인
systemctl status drone-runner-exec.service

# docker 환경 변수 확인
docker inspect -f "{{.Config.Env}}" drone  | tr " " "\n"


# ssh(ssh 로 서버에 접속해 명령을 실행하는 용도) 러너 설치
docker pull drone/drone-runner-ssh
docker run -d \
  -e DRONE_RPC_PROTO=http \
  -e DRONE_RPC_HOST=dd441e3e9f16.ngrok.io \
  -e DRONE_RPC_SECRET=d087c94b8155367b1982238df930c2f \
  -p 3000:3000 \
  --restart always \
  --name runner \
  drone/drone-runner-ssh

# 루트 경로에 .drone.yml 를 작성한다.
# 파일명은 drone ci settings 에서 변경 가능하다.
---
kind: pipeline
type: exec
name: default

platform:
  os: linux
  arch: amd64

trigger:
  event:
    - push
steps:
  - name: 작업1
    commands:
      - echo hello world1
  - name: 작업2
    commands:
      - echo hello world2
  - name: 슬랙 알림
    # environment:
    #   noti_msg: "Branch: ${DRONE_BRANCH}\nAuthor: ${DRONE_COMMIT_AUTHOR}\nLink: ${DRONE_COMMIT_LINK}"
    #   build_status: "✅ build ${DRONE_BUILD_NUMBER} succeeded. Good job."
    commands:
      - echo "파이프 종료"
      - export HTTP_PROXY="http://프록시서버"
      - export noti_msg="Branch ${DRONE_BRANCH}\nAuthor ${DRONE_COMMIT_AUTHOR}\nLink ${DRONE_COMMIT_LINK}"
      - export build_status="✅ build ${DRONE_BUILD_NUMBER} succeeded. Good job."
      - echo $DRONE_BUILD_STATUS
      - if [[ $DRONE_BUILD_STATUS == "failure" ]]; then build_status="❌ build ${DRONE_BUILD_NUMBER} failed. Fix me please."; fi
      - |
        curl https://hooks.slack.com/services/..... -d "payload={\"channel\": \"#billtest\", \"text\": \"파이프 라인 시작\n$noti_msg\n$build_status\"}"
# ---
# kind: pipeline
# type: ssh
# name: default
# # 접속할 대상 서버
# server:
#   host: ysoftman-server.com
#   user: deploy
#   password:
#     from_secret: password
# steps:
#   - name: 작업1
#     commands:
#       - echo hello world1
#   - name: 작업2
#     commands:
#       - echo hello world2
# ---
# kind: pipeline
# type: docker
# name: slack notification
# # 사내환경등에서 외부 접속이 안되는 경우 프록시 환경 변수 설정
# environment:
#  HTTP_PROXY: "http://프록시주소"
#  HTTPS_PROXY: "http://프록시주소"
# steps:
#   - name: 슬랙 알림
#     # 사내환경등에서 외부 이미지 다운로드가 안되는 경우 알맞게 변경
#     image: plugins/slack
#     settings:
#       # https://my.slack.com/services/new/incoming-webhook 참고
#       webhook: https://hooks.slack.com/services/.....
#       channel: ysoftman-test
#       template: >
#         {{#success build.status}}
#           build {{build.number}} succeeded. Good job.
#         {{else}}
#           build {{build.number}} failed. Fix me please.
#         {{/success}}
#         Branch: {{ build.branch }}
#         Author: {{ build.author }}
#         Link: {{ build.link }}

# 이제 drone DRONE_WEBHOOK_ENDPOINT 변수로 설정된 url 을
# github 저장소 webhook url 을 추가해 push 되면 drone 에 알리도록 한다.
http://dd441e3e9f16.ngrok.io/hook

# 참고로 위의 HTTP_PROXY 와 같은 환경변수를 사용할때 
# ${HTTP_PROXY} 는 안되고 {} 를 제거한 $HTTP_PROXY 로 사용해야 한다.

#####

# drone cli 툴 사용 https://docs.drone.io/cli/install/
# 설치
brew install drone-cli

# aaaaabbbbb11111 는 drone > User Settings > token 로 확인
# 접속할 drone 서버 환경 변수 설정
export DRONE_SERVER=http://dd441e3e9f16.ngrok.io
export DRONE_TOKEN=aaaaabbbbb11111

# 접속 여부 확인
drone info

# .drone.yml 작업 수행(커밋 전에 미리 로컬에서 테스트할 수 있다.)
# drone exec 현재 type: docker 만 실행된다.
# .drone.yml 을 다음과 같이 만들고
kind: pipeline
type: docker
name: default

steps:
- name: build
  image: golang:1.13
  commands:
  - echo "aaa"

# 실행
# .drone.yml syntax 체크등에 활용할 수 있다.
drone exec

DB 커넥션 끊김 방지하기

보통 DB에서는 쿼리 요청이 없는 Connection 은 일정시간이 지나면 끊어 버린다.

# MySQL 경우 기본 커넥션유지는 interactive_timeout 28800 (8시간)이다.
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_interactive_timeout
# 각종 타임 아웃 시간 보기
# 대기시간(연결 유지)은 wait_timeout
show variables like '%timeout%';

따라서 일정 주기만 커넥션을 유지를 위한 더미 쿼리(ex "Select 1;")를 요청해주도록 한다.
아니면 각 DB 마다 연결끊김 에러코드를 인지하여 다시 연결하도록 한다.

oracle
ORA-00028: your session has been killed
ORA-01012: not logged on
ORA-01033: ORACLE initialization or shutdown in progress
ORA-01034: ORACLE not available
ORA-01089: immediate shutdown in progress - no operations are permitted
ORA-03113: end-of-file on communication channel
ORA-03114: not connected to ORACLE
ORA-03127: no new operations allowed until the active operation ends
ORA-12571: TNS:packet writer failure

mssql
10054 : Connection Reset By peer (tcp 의 RST 로 비정상 종료로 연결을 끊는 경우)
10061 : Network Error

mysql
2003 : Can't connect to MySQL server
2013 : Lost connection to MySQL server during query
2006 : MySQL server has gone away


SQL IDE/QueryBrowser

[SQL IDE/QueryBrowser]
SQL Developer http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html
MySQL WorkBench http://www.mysql.com/downloads/workbench/
SSMS(SQL Server Management Studio) http://www.microsoft.com/en-us/download/details.aspx?id=7593

ARM 계열 맥북 M1 등에서 mysql workbench 최신 버전(8.0.x)이 계속 크래시 되는 이슈가 있다.

대신 dbeaver 를 사용하자.
brew install --cask dbeaver-community

이름에 커서 위치시키고 f4 : table view
cmd+shift+r : open resource (.sql .erd등 파일 열때 유용)
cmd+enter : 쿼리 하나 실행
cmd+\ : 현재탭의 모든 쿼리 실행
ctrl+/ : 현재 라인 주석 토글
ctrl+shift+f : 쿼리 포맷팅
alt+up : 이전 쿼리 위치로 이동
alt+down : 다음 쿼리 위치로 이동
ctrl+shift+j : 라인 합치기
ctrl+shift+\ : 실행 결과 창 닫기
cmd+shift+x : to uppercase
cmd+shift+y : to lowercase
cmd+shift+e : editor 선택 팝업
cmd+s : editor 내용 저장, 레코드 결과 수정 적용
ctrl+r : 레코드 결과 수정 취소
ctrl+tab (customize) : next tab
ctrl+shift+tab (customize) : previous tab
ctrl+e (customize) : switch active panel (디폴트 ctrl+alt+t 는 rectangle 앱 단축키와 중복)

[터미널에서 사용하는 SQL IDE]

[harlequin]
설치
pip install harlequin harlequin-mysql

mysql 접속
harlequin -a mysql -h localhost -p 3306 -U root --password example --database dev --theme one-dark

설정 파일($XDG_CONFIG_HOME/harlequin/config.toml)을 만들어 두자.
default_profile = "ysoftman"
[profiles.ysoftman]
adapter = "mysql"
theme = "one-dark"
limit = 100000
host = "localhost"
port = "3306"
database = "test"
user = "user1"
password = "abc123"
connection_timeout = "10"

이제 할리퀸 실행하면 하면 위 설정으로 실행된다.
harlequin

sql query examples

-- show command 로 정보 확인
show databases;
show tables;
show variables;
show processlist;
show variables like 'log_output%';
show variables like '%timeout%';
show variables like 'event%';

-- slow 쿼리 로깅 활성화, 상태 확인
-- slow_query_log_file 위치의 파일을 확인하면 된다.
set global slow_query_log = 'on';
show global variables like 'slow_query_log%';

-- event 활성
show variables like 'event%';
set global event_scheduler = on;

-- event 생성
create event delete_history
on schedule every 1 day
comment '매일 히스토리 정리'
do
delete from history1 where created_at < (now() - interval 6 month);
delete from history2 where start_at < (now() - interval 6 month);

show events;
drop event delete_history;

-- db 선택
use ysoftman;

-- mysql 버전확인
select version();

-- create
create table `test_info` (
`id` bigint(20) unsigned not null auto_increment,
`age` int(11) default null,
`name` varchar(45) default null,
`nickname` varchar(45) default null,
`enable` tinyint(1) default 1,
`created_at` datetime default current_timestamp,
`updated_at` datetime default current_timestamp,
`deleted_at` datetime default current_timestamp,
`last_date` datetime default null,
primary key (`id`)
) engine=innodb default charset=utf8;

-- show create table
show create table test_info;

-- alter
alter table test_info default character set utf8mb4 default collate utf8mb4_bin;

-- delete
delete from test_info where name='ysoftamn';

-- update
update ysoftman.test_info set nickname = 'xelloss' where name = 'bill';
update ysoftman.test_info set nickname = 'xelloss' where name in ('bill', 'yoon', 'naruto');

-- select
select * from user;
select * from user limit 10;
select * from user where name like '%ysoftman%' or name like '%bill%';
select * from user order by id desc;
select * from user where created_at >= (now() - interval 1 month);
-- BETWEEN min AND max 으로 사용해야 한다.
select * from user where created_at between (now() - interval 1 month) and (now() - interval 1 day);

-- 3개의 테이블 left, right join
select
    svc1.name as svc1_name,
    svc1.description as svc1_desc,
    ifnull(svc2.aaa,'') as svc2_aaa,
    ifnull(svc3.aaa,'') as svc3_aaa,
from
    service1 svc1
right join service2 svc2 on
    svc1.service2_id = svc2.id
left join service3 svc3 on
    svc1.service3_id = svc3.id
where
    s.name = 'bill'
order by
    name asc;

-- major, minor 별 path 가장 높은 버전으로 조회
select
    *
from
    versions as t1
join (
    select
        version_major,
        version_minor,
        max(version_patch) as patch
    from
        versions
    where
        stable = 1
        and version_major >= 0
        and version_minor >= 1
    group by
        version_major,
        version_minor
) as t2 on
    t1.version_major = t2.version_major
    and t1.version_minor = t2.version_minor
    and t1.version_patch = t2.patch;

/*
mssql 저장 프로시져 테스트
*/
use [TestSP]
create proc SPQuery(
@a varchar(20),
@b varchar(20),
@c int,
@d float,
@e bigint,
@f int)
as
declare @idx int;
set @idx = 0;
while (@idx < 10)
begin
insert into mytable(col1, col2, col3, col4, col5, col6) 
values(@a, @b, @c, @d, @e, @f)
set @idx = @idx + 1
end

/*
저장 프로시져 실행
*/
exec SPQuery 'ysoftman', yoon, 123, 1.0, 12345, 123

#####

# mysql 접속해서 쿼리 실행하기
# -h host
# -u user
# -p passowrd (-p뒤에 공백없이 패스워드 명시)
# -N, --skip-column-names 결과 출력에서 컬럼명 제외
# -B, --batch 결과 출력시 dash(-) 표시 제외
# -e statement
# key같이 예약어가 있을 수 있어 ``로 감싸주는게 좋다.
mysql -h 127.0.0.1 -u ${mysql_user} -p${mysql_password}" mydb -NB -e 'select `key` from ysoftman;' 2> /dev/null

MSAccessDB 기능에 대응하는 Sqlite 기능

MS AccessDB 에서 사용하는 기능 ===> Sqlite 에서 사용하는 기능

now() ===> datetime('now', 'localtime')
cstr(colDateInt) ===> cast(colDateInt as text)
cint(colDateText) ===> cast(colDateText as int)
format(colDate, 'MMM-D-YY') ===> strftime('%m/%d/%Y', colDate)
format(colRate, '0.00') ===> round(colRate, 2)
select top 10 * from table_name ==>  select * from limit 10

MSSQL 계정 암호 변경하기

MSSQL 에서 sa 나 기타 로그인 아이디에 대한 패스워드를 잊어 버렸다면 아래와 같이 재설정 할 수 있다.
cmd 콘솔에서 sqlcmd 을 실행한다. (참고로 :help 하면 도움말이 표시된다.)
1> alter login ysoftman with password="abc123";
2> go
3> exit