오라클에서 시간을 기준으로 데이터 복구

Posted by 백창
2021. 9. 16. 21:54 개발/Oracle
반응형

#1

시스템을 실제 운용하는 상황에서는 가끔 언제 무슨 데이터를 확인 해달라는 요청이 많이 발생한다.

운영 시스템에선 DB백업을 모두 하고 있겠지만 데이터 하나하나 확인하고자 

백업 라이브러리를 뒤적거릴 시간이 없을 것이다.

이런 경우 유용하게 활용할 수 있는 timstamp 기능이 있다.

  * 이 기능은 미리 설정되어 있는 시간만큼만 조회가 가능함

 

 

사용법은 간단하다. 복구를 원하는 테이블에

as of timestamp(복구시간) 라는 명령어를 작성해주면 되는데

 

#2

정확한 복구 시점을 알 수 없을때는 

아래와 같은 방법으로 현재 시간으로부터 XX시간, XX분, XX초 전의 데이터를 확인 할 수 있다.

select * from sample_tabel as of timestamp(systimestamp - interval '1' hour)

interval '1' hour을 아래와 같이 바꾸면 다양한 방법으로 활용이 가능하다

o XX일 :  'XX' DAY

o XX시간 : 'XX' HOUR

o XX분 : 'XX' MINUTE

o XX초 : 'XX' SECOND

 

#3

정확한 복구 시점을 알고 있는 경우는 아래와 같이 정확히 복구시간을 작성해주는 것이 더욱 도움이 된다.

select * from sample_table as timestamp(to_date('20210101000000','YYYYMMDDHH24MISS'))

 

 

반응형

'개발 > Oracle' 카테고리의 다른 글

[oracle] DB Link  (0) 2016.04.07
[oracle] 날짜 + 번호 일련번호 생성하기  (0) 2015.12.13

[wxpython] 다중모니터 감지하기

Posted by 백창
2017. 6. 28. 15:17 개발/Python
반응형

#1


wxPython 은 GUI를 만들 수 있는 오픈소스 라이브러리이다.


GUI를 만드는건 만드는건데 가끔 보면 듀얼모니터, 다중모니터를 사용하면서 


모든 화면에 프로그램을 띄울 필요가 생길 것이다.


그걸 어떻게 감지하는지 퍼온 소스를 적어 놓겠다.


#2


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import wx
 
app = wx.App()
 
#To get the count of displays
num_displays = wx.Display.GetCount()
 
#Open a frame on each display
for display_num in range(num_displays):
    #Get a display object
    display = wx.Display(display_num)
 
    #To get a wx.Rect that gives the geometry of a display
    geometry = display.GetGeometry()
 
    #Create a frame on the display
    frame = wx.Frame(None,-1,"Display %d"%display_num,
    geometry.GetTopLeft(),geometry.GetSize())
 
    #Make the frame visible
    frame.Show()
 
app.MainLoop()
cs


모니터의 갯수를 저장해서 반복문을 돌며 각 화면마다 프레임을 실행해주는 소스가 되겠다.


#3


https://bytes.com/topic/python/answers/486021-multi-monitor-support

반응형

'개발 > Python' 카테고리의 다른 글

[Python] 웹페이지 변화 감지하기  (2) 2017.04.27

[Python] 웹페이지 변화 감지하기

Posted by 백창
2017. 4. 27. 16:48 개발/Python
반응형

# 1


음.. 파이썬을 시작하게된 이유였던가 ?


웹 페이지에 변화를 감지하기 위해서 파이썬을 처음으로 깔았다.


페이지 변화를 감지해서 뭐하냐 싶겠지만 의외로 용도가 많다.


공지사항에 새로운글(있던 글이 지워지거나 수정된 것도 감지되겠지만)을 체크하여 알림을 보낼 수 있고,

뭐 다른 용도도 많이 있다.


내가 처음 사용한 용도는 회사 홈페이지가 뻑나면 복구 스크립트를 돌리는데 사용했다.

뻑난지를 이 방법으로 확인한거지


# 원리


원리는 별거 없다. 


일정 주기마다 페이지를 긁어 해쉬값으로 저장해두고 기존에 저장된 해쉬값과 비교를 하는 것이다.


페이지가 조금만 달라져도 해쉬값은 크게 변하니 쉽게 감지할 수 있다.


# 소스


1. 페이지를 긁어서 해쉬값으로 변환하여 저장


음.. getList는 긁어오고 싶은 사이트들을 저장해둔 파일을 불러오는 소스라서 무시해도된다.

그냥 주소써서 긁어오면됨


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
# coding : utf-8
import requests
import hashlib
import time
import sys
import re
import getList
reload(sys)
sys.setdefaultencoding('utf-8')
 
# get check list
lines = getList.getList()
 
cnt = len(lines)
= 0
 
try :
 
    while i < cnt:
        chkList = re.split(r'[\s]',lines[i])
        i += 1
        with requests.Session() as c:
            URL = chkList[1]
 
            html = c.get(URL)
 
            m = hashlib.md5(html.text)
             now = time.localtime()
            file = open("PATH/md5_%s_%04d-%02d-%02d.log"%(chkList[0],now.tm_year, now.tm_mon, now.tm_mday),'a')
    
            print >> file, m.hexdigest()
            file.close()
 
    execfile("PATH/check.py",{})
except:
    print 'error'
 
cs



2. 페이지비교


offset에 따라 몇번째까지 비교할지 설정할 수 있고

2로 되어있으니 최근 2번 것과 비교하여 다르면 메시지를 보내도록 하였다.

(메시지는 텔레그램으로 보내면 편함)


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
#-*- coding: utf-8 -*-
import time
import re
import getList
import sendMsg
 
# get check List
lists = getList.getList()
lists_cnt = len(lists)
= 0
 
while i < lists_cnt:
    chkList = re.split(r'[\s]',lists[i])
    i += 1
    now = time.localtime()
 
    file = open("PATH/md5_%s_%04d-%02d-%02d.log"%(chkList[0], now.tm_year, now.tm_mon, now.tm_mday),'r')
    lines = file.readlines()
    file.close()
 
    flag = True
 
    cnt = len(lines)
 
    # set compare res
    offset = 2
    if cnt < offset:
        offset = cnt
 
    # compare hash value
    for j in range(cnt-offset, cnt):
        if lines[j] != lines[cnt-1]:
            flag = False
 
    # if unmatch
    if flag == False:
        # send msg
        for z in range(2len(chkList)):
            sendMsg.send_msg_to_telegram(chkList[z],'['+chkList[0]+'] 변화 감지 : \t'+chkList[1])
 
cs


# 마침


벌써 비슷한 방식으로 3개째 프로그램을 만들었다.

생각하기에 따라서 활용도가 많으니 잘 활용해봐야겠다.


반응형

'개발 > Python' 카테고리의 다른 글

[wxpython] 다중모니터 감지하기  (0) 2017.06.28

정규식을 이용해 숫자만 추출

Posted by 백창
2016. 6. 24. 10:09 개발/Java script
반응형

# 개요


 수업시간에는 정규식에 대해 깊이 생각해본적이 없었는데, 요즘 정말 활용분야가 다양하다는 걸 느끼고 있다.


Javascript에서 정규식을 이용하여 문자열에서 숫자만 추출해보도록 하자.



# 소스


1
2
3
4
5
function fn(str){
    var res;
    res = str.replace(/[^0-9]/g,"");
    return res;
}
cs


# 주절주절


 간단하게 해석해보자면 [^0-9] 즉, 숫자가 아닌 부분을 "" 공백으로 치환함으로써 숫자만 남기는 것.


 얼마나 편리한지 허허.

반응형

'개발 > Java script' 카테고리의 다른 글

배열 특정 값 지우기  (0) 2015.12.14
[d3] line chart 그리기  (0) 2015.03.31

[Flask] 외부소스 읽기

Posted by 백창
2016. 5. 31. 09:33 개발/Flask
반응형

# 개요


 Flask 개발 중 css와 js파일을 로드하기 위해 평소처럼 resource/js .. css 등의 디렉토리를 만들고 아래와 같이


<script type="text/javascript" src="./resource/js/jquery.js>


js 파일을 읽어왔다.


하지만 현실은.. js 파일을 찾을 수 없다는 에러메시지만 받을 수 있었다.


Flask에서 css나 js파일을 읽어 올 때 'url_for' 을 이용하여 지정하면 편리하게 읽어 올 수 있다.



# 사용법


서버동작이 구현되어 있는 run.py 파일을 기준으로 static 폴더를 생성하여 참조할 소스들을 static폴더에 넣는다.


run.py  - static         - js

                                 - css

             - templates


그리고 아래와 같이 사용하면 정상적으로 읽어 올 수 있게 된다.


 <link type="text/css" rel="stylesheet" href="{{url_for('static', filename='css/style.css')}}/>



# 비고


 o url_for 함수의 여러가지 유용한 사용법이 있는듯한데 일단 그건 나중에 알아봐야겠다..

 o Flask에서 {{ }}를 사용하면 파이썬의 함수나 변수를 사용할 수 있다.

반응형

'개발 > Flask' 카테고리의 다른 글

[Flask] 설치  (0) 2016.05.26

[Flask] 설치

Posted by 백창
2016. 5. 26. 16:15 개발/Flask
반응형

# 개요


 4월이 되며 든 생각이 스크립트 언어를 공부해야겠다는것이었다. 어떤 언어를 공부할까 고민하다가 함께 발전할 수 있는 Python 을 해보기로 하고 간단한 웹서버를 구축하기 위해 FLASK를 수동으로 설치해보았다.


# flask란?


 flask는 Python 용 micro Framework이다. 다른 라이브러리들에는 존재하는 기능들을 제공하지는 않지만 그런 기능들을 가질 수 있는 확장성은 제공하고 있다.

 간단하게 생각하면 내가 필요한것들을 가져다 쓰면되겠다.


# 설치

 

 pip 명령어를 사용하면 간단하게 설치 할 수 있지만, flask를 설치할 서버가 인터넷이 안되기 때문에 수동으로 설치하였다.


 먼저, 다음 URL에 접속하여 flask 소스를 다운받아서 설치해보자.



 소스를 받고 압축을 해제하면 여러 파일들이 있는데 그 중 setup.py라는 파일을 이용해서 수동으로 설치할 수 있다.


 # python setup.py install


 설치가 잘 되나요? 인터넷이 안되는 환경에서는 이 방법만으로는 설치가 어렵다.


 그렇다면 어떻게 해야할까?,,,


 Flask는 Werkzeug, jinja2 등 몇몇 패키지에 의존성을 가진다. 이 패키지들이 깔려있지않다면 flask를 설치할 수 가 없다.


 다음 URL에 접속하여 의존성을 가지는 패키지들을 다운받아 먼저 설치하자.





 Flask를 설치했던 방법과 동일한 방법을 사용하여 위 패키지들을 설치하고 다시한번 Flask를 설치하면 잘 될 것이다.



# 테스트


다음 코드를 작성하여 Flask가 잘 설치되었고 동작하는지 테스트 해보자.


1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)
 
@app.route("/")
def hello():
    return "Hello World!"
 
if __name__ == "__main__":
    app.run()
cs


$ python hello.py


를 실행하면 로컬 환경에서 127.0.0.1:5000 을 통해 결과를 확인 할 수 있다.


같은 네트워크에 public IP로 주고 싶다면


app.run() 대신 app.run(host='0.0.0.0')을 입력해주면 된다.


# 출처


http://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html

https://spoqa.github.io/2013/02/20/python-development-environment.html


반응형

'개발 > Flask' 카테고리의 다른 글

[Flask] 외부소스 읽기  (0) 2016.05.31

[oracle] DB Link

Posted by 백창
2016. 4. 7. 11:14 개발/Oracle
반응형

db link 설명


http://www.gurubee.net/lecture/1560

반응형

배열 특정 값 지우기

Posted by 백창
2015. 12. 14. 16:46 개발/Java script
반응형

# 개요


 Javascript 배열 내 원하는 value의 값을 삭제해보자.


기본적으로 제공하는 함수는 pop함수로 원하는 값을 제거하기에 불편함이 있다. 


다음 코드는 구글에서 배열 특정값을 제거하는 소스를 검색하면 자주 나오는 코드이다


# 소스


1
2
3
4
5
6
7
8
9
10
11
function removeA(arr) {
    var what, a = arguments, L = a.length, ax;
    while (L > && arr.length) {
        what = a[--L];
        while ((ax= arr.indexOf(what)) !== -1) {
            arr.splice(ax, 1);
        }
    }
    return arr;
}
    
cs


# 사용방법


removeA( 배열 , 지우고 싶은 값);


# 출처


---------stackoverflow

반응형

'개발 > Java script' 카테고리의 다른 글

정규식을 이용해 숫자만 추출  (2) 2016.06.24
[d3] line chart 그리기  (0) 2015.03.31

[oracle] 날짜 + 번호 일련번호 생성하기

Posted by 백창
2015. 12. 13. 03:23 개발/Oracle
반응형

# 개요


 Oracle에서 스케줄 등록 없이 날짜 + 숫자 와 같은 형식의 일련번호를 생성해보자.


# 코드


1
2
3
4
5
6
select 
    to_number(to_char(sysdate,'YYMMDD'|| nvl(to_char(max(substr(sales_no,7))),'00'))+1
from
    sales
where
    to_char(sales_date,'YYYYMMDD'= to_char(sysdate,'YYYYMMDD')    
cs


# 설명


 일련번호의 형태로 많이 사용하는 방식은 YYYYMMDD + 00001 와 같은 방식일 것이다. 


 이런 일련번호를 생성하기 위해서는 스케줄을 등록하여 하루가 지날때마다 초기 값을 지정해주는 방법이 있었다.


 개발 중인 프로그램의 특성상 DB서버를 항상 켜두는 것이 아니기 때문에 insert 시 계산하는 방법에 대해 고민해보았다.


 아직 학생이라 효율성의 측면까지는 생각하지 못하였고 동작은 잘 되고 있다.


# 전체 SQL 및 DB



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<insert id="addNewOrder" parameterType="com.nara.order.vo.AddOrder">
    <selectKey order="BEFORE" keyProperty="sales_no" resultType="int">
        select 
            to_number(to_char(sysdate,'YYMMDD'|| nvl(to_char(max(substr(sales_no,7))),'00'))+1
        from
            sales
         where
            to_char(sales_date,'YYYYMMDD'= to_char(sysdate,'YYYYMMDD')
    </selectKey>
    insert
        into sales
            (sales_no, cust_no, cost_sum, sales_date, pay, section)
        values
            (#{sales_no}, #{cust_no}, #{cost_sum}, sysdate, #{pay}, #{section})
</insert>
cs



# 동작 결과




반응형

'개발 > Oracle' 카테고리의 다른 글

오라클에서 시간을 기준으로 데이터 복구  (0) 2021.09.16
[oracle] DB Link  (0) 2016.04.07

[d3] line chart 그리기

Posted by 백창
2015. 3. 31. 21:16 개발/Java script
반응형


 개요


 d3.js를 이용해 Line Chart를 그리자



 D3


d3란 데이터를 시각적으로 표현하는 자바스크립트 라이브러리이다. 


d3 사이트에 들어가면 많은 예제가 있고 소스가 공개되어 있어 따라해볼 수 있습니다.


http://d3js.org/



 소스


- 스크립트

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
45
46
47
48
49
50
51
52
53
function drawLineChart(className,array_value,array_Kg, lineData_pre, lineData_ori){
    
    // define dimensions of graph
    var m = [80808080]; // margins
    var w = 500 - m[1- m[3];    // width
    var h = 300 - m[0- m[2]; // height
    
    // x & y range
    var x = d3.scale.linear().domain([0, d3.max(array_Kg)]).range([0, w]);
    var y = d3.scale.linear().domain([d3.min(array_value), d3.max(array_value)]).range([h, 0]);
 
    var line = d3.svg.line()
    // assign the X function to plot our line as we wish
    .x(function(d) { 
        return x(d.x); 
    })
    .y(function(d) { 
        return y(d.y); 
    });
    
    var graph = d3.select("#"+className).append("svg:svg")
          .attr("width", w + m[1+ m[3])
          .attr("height", h + m[0+ m[2])
        .append("svg:g")
          .attr("transform""translate(" + m[3+ "," + m[0+ ")");
                
    // create yAxis
    var xAxis = d3.svg.axis().scale(x).tickSize(-h).tickSubdivide(true).orient("bottom");
    // Add the x-axis.
    graph.append("svg:g")
          .attr("class""x axis")
          .attr("transform""translate(0," + h + ")")
          .call(xAxis)
         .append("svg:text")
          .style("text-anchor","middle")
          .text("Kg");
 
 
    // create left yAxis
    var yAxisLeft = d3.svg.axis().scale(y).ticks(4).orient("left");
    // Add the y-axis to the left
    graph.append("svg:g")
          .attr("class""y axis")
          .attr("transform""translate(-25,0)")
          .call(yAxisLeft);
    
    
    // Add the line by appending an svg:path element with the data line we created above
    // do this AFTER the axes above so that the line is above the tick-lines
    graph.append("svg:path").attr("d", line(lineData_pre)).attr("class","predict");
 
    graph.append("svg:path").attr("d", line(lineData_ori)).attr("class","origin");
}
cs


- CSS

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
path {
    stroke-width: 1;
    fill: none;
}
/**
*    graph line color
*/
.predict{
    stroke:steelblue;
}
.origin{
    stroke:orange;
}
.axis {
  shape-rendering: crispEdges;
}
.x.axis line {
  stroke: lightgrey;
}
.x.axis .minor {
  stroke-opacity: .5;
}
.x.axis path {
  display: none;
}
.y.axis line, .y.axis path {
  fill: none;
  stroke: #000;
}
cs




 코드 주석


1. var x, y : 제일 먼저 x&y 값 최소와 최대값을 측정하여 범위를 지정한다.

2. var line : 데이터에 따라 선을 그리기 위해 x좌표값과 y좌표값을 데이터에서 추출한다.

(아래 데이터에서는 Kg이 x축이고 L , a, b, E가 각각 Y의 값이되어 4개의 그래프를 그릴 수 있다)

3. var graph : className으로 지정된 ID를 가진 div를 선택해 그래프의 바탕을 그린다.

4. var xAxis, yAxis : 앞서 구한 x&y의 범위를 가지고 x축과 y축을 그린다.

(transform 옵션은 축의 위치가 되겠다)

5. graph.append("svg:path") 를 통해 line 함수로 추츨된 x y 좌표로 그래프의 선을 그린다.


 Data



origin
L a b E Kg
54.59 1.04 2.81 0.45 32.0
55.21 1.02 2.67 0.5 209.0
54.91 0.95 2.12 0.35 211.0
54.34 1.16 2.5 0.5 305.0
54.59 0.98 2.01 0.48 371.0
54.28 1.0 2.46 0.5 433.0

predict

LabEKg
54.601512204878791.02529713975785542.7958658656028120.439670601399571432.0
55.204234776560471.02768152242697772.6771897893800560.5050869193777713209.0
54.8863728256512640.98179670291752492.149646309017210.37113914211756211.0
54.3457023796577451.15547794185641962.49327085631507650.4939113237644091305.0
54.543651832328611.01319704838464332.06317044141718360.5249999887597754371.0
54.280970805276050.99846972236447532.4603476822979950.5031537879399656433.0



 결과



반응형

'개발 > Java script' 카테고리의 다른 글

정규식을 이용해 숫자만 추출  (2) 2016.06.24
배열 특정 값 지우기  (0) 2015.12.14