Compass는 MongoDB 데이터를 쿼리 및 분석할 수 있는 GUI 도구입니다.

 

 

Compass 다운로드 및 설치

https://www.mongodb.com/try/download/compass 에 접속하여 원하는 OS 환경의 소프트웨어를 다운로드 합니다.

본 문서에서는 Window10 에 msi 버전을 다운로드하여 설치하였습니다.

또는 아래 화면처럼 MongoDB 설치 시 나타나는 창에서 "Install MongoDB Compass"를 선택해서 설치할 수도 있습니다.

 

 

별다른 설정없이 바로 설치가 되고 프로그램이 수행됩니다.

 

 

MongoDB에 연결

PC에 MongoDB가 설치되어 있다면 DB 접속 URI 를 mongodb://localhost:27017 로 설정한 후 [Connect] 버튼을 클릭하면 MongoDB 에 접속됩니다.

MongoDB에 다른 데이터베이스를 생성하지 않았다면 기본적으로 admin, config, local 3개의 데이터베이스가 보입니다.

 

원격의 DB에 접속할 경우 

  • MongoDB의 경우: mongodb://host:port/database. 호스트는 호스트 이름, IP 주소 또는 UNIX 도메인 소켓일 수 있습니다. 연결 문자열이 포트를 지정하지 않는 경우 기본 MongoDB 포트인 27017을 사용합니다.
  • MongoDB Atlas의 경우: mongodb+srv://server.example.com/database. 호스트는 DNS SRV 레코드에 해당하는 호스트 이름일 수 있습니다. SRV 형식에는 포트가 필요하지 않으며 기본 MongoDB 포트인 27017을 사용합니다.

Database 생성

 

"Databases" 메뉴의 우측 "+" 기호를 클릭한 후 아래와 같은 화면에서 "Database Name"과 "Collection Name"을 입력한 후 [Create Database] 버튼을 클릭하여 데이터베이스와 Collection을 생성합니다.

 

데이터 입력

아래와 같은 화면에서 [ADD DATA] - Insert document 메뉴를 클릭합니다.

 

"Insert Docuement" 화면에 JSON 형식으로 key: value 형태로 값을 입력한 후 [Insert] 버튼을 클릭합니다.

JSON 형식과 테이블 형식으로 데이터를 입력할 수 있습니다.

"_id" 필드는 MongoDB에서 자동으로 입력하는 Primary Key 이며, 데이터타입은 ObjectId 타입입니다.

 

입력 시 ordered 옵션을 사용할 수 있습니다. 기본값은 true 입니다. insertMany로 여러 데이터 입력 시 ordered 가 true인 경우 처음 오류를 만나는 시점에서 입력을 중지합니다. 기존 데이터는 rollback하지 않습니다. 즉 순차적으로 입력합니다.

반면, ordered가 false인 경우 병렬로 데이터를 입력합니다. 그래서, 중복 오류가 발생하는 데이터를 제외하고 모두 입력됩니다.

 

JSON 형식 데이터 입력

 

TABLE 형식 데이터 입력

조회조건 입력

화면의 Filter 입력란에 { field: value} 형식으로 입력한 후 [Find] 버튼을 클릭하여 조회합니다.

 

Document 수정

Document 오른쪽의 연필 모양의 아이콘(Edit)을 클릭한 후, 수정하고자 하는 데이터를 수정하고, [UPDATE] 버튼을 클릭합니다. 예제에서는 홍길동을 신홍길동이라는 이름으로 변경하였습니다.

 

 

Document 삭제

Document 오른쪽의 휴지통 모양의 아이콘(Delete)을 클릭하여 Document를 삭제합니다.

 

전체 Document 수정 및 삭제

전체 document 수정 및 삭제는 아래의 버튼으로 수행합니다.

 

EXPORT DATA

- 한글 깨짐 : notepad로 연 후 다른 이름으로 저장 시 인코딩 형식을 UTF-8(BOM)으로 저장한 후 엑셀로 다시 엽니다. 또는 notepad ++ 을 사용할 경우 Encoding 메뉴에서 UTF-8 BOM을 선택한 후 저장하면 됩니다.

 

IMPORT DATA

- JSON or CSV file

 

 

 

<ObjectId의 구조>

 

ObjectId는 3개의 영역으로 나뉘어져 있다

  • 첫번째 4byte는 Unix epoch 이후 초 단위로 측정된 ObjectId의 생성을 나타내는 4바이트 타임스탬프 값
  • 두번째 5byte는 프로세스당 한 번 생성 되는 5바이트 임의 값이며 이 임의 값은 기계와 프로세스에 고유
  • 세번째 3byte는 임의의 값으로 초기화 되는 3바이트 증분 카운터

 

 

 

MongoDB에 생성

blog 데이터베이스 생성, users, posts collection 생성

> use blog

blog> db.users.insertMany([{name:"First",age:20,email:"first@a.com"}, {name:"Second",age:21,email:"second@a.com"}])
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId('65e803f125d99817df294c64'),
    '1': ObjectId('65e803f125d99817df294c65')
  }
}

blog> db.users.find()
[
  {
    _id: ObjectId('65e803f125d99817df294c64'),
    name: 'First',
    age: 20,
    email: 'first@a.com'
  },
  {
    _id: ObjectId('65e803f125d99817df294c65'),
    name: 'Second',
    age: 21,
    email: 'second@a.com'
  }
]

blog> db.posts.insertOne({title:"My first Post", text:"Thist is my first post", tags:["new", "tech"], creator:ObjectId('65e803f125d99817df294c65'), comments:[{text:"I like this post",author:ObjectId('65e803f125d99817df294c64')}]})
{
  acknowledged: true,
  insertedId: ObjectId('65e804b225d99817df294c66')
}

blog> db.posts.find()
[
  {
    _id: ObjectId('65e804b225d99817df294c66'),
    title: 'My first Post',
    text: 'Thist is my first post',
    tags: [ 'new', 'tech' ],
    creator: ObjectId('65e803f125d99817df294c65'),
    comments: [
      {
        text: 'I like this post',
        author: ObjectId('65e803f125d99817df294c64')
      }

 

Schema Validation

 

db.createCollection('posts',
{ 
    validator: { 
        $jsonSchema: { 
            bsonType: 'object', 
            required: ['title', 'text', 'creator', 'comments'], 
            properties: {
                titile: {
                    bsonType: "string",
                    description: "must be a string and required"
                },
                text: {
                    bsonType: "string",
                    description: "must be a string and required"
                },
                creator: {
                    bsonType: "objectId",
                    description: "must be a objectid and required"
                },
                comment: {
                    bsonType: "array",
                    description: "must be a array and required",
                    items: {
                        bsonType: "object",
                        required: ["text", "author"],
                        properties: {
                            text: {
                                bsonType: "string",
                                description: "must be a array and required"
                            },
                            author: {
                                bsonType: "objectId",
                                description: "must be a array and required"
                            }
                        }
                    }
                }
            }
        }
    }
});

 

데이터 모델리 시 고려해야 할 사항

- 데이터 페치 형식

- 얼마나 자주 데이터가 페치/변경되는지

-  데이터 저장 건수

- 데이터 연관성

- 데이터 중복 허용

- 데이터와 저장공간 한계

 

 

Useful Resources & Links

Helpful Articles/ Docs:

 

Oracle 데이터베이스에 연결하기 위한 환경 변수에는 두 가지가 있습니다. 그 중 하나는 ORACLE_SID 이고 다른 하나는  TWO_TASK 입니다.  

ORACLE_SID 는 동일한 호스트에 설치된 데이터베이스를 연결하는 데 사용되고,

TWO_TASK 는 다른 호스트에 설치된 oracle 데이터베이스를 연결하는데 사용됩니다.

 

TWO_TASK (또는 Windows의 LOCAL )는 원격 Oracle 서비스를 지정하는 데 사용되는 환경 변수입니다. 서비스 이름( tnsnames.ora 항목)을 지정하지 않고 SQL*Net 을 통해 원격 데이터베이스에 연결됩니다 . 프로그램에는 로컬 데이터베이스에 연결되어 있는 것처럼 보이지만 실제로는 원격 데이터베이스로 라우팅됩니다.

이 환경 변수는 Windows의 LOCAL 레지스트리 항목과 동일합니다 . ORACLE_SID 와 TWO_TASK 또는 LOCAL이 모두 정의된 경우 TWO_TASK 또는 LOCAL이 우선합니다.

TWO_TASK 사용법

윈도우 환경변수 설정 :

set LOCAL=oraservice1

 

유닉스/리눅스  환경변수 설정 :

$ export TWO_TASK=oraservice1
또는
$ setenv TWO_TASK oraservice1

 

여기서 'oraservice1'은 로컬 TNSNAMES.ORA 파일에 정의되어 있습니다.

일반적으로는 TNSNAMES.ORA 파일에 정의된 서비스 이름(연결 문자열)을 지정하여 원격 데이터베이스에 연결합니다.

아래 예제에서 'connect_str' 은 TNSNAMES.ORA 파일에 정의된 서비스 이름입니다.

$ sqlplus scott/tiger@connect_str

그러나, TWO_TASK를 설정하면 연결 문자열을 생략할 수 있습니다.

$ TWO_TASK=connect_str; export TWO_TASK
$ sqlplus scott/tiger

 

Multi-Tenant 로 설치된 Oracle DB 에서 "sqlplus / as sysdba" 로 기본적으로 접속하면 local DB로 접속하게 됩니다. 물론 TWO_TASK 환경변수에 영향을 받습니다. 아무것도 설정이 되어 있지 않을 경우에는 local CDB로 접속되지만 다른 설정값이 있는 경우 설정된 값의 DB로 접속됩니다.

 

아래 화면은 TWO_TASK 가 설정되어 있지 않은 DB 서버에서 명령어를 수행한 화면입니다. Local DB 에 접속되는 것을 

 

PDB 접속 방법

DB 서버 외부에서 접속할때는 어차피 다 SQL*Net 이나 JDBC 형태로 접속하기 때문에 싱글DB에 접속하는 것과 방법은 똑같습니다.

DB 서버 내부에서 SQL*Plus 로 접속하는 경우는 아래와 같이 4가지 방식을 사용할 수 있습니다.

 

1) CDB 에 접속한 후 alter session 커맨드로 세션 변경

2) tnsnames.ora 파일 세팅후 @TNS 로 접속

3) Easy Connect 방식으로 접속

4) TWO_TASK 설정해서 접속

 

 

1) CDB 에 접속한 후 alter session 커맨드로 세션 변경

sqlplus / as sysdba 로 CDB 에 접속한 후에, "alter session set container=<PDB명>;" 명령어로 접속하고자하는 PDB로 접속하는 방법입니다.

 

2) tnsnames.ora 파일 세팅후 @TNS 로 접속

tnsnames.ora 파일에 CDB나 PDB 정보를 설정하고, 그 이름을 사용해서 접속하는 방식입니다.

 

 

위는 sys 유저로 접속하는 예시라서 뒤에 "as sysdba" 가 붙었습니다.

scott 유저로 접속하는 경우는 "sqlplus scott/tiger@PDB1" 이라고 하면 됩니다.

 

 

3) Easy Connect 방식으로 접속

tnsnames 구성할 필요 없이 클라이언트 애플리케이션에서 직접 Oracle 데이터베이스에 대한 연결 주소를 지정할 수 있습니다 .

이 방법은 tnsnames.ora 파일을 생성하고 관리할 필요가 없다는 점에서 편리합니다. DB에 접속할 때 호스트 이름과 포트 번호를 지정하면 됩니다.

예를 들어, 호스트 이름이 shobeen이고 포트 번호가 1521인 서버에 있는 sales_us 데이터베이스에 연결하려고 한다면 다음과 같이 명령어를 실행하면 됩니다.

sqlplus system/admin@//shobeen:1521/sales_us

 

  • 다음 형식을 사용하여 SQL 연결 URL 문자열을 지정

//host[:port][/service_name]

//shobeen:1521/sales_us

  • Alternatively, specify the SQL connect information as an Oracle Net keyword-value pair.
  • Oracle Net 설정과 같이 SQL 연결 정보를 지정

(CONNECT_DATA=(SERVICE_NAME=sales_us)))”

“(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=shobeen) (PORT=1521))

 

 

 

 

4) TWO_TASK 설정해서 접속

 

TWO_TASK 환경변수를 설정해서 하는 방식은 사실 위 2)번 방식으로 tnsnames.ora 파일이 세팅되어 있을때 사용가능한 방식입니다.

TWO_TASK 환경변수가 하는 역할이 sqlplus 접속시 뒤에 "@TNS명" 을 안붙혀도 붙힌 것처럼 효과를 주는 것밖에는 없기 때문입니다.

 

 

만약, tnsnames.ora 파일에 PDB1 이 TNS 로 등록되어 있지 않으면

"ORA-12154: TNS:could not resolve the connect identifier specified" 에러가 발생합니다.

 

 

SQL*Plus 접속이 많은 경우, 좀 더 편하게 접속하고자 하는 경우는

위 3)번 Easy Connect 방식의 접속 커맨드를 alias 로 아래와 같이 만들어서 .profile 같은 곳에 넣어두고

이 alias 를 사용하면 아주 편합니다.

 

alias pdb1='sqlplus sys@localhost/PDB1 as sysdba'
alias pdb2='sqlplus sys@localhost/PDB2 as sysdba'
alias pdb3='sqlplus sys@localhost/PDB3 as sysdba'
alias pdb1_scott='sqlplus scott/tiger@localhost/PDB1'

 

 

 

Visual Studio Code 내에 VS Code용 MySQL 셸을 설치하는 방법을 설명합니다.

 

VS Code 확장용 MySQL 셸 설치

1단계: Visual Studio Code를 연다.

2단계: 화면 좌측의 Extensions을 클릭한 후 검색란에 "MySQL Shell for VS Code"를 입력한다.

             - 아래 화면의 Extensions(①)을 클릭한 후 검색란(②)에 " MySQL Shell for VS Code"를 입력한다.

 

3단계: " MySQL Shell for VS Code" 확장 프로그램을 설치합니다.

            - 검색된 Extension 중 " MySQL Shell for VS Code"  [Install] 버튼을 클릭하여 설치합니다.

 

4단계: 설치가 완료되면 VS Code 화면의 좌측 하단에 아래와 같이 "MySQL Shell for VS Code" 아이콘을 볼 수 있다.

5단계: 설치를 완료한 후 VS Code를 재실행한다.

 

MySQL Shell for VS Code Components

좌측 메뉴에서 " MySQL Shell for VS Code" 아이콘을 클릭하면 아래와 같은 4개의 하위 메뉴를 볼 수 있다.

  • OPEN EDITORS : DB 노트북, 단일 언어 스크립트, MySQL Shell 세션 편집기를 생성하고 관리
  • DATABASE CONNECTIONS : MySQL 서버 및 MySQL 데이터베이스 서비스에 대한 연결을 생성하고 관리
  • ORACLE CLOUD INFRASTRUSTURE : Oracle Cloud Infrastructure 프로필 목록을 구성
  • MYSQL SHELL TASKS : MySQL Shell에 대해 진행 중인 작업을 확인

1) OPEN EDITIORS : DB 노트북, 단일 언어 스크립트, MySQL Shell 세션 편집기를 생성하고 관리 .(수정)

 

2) DATABASE CONNECTIONS :  DB 접속 환경을 설정할 수 있는 메뉴로 "Create New DB Connection"을 클릭한다.

 

아래와 같은 DB 접속 설정 화면을 볼 수 있다.

  • Caption : 접속할 DB를 구분할 수 있는 임의의 명칭을 입력한다.
  • Host Name or IP Address : Host명이나 IP 또는 endpoints 등을 입력한다.
  • User Name : DB 계정을 입력한다.
  • Store Password 버튼을 클릭하여 계정의 패스워드를 입력한다.

위의 내용이 입력되었으면 [OK] 버튼을 클릭하여 DB 접속 환경 정보를 저장한다.

아래 화면처럼 [DATABASE CONNECTIONS] Component 밑에 LocalDB 접속환경이 생성된 것을 확인할 수 있다.

 

DB 접속을 위해 아래 화면처럼 "Open New Database Connection" 을 클릭한다. 우측화면에 SQL 콘솔 화면이 나타나다.

 

 

 

 

MySQL8 이상에서는 Function Based Index를 지원한다.

 

Function Based Index 생성 시 주의할 점은 괄호를 묶어주어야 한다는 것이다.

 

 예제 1) 테이블 생성 시 FBI 생성

CREATE TABLE tbl (
  col1 LONGTEXT,
  INDEX idx1 ((SUBSTRING(col1, 1, 10)))
);
SELECT * FROM tbl WHERE SUBSTRING(col1, 1, 9) = '123456789';
SELECT * FROM tbl WHERE SUBSTRING(col1, 1, 10) = '1234567890';

 

예제 2) FBI 인덱스 생성

Create index fbi_index on animals((CONCAT (grp , name)));

 

Autoscaling Aurora Serverless

 Aurora 서버리스는 애플리케이션에서 발생된 부하를 기반으로 확장하도록 되어 있습니다. 다음 조건 중 하나가 충족되면 클러스터가 자동으로 ACU를 확장합니다.

  • CPU 사용률이 70%를 초과하거나
  • DB max connection의 90% 이상 사용

다음 조건이 모두 충족되면 클러스터가 자동으로 축소됩니다.

  • CPU 사용률이 30% 미만으로 떨어지고
  • DB max connection 의 40% 미만이 사용

 

 

'AWS > RDS' 카테고리의 다른 글

AWS RDS Proxy란  (0) 2023.08.01
AWS RDS - Restore to point in time  (0) 2023.07.21
AWS Oracle RDS hidden parameter 조회  (0) 2021.12.30

사전 요구사항

아래 내용들이 사전에 설정된 상태에서 Python과 MySQL 연동을 설명합니다.

MySQL DB와 연동을 위한 여러 모듈이 있습니다. 본 문서에서는 Connector/Python 모듈을 이용하는 방법을 설명합니다.

 

Connector/Python 설치

pip install mysql-connector-python

 

Connector/Python 으로 MySQL 접속

connect()  생성자는 MySQL 서버에 대한 연결을 생성하고 MySQLConnection객체를 반환합니다.

다음 예에서는 MySQL 서버에 연결하는 방법을 보여줍니다.

try ~ except문을 사용하여 DB 접속 오류를 처리하고,  Error을 사용하여 오류를 catch 합니다.

import mysql.connector
from mysql.connector import errorcode

try:
  cnx = mysql.connector.connect(user='pymysql', password='pymysql123',
	                          host='127.0.0.1',
       	                      database='pymysqldb')
except mysql.connector.Error as err:
  if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
    print("Something is wrong with your user name or password")
  elif err.errno == errorcode.ER_BAD_DB_ERROR:
    print("Database does not exist")
  else:
    print(err)
else:
  cnx.close()

 

Inserting Data Using Connector/Python

데이터 삽입이나 업데이트는 커서라는 핸들러 구조를 사용하여 수행합니다. InnoDB와 같은 트랜잭션 스토리지 엔진을 사용하는 경우, DML(INSERT, UPDATE, DELETE) 명령문 후에 데이터를 커밋 해야 합니다 . 

이 예에서는 새 데이터를 삽입하는 방법을 보여줍니다. 두 번째는 새로 생성된 첫 번째 기본 키INSERT 의 값에 따라 달라집니다 . 이 예에서는 확장 형식을 사용하는 방법도 보여줍니다. 이 작업은 내일부터 급여가 50000으로 설정된 새 직원을 추가하는 것입니다.

 

 

 

 

1. MySQL 설정

- MySQL 설치 : Ver 8.0.32

- schema 생성 : pymysqldb

 create database pymysqldb default character set utf8mb4 collate utf8mb4_bin;

- 계정, 권한 생성 : pymysql

-- 계정생성
create user pymysql identified by 'pymysql123';
-- 권한 부여
grant all on pymysqldb.* to pymysql;

- 테이블 생성 : 

 

* 테이블 layout

Entity/Table Name Entity/Table Physical_Name Definition 주제영역
응용구분 업무명 영문명 엔터티개수

 

파이썬 자체에는 MySQL을 인식하는 기능이 없습니다. 파이썬 코드에서 MySQL을 활용하기 위해 외부 라이브러리인 pymysql을 설치해야합니다.

 

pymysql 모듈 사용

 

1. pymysql 모듈 설치

pip install pymysql

 

2.   pymysql 임포트

import pymysql

3. 데이터베이스와 연동

pymysql을 임포트한 후 pymysql.connect()로 데이터베이스와 연동 하고 connectoin 객체를 conn 에 할당합니다.

import pymysql

conn = pymysql.connect(host='127.0.0.1', user='pymysql', password='pymysql123', db='pymysqldb', charset='utf8mb4')

 

 pymysql.connect(host=서버IP주소, user=사용자, passoword=암호, db=데이터베이스, charset=문자세트)

 

② 커서(cursor)는 데이터베이스에 SQL 문을 실행하거나 실행된 결과를 돌려받는 통로로 생각하면 됩니다. ① 에서 연결한 연결자에 커서를 만들어야 합니다. cur라는 변수를 커서로 사용하겠습니다.

 

  

+ Recent posts