카테고리 보관물: DEV

Docker – Oracle 12c 설치

Oralce 12C를 설치할 디렉토리 생성 및 권한 변경

 mkdir vm_ora12c

chmod -R a+w vm_ora12c

Oracle 12c 이미지 조회

docker search oracle

[docker_test@blue ~]$ docker search oracle

INDEX       NAME                                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

docker.io   docker.io/oraclelinux                         Official Docker builds of Oracle Linux.         515       [OK]

docker.io   docker.io/sath89/oracle-12c                   Oracle Standard Edition 12c Release 1 with…   409                  [OK]

docker.io   docker.io/frolvlad/alpine-oraclejdk8          The smallest Docker image with OracleJDK 8…   343                  [OK]

docker.io   docker.io/alexeiled/docker-oracle-xe-11g      This is a working (hopefully) Oracle XE 11…   273                  [OK]

docker.io   docker.io/sath89/oracle-xe-11g                Oracle xe 11g with database files mount su…   224                  [OK]

docker.io   docker.io/wnameless/oracle-xe-11g             Dockerfile of Oracle Database Express Edit…   115                  [OK]

docker.io   docker.io/jaspeen/oracle-11g                  Docker image for Oracle 11g database            77                   [OK]

docker.io   docker.io/isuper/java-oracle                  This repository contains all java releases…   55                   [OK]

docker.io   docker.io/oracle/openjdk                      Docker images containing OpenJDK Oracle Linux   49                   [OK]

docker.io   docker.io/airdock/oracle-jdk                  Docker Image for Oracle Java SDK (8 and 7)…   39                   [OK]

docker.io   docker.io/sath89/oracle-ee-11g                Dockerfile of Oracle Database Enterprise E…   34                   [OK]

docker.io   docker.io/cogniteev/oracle-java               Oracle JDK 6, 7, 8, and 9 based on Ubuntu …   24                   [OK]

docker.io   docker.io/ingensi/oracle-jdk                  Official Oracle JDK installed on centos.        21                   [OK]

docker.io   docker.io/oracle/nosql                        Oracle NoSQL on a Docker Image with Oracle…   17                   [OK]

docker.io   docker.io/n3ziniuka5/ubuntu-oracle-jdk        Ubuntu with Oracle JDK. Check tags for ver…   16                   [OK]

docker.io   docker.io/sgrio/java-oracle                   Docker images of Java 7/8/9/10 provided by…   16                   [OK]

docker.io   docker.io/andreptb/oracle-java                Debian Jessie based image with Oracle JDK …   7                    [OK]

docker.io   docker.io/flurdy/oracle-java7                 Base image containing Oracle’s Java 7 JDK       5                    [OK]

docker.io   docker.io/davidcaste/debian-oracle-java       Oracle Java 8 (and 7) over Debian Jessie        4                    [OK]

docker.io   docker.io/martinseeler/oracle-server-jre      Oracle’s Java 8 as 61 MB Docker container.      4                    [OK]

docker.io   docker.io/teradatalabs/centos6-java8-oracle   Docker image of CentOS 6 with Oracle JDK 8…   4

docker.io   docker.io/publicisworldwide/oracle-core       This is the core image based on Oracle Lin…   1                    [OK]

docker.io   docker.io/bitnami/oraclelinux-extras          Oracle Linux base images                        0                    [OK]

docker.io   docker.io/pivotaldata/oracle7-test            Oracle Enterprise Linux (OEL) image for GP…   0

docker.io   docker.io/softwareplant/oracle                oracle db                                       0                    [OK]

Oracle docker image download

docker pull sath89/oracle-12c

[docker_test@blue ~]$ docker pull sath89/oracle-12c

Using default tag: latest

Trying to pull repository docker.io/sath89/oracle-12c …

latest: Pulling from docker.io/sath89/oracle-12c

863735b9fd15: Pull complete

4fbaa2f403df: Pull complete

44be94a95984: Pull complete

a3ed95caeb02: Pull complete

b8bc6e8767ee: Pull complete

c918da326197: Pull complete

448e1619a038: Pull complete

faadd00cf98e: Downloading [====>                                              ] 266.9 MB/2.768 GB

fab7f453b7c6: Download complete

c98ac63d2108: Download complete

download 된 image 확인

[docker_test@blue ~]$ docker images

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE

docker.io/sath89/oracle-12c   latest              ee3351d51185        2 months ago        5.7 GB

실행

docker run –name oracle12c -d -p (외부포트):8080 -p (외부포트):1521 -v (외부경로):/u01/app/oracle sath89/oracle-12c

[docker_test@blue ~]$ docker run –name oracle12c -d -p 28080:8080 -p 21521:1521 -v /home/docker_test/vm_ora12c:/u01/app/oracle sath89/oracle-12c

185cb33e3b92b6473c13f35e687b960d42da9e547ceb600e5a181d0ed7fca631

실행 로그 확인

 docker logs -f oracle12c

[docker_test@blue ~]$ docker logs -f oracle12c

Database not initialized. Initializing database.

Starting tnslsnr

Copying database files

1% complete

3% complete

11% complete

18% complete

26% complete

37% complete

Creating and starting Oracle instance

40% complete

45% complete

……

ls: cannot access /docker-entrypoint-initdb.d/*: No such file or directory

Import finished

Database ready to use. Enjoy! 😉

oracle 의 사용자 계정 생성

docker exec  -it oracle12c /bin/bash

su oracle

export PATH=$PATH:$ORACLE_HOME/bin

sqlplus /as sysdba

create user testuser identified by oracle;

grant dba to testuser;

exit (연속)

[docker_test@blue ~]$ docker exec -it oracle12c /bin/bash

root@185cb33e3b92:/# su oracle

oracle@185cb33e3b92:/$ export PATH=$PATH:$ORACLE_HOME/bin

oracle@185cb33e3b92:/$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Mon Oct 29 05:24:43 2018

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Connected to:

Oracle Database 12c Standard Edition Release 12.1.0.2.0 – 64bit Production

SQL> create user testuser identified by oracle

2  /

User created.

SQL> grant dba to testuser

2  /

Grant succeeded.

해당 유저로 접속 확인

 docker exec -it oracle12c sqlplus testuser/oracle

[docker_test@blue ~]$ docker exec -it oracle12c sqlplus testuser/oracle

SQL*Plus: Release 12.1.0.2.0 Production on Mon Oct 29 05:26:30 2018

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Connected to:

Oracle Database 12c Standard Edition Release 12.1.0.2.0 – 64bit Production

SQL>

 

[엘라스틱서치] Elasticsearch in action – 데이터 검색

엘라스틱서치는 루씬 검색 기능을 모두 사용해서 데이터를 검색할 수 있도록 풍부한 API를 제공한다. 엘라스틱서치는 그 형식 덕분에 다양한 조합으로 검색 요청을 만들 수 있다. 데이터에 사용할 적절한 필터 조합 쿼리를 찾는데 가장 나은 방법은 시험해보는 것이다. 프로젝트 데이터에서 원하는 가장 적합한 것을 찾기 위해 여러가지 조합을 시도해보는 것이 가장 중요하다.

 

  • 검색 요청과 검색 요청의 결과가 일반적으로 어떻게 보여질까?
  • 검색 API의 주요 구성 요소 중 하나인 쿼리와 필터 DSL를 알아본다.
  • 필터와 쿼리에 사용하는 가장 일반적인 방법 / 쿼리와 필터의 차이점
  • 엘라스틱서치가 도큐먼트의 점수를 어떻게 계산할까?

REST API 검색 요청은 처음 접속하려고 선택한 노드에 전송되고 검색 요청을 모든 샤드(주 또는 레플리카)로 보낸다. 모든 샤드에서 정렬 및 순위를 매긴 결과로부터 충분한 정보를 수집하면, 오직 반환될 도큐먼트 내용을 담고 있는 샤드만 해당 내용을 반환하도록 요청 받는다. 이런 검색 라우팅 기능은 설정할 수 있는데, “query_then_fetch”라 부르는 기본동작이다.

 

엘라스틱서치 검색 요청은 JSON 도큐먼트 기반 요청이거나 URL 기반 요청이다. 요청은 서버로 보내지고, 모든 검색 요청이 같은 형식을 따르기 때문에 개별 검색 요청을 변경할 수 있는 구성 요소에 대해 이해하는 것이 도움이 된다.

 

색인은 두 개의 샤드이고 샤드당 한 개의 복제본으로 구성한다. 도큐먼트를 찾고 점수를 산정한 후 상위 n개의 도큐먼트가 반환된다.

 

 

(1) 검색 범위 지정하기

모든 REST 검색 요청은 _search REST 종단점을 사용하고 GET이나 POST 요청 중 하나가 된다. 전체 클러스터를 검색하거나 또는 요청 URL에 색인 이름 또는 타입을 지정해서 범위를 제한할 수 있다.

 

일단 색인을 하면, 다중 색인을 검색하는 alias도 사용할 수 있다. 이 방식은 접근 가능한 날짜와 시간으로 구성한 이름의 색인을 이용해서 검색할 때 종종 사용한다. 즉, logstash-yyyymmdd 형식의 색인은 하나의 앨리어스로 logstash를 호출하지만 실은 전체 색인을 가리키게 된다. 기본 검색을 할 수도 있고 curl ‘localhost:9200/logstash/_search’처럼 전체 logstash 기반 색인에 한정할 수도 있다. 최고 성능을 내려면, 최소한의 색인과 타입을 사용하도록 쿼리를 제한하는 것이 좋다. 각 검색 요청이 모든 색인 샤드에 전송된다는 사실은, 더 많은 색인은 더 많은 샤드에 검색 요청이 전송된다는 것을 의미한다.

 

 

(2) 검색 요청의 기본 구성 요소

검색할 색인을 선택했다면, 검색 요청에 있어 가장 중요한 구성 요소를 설정해야 한다. 구성 요소는 반환할 도큐먼트 개수를 제어하고, 최적의 도큐먼트를 선택하게 하며, 원치 않는 도큐먼트는 결과에서 걸러내도록 한다.

 

  • query – 검색 요청에 있어 가장 중요한 요소다. 점수 기반으로 최적의 도큐먼트를 반환하거나 원치 않는 도큐먼트를 걸러내도록 설정한다. 이 구성 요소는 DSL 쿼리와 DSL 필터를 사용해서 구성한다.
  • size – 반환할 도큐먼트 개수를 의미한다.
  • from – size와 함께 Pagination에 사용한다. 다음 페이지 10개를 결정하기 위해 엘라스틱서치는 상위 20개를 산출해내야 한다는 점을 기억한다. 결과 집합이 커져서 중간쯤 어딘가의 페이지를 가져오는 것은 비용이 많이 들어가는 요청이 될 것이다.
  • _source – _source 필드는 어떻게 반환할 것인가를 명시한다. 기본값은 완전한 _source 필드를 반환하는 것이다. _source 설정으로 반환되는 필드를 걸러낼 수 있다. 색인된 도큐먼트가 크고 결과에서 전체 내용이 필요하지는 않을때 사용한다. 이 옵션을 사용하려면, 색인 매핑에서 _source 필드를 비활성화하지 않아야 한다. 필드와 _source간에는 차이가 있다.
  • sort – 기본 정렬은 도큐먼트 점수에 따른다. 그런데, 점수 계산이 필요없거나 동일 점수의 다수 도큐먼트가 예상된다면, 반환한 도큐먼트 결과로부터 가져올때 sort를 추가해서 원하는대로 순서를 제어할 수 있다.

 

기본 구성 요소 중 쿼리 구성 요소에 대해 알아본다. match_all 쿼리를 match 쿼리로 변경하고, 필터 DSL에서 쿼리 DSL의 filtered 쿼리를 사용하는 검색 요청으로 변경하는 term 필터를 추가할 수 있다. 그리고 필터와 쿼리의 차이점을 깊게 알아 본다.

 

다음 예제는 “Hadoop” 단어를 제목으로 포함하는 그룹을 찾기 위해 match 쿼리를 사용했다.

 

curl ‘localhost:9200/get-together/event/_search’ -d ‘{
“query”: {
“match”: {
“title”: “hadoop”
}
}
}’

쿼리는 3건의 이벤트를 반환한다. 쿼리를 실행해서 처음 일치하는 것의 점수를 확인한다. 첫 일치는 “Using Hadoop with Elasticsearch”라는 제목을 가진 도큐먼트이다. 이 검색을 H가 대문자인 “Hadoop” 단어로 검색하도록 변경할 수 있다. 결과는 같을 것이다.

 

필터가 쿼리와 유사하긴 해도 점수 매김과 여러가지 검색 기능 수행을 어떻게 적용하는지가 다르다. 쿼리가 특정 텀으로 점수 계산하는 것과 달리, 검색에서 필터는 “이 도큐먼트가 이 쿼리와 일치를 하는가”하는 단순 이진법의 예 또는 아니요 답변만을 반환한다.

 

 

필터는 이런 차이점 때문에 일반 쿼리를 사용하는 것보다 더 빠를 수 있고 캐시할 수도 있다. 필터를 이용해서 검색하는 것은 쿼리를 사용하는 일반 검색과 유사하게 보이지만, 실제는 그렇지 않다. 쿼리는 원래의 쿼리와 필터를 포함하는 “filtered” 맵으로 변경한다. 이 쿼리는 쿼리 DSL에서 filtered query로 부른다. filtered query는 두 개의 구성 요소. 즉, 쿼리와 필터를 포함한다.

 

$ curl 'localhost:9200/get-together/_search' -d '{
    "query": {
        "filtered": {
            "query": {
                "match": {
                    "title": "hadoop"
                }
        },
        "filter": {
            "term": {
                "host": "andy"
            }
        }
    }
}'

 

여기 “hadoop”으로 일치하는 이벤트를 위한 일반적인 쿼리처럼 필터가 사용되었으나, 필터는 “Hadoop” 단어를 위한 쿼리뿐만 아니라 특정 이벤트로 제한할 때에도 사용한다. 이 특정 필터 부분 내부에, host가 “andy”인 모든 도큐먼트를 찾기 위해 텀 필터가 사용되었다. 여기서 엘라스틱서치는 이 필터와 일치하는 도큐먼트인지 아닌지 보여주는 바이너리 비트 집합인 Bitset을 작성한다.

 

엘라스틱서치가 비트셋을 만들고 나서는 도큐먼트를 필터링하는데 사용할 수는 있으나 검색의 쿼리 일부분으로 검색하는 것은 아니다. 필터는 점수 계산이 필요한 도큐먼트를 제한한다. 제한된 도큐먼트 집합의 접수는 쿼리 기반으로 계산된다. 이런 이유로, 필터를 추가하는 것은 전체 쿼리를 단일 검색으로 결합하는 것보다 더 빠른다. 어떤 종류의 필터인가에 따라 엘라스틱서치는 비트셋 결과를 캐시할 수 있다. 필터를 다른 검색에 사용해도 비트셋을 다시 계산할 필요가 없다.

 

그러나 어떤 유형의 필터의 경우, 엘라스틱서치가 다시 사용되지 않을 것으로 판단하거나 비트셋 재생성 비용이 사소하다면 자동으로 캐시하지 않을 수 있다. 캐시하기 어려운 쿼리의 예로 최근 한 시간의 모든 문서로 결과를 제한하는 필터의 경우가 그러하다. 이 쿼리는 이를 실행할 때 매초 변경되어야 하므로 캐시할 이유가 없다. 추가로, 엘라스틱서치는 필터를 캐시해야 할지에 관해 수동으로 지정하는 기능을 제공한다. 이 모든 것은 필터를 가진 검색을 더 빠르게 만든다. 그러므로 가능하다면 쿼리의 일부분을 필터로 만들 필요가 있다.

 

비록 엘라스틱서치에서 쿼리하는 수많은 방법이 있지만, 어떤 쿼리는 색인에 데이터가 어떻게 저장되었는지에 의존하는 쿼리보다 더 나을 수 있다. 엘라스틱서치가 지원하는 쿼리의 서로 다른 타입을 알아보고, 쿼리에서 어떻게 사용하는지 알아보도록 하겠다. 어떤 쿼리가 데이터에 가장 적합한지 결정할 수 있도록 각각 성능에 대해서도 언급하고, 각 쿼리를 사용할 때의 장단점에 대해서 가늠해보도록 한다.

 

전체 도큐먼트를 반환하는 match_all 쿼리로 시작하여, 특정 필드에 대해 일치하는 다어로 결과를 제한하는 match 쿼리로, 그리고 특정 필드에 있는 텀을 사용해서 결과를 제한하는 텀 필터가지 사용해봤다. 그리고 query_string을 사용하는 방법도 존재한다. 이 쿼리는 URL 기반 검색에서 사용하게 된다.

 

 

MATCH_ALL 쿼리

이 필터는 모든 도큐먼트를 일치하게 한다. 도큐먼트 점수에 관해 신경쓰지 않을때라면, 쿼리 대신 필터 사용이 필요할때 match_all 쿼리가 상당히 유용하다. 또는 검색하는 색인과 타입 사이에서 모든 도큐먼트를 반환하고 싶을때 유용하다. 이 쿼리는 다음과 같은 형태다.

curl 'localhost:9200/_search' -d '{
    "query" : {
        "match_all": {}
    }
}'

 

 

검색에 쿼리 부분 대신 필터를 사용하면 쿼리는 아래와 같다.

curl 'localhost:9200/get-together/_search' -d '{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                ... 필터 세부 내용 ...
            }
        }
    }
}'

 

거의 모든 것을 검색하기 때문에 검색엔진을 사용함에도 사용자에게는 유용해 보인다. Match_all 쿼리를 기본으로 사용하면 검색요청도 더 쉽게 만들 수 있다. 그러므로 쿼리 요소는 이 경우 완벽하게 생략할 수 있다.

 

 

QUERY_STRING 쿼리

엘라스틱서치 서버를 시작하고 실행할때, query_string 쿼리를 이용하면 쉽게 쿼리 결과를 얻을 수 있다. query_string 검색은 요청 URL로부터 또는 요청 본문을 전송하는 것으로부터 수행할 수 있다. 아래 예제는 “nosql”을 포함하는 도큐먼트를 검색하는데, 이 쿼리는 도큐먼트 한 건을 반환할 것이다.

// query_string 검색은 URL 파라미터처럼 전송
curl -X GET 'localhost:9200/get-together/_search?q=nosql&pretty'

// 같은 query_string 검색을 요청 본문처럼 전송
curl -X POST 'http://localhost:9200/get-together/_search?pretty' -d '{
    "query": {
        "query_string" : {
            "query" : "nosql"
        }
    }
}'

 

기본적으로, query_string 쿼리는 _all 필드를 검색한다. _all 필드는 모든 필드 결합으로 구성되어 있다. description:nosql 처럼 쿼리로 특정 필드를 지정하거나 요청 본문에 default_field를 지정하면 이를 변경할 수 있다.

curl -X POST 'localhost:9200/_search' -d '{
    "query": {
        "query_string" : {
            // 쿼리에 지정된 필드가 없기 때문에 기본 필드가 사용.
            "default_field": "description",
            "query": "nosql"
        }
    }
}'

 

추측할 수 있듯이, 이 문법은 단일 단어를 검색하는 것보다 더 많은 것을 제공한다. 내부적으로, 이는 모두 AND와 OR처럼 boolean 연산자로 서로 다른 텀을 검색하고 추가적으로 마이너스(-) 연산을 사용해서 결과로부터 도큐먼트를 제외하는 결합의 루씬 쿼리 문법이다. 다음 쿼리는 “nosql” 이름으로 모든 그룹을 검색하지만 description에 “mongodb”를 포함하지 않는다.

name:nosql AND -description:mongodb

 

1999년부터 2001년 사이에 생성한 모든 search와 모든 lucene 그룹은 다음과 같이 검색할 수 있다.

(tags:search OR tags:lucene) AND created_on:[1999-01-01 TO 2001-01-01]

 

query_string는 쿼리가 위력적이여서, 웹사이트 사용자에게 그대로 노출하면, 엘라스틱서치 클러스터가 위험할 수 있다. 사용자가 잘못된 형식으로 쿼리를 실행하면 예외 상황에 맞닥뜨리게 될 수 있다. 또한, 모든 것을 반환하는 조합을 만들 가능성도 있어서, 이는 클러스터에 리스크가 될 수 있다.

 

도큐먼트의 필드와 필드 내에 있는 문자열 검색을 허용하는 term, terms, match, multi_match 쿼리를 포함하는 query_string 쿼리는 다른 대체재로 교체하는 것을 추천한다. 적절한 대체재는 simple-query-string 쿼리인데, +,-,AND,OR를 사용하여 쉽게 접근 가능한 쿼리 문법으로 교체할 수 있다.

 

 

텀 쿼리와 텀 필터

텀 쿼리와 필터는 실행 가능한 가장 단순한 쿼리인데, 필드와 텀을 지정해서 도큐먼트 내에서 검색할 수 있다. 검색한 텀이 분석되지 않았기 때문에 완전히 일치하는 도큐먼트 결과만 찾는것은 것을 알아둔다. 엘라스틱서치에 의해 어떻게 텍스트를 개별적인 색인 조각으로 토큰을 만드는 지는 데이터 분석 파트에서 확인할 수 있다. 루씬에 익숙하다면, 텀쿼리가 직접적으로 루씬 TermQuery로 매핑된다는 것은 유용한 정보가 된다.

 

다음은 elasticsearch 태그로 그룹을 검색하는 텀 쿼리이다.

curl 'localhost:9200/get-together/group/_search' -d '{
	"query": {
		"term": {
			"tags": "elasticsearch"
		}
	},
	"_source": ["name", "tags"]
}'

{
	...
	"hits": [
		{
			"_id": "3",
			"_index": "get-together",
			"_score": 1.0769258,
			"_type": "group",
			"_source": {
				"name": "Elasticsearch San Francisco",
				"tags": [
					"elasticsearch",
					"big data",
					"lucene",
					"open source"
				]
			}
		},
		{
			"_id": "2",
			"_index": "get-together",
			"_score": 0.8948604,
			"_type": "group",
			"_source": {
				"name": "Elasticsearch Denver",
				"tags": [
					"denver",
					"elasticsearch",
					"big data",
					"lucene",
					"solr"
				]
			}
		}
	],
	...
}

 

텀 쿼리처럼 텀 필터는 점수에 영향을 미치지 않고 텀을 포함하는 도큐먼트의 제한된 결과가 필요할 때 사용할 수 있다. 점수를 사용한 이전 예제의 도큐먼트 점수를 다음 예제와 비교하자. 필터가 계산에 방해가 되지도 점수에 영향을 미치지도 않는다는 것을 알게 될 것이다. Match_all 쿼리 대문에 모든 도큐먼트의 점수는 1.0이 된다. 도큐먼트 점수는 필터가 쿼리대신 사용되었으므로 이제 상수가 된다.

curl 'localhost:9200/get-together/group/_search' -d '{
	"query": {
		"filtered": {
			"match_all": {}
		},
		"filter": {
			"term": {
				"tags": "elasticsearch"
			}
		}
	},
	"_source": ["name", "tags"]
}'

{
	...
	"hits": [
		{
			"_id": "3",
			"_index": "get-together",
			"_score": 1.0,
			"_type": "group",
			"_source": {
				"name": "Elasticsearch San Francisco",
				"tags": [
					"elasticsearch",
					"big data",
					"lucene",
					"open source"
				]
			}
		},
		{
			"_id": "2",
			"_index": "get-together",
			"_score": 1.0,
			"_type": "group",
			"_source": {
				"name": "Elasticsearch Denver",
				"tags": [
					"denver",
					"elasticsearch",
					"big data",
					"lucene",
					"solr"
				]
			}
		}
	],
	...
}

 

 

텀즈 쿼리

텀 쿼리와 유사하게, 텀즈(term이 아닌 terms) 쿼리로 도큐먼트 필드에서 다중 텀으로 검색할 수 있다. 예를 들어, 다음 예제는 “jvm”, “hadoop” 중 어느 하나와 일치하는 태그의 그룹을 검색한다.

curl 'localhost:9200/get-together/group/_search' -d '{
	"query": {
		"terms": {
			"tags": ["jvm", "hadoop"]
		}
	},
	"_source": ["name", "tags"]
}'

{
	...
	"hits": [
		{
			"_id": "1",
			"_index": "get-together",
			"_score": 0.33779633,
			"_type": "group",
			"_source": {
				"name": "Denver Clojure",
				"tags": [
					"clojure",
					"denver",
					"function programming",
					"jvm",
					"java"
				]
			}
		},
		{
			"_id": "4",
			"_index": "get-together",
			"_score": 0.22838624,
			"_type": "group",
			"_source": {
				"name": "Boulder/Denver big data get-together",
				"tags": [
					"big data",
					"data visualization",
					"open source",
					"cloud computing",
					"hadoop"
				]
			}
		}
	]
}

 

쿼리 일치 전에 도큐먼트에서 최소 개수의 텀 일치를 강제하려면, minimum_should_match 파라미터를 지정한다. 이외에 다중 쿼리와 단일 쿼리를 결합할 필요가 있을때, 다중 텀 쿼리를 결합한 복합 쿼리를 작성할 수도 있다.

 

curl 'localhost:9200/get-together/group/_search' -d '{
	"query": {
		"terms": {
			"tags": ["jvm", "hadoop", "lucene"],
			"minimum_should_match": 2
		}
	}
}'

 

 

매치 쿼리와 텀 필터

텀 쿼리와 유사하게 매치 쿼리는 검색하려는 필드와 검색하려는 문자열을 포함하는 해시맵인데, 필드나 한번에 모든 필드를 검색하는 _all 필드가 올 수 있다. 다음 예제는 name 필드에 “elasticsearch”를 포함하는 그룹을 검색하는 매치 쿼리다.

curl 'localhost:9200/get-together/group/_search' -d '{
	"query": {
		"match": {
			"name": "elasticsearch"
		}
	}
}'

 

매치 쿼리는 몇몇 서로 다른 방식으로 동작할 수 있다. 가장 주요한 두 가지의 기능은 boolean과 phrase다.

 

 

(1) BOOLEAN 쿼리

기본적으로, 쿼리 매치는 Boolean 기능과 OR 연산을 사용한다. 예를 들어 “Elasticsearch Denver” 텍스트를 검색한다면 엘라스틱서치는 “Elasticsearch OR Denver”로 검색해서 “Elasticsearch Amsterdam”과 “Denver Clojure Group” 모두로부터 get-together groups가 일치할 것이다.

 

“Elasticsearch”와 “Denver”를 모두 포함하는 결과를 검색하려면, 맵과 추가하는 연산자 필드 설정에 들어가는 일치 필드 이름을 수정하면서 연산자를 변경한다.

curl 'localhost:9200/get-together/_search' -d '{
	"query": {
		"match": {
			"name": {
				"query": "Elasticsearch Denver",
				"operator": "and"
			}
		}
	}
}'

 

 

(2) PHRASE 쿼리

도큐먼트 내에서 각 단어의 위치에 따른 leeway 값처럼 특정 구를 검색할때 phrase 쿼리가 유용하다. Leeway는 slop으로 불리는데 구문 내에서 토큰 사이의 거리를 표현하는 수치 값이다. get-together의 그룹 name을 기억해 내려 할때, “Enterprise” 단어와 “London” 단어는 기억하나 name의 나머지는 기억하지 못한다고 하자. “enterprise london” 구문을 기본값 0 대신 slop을 1 또는 2로 설정해서 완전한 그룹 제목을 몰라도 구문을 포함하는 결과를 찾아 검색할 수 있다.

curl 'localhost:9200/get-together/group/_search' -d '{
	"query": {
		"match": {
			"name": {
				"type": "phrase" // 일반 match 쿼리 대신 match phrase 쿼리 사용
				"query": "enterprise london",
				"slop": 1 // slop에 1을 지정해서 텀간 leeway 거리를 가지도록.
			}
		}
	}
}'

 

 

Phrase_prefix 쿼리

Match_phrase 쿼리와 유사하게 match_phrase_prefix 쿼리는 phrase로 검색하는 것에 더해서 phrase 내에서 마지막 텀에 프리픽스 매칭을 허용한다. 이 기능은 검색을 제안하는 검색창에서 사용자가 검색 텀을 입력하는 동안 자동완성을 제공하는 데 정말 유용하다. 이런 유형의 기능으로 검색을 사용할 때, max_expansions 설정을 사용해서, 검색이 반환할 이해 가능한 수준의 총 소요 시간 내에서 확장할 프리픽스의 최댓값을 설정하는 것이 좋다.

curl 'localhost:9200/get-together/group/_search' -d '{
	"query": {
		"match": {
			"name": {
				"type": "phrase_prefix",
				"query": "Elasticsearch den",
				"max_expansions": 1
			}
		}
	},
	"_source": ["name"]
}'

 

Boolean과 phrase 쿼리는 사용자 입력을 받아들이는 데 훌륭한 선택이 된다. Query_string 쿼리와 다르게 매치 쿼리가 +,-,ㅡ?,! 같은 예약된 문자를 막지 않으면서 오류 발생이 가장 적은 방식으로 사용자 입력을 그대로 넘기도록 허용하기 때문이다.

 

(1) MULTI_MATCH로 다중 필드 일치

비록 multi_match 쿼리가 텀즈 쿼리처럼 필드에서 다중 일치로 검색하는 기능으로 고려해볼 수 있겠지만, 이 기능은 다소 다르다. 다만, 다중 필드의 값을 검색하도록 허용한다. 이는 get-together 예제에서 그룹 name과 description 문자열로 검색하기를 원하는 곳에 유용할 수 있다.

 

curl 'localhost:9200/get-together/_search' -d '{
	"query": {
		"multi_match": {
			"query": "elasticsearch hadoop",
			"fields": ["name", "description"]
		}
	}
}'

 

매치 쿼리가 phrase 쿼리, prefix 쿼리 또는 phrase_prefix 쿼리로 전환할 수 있는 것처럼, multi_match 쿼리는 type 키를 추가해서 phrase 쿼리 또는 phrase_prefix 쿼리로 전환할 수 있다. Multi_match 쿼리는 검색을 위해 단일 필드 대신 다중 필드를 지정할 수 있다는 것을 제외하고는 매치 쿼리와 완전히 비슷하다.

 

매치 쿼리를 사용하면 어떠한 것도 검색할 수 있는데, 이는 대부분의 경우 기본적으로 사용할 수 있는 쿼리 타입이라 할 수 있어, 가능한 이를 사용하도록 강하게 추천한다.

 

bool 쿼리

Bool 쿼리는 몇 개의 쿼리라도 특정 부분이 must, should, must_not로 데이터가 일치하는지 명시하게 하는 쿼리 구문을 이용해서 단일 쿼리에 결합할 수 있다.

  • bool 쿼리로 must 매치를 지정한다면, 쿼리가 반환하는 오직 일치하는 결과만 받는다.
  • should 매치를 지정하면, 도큐먼트가 반환하는 특정 개수의 구문이 일치해야 한다는 의미다.
  • must 구문이 지정되지 않으면, 도큐먼트로부터 반환되는 것으로부터 일치하는 적어도 하나는 가져야 한다.
  • 마지막으로 must_not 구문은 일치하는 도큐먼트가 결과셋에서 제외하는데 사용한다.
bool 쿼리 절 이진 연산 대응 의미
must 다중 절을 결합하기 위해 이진 and 연산을 사용 (query1 AND query2 AND query3) must 절에서 검색은 도큐먼트가 일치해야 한다. 소문자 and는 함수이고, 대문자 AND는 연산자이다.
must_not 이진 not 연산으로 다중 절 결합 must_not 절에서 검색은 도큐먼트의 부분이 되지 않아야 한다. 다중 절은 이진 not 메소드에서 결합한다.
should 이진 or 연산으로 다중 절 결합
(query1 OR query2 OR query3)
should 절에서 검색은 이진 OR(query1 OR query2 OR query3)와 유사하게 도큐먼트가 일치하거나 그렇지 않을 수 있다. 그러나 최소 minimum_should_match 파라미터로 이 갯수만큼을 일치해야 한다. (must가 존재하지 않으면 기본값은 1이고, must가 존재한다면 0이다)

 

David가 참성한(attendees 텀) 이벤트를 검색하는데, Clint나 Andy 중 하나는 참석해야 하고, June 30, 2013보다 오래되지 않아야 한다.

curl 'localhost:9200/get-together/_search' -d '{
	"query": {
		"bool": {
			"must": [
				{
					"term": {
						"attendees": "david"
					}
				}
			],
			"should": [
				{
					"term": {
						"attendees": "clint"
					}
				},
				{
					"term": {
						"attendees": "andy"
					}
				}
			],
			"must_not": [
				{
					"range": {
						"date": {
							"lt": "2013-06-30T00:00"
						}
					}
				}
			],
			"minimum_sould_match": 1
		}
	}
}'

 

bool 필터

Bool 쿼리의 필터 버전은 쿼리 버전처럼 거의 동일한 역할을 하지만, 쿼리 대신 필터를 결합한다. 이전 예제의 필터에 해당하는 것은 다음과 같다. 단, bool 필터는 minimum_sould_match 속성을 제공하지 않는다.

curl 'localhost:9200/get-together/_search' -d '{
	"query": {
		"filtered": {
			"query": {
				"match_all": {}
			},
			"filter": {
				"bool": {
					"must": [
						{
							"term": {
								"attendees": "david"
							}
						}
					],
					"should": [
						{
							"term": {
								"attendees": "clint"
							}
						},
						{
							"term": {
								"attendees": "andy"
							}
						}
					],
					"must_not": [
						{
							"range": {
								"date": {
									"lt": "2013-06-30T00:00"
								}
							}
						}
					]
				}
			}
		}
	}
}'

 

query_string과 매치 쿼리같은 범용 쿼리는 검색차에서 사용자가 입력한 단어로 그런 쿼리를 실행할 수 있어서 특히 유용하다. 검색 범위를 좁히는 목적으로 특정 사용자 인터페이스는 검색창 옆에 최근 생성된 그룹을 검색하도록 하는 달력 위젯이나 특정 위치에서 발생한 이벤트를 필터링하려는 체크 상자 같은 또 다른 요소를 포함하기도 한다.

 

(1) 범위 쿼리와 필터

특정 범위 사이의 숫자, 날짜 및 문자열까지고 사용할 수 이쓴 값으로 쿼리하는 데 사용한다. 범위 쿼리를 사용해서 필드의 상위 및 하위 값을 지정한다.

curl 'localhost:9200/get-together/_search' -d '{
	"query": {
		"range": {
			"created_on": {
				"gt": "2012-06-01",
				"lt": "2012-09-01"
			}
		}
	}
}'

curl 'localhost:9200/get-together/_search' -d '{
	"query": {
		"filtered": {
			"query": {
				"match_all": {}
			}
		},
		"filter": {
			"range": {
				"created_on": {
					"gt": "2012-06-01",
					"lt": "2012-09-01"
				}
			}
		}
	}
}'

범위 쿼리는 문자열 범위도 지원한다. 범위 검색을 사용할 때 필터가 더 나은 선택인지 신중하게 생각하는게 좋다. 바이너리 매치를 가지는 범위 쿼리로 들어간 도큐먼트는 범위 쿼리가 되는데 필요하지 않기 때문이다. 쿼리로 만들지 필터로 만들지 확실치 않다면 필터로 만드는 것을 권장한다. 범위 쿼리를 만드는데 99% 경우, 필터가 옳은 선택이다.

 

프리픽스 쿼리와 필터

텀 쿼리와 유사하게 프리픽스 쿼리와 필터는 검색하기 전에 분석이 안된 프리픽스를 포함하는 텀을 검색하도록 해준다. 예를 들어, “liber”로 시작하는 모든 이벤트의 색인 검색은 다음 쿼리를 사용한다.

curl 'localhost:9200/get-together/event/_search' -d '{
	"query": {
		"prefix": {
			"title": "liber"
		}
	}
}'

curl 'localhost:9200/get-together/event/_search' -d '{
	"query": {
		"filtered": {
			"query" : {
				"match_all": {}
			},
			"filter": {
				"prefix": {
					"title": "liber"
				}
			}
		}
	}
}'

검색 프리픽스는 전송 전에는 분석되지 않으므로, “liber”를 “Liber”로 변경하여 검색요청을 보내면 색인에 소문자로 된 텀을 찾을 수 없다. 이는 엘라스틱서치가 도큐먼트를 분석하고 쿼리하는 방식때문이다. 이 기능때문에 프리픽스 쿼리는 텀이 색인의 일부분일때 사용자가 입력한 부분 텀의 자동완선에 있어서 좋은 선택이다. 예를 들어, 존재하는 카테고리가 이미 알려져 있을때 카테고리 입력창을 제공할 수있다. 사용자가 색인의 일부분인 텀을 입력하고 있다면, 사용자의 검색창에 입력하는 텍스트를 소문자로 변경한 다음 결과를 보여주는 어떤 다른 결과를 보여주기 위해 프리픽스 쿼리를 사용할 수 있다.

 

프리픽스 쿼리로부터 매칭 결과를 가지고 있을때 사용자가 입력하는 도중에 제안처럼 그들을 제공할 수 있다. 그러나 결과에서 텀을 분석하거나 fuzziness 값을 지정하기를 원하다면, 자동완성 기능을 위해 match_phrase_prefix 쿼리를 사용하는 게 아마 나을 것이다.

출처: https://12bme.tistory.com/477 [길은 가면, 뒤에 있다.]

ORACLE JOB 등록방법 (simple)

오라클 자체적으로 프로시저, 패키지, 등의 OBJECT 를 ORACLE JOB QUEUE에 등록후 스케쥴링 하여 사용할수 있습니다.

단, ORACLE PARAMETER 의 JOB_QUEUE_PROCESSES가 0보다 커야 JOB 스케쥴링이 동작한다는것에 유의하세요.

ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 10 ; –변경

# DBMS_JOB 패키지의 프로시저

DBMS_JOB.SUBMIT( );          : JOB 등록

DBMS_JOB.REMOVE( );        : 제거

DBMS_JOB.CHANGE( );        : 변경

DBMS_JOB.NEXT_DATE( );   : JOB의 다음 수행시간 변경

DBMS_JOB.INTERVAL( );       : JOB의 실행 CYCLE 지정

DBMS_JOB.WHAT( );              : JOB 수행 으로 등록된 OBJECT 를 변경

DBMS_JOB.RUN( );                : JOB을 수동으로 실행

BEGIN
DBMS_JOB.RUN(‘4’);  — JOB 조회 후 번호 기술
END;

 

# SUBMIT 프로시져를 이용한 JOB등록 예제

DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT (
JOB       => X
,WHAT      => ‘실행할 OBJECT’
,NEXT_DATE => TO_DATE(’17-11-2007 09:00:00′,’DD/MM/YYYY HH24:MI:SS’)
,INTERVAL  => ‘TRUNC(SYSDATE) + 1 + 9/24’
,NO_PARSE  => TRUE
);
SYS.DBMS_OUTPUT.PUT_LINE (‘JOB NUMBER IS:’|| TO_CHAR (X)) ;
END;

# INTERVAL을 세팅

1. 10분간격으로 실행

SYSDATE + 1/24/6

2. 현재 시간으로 부터 다음 날 현재 시간에 실행 (매일)

SYSDATE + 1    — 지금이 오후3시면 다음날 오후 3시 에 매일매일 실행

3. 매일 새벽 5시

TRUNC(SYSDATE) + 1 + 5 / 24

4. 매일 밤 10시

TRUNC(SYSDATE)  + 20 / 24

# JOB의 확인

SELECT * FROM USER_JOBS;

NEXT_DATE 을 통해 다음 실행 예정인 시각을 확인

# 자세한 사항은 아래를 참고

HTTP://WWW.PSOUG.ORG/REFERENCE/DBMS_JOB.HTML

Oracle export/import 유틸리티 – Oracle Data Pump(expdp/impdp)

Oracle Data Pump 유틸리티의 사용법을 알아보겠습니다.

Oracle Data Pump 유틸리티를 사용하기 위해서는 덤프 파일이 생성될 폴더를 지정하고, 그 폴더에 읽기, 쓰기 권한이 있어야 합니다.(데이터 import 를 위해 읽기, export를 위해 쓰기 권한이 필요합니다.)

이 예제에서는 Oracle Express Editon 11g r2를 사용해서 테스트 했습니다.

 

※ 디렉토리 생성 및 권한 주기

1. SYSTEM으로 로그인합니다.(일반 계정으로는 디렉토리를 추가할 권한이 없으므로 SYSTEM 계정으로 추가하고, 권한을 줍니다.)

 

2. 덤프 파일이 생성될 디렉토리를 생성합니다. 여기서는 ‘E:\export’ 를 만들었습니다.(이 폴더는 데이터베이스 서버에 만드는 것입니다.)

 

3. ‘E:\export’ 디렉토리를 TEST_DUMP 다른 이름으로 데이터베이스에 등록합니다.

CREATE OR REPLACE DIRECTORY TEST_DUMP AS 'E:\export';

 

4. 일반유저인 xeuser에게 이 디렉토리에 읽기, 쓰기 권한을 줍니다.

GRANT READ, WRITE ON DIRECTORY TEST_DUMP TO xeuser;

 

5. xeuser 계정으로 로그인하여 권한을 확인합니다.

– 디렉토리는 all_directories 뷰에서 확인할 수 있습니다.

SELECT * FROM all_directories;

결과)
OWNER  DIRECTORY_NAME  DIRECTORY_PATH
SYS    TEST_DUMP       E:\export

 

– 권한의 확인은 다음과 같이 할 수 있습니다.

SELECT * FROM all_tab_privs WHERE TABLE_NAME IN (
  SELECT DIRECTORY_NAME FROM all_directories
);

결과)
GRANTOR  GRANTEE  TABLE_SCHEMA  TABLE_NAME  PRIVILEGE  GRANTABLE  HIERARCHY
SYSTEM   XEUSER   SYS           TEST_DUMP   READ       NO         NO
SYSTEM   XEUSER   SYS           TEST_DUMP   WRITE      NO         NO

 

– Oracle 11g r2 이상이라면 다음 쿼리도 사용할 수 있습니다.

SELECT * FROM datapump_dir_objs;

결과)
NAME       PATH       READ  WRITE
TEST_DUMP  E:\export  TRUE  TRUE

 

※ 데이터 export/import 하기

Oracle Data Pump는 명령행 유틸리티 expdp/impdp를 사용해서 작업합니다.

 

1. 테이블 export/import(특정 테이블을 export/import 합니다.)

E:\>expdp xeuser/xeuser@xe tables=EMP,DEPT directory=TEST_DUMP dumpfile=EMP_DEPT.dmp logfile=expdpEMP_DEPT.log

E:\>impdp xeuser/xeuser@xe tables=EMP,DEPT directory=TEST_DUMP dumpfile=EMP_DEPT.dmp logfile=impdpEMP_DEPT.log

* xeuser/xeuser@xe – 로그인아이디/비밀번호@SID 입니다.

* tables=EMP, DEPT – 테이블을 콤마(,)로 분리해서 나열합니다.

* directory=TEST_DUMP – 덤프 파일이 생성될 디렉토리입니다. 위해서 만들것 입니다.

* dumpfile=EMP_DEPT.dmp – 생성될 덤프 파일의 이름 입니다.

* logfile=expdpEMP_DEPT.log – 로그 파일의 이름입니다. 덤프파일과 같은 위치에 만들어 집니다.

 

2. 스키마(Schema) export/import 하기

E:\>expdp xeuser/xeuser@xe schemas=XEUSER directory=TEST_DUMP dumpfile=XEUSER.dmp logfile=expdpXEUSER.log

E:\>impdp xeuser/xeuser@xe schemas=XEUSER directory=TEST_DUMP dumpfile=XEUSER.dmp logfile=impdpXEUSER.log

* schemas=XEUSER : 주어진 사용자(schema)가 가진 전체 객체를 export/import합니다.(이전 exp의 OWNER와 같은 기능의 옵션 입니다.)

 

3. 데이터베이스 전체 export/import 하기

E:\>expdp system/password@xe full=Y directory=TEST_DUMP dumpfile=XE.dmp logfile=expdpXE.log

E:\>impdp system/password@xe full=Y directory=TEST_DUMP dumpfile=XE.dmp logfile=impdpXE.log

* 전체 작업은 권한이 있는 system 계정으로 작업합니다.

* full=Y – 전체 데이터베이스를 대상으로 합니다.

 

4. 데이터베이스 Link를 export/import 하기

데이터베이스 Link를 통해서 export/import 하기 위해서는 로컬과 리모트 사용자 모두에게 EXP_FULL_DATABASE / IMP_FULL_DATABASE 롤이 부여되어 있어야 합니다.

다음 예는 로컬계정 은 xeuser이고, 리모트 서버가 REMOTE_SCOTT라는 이름으로 링크 되어 있다고 가정합니다.  리모트 계정은 scott 입니다.

E:\>expdp xeuser/xeuser@xe tables=SCOTT.EMP network_link=REMOTE_SCOTT directory=TEST_DUMP dumpfile=EMP.dmp logfile=expdpEMP.log

E:\>impdp xeuser/xeuser@xe tables=SCOTT.EMP network_link=REMOTE_SCOTT directory=TEST_DUMP logfile=impdpSCOTT.log remap_schema=SCOTT:XEUSER

* remap_schema=SCOTT:XEUSER – SCOTT계정의 객체들을 XEUSER계정으로 로드 합니다.

 

5. 버전을 지정하여 export 합니다.(버전은 9.2 이상만 지정할 수 있습니다.)

E:\>expdp xeuser/xeuser@xe schemas=XEUSER version=10.2 directory=TEST_DUMP dumpfile=XEUSER.dmp logfile=expdpXEUSER.log

이것으로 Oracle Data Pump 사용법에 대해 알아보았습니다.

 

자세한 옵션들에 대해서는 다음 URL을 참고 하세요.

출처 : https://oracle-base.com/articles/10g/oracle-data-pump-10g

DB ERD 관계선(실선, 점선)과 기호 설명

 
DBA는 아니지만, 프로그램을 잘 만들기 위해서 완성된 ERD를 이해하고, 나아가 간단한 모델링은 직접 
 
만들줄 알야한다고 생각한다.
 
 
ERD를 이해하기 위한 첫 걸음이자 가장 중요하다 할 수있는 부분이 관계선과 관계선에 사용되는 기호라
 
고 할 수 있다.
 
 
들어가기 앞서 관계선과 기호의 종류에대해 알아보자
 
관계선의 종류
  • 실선(Identifying): 식별관계
    • 부모테이블의 PK가 자식테이블의 FK/PK가 되는 경우
    • 부모가 있어야 자식이 생기는 경우
  • 점선(Non-Identifying): 비식별관계
    • 부모테이블의 PK가 자식테이블의 일반속성이 되는 경우
    • 부모가 없어도 자식이 생기는 경우
 
 
기호의 종류(도형 혹은 식별자)
  • |: 1개 / 실선은(dash) ‘1’을 나타낸다.
  • ∈: 여러개 / 까마귀 발(crow’s foot or Many)은 ‘다수’ 혹은 ‘그 이상’을 나타낸다.
  • ○: 0개 / 고리(ring or Optional)은 ‘0’을 나타낸다.
위와 같은 기호들을 서로 조합하여 사용될 수 있으며, 다음과 같은 조합이 가능하다.
 

  • Type1(실선과 실선): 정확히 1 (하나의 A는 하나의 B로 이어져 있다.)
  • Type2(까마귀발): 여러개 (하나의 A는 여러개의 B로 구성되어 있다.)
  • Type3(실선과 까마귀발): 1개 이상 (하나의 A는 하나 이상의 B로 구성되어 있다.)
  • Type4(고리와 실선): 0 혹은 1 (하나의 A는 하나 이하의 B로 구성되어 있다.)
  • Type5(고리와 까마귀발): 0개 이상 (하나의 A는 0또는 하나 이상의 B로 구성되 있다.)
기호의 조합은 보통 그림 예제의 Type1, Type3, Type4, Type5를 자주사용하며, 사용하는 
 
ERD 프로그램에 따라 조합 방식이 다를 수 있다.
 
 
(상품 테이블과 상품의 옵션 테이블의 관계를 정의할때, 상품의 옵션은 없을 수 도 있고, 여러개가 있을 
 
수 있기 때문에. 그림 예제 Type5로 표현이 가능하다.)
 
 

Oracle 12c ORA-01017: invalid username/password

After I installed Oracle SE 12c on my server, some clients with 11Gr2 or 9i (OCI,Oledb,.net and ODBC drivers) started to show the following error:

ORA-01017: invalid username/password; logon denied

오라클 12c 설치 하면 기존에 사용하던 11g 프로그램을 이용하여 접속시 위와 같은 에러가 나올때가
있다 .

그 경우 아래와 같이 해 주면된다.

1) 아래와 같이 oracle 에 sqlnet.ora 파일을 수정한다.
sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8

2) password 버전을 확인 합니다.
select USERNAME,ACCOUNT_STATUS,PASSWORD_VERSIONS from dba_users;

USERNAME          ACCOUNT_STATUS    PASSWORD_VERSIONS
—————                       ————–                   —————–
dummyuser                         OPEN                         11G 12C

3) 기존 패스워드를 재생성 합니다.

You must be careful with quotes and doble quotes.
It’s recommended to reset the user password, using a admin credentials.

ALTER USER user_name IDENTIFIED BY new_password;

4)접속을 해본다.

Oracle remote connection configuration 외부 접속 설정하기 (listener.ora)

최초 오라클을 설치하고 나면 TCP/IP 설정은 localhost 만 지정되어있습니다.

이 설정 파일은 다음과 유사한 경로를 가집니다.

C:\app\Administrator\product\11.2.0\orcl\NETWORK\ADMIN\listener.ora

 

이 파일을 열어보면 다음과 같이 기본 설정되어있습니다.

# listener.ora Network Configuration File: C:\app\Administrator\product\11.2.0\orcl\NETWORK\ADMIN\listener.ora

# Generated by Oracle configuration tools.

 

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

)

)

ADR_BASE_LISTENER = C:\app\Administrator

 

Administrator 계정으로 설치를 시작하고 다음 > 다음 > 다음 > …… 을 연타하면 위와 같이 지정되죠!!!

바인딩할 추가 IP를 지정합니다.

 

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

)

(DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.211.55.13)(PORT = 1521))

    )

)

 

실행 경로(Path)는 지정되어있다고 가정하고 리스너 서비스를 재시작합니다.

 

C:\app\Administrator\product\11.2.0\orcl\NETWORK\ADMIN>lsnrctl stop

LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 – Production on 26-6월 -2013 14:32:38

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))에 연결되었습니다

명령이 성공적으로 수행되었습니다

 

C:\app\Administrator\product\11.2.0\orcl\NETWORK\ADMIN>lsnrctl start

LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 – Production on 26-6월 -2013 14:32:43

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

시작 tnslsnr: 잠시만 기다리세요…

TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 – Production

시스템 매개변수 파일은 C:\app\Administrator\product\11.2.0\orcl\network\admi

n\listener.ora 입니다

c:\app\administrator\diag\tnslsnr\jkf\listener\alert\log.xml (으)로 로그 메시지

를 기록했습니다

리스닝이: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))

리스닝이: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))

리스닝이: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.211.55.13)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))에 연결되었습니다

리스너의 상태

————————

별칭                     LISTENER

버전                     TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 – Production

시작 날짜                 26-6월 -2013 14:32:49

업타임                   0 일 0 시간. 0 분. 5 초

트레이스 수준            off

보안                     ON: Local OS Authentication

SNMP                     OFF리스너 매개변수 파일   C:\app\Administrator\product\11.2.0\orcl\network\admin\listener.ora

리스너 로그 파일         c:\app\administrator\diag\tnslsnr\jkf\listener\alert\log.xml

끝점 요약 청취 중…

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))

 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.211.55.13)(PORT=1521)))

리스너는 서비스를 지원하지 않습니다

명령이 성공적으로 수행되었습니다

C:\app\Administrator\product\11.2.0\orcl\NETWORK\ADMIN>

리스너 서비스가 정상적으로 구동되면 이후부터 외부에서 정상적으로 접속 할 수 있습니다.

MariaDB Connect engine JDBC 연결 사용하기

MariaDB에서 이기종 데이터베이스를 사용하기 위해서 Connect 엔진을 사용합니다.

connect 엔진에 대한 MariaDB의 웹페이지는 아래를 참고하시면 됩니다.

https://mariadb.com/kb/en/library/connect/

connect 엔진을 이용해서 이기종 데이터 베이스를 연결할때 ODBC를 사용을 했습니다.

JDBC를 사용하기 위해서는 10.2.2 / 10.1.17 / 10.0.27 이상의 버전을설치하면 됩니다.

JDBC를 사용하는 방법은 아래 웹페이지를 참고합니다.

https://mariadb.com/kb/en/library/connect-jdbc-table-type-accessing-tables-from-another-dbms/

해당 웹페이지만으로 실제 사용하기에는 쉽지 않아서 아래 테스트를 한 내용을 정리해 봅니다.

먼저 MariaDB JDBC connector를 이용해서 같은 서버의 MariaDB를 JDBC로 연결해서 사용하는 방법은 아래와 같습니다.

  • JRE 설치
  • my.cnf 설정 : connect_jvm_path, connect_class_path
  • mariadb start
  • connect 엔진 global variables 확인
  • create table

# apt-get install default-jre

# vi my.cnf
##### connect engine
connect_jvm_path="/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server"
connect_class_path="/ohnew/mariadb/connect/mariadb-java-client-2.2.3.jar"

# systemctl start mariadb

MariaDB> show global variables like 'conn%path';

MariaDB> create table jt_t1 engine=connect table_type=jdbc tabname=t1 connection='jdbc:mariadb://localhost:3306/ohnew' option_list="User=root,Password=";

아래는 다른 서버에 있는 oracle 데이터베이스를 JDBC로 연결해서 사용하는 방법입니다.

  • my.cnf 설정 : connect_jvm_path, connect_class_path
  • mariadb start
  • create server
  • create table

# vi my.cnf
##### connect engine
connect_jvm_path="/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server"
connect_class_path="/ohnew/mariadb/connect/ojdbc6.jar"

# systemctl start mariadb

MariaDB> create server 'oracle' foreign data wrapper 'oracle' options (
HOST 'jdbc:oracle:thin:@192.168.100.101:1521:orcl',
DATABASE 'ORCL',
USER 'system',
PASSWORD 'manager',
PORT 0,
SOCKET '',
OWNER 'SYSTEM');

MariaDB> create table jt_ora_t1 engine=connect table_type=JDBC connection='oracle/ohnew.t1' SRCDEF='select c1 from ohnew.t1';

MariaDB 캐릭터셋을 UTF8 로 설정하기

한글을 사용하기 위해서는 인코딩을 euc-kr이나 UTF8로 바꾸는 것이 필요한데, 요즘은 대부분 UTF8을 사용하므로 UTF8로 설정해 봅니다.

MariaDB의 캐릭터셋을 UTF8로 설정하는 것은 MySQL과 유사합니다.

먼저, 현재 MariaDB의 캐릭터셋이 무엇으로 되어 있는지 확인부터 해보죠. (이미 UTF8로 되어 있다면 바꿀 이유가 없으니까요.)

먼저 터미널로 접속합니다. 그리고 MariaDB에 연결합니다.

$ sudo mysql -uroot -p                        <– root는 MariaDB 유저명

비밀번호를 입력하고 접속 되면, MariaDB에 c로 시작하는 변수값이 어떻게 설정되었는지 확인합니다.

MariaDB [(none)]> show variables like ‘c%’;

제 경우 아래와 같이 나오네요.

utf8로 설정되어 있는 부분들도 있지만, latin1으로 설되어 있는 부분들도 보이는군요.

utf8로 바꾸어 봅시다.

(모두 utf8로 되어 있다면 바꿀 필요 없습니다.)

먼저 quit; 명령으로 MariaDB를 빠져 나옵니다.

MariaDB의 my.cnf 파일을 수정해야 하는데, 우분투의 경우, /etc/mysql/ 디렉터리 밑에 있습니다.

만약을 대비해 먼저 my.cnf 파일을 백업합니다.

$ sudo cp /etc/mysql/my.cnf /etc/mysql/my.cnf.ori

이제 본인에게 편한 에디터로 my.cnf 파일을 수정합니다.

아래 내용이 my.cnf에 있는지 확인하고 없으면 추가하고, 있으면 수정합니다.

(각 섹션별로 추가나 수정을 해 줍니다.)

 

[client]
default-character-set=utf8

[mysqld]
init_connect=”SET collation_connection=utf8_general_ci”
init_connect=”SET NAMES utf8″
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake

[mysql]
default-character-set=utf8

 

수정을 마쳤으면, MariaDB를 재시작합니다.

$ sudo service mysql restart

다시한번 MariaDB에 접속해서, 아래 명령어로 캐릭터셋이 바뀌었는지 확인합니다.

MariaDB [(none)]> show variables like ‘c%’;

이제 아래와 같이 나오네요.

정상적으로 utf8로 바뀐것을 확인 할 수 있습니다.

Tomcat 서버 HTTPS / SSL 적용

1. .keystore 파일 경로를 원하는 위치에 이동시킨다!!!

2. Tomcat 서버의 server.xml을 연다 .  (보통은 톰캣위치\conf 경로에 존재한다. )

server.xml을 열어보자!

3. 아래의 소스코드를 추가한다.

HTTPS통신을 할 포트번호를 정한다 ( https는 Port 443이 기본이다.  혹시 기존에 해당 포트가 사용중이라면 , 다른포트를 이용하자)

keystorepass에는 키스토어 비밀번호를 입력한다.

keystorefile에는 .keystore의 위치를 지정해준다.

1
2
3
4
5
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
SSLEnabled="true" URIEncoding="euc-KR" maxThreads="150" scheme="https"
secure="true" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA"
keystoreFile="D:/Workspace/PLMS/PLAN_PLM/cert/certification/STAR.hankooktech.com.jks"
keystorePass="hankooktire" clientAuth="false" sslProtocol="TLS"/>