반응형

조시형님의 SQLP 핵심노트가 출간되었습니다.

 

주요 온라인 쇼핑몰에서 「SQLP 핵심노트」 Ⅰ&Ⅱ 판매를 시작했습니다. 오프라인 매장에서는 일요일 이후로 구매 가능할 거 같습니다.

자신이 운영하거나 활동 중인 SNS에 도서를 홍보해 주시면, 20명을 선정해 「SQLP 핵심노트」 도서 또는 커피 쿠폰을 증정하겠습니다.

[ 증정품 ]

1. 「SQLP 핵심노트」 Ⅰ권과 Ⅱ권 증정 ▶ 회원/이웃/팔로워가 많은 순으로 최상위 5명

2. 「SQLP 핵심노트」 Ⅰ권 또는 Ⅱ권 증정 ▶ 회원/이웃/팔로워가 많은 순으로 차상위 5명

3. 스타벅스 커피 쿠폰 ▶ 추첨을 통해 선정된 10명

[ 참여 방법 ]

① 본 게시글 URL(https://cafe.naver.com/dbian/4272)을 카페/블로그/페이스북/인스타그램/트위터 등에 공유

② 해당 SNS URL을 아래 댓글로 등록

▶ 이벤트 기간 : 9월 1일(수) ~ 9월 16일(목) 9월 1일(수) ~ 9월 8일(수)

▶ 당첨자 발표 : 9월 17일(금) 9월 9일(목)

이벤트 기간을 8일 더 연장합니다. 지금 추세라면 100% 당첨 이벤트가 될 듯 ^^

여러분의 많은 참여와 홍보 부탁드립니다.

감사합니다.

▶ 주요 온라인 서점 URL

[ 교보문고 ]

SQLP 핵심노트 Ⅰ

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791191941005&orderClick=LAG&Kc=

SQLP 핵심노트 Ⅱ

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791191941012&orderClick=LAG&Kc=

[ 예스24 ]

SQLP 핵심노트 Ⅰ

http://www.yes24.com/Product/Goods/103510806?OzSrank=1

SQLP 핵심노트 Ⅱ

http://www.yes24.com/Product/Goods/103521655?OzSrank=2

[ 알라딘 ]

SQLP 핵심노트 Ⅰ

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=278839908

SQLP 핵심노트 Ⅱ

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=278900838

[ 인터파크 ]

SQLP 핵심노트 Ⅰ

https://shopping.interpark.com/product/productInfo.do?prdNo=8477056875&dispNo=008001082&pis1=shop&pis2=product

SQLP 핵심노트 Ⅱ

https://shopping.interpark.com/product/productInfo.do?prdNo=8479369026&dispNo=008001082&pis1=shop&pis2=product

「SQLP 핵심노트」 서문

「SQLP 핵심노트」 목차

※ 자매 도서 ▶ SQLD 핵심노트


[출처] 「SQLP 핵심노트」 Ⅰ & Ⅱ 출간 기념 이벤트 (DBian 포럼) | 작성자 oraking

반응형

'Database' 카테고리의 다른 글

무료 DB 접근 툴  (0) 2019.08.19
무료 ERD 툴 ERMASTER  (0) 2019.08.08
damo 암호화 컬럼 복원시 주의사항  (0) 2017.08.20
Sybase IQ Administrator 사용 Script  (0) 2012.10.18
JNDI Log4SQL 적용 예...  (0) 2011.04.21
반응형

관련 URL : https://mariadb.com/kb/en/library/installing-the-connect-storage-engine/

 

Installing the CONNECT Storage Engine

Installing the CONNECT storage engine.

mariadb.com

 

MariaDB 10.2 버전부터 connect engine 이 반영되었습니다.

 

CONNECT 스토리지 엔진은 MariaDB가 외부나 원격 데이터에 접근할 수 있습니다.

 

이 스토리지 엔진은 테이블 파티셔닝, MariaDB 가상 컬럼을 지원하며 ROWID, FILEID 및 SERVID와 같은 특수 컬럼을 정의할 수 있습니다.

 

0. CONNECT 스토리지 엔진 설치 여부

 

# mysql -uroot -p 접속

 

MariaDB [ (none) ] > show engines; 

 

 

위 출력 결과에 Engine 컬럼에 CONNECT가 보이지 않는다면 설치되어 있지 않은 상태입니다.

 

현재 이 글을 쓸때 10.3 버전의 최신은 10.3.19이나 버그가 발생하여 10.3.18로 다운 그레이드하여 사용합니ㅏㄷ.

 

1. 플러그인 패키지 설치

 

MariaDB를 설치할 때 레파지토리를 이미 구성하였다고 가정합니다.

 

패키지 설치를 위해 Centos 7 이하 yum / 이상 dnf 를 사용합니다.

 

아래 명령을 수행하면 설치를 위한 ha_connect.so 파일등이 로컬에 설치됩니다.

 

현재 이 문서는 Centos 7 로 수행합니다.

 

# yum install -y MariaDB-connect-engine

 

or

 

특정 버전 지정 설치 (DB 버전과 일치해야 합니다!)

# yum install -y MariaDB-connect-engine-10.3.18

 

 

2. 플러그인 설치

기본적으로 플러그인은 자동으로 설치되지 않습니다.

 

두가지 방법이 있습니다.

 

방법1. INSTALL SONAME  명령 수행하기

 

다음 명령을 통해 ha_connect 를 설치합니다.

 

# mysql -uroot -p

 

MariaDB [(none)]> install soname 'ha_connect';
Query OK, 0 rows affected (0.000 sec)

 

방법2. 환경 설정 파일(my.cnf / server.cnf) 에 추가

[mariadb]

...

plugin_load_add = ha_connect

 

설치후에는 다음과 같이 조회합니다.

 

MariaDB [(none)]> show engines;

 

Engine 컬럼에 CONNECT가 보이면 정상적으로 설치되어 해당 엔진을 사용할 수 있는 상태입니다.

 

3. 플러그인 제거

 

다음 명령을 통해 제거 할 수 있습니다.

 

MariaDB [(none)]> UNINSTALL SONAME 'ha_connect';

 

MariaDB [(none)]> show engines;

 

 

4. 종속성 설치

 

10.2 버전대에는 10.3 이후 버전대와 다르게 unixODBC 라이브러리를 별도로 설치했는거 같습니다.

현재 10.3 버전은 설치 시점에 종속성이 unixODBC라 같이 설치되었기 때문에 별도로 작업은 하지 않습니다.

 

별도 작업시에는 아래 명령을 통해 설치합니다.

 

# yum install unixODBC

 

 

5. 외부 테이블 연결

 

관련 정보 : https://mariadb.com/kb/en/library/connect-table-types/

 

CONNECT Table Types

 

mariadb.com

위의 내용 중 

 

CONNECT MYSQL Table Type: Accessing MySQL/MariaDB Tables

 

부분을 살펴보겠습니다.

 

A Maria 10.4 DB서버 : 192.168.10.191

B Maria 10.3 DB서버 : 192.168.10.194

 

B 서버에서 A서버 test 데이터베이스에 json_test 테이블을 Connect 하겠습니다.

 

※ 무한 루프를 피하기 위해 MYSQL 본인 자체를 참조하지 않도로 주의하세요!

 

※ Connect는 BLOC or TEXT 컬럼은 지원하지 않습니다. 

ERROR 1163 (42000): Storage engine CONNECT doesn't support BLOB/TEXT columns

 

A 서버 json_test 테이블 CREATE 구문

 

CREATE TABLE `connect_test` (
`id` INT(11) NULL DEFAULT NULL,
`DT` DATE NULL DEFAULT NULL,
`TXT` VARCHAR(1000) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci'
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
;

아래 INSERT 문장을 통해 3줄의 데이터를 입력합니다.

INSERT INTO connect_test VALUES (1, CURDATE(), '첫번재 입력');

INSERT INTO connect_test VALUES (2, CURDATE(), '두번재 입력');

INSERT INTO connect_test VALUES (3, CURDATE(), '세번재 입력');

 

COMMIT;

 

 

B 서버에 test 데이터베이스에 new_connect_test를  아래와 같이 명령어를 입력하여 적용합니다.

CREATE TABLE test.`new_connect_test` ( 
`id` INT(11) NULL DEFAULT NULL, 
`DT` DATE NULL DEFAULT NULL, 
`TXT` VARCHAR(1000) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci' 

COLLATE='utf8_unicode_ci' 
ENGINE=CONNECT

table_type=mysql

dbname=test
tabname=connect_test
connection='mysql://root:비밀번호@192.168.10.191'

table_type : Mariadb / mysql 일 때 명시

dbname : 원본(A DB 서버) 데이터베이스 명

tabname : 원본(A DB 서버) 테이블 명

 

아래 실행 결과와 같이 오류가 발생하지 않으면 정상적으로 데이터가 조회됩니다.

 

조회

 

위와 같이 연결된 상태에서 A원본 서버에 데이터를 한건 지우고 나면 B 서버에서도 동일하게 한건 지워진 상태로 조회됩니다.

 

또한 B서버에서 new_connect_test 에 데이터를 입력/삭제하여도 동일하게 원본서버에 connect_test 테이블도 변경됩니다.

 

좀더 상세한 것은 아래 링크를 참조하면 됩니다.

 

https://mariadb.com/kb/en/library/connect-mysql-table-type-accessing-mysqlmariadb-tables/

 

CONNECT MYSQL Table Type: Accessing MySQL/MariaDB Tables

Accessing a MySQL or MariaDB table or view

mariadb.com

 

반응형

'Database > MYSQL' 카테고리의 다른 글

MariaDB JSON 컬럼 및 함수들  (0) 2019.11.04
MariaDB 테이블 백업 및 복구  (0) 2019.11.01
MariaDB 우편번호 Import 하기  (0) 2019.11.01
MariaDB SHA2 512 방식으로 암호화 예제  (0) 2019.10.25
Mysql & MariaDB 튜닝 쉘  (0) 2019.08.14
반응형


MariaDB JSON 형식 데이터 사용 : MariaDB 10.2 부터 가능

참고 사이트

https://mariadb.com/kb/en/library/json-functions/
https://mariadb.com/resources/blog/json-with-mariadb-10-2/
https://bstar36.tistory.com/359


1. 버전 확인
    MariaDB [(test)]> select @@version;
    +-----------------+
    | @@version       |
    +-----------------+
    | 10.3.17-MariaDB |
    +-----------------+
    1 row in set (0.000 sec)

2. JSON 데이터 타입 지원(내부적으로 LongTEXT로 저장)    
    MariaDB [test]> create table json_test (id int, data json);
    Query OK, 0 rows affected (0.015 sec)

    MariaDB [test]> show create table json_test;
    +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table     | Create Table                                                                                                                                                                                  |
    +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | json_test | CREATE TABLE `json_test` (
      `id` int(11) DEFAULT NULL,
      `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
    +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.000 sec)


3. JSON 데이터 조작
   A. json_object 함수를 이용하여 key,value 형식으로 Insert
    MariaDB [test]> insert into json_test values (1 , json_object('Name' , 'Kil-Dong, Hong' , 'Sex' , 'M' , 'Phone' , '010-1234-5678')) ;
    Query OK, 1 row affected (0.003 sec)
    
    MariaDB [test]> commit;
    Query OK, 0 rows affected (0.000 sec)
    
    MariaDB [test]> select * from json_test ;
    +------+------------------------------------------------------------------+
    | id   | data                                                             |
    +------+------------------------------------------------------------------+
    |    1 | {"Name": "Kil-Dong, Hong", "Sex": "M", "Phone": "010-1234-5678"} |
    +------+------------------------------------------------------------------+
    1 row in set (0.000 sec)

   B. 특정 key 값만 조회 하고자 할때 json_value 함수를 사용 
   
    MariaDB [test]> select id , json_value(data,'$.Name') As Name , json_value(data,'$.Phone') as Phone from json_test ;
    +------+----------------+---------------+
    | id   | Name           | Phone         |
    +------+----------------+---------------+
    |    1 | Kil-Dong, Hong | 010-1234-5678 |
    +------+----------------+---------------+
    1 row in set (0.001 sec)
    
    C. 특정 하나 Key 값을 update 하고자 할때,  json_replace 함수를 사용
    
    ※ 단, 이름은 중복날 수 있으니 Unique 값으로 비교하는 것을 추천 (사용방법 안내)
    MariaDB [test]> update json_test set data = json_replace(data,'$.Phone','010-2345-6789') where json_value(data,'$.Name') = 'Kil-Dong, Hong';
    Query OK, 1 row affected (0.002 sec)
    Rows matched: 1  Changed: 1  Warnings: 0


    MariaDB [test]> select id , json_value(data,'$.Name') As Name , json_value(data,'$.Phone') as Phone from json_test ;
    +------+----------------+---------------+
    | id   | Name           | Phone         |
    +------+----------------+---------------+
    |    1 | Kil-Dong, Hong | 010-2345-6789 |
    +------+----------------+---------------+
    1 row in set (0.000 sec)
    
    
    Object 값 자체로 추출("" 형태)
    MariaDB [test]> SELECT JSON_EXTRACT(data, '$.Name') from json_test;
    +------------------------------+
    | JSON_EXTRACT(data, '$.Name') |
    +------------------------------+
    | "Su, Peng"                   |
    | "Dori Go"                    |
    | "DaHan, Wi "                 |
    | NULL                         |
    | NULL                         |
    +------------------------------+
    5 rows in set (0.000 sec)
    
    
    MariaDB [test]> SELECT JSON_UNQUOTE(JSON_EXTRACT(data, '$.Name')) from json_test;
    +--------------------------------------------+
    | JSON_UNQUOTE(JSON_EXTRACT(data, '$.Name')) |
    +--------------------------------------------+
    | Su, Peng                                   |
    | Dori Go                                    |
    | DaHan, Wi                                  |
    | NULL                                       |
    | NULL                                       |
    +--------------------------------------------+
    5 rows in set (0.000 sec)


    
    D. 하나 이상의 Key 값을 변경할 때는 json_set 함수 사용

    MariaDB [test]> update json_test set data = json_set(data,'$.Phone','010-3456-7890', '$.Name','Su, Peng') where id = 1 ;
    Query OK, 1 row affected (0.001 sec)
    Rows matched: 1  Changed: 1  Warnings: 0

    MariaDB [test]> select id , json_value(data,'$.Name') As Name , json_value(data,'$.Phone') as Phone from json_test ;
    +------+----------+---------------+
    | id   | Name     | Phone         |
    +------+----------+---------------+
    |    1 | Su, Peng | 010-3456-7890 |
    +------+----------+---------------+
    1 row in set (0.000 sec)

 
    E. Json 형태가 추가되어도 입력이 가능
    insert into json_test values (2 , json_object('Name' , 'Dori Go' , 'Sex' , 'F' , 'Phone' , '02-123-4567' , 'Birth', '2000-01-01')) ; 
    
    MariaDB [test]> insert into json_test values (2 , json_object('Name' , 'Dori Go' , 'Sex' , 'F' , 'Phone' , '02-123-4567' , 'Birth', '2000-01-01')) ;
    Query OK, 1 row affected (0.001 sec)
    
    MariaDB [test]> commit;
    Query OK, 0 rows affected (0.000 sec)
    
    MariaDB [test]> select * from json_test;
    +------+--------------------------------------------------------------------------------+
    | id   | data                                                                           |
    +------+--------------------------------------------------------------------------------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"}                     |
    |    2 | {"Name": "Dori Go", "Sex": "F", "Phone": "02-123-4567", "Birth": "2000-01-01"} |
    +------+--------------------------------------------------------------------------------+
    2 rows in set (0.000 sec)

    F. json 데이터 값의 Like 검색
    
    MariaDB [test]> select count(*) from json_test where json_value(data,'$.Phone') like '02%' ;
    +----------+
    | count(*) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.000 sec)
     
    G. json 데이터 타입의 key를 가상 컬럼을 생성 후 Index 작업 가능
    
    - 테이블 변경(가상 컬럼 추가)
    MariaDB [test]> alter table json_test add phone varchar(20) as (json_value(data,'$.phone')) ;
    Query OK, 0 rows affected (0.341 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    MariaDB [test]> select * from json_test limit 1 ;
    +------+------------------------------------------------------------+-------+
    | id   | data                                                       | phone |
    +------+------------------------------------------------------------+-------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"} | NULL  |
    +------+------------------------------------------------------------+-------+
    1 row in set (0.000 sec)

    현재 화면에서 데이터가 안나오는 이유는 Key의 Phone은 P가 대문자 생성시에는 소문자로 만들었음
    삭제 후 다시 추가

    MariaDB [test]> alter table json_test drop phone;
    Query OK, 0 rows affected (0.009 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    MariaDB [test]>  select * from json_test limit 1 ;
    +------+------------------------------------------------------------+
    | id   | data                                                       |
    +------+------------------------------------------------------------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"} |
    +------+------------------------------------------------------------+
    1 row in set (0.000 sec)

    MariaDB [test]> alter table json_test add phone varchar(20) as (json_value(data,'$.Phone')) ;
    Query OK, 0 rows affected (0.012 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    MariaDB [test]>  select * from json_test;
    +------+--------------------------------------------------------------------------------+---------------+
    | id   | data                                                                           | phone         |
    +------+--------------------------------------------------------------------------------+---------------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"}                     | 010-3456-7890 |
    |    2 | {"Name": "Dori Go", "Sex": "F", "Phone": "02-123-4567", "Birth": "2000-01-01"} | 02-123-4567   |
    +------+--------------------------------------------------------------------------------+---------------+
    2 rows in set (0.000 sec)
    
       
    - 인덱스 생성
    key 값을 기준으로 가상 생성된 컬럼에 index를(ix_json_test_01)  추가
    MariaDB [test]> create index ix_json_test_01 on json_test(phone) ;
    Query OK, 0 rows affected (0.021 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    explain 을 통해 plan을 조회합니다.
    MariaDB [test]> explain select count(*) from json_test where Phone like '02%' ;
    +------+-------------+-----------+-------+-----------------+-----------------+---------+------+------+--------------------------+
    | id   | select_type | table     | type  | possible_keys   | key             | key_len | ref  | rows | Extra                    |
    +------+-------------+-----------+-------+-----------------+-----------------+---------+------+------+--------------------------+
    |    1 | SIMPLE      | json_test | index | ix_json_test_01 | ix_json_test_01 | 63      | NULL |    2 | Using where; Using index |
    +------+-------------+-----------+-------+-----------------+-----------------+---------+------+------+--------------------------+
    1 row in set (0.000 sec)

    H. Json Object를 사용하지 않은 Insert
    MariaDB [test]> insert into json_test(id, data) values (3, '{"Name": "DaHan, Wi ", "Sex": "M", "Phone": "010-9876-5432", "Birth": "1999-12-31"}');
    Query OK, 1 row affected (0.003 sec)

    MariaDB [test]> select * from json_test;
    +------+-------------------------------------------------------------------------------------+---------------+
    | id   | data                                                                                | phone         |
    +------+-------------------------------------------------------------------------------------+---------------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"}                          | 010-3456-7890 |
    |    2 | {"Name": "Dori Go", "Sex": "F", "Phone": "02-123-4567", "Birth": "2000-01-01"}      | 02-123-4567   |
    |    3 | {"Name": "DaHan, Wi ", "Sex": "M", "Phone": "010-9876-5432", "Birth": "1999-12-31"} | 010-9876-5432 |
    +------+-------------------------------------------------------------------------------------+---------------+
    3 rows in set (0.000 sec)


4. Json 관련 함수들
   관련 링크 :  https://mariadb.com/kb/en/library/json-functions/
   
   - JSON_Query와 JSON_VALUE 차이
     아래와 같이 임시로 json 변수를 선언하고 json 데이터를 저장합니다.
     
    MariaDB [test]> SET @json='{ "x": [0,1], "y": "[0,1]", "z": "Monty" }';
    Query OK, 0 rows affected (0.001 sec)

    MariaDB [test]> SELECT JSON_QUERY(@json,'$'), JSON_VALUE(@json,'$');
    +--------------------------------------------+-----------------------+
    | JSON_QUERY(@json,'$')                      | JSON_VALUE(@json,'$') |
    +--------------------------------------------+-----------------------+
    | { "x": [0,1], "y": "[0,1]", "z": "Monty" } | NULL                  |
    +--------------------------------------------+-----------------------+
    1 row in set (0.000 sec)

    MariaDB [test]> SELECT JSON_QUERY(@json,'$.x'), JSON_VALUE(@json,'$.x');
    +-------------------------+-------------------------+
    | JSON_QUERY(@json,'$.x') | JSON_VALUE(@json,'$.x') |
    +-------------------------+-------------------------+
    | [0,1]                   | NULL                    |
    +-------------------------+-------------------------+
    1 row in set (0.000 sec)

    MariaDB [test]> SELECT JSON_QUERY(@json,'$.y'), JSON_VALUE(@json,'$.y');
    +-------------------------+-------------------------+
    | JSON_QUERY(@json,'$.y') | JSON_VALUE(@json,'$.y') |
    +-------------------------+-------------------------+
    | NULL                    | [0,1]                   |
    +-------------------------+-------------------------+
    1 row in set (0.000 sec)

    MariaDB [test]> SELECT JSON_QUERY(@json,'$.z'), JSON_VALUE(@json,'$.z');
    +-------------------------+-------------------------+
    | JSON_QUERY(@json,'$.z') | JSON_VALUE(@json,'$.z') |
    +-------------------------+-------------------------+
    | NULL                    | Monty                   |
    +-------------------------+-------------------------+
    1 row in set (0.000 sec)

    MariaDB [test]> SELECT JSON_QUERY(@json,'$.x[0]'), JSON_VALUE(@json,'$.x[0]');
    +----------------------------+----------------------------+
    | JSON_QUERY(@json,'$.x[0]') | JSON_VALUE(@json,'$.x[0]') |
    +----------------------------+----------------------------+
    | NULL                       | 0                          |
    +----------------------------+----------------------------+
    1 row in set (0.000 sec)

    - JSON_ARRAY 함수
      10.2.3 버전부터 추가됨
      MariaDB [test]> SELECT Json_Array(56, 3.1416, 'My name is "Foo"', NULL);
    +--------------------------------------------------+
    | Json_Array(56, 3.1416, 'My name is "Foo"', NULL) |
    +--------------------------------------------------+
    | [56, 3.1416, "My name is \"Foo\"", null]         |
    +--------------------------------------------------+
    1 row in set (0.000 sec)


    MariaDB [test]> insert into json_test(id, data) values (4, JSON_ARRAY("Name","Ra, Ro ", "Sex", "F", "Phone", "010-1122-3344", "Birth", "1990-06-01"));
    Query OK, 1 row affected (0.003 sec)
 
     
    MariaDB [test]> select * from json_test;
    +------+-------------------------------------------------------------------------------------+---------------+
    | id   | data                                                                                | phone         |
    +------+-------------------------------------------------------------------------------------+---------------+
    |    1 | {"Name": "Su, Peng", "Sex": "M", "Phone": "010-3456-7890"}                          | 010-3456-7890 |
    |    2 | {"Name": "Dori Go", "Sex": "F", "Phone": "02-123-4567", "Birth": "2000-01-01"}      | 02-123-4567   |
    |    3 | {"Name": "DaHan, Wi ", "Sex": "M", "Phone": "010-9876-5432", "Birth": "1999-12-31"} | 010-9876-5432 |
    |    4 | ["Name", "Ra, Ro ", "Sex", "F", "Phone", "010-1122-3344", "Birth", "1990-06-01"]    | NULL          |
    +------+-------------------------------------------------------------------------------------+---------------+
    4 rows in set (0.000 sec)

    위의 id 4번 값은 아래에 보듯이 Type이 맞지 않기 때문에 phone값이 정상 인식 되지 않았음.
    
    MariaDB [test]> select json_type(data) from json_test;
    +-----------------+
    | json_type(data) |
    +-----------------+
    | OBJECT          |
    | OBJECT          |
    | OBJECT          |
    | ARRAY           |
    +-----------------+
    4 rows in set (0.001 sec)

    - 함수들 간략한 설명
    2
    JSON_QUERY와 JSON_VALUE의 차이점
        JSON_QUERY와 JSON_VALUE의 예제와 비교합니다.
    JSON_ARRAY
        나열된 값이 포함 된 JSON 배열을 반환합니다.
    JSON_ARRAY_APPEND
        JSON 문서 내에서 주어진 배열의 끝에 값을 추가합니다.
    JSON_ARRAY_INSERT
        JSON 문서에 값을 삽입합니다.
    JSON_COMPACT
        불필요한 모든 공간을 제거하여 json 문서가 가능한 한 짧습니다.
    JSON_CONTAINS
        지정된 JSON 문서 또는 문서 내의 지정된 경로에서 값을 찾을 수 있는지 여부
    JSON_CONTAINS_PATH
        지정된 JSON 문서에 지정된 경로의 데이터가 있는지 여부를 나타냅니다.
    JSON_DEPTH
        JSON 문서의 최대 깊이.
    JSON_DETAILED
        중첩 구조를 강조하는 가장 이해하기 쉬운 방식으로 JSON을 나타냅니다.
    JSON_EXISTS
        지정된 데이터에 지정된 JSON 값이 있는지 확인합니다. 
    JSON_EXTRACT
        JSON 문서에서 데이터를 추출합니다.
    JSON_INSERT
        JSON 문서에 데이터를 삽입합니다.
    JSON_KEYS
        JSON 객체의 최상위 값에서 키를 반환하거나 경로에서 최상위 키를 반환합니다.
        MariaDB [test]> select id, json_keys(data) from json_test;
        +------+-----------------------------------+
        | id   | json_keys(data)                   |
        +------+-----------------------------------+
        |    1 | ["Name", "Sex", "Phone"]          |
        |    2 | ["Name", "Sex", "Phone", "Birth"] |
        |    3 | ["Name", "Sex", "Phone", "Birth"] |
        |    4 | NULL                              |
        |    5 | NULL                              |
        +------+-----------------------------------+
        5 rows in set (0.000 sec)

    JSON_LENGTH
        JSON 문서의 길이 또는 문서 내 값의 길이를 반환합니다.
    JSON_LOOSE
        더 읽기 쉽게 보이도록 JSON 문서에 공백을 추가합니다.
    JSON_MERGE
        주어진 JSON 문서를 병합합니다.
    JSON_MERGE_PATCH
        주어진 JSON 문서의 RFC 7396 호환 병합
    JSON_MERGE_PRESERVE
        JSON_MERGE의 동의어
    JSON_OBJECT
        주어진 키 / 값 쌍을 포함하는 JSON 객체를 반환합니다. 
    JSON_QUERY
        JSON 문서가 주어지면 경로로 지정된 객체 또는 배열을 반환합니다.
    JSON_QUOTE
        문자열을 JSON 값으로 인용합니다.
    JSON_REMOVE
        JSON 문서에서 데이터를 제거합니다.
    JSON_REPLACE
        JSON 문서에서 기존 값을 바꿉니다.
    JSON_SEARCH
        JSON 문서 내에서 지정된 문자열의 경로를 반환합니다.
    JSON_SET
        JSON 문서에 데이터를 업데이트하거나 삽입합니다.
    JSON_TYPE
        JSON 값의 유형을 반환합니다.
    JSON_UNQUOTE
        JSON 값을 인용 해제하여 문자열을 반환합니다. 
    JSON_VALID
        값이 유효한 JSON 문서인지 여부 
    JSON_VALUE
        JSON 문서가 주어지면 지정된 스칼라를 반환합니다.
     

반응형

'Database > MYSQL' 카테고리의 다른 글

MariaDB connect 설치  (0) 2019.11.07
MariaDB 테이블 백업 및 복구  (0) 2019.11.01
MariaDB 우편번호 Import 하기  (0) 2019.11.01
MariaDB SHA2 512 방식으로 암호화 예제  (0) 2019.10.25
Mysql & MariaDB 튜닝 쉘  (0) 2019.08.14
반응형

파티션 테이블 유무에 따라 사용법이 나뉩니다.

 

 

1. Non 파티션 테이블 백업

 

- 대상 데이터베이스 : test

- 대상 테이블 : ZIPDB

 

a. FLASH TABLES 권한이 있는 계정으로 접속합니다. (어려우면 root 접속)

   

    MariaDB [TEST]> FLUSH TABLES test.ZIPDB FOR EXPORT;

    Query OK, 0 rows affected (0.013 sec)

 

b. 위의 명령어가 정상적으로 끝나면 기본 데이터 저장하는 곳에 파일 생성됩니다.

   (기본 yum 설치시 : /var/lib/mysql 이며 그 밑에 데이터베이스 명 폴더로 갑니다.)

   cd /var/lib/mysql/test

   ls -lsa를 수행하면 

 

 

  일반적으로 보이지 않는 zipdb.cfg 파일이 하나더 생성됨을 알 수 있습니다.

   ※ 현재 이상태는 백업을 위해 TABLE LOCK을 한 상태입니다.

 

c. 테이블 이동을 위한 복사 작업을 수행합니다

   cp /var/lib/mysql/test/zipdb.ibd /tmp

   cp /var/lib/mysql/test/zipdb.cfg /tmp

 

d. 복사가 정상적으로 끝나면 TABLE LOCK을 풀어줍니다.

  MariaDB [TEST]> UNLOCK TABLES;
  Query OK, 0 rows affected (0.019 sec)

 

위의 작업을 마치면 정상적으로 해당 테이블을 백업 받은 상태입니다.

 

2. Non 파티션 테이블 복구하기

복구할 Database로 2개의 파일(zipdb.ibd, zipdb.cfg)을 복사합니다.

복사시에는 같은 망인 경우 scp를 사용하면 편리합니다.

(scp /tmp/zipdb.* root@대상hostIP:/tmp)

 

a. 먼저 테이블 생성 구문을 동일하게 수행합니다.   

CREATE TABLE `zipdb` (
`ZONE_NO` VARCHAR(5) NOT NULL COMMENT '구역번호(우편번호)',
`CTPRVN` VARCHAR(20) NULL DEFAULT NULL COMMENT '시도',
`CTPRVN_ENG` VARCHAR(40) NULL DEFAULT NULL COMMENT '시도영문',
`SIGNGU` VARCHAR(20) NULL DEFAULT NULL COMMENT '시군구',
`SIGNGU_ENG` VARCHAR(40) NULL DEFAULT NULL COMMENT '시군구영문',
`EUP_MYEON` VARCHAR(20) NULL DEFAULT NULL COMMENT '읍면',
`EUP_MYEON_ENG` VARCHAR(40) NULL DEFAULT NULL COMMENT '읍면영문',
`RN_CODE` VARCHAR(12) NULL DEFAULT NULL COMMENT '도로명코드',
`RN` VARCHAR(80) NULL DEFAULT NULL COMMENT '도로명',
`RN_ENG` VARCHAR(80) NULL DEFAULT NULL COMMENT '도로명영문',
`UNDGRND_AT` VARCHAR(1) NULL DEFAULT NULL COMMENT '지하여부(0:지상, 1:지하)',
`BDNBR_MNNM` INT(5) NULL DEFAULT NULL COMMENT '건물번호본번',
`BDNBR_DUCA` INT(5) NULL DEFAULT NULL COMMENT '건물번호부번',
`BULD_MANAGE_NO` VARCHAR(25) NULL DEFAULT NULL COMMENT '건물관리번호',
`MUCH_DLVR_OFFIC_NM` VARCHAR(40) NULL DEFAULT NULL COMMENT '다량배달처명(null)',
`SIGNGU_BDNBR_NM` VARCHAR(200) NULL DEFAULT NULL COMMENT '시군구용건물명',
`LEGALDONG_CODE` VARCHAR(10) NULL DEFAULT NULL COMMENT '법정동코드',
`LEGALDONG_NM` VARCHAR(20) NULL DEFAULT NULL COMMENT '법정동명',
`LI_NM` VARCHAR(20) NULL DEFAULT NULL COMMENT '리명',
`ADSTRD_NM` VARCHAR(40) NULL DEFAULT NULL COMMENT '행정동명',
`MNTN_AT` VARCHAR(1) NULL DEFAULT NULL COMMENT '산여부(0:토지, 1:산)',
`LNM_MNNM` INT(4) NULL DEFAULT NULL COMMENT '지번본번',
`EMD_SN` VARCHAR(2) NULL DEFAULT NULL COMMENT '읍면동일련번호',
`LNM_DUCA` INT(4) NULL DEFAULT NULL COMMENT '지번부번',
`OLD_ZIP` VARCHAR(6) NULL DEFAULT NULL COMMENT '구 우편번호(null)',
`ZIP_SN` VARCHAR(3) NULL DEFAULT NULL COMMENT '우편번호일련번호(null)', INDEX `ZIPDB_IX1` (`ZONE_NO`), INDEX `ZIPDB_IX2` (`CTPRVN`, `SIGNGU`, `EUP_MYEON`), INDEX `ZIPDB_IX3` (`RN_CODE`), INDEX `ZIPDB_IX4` (`RN`)
) COLLATE='utf8_general_ci' ENGINE=InnoDB
;

b. 생성후에는 ALTER TABLE ... DISCARD TABLESPACE 명령을 사용하여 새로운 테이블의 테이블스페이스를 폐기합니다.

MariaDB [TEST]> ALTER TABLE test.zipdb DISCARD TABLESPACE;

c. ibd 파일과 cfg 파일을 데이터베이스 (test) 폴더에 붙여 넣습니다.

복구할 서버 데이터베이스 저장 위치 : /var/lib/mysql/test

 

# cp /tmp/zipdb.* /var/lib/mysql/test/

 

root 권한으로 복사시에는 아래의 퍼미션을 부여합니다.

# chown -R mysql:mysql /var/lib/mysql/test/zipdb.*

 

.ibd 파일 만으로도 테이블 스페이스로 파일을 가지고 올 수 있습니다.   

(.cfg 파일은 테이블 스페이스 정보 가지고 있음)

 

d. 다음 명령을 사용하여 새 테이블에 데이터를 가지고 옵니다.

 

MariaDB [(none)]> ALTER TABLE test.zipdb IMPORT TABLESPACE;

퍼미션이 맞지 않는 경우 다음의 에러가 발생

ERROR 1030 (HY000): Got error 194 "Tablespace is missing for a table" from storage engine InnoDB

 

 

e. 복구 결과

   정상적으로 모든 데이터 건수가 일치하는 것을 알 수 있습니다.

 

파티셔닝 복구 방식

https://mariadb.com/kb/en/library/innodb-file-per-table-tablespaces/

 

InnoDB File-Per-Table Tablespaces

InnoDB file-per-table tablespaces: what they are, where they're located, how to copy them, and other details.

mariadb.com

 

반응형

'Database > MYSQL' 카테고리의 다른 글

MariaDB connect 설치  (0) 2019.11.07
MariaDB JSON 컬럼 및 함수들  (0) 2019.11.04
MariaDB 우편번호 Import 하기  (0) 2019.11.01
MariaDB SHA2 512 방식으로 암호화 예제  (0) 2019.10.25
Mysql & MariaDB 튜닝 쉘  (0) 2019.08.14
반응형

우편번호는 아래 링크 사이트를 통해 최신 데이터를 받을 수 있습니다.

 

https://www.epost.go.kr/search/zipcode/cmzcd002k01.jsp

 

우편번호 DB와 검색기 소개 - 우편번호 안내

우편번호 검색기란? 우편번호 검색기 바로가기 ※ 우편번호를 검색하거나 고객이 보유한 다량의 주소록에 올바른 우편번호를 자동으로 생성해 주는 프로그램입니다.

www.epost.go.kr

 

1. 테이블 생성

 

ZIPDB라는 우편번호를 저장할 수 있는 테이블을 생성합니다.

 

저는 데이터베이스를 TEST라는 곳에서 아래 테이블을 생성하였습니다.

 

CREATE TABLE IF NOT EXISTS ZIPDB (
ZONE_NO VARCHAR(5) not null COMMENT '구역번호(우편번호)', 
CTPRVN VARCHAR(20) COMMENT '시도', 
CTPRVN_ENG VARCHAR(40) COMMENT '시도영문', 
SIGNGU VARCHAR(20) COMMENT '시군구', 
SIGNGU_ENG VARCHAR(40) COMMENT '시군구영문', 
EUP_MYEON VARCHAR(20) COMMENT '읍면', 
EUP_MYEON_ENG VARCHAR(40) COMMENT '읍면영문', 
RN_CODE VARCHAR(12) COMMENT '도로명코드', 
RN VARCHAR(80) COMMENT '도로명', 
RN_ENG VARCHAR(80) COMMENT '도로명영문', 
UNDGRND_AT VARCHAR(1) COMMENT '지하여부(0:지상, 1:지하)', 
BDNBR_MNNM INT(5) COMMENT '건물번호본번', 
BDNBR_DUCA INT(5) COMMENT '건물번호부번', 
BULD_MANAGE_NO VARCHAR(25) COMMENT '건물관리번호', 
MUCH_DLVR_OFFIC_NM VARCHAR(40) COMMENT '다량배달처명(null)', 
SIGNGU_BDNBR_NM VARCHAR(200) COMMENT '시군구용건물명', 
LEGALDONG_CODE VARCHAR(10) COMMENT '법정동코드', 
LEGALDONG_NM VARCHAR(20) COMMENT '법정동명', 
LI_NM VARCHAR(20) COMMENT '리명', 
ADSTRD_NM VARCHAR(40) COMMENT '행정동명', 
MNTN_AT VARCHAR(1) COMMENT '산여부(0:토지, 1:산)', 
LNM_MNNM INT(4) COMMENT '지번본번', 
EMD_SN VARCHAR(2) COMMENT '읍면동일련번호', 
LNM_DUCA INT(4) COMMENT '지번부번', 
OLD_ZIP VARCHAR(6) COMMENT '구 우편번호(null)', 
ZIP_SN VARCHAR(3) COMMENT '우편번호일련번호(null)'

 ENGINE = INNODB 
 DEFAULT CHARSET=utf8
 ;

 

 -- 인덱스 (구역번호 5자리 신 우편번호)
CREATE INDEX ZIPDB_IX1 ON zipdb(ZONE_NO);

-- 인덱스 (시도,시군구,읍면)
CREATE INDEX ZIPDB_IX2 ON zipdb(CTPRVN, SIGNGU, EUP_MYEON);

-- 인덱스(도로명코드)
CREATE INDEX ZIPDB_IX3 ON zipdb(RN_CODE);

-- 인덱스 (도로명)
CREATE INDEX ZIPDB_IX4 ON zipdb(RN);

 

 

2. 데이터 로드
우편번호 사이트의 모든 zip 값들을 서버에 /tmp/zip 폴더에 업로드
다만! 파일을 반드시 utf8로 변경 합니다.(메모장 열고 다른이름 저장에서 UTF8로 지정하면 됨.)

 

실행한 MariaDB는 10.3 버전으로 약간의 문법이 다릅니다.

 

다음 명령을 실행하여 LOAD DATA 문장을 자동으로 만듭니다.

 

# ls -lsa /tmp/zip/*.txt | awk '{print "LOAD DATA INFILE " "\x27" $10 "\x27" " INTO TABLE ZIPDB character set " "\x27" "utf8" "\x27" " fields terminated by " "\x27" "|" "\x27" " IGNORE 1 LINES;"}' 

 

아래 문장은 root 계정으로 local 시스템에 TEST 데이터베이스에 접속하라는 의미입니다.

# mysql -u root -p --local-infile=1 TEST (접속) 

 

MariaDB [TEST]> LOAD DATA INFILE '/tmp/zip/강원도.txt' INTO TABLE ZIPDB character set 'utf8' fields terminated by '|' IGNORE 1 LINES; 

 

위와 같이 수행하면 아래 그림과 같이 오류가 없는 경우 Query OK와 함께 Insert된 수가 출력됩니다.

 

2019.11.01 일 데이터 기준으로 약 1.3GB의 용량이 입력됩니다.

건수 : 3,112,960 건 

 

 

 

반응형
반응형

무료 DB인 MariaDB를 사용함에 있어서

 

암복호화를 하는 것이 필요했습니다.

 

다음 예제는 임의의 Table 생성 후

 

SHA2 512 방식으로 암복호화 하는 예제를 첨부하였습니다.

 

다만,

 

- Function에서 길이나 별도의 예외 상황에 대한 추가 처리는 더 필요해 보입니다.

- key_value는 사이트 특성에 맞춰 수행이 필요합니다.

 

function 에서 암호화 키 값이 보일수 있기 때문에 보안 목적과 잘 고려하여 설정이 필요합니다.


-- 암호화 할 컬럼은 Byte 값을 반환하기 때문에 blob 사용

CREATE TABLE private_data ( 
NAME VARCHAR(21), 
phone BLOB, 
address BLOB 
); 

 

-- 데이터 입력

insert into private_data values( 
'김대식', 
AES_ENCRYPT('010-1234-1234',SHA2('key_value',512)), 
AES_ENCRYPT('서울시 송파구',SHA2('key_value',512))  
); 

 

-- 암호화 컬럼 데이터 조회

select name,  
CONVERT(AES_DECRYPT(phone,SHA2('key_value',512)) using utf8) phone,  
CONVERT(AES_DECRYPT(address,SHA2('key_value',512)) using utf8) address  
from private_data;


 

-- 함수 사용 데이터 조회

SELECT test.decfn(test.encfn('010-1234-1234')) FROM dual; 

SELECT NAME 
     , test.decfn(phone) AS phone 
     , test.decfn(address) AS address 
 FROM private_data;

 

encfn 함수

DELIMITER $$
DROP FUNCTION IF EXISTS test.encfn;
CREATE FUNCTION test.encfn(encvalue VARCHAR(1000)) RETURNS blob
BEGIN
DECLARE result BLOB DEFAULT '';
select AES_ENCRYPT(encvalue,SHA2('key_value',512)) INTO result FROM dual;
RETURN result;
END $$
DELIMITER ;

 

decfn 함수

DELIMITER $$
DROP FUNCTION IF EXISTS test.decfn;
CREATE FUNCTION test.decfn(decvalue blob) RETURNS VARCHAR(1000)
BEGIN
DECLARE result VARCHAR(1000) DEFAULT '';
select CONVERT(AES_DECRYPT(decvalue,SHA2('key_value',512)) using UTF8) INTO result FROM dual;
RETURN result;
END $$
DELIMITER ;

 

계정 생성 및 실행 권한 부여

(해당 쉘로 접속하여 수행)

 

CREATE USER 'testuser'@'%' IDENTIFIED BY 'testuser';

GRANT SELECT ON test.* TO 'testuser'@'%';

GRANT EXECUTE ON FUNCTION test.encfn TO testuser@'%';

GRANT EXECUTE ON FUNCTION test.decfn TO testuser@'%';

 

(만약 HediSQL에서 아래 에러가 발생하면)

 

원격 root에 대한(%) 권한 부족으로

해당 mariaDB에 접속하여 with grant option을 설정해 주면 됩니다.

 

SQL> grant all on *.* to 'root'@'%' identified by 'password' with grant option;

 

 

참고 사이트

https://m.blog.naver.com/jjjhyeok/220006204633

 

[mysql] MYSQL Function 함수 생성, 조회, 실행

아래 샘플코드는 코드조회용 FUNCTION생성 스크립트 샘플 DELIMITER $$ DROP...

blog.naver.com

https://hsunryou.blog.me/221543591162

 

MariaDB(10.1.23)의 AES 암호화 Key 길이는 ?

우선 암호화 테스트를 위한 테이블을 아래와 같이 구성해 보았습니다.# AES 암호화 키가 128Bit보다 작...

blog.naver.com

 

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

 

SHA2

Calculates an SHA-2 checksum.

mariadb.com

 

https://eotlr0806.blog.me/221338753828

 

Mariadb 암호화 복호화

어플리케이션을 서비스 하다보면 개인정보를 다뤄야 하는 민감한 상황들이 옵니다... 이때 대부분 많이 사...

blog.naver.com

 

 

반응형

'Database > MYSQL' 카테고리의 다른 글

MariaDB 테이블 백업 및 복구  (0) 2019.11.01
MariaDB 우편번호 Import 하기  (0) 2019.11.01
Mysql & MariaDB 튜닝 쉘  (0) 2019.08.14
MySQL 백업용 쉘스크립트입니다.  (0) 2010.01.18
무료 접속 툴 (Free Tool)  (0) 2009.03.06
반응형

무료 DB 접근툴로 역 ERD도 정상적으로 잘 그려지는것을 확인하였습니다.

 

아무래도 한국어가 지원하다보니 뭔가 보여지는 모습도

 

산출물 형태를 띄고 있어 맘에 듭니다.

 

특징

 

1. 역 ERD 아주 잘 그려짐

2. 여러가지 DB를 웹 상에서 가능

3. 웹 상으로 띄우기 때문에 여러사람이 사용 가능

 

라이선스 : 일반버전 LGPL 라이선스 

 

소스 및 컴파일 다운로드 주소

https://sourceforge.net/projects/tadpoledbhub/

 

Tadpole DB Hub

Download Tadpole DB Hub for free. Web based Database collboration tools. Original home : https://github.com/hangum/TadpoleForDBTools It is a tool to manage Altibase, Amazon RDS, Apache Hive, Apache Tajo, MongoDB, CUBRID, MariaDB, MySQL, Oracle, MSSQL, SQLi

sourceforge.net

 

https://www.tadpolehub.com/tadpole

 

TadpoleHub | tadpolehub

라이브러리 aws-java-sdk-1.4.7 입니다. 작성되는 시점에서 최신 버전입니다. 

www.tadpolehub.com

 

 

 

오픈소프 버전 vs 엔터프라이즈 버전 차이

https://www.oss.kr/oss_case/show/2b6ac347-f8d4-4fc0-9c5c-33d56745f377

 

[공개SW 스타트업/테드폴허브]올챙이가 대왕개구리 되는 그날까지 - 공개SW 포털

올챙이가 대왕개구리 되는 그날까지 백지영/디지털데일리 엔터프라이즈 솔루션부 팀장/jyp@ddaily.co.kr 시높시스와 가트너 등 시장조사기관의 조사에 따르면 상용 소프트웨어(S...

www.oss.kr

 

 

반응형

'Database' 카테고리의 다른 글

「SQLP 핵심노트」 Ⅰ & Ⅱ 출간  (0) 2021.09.08
무료 ERD 툴 ERMASTER  (0) 2019.08.08
damo 암호화 컬럼 복원시 주의사항  (0) 2017.08.20
Sybase IQ Administrator 사용 Script  (0) 2012.10.18
JNDI Log4SQL 적용 예...  (0) 2011.04.21
반응형

MariaDB와 Mysql 성능을 테스트하기 위해

 

HammerDB를 사용하다가

 

보니...

 

정작 중요한 my.cnf 설정이 정상적인가? 물음에 도달하게 되었습니다.

 

정확한 설정값을 위해 자동 튜닝 스크립트를 제공하는 사이트를 발견하였습니다.

 

보통 정상적으로 튜닝 범주라고 체크 할려면 48시간이상 이용해야 한다는 사실은 존재합니다.

 


 

virtualbox 상에서 실행한 결과 (OK : 정상 / !! 설정 이상 / -- SKIP)

 

 >>  MySQLTuner 1.7.15 - Major Hayden <major@mhtx.net>
 >>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 >>  Run with '--help' for additional options and output filtering

[--] Skipped version check for MySQLTuner script
[OK] Logged in using credentials passed on the command line
[OK] Currently running supported MySQL version 10.3.17-MariaDB
[OK] Operating on 64-bit architecture

-------- Log file Recommendations ------------------------------------------------------------------
[--] Log file: /var/lib/mysql/hammerdb.err(0B)
[!!] Log file /var/lib/mysql/hammerdb.err doesn't exist
[!!] Log file /var/lib/mysql/hammerdb.err isn't readable.

-------- Storage Engine Statistics -----------------------------------------------------------------
[--] Status: +Aria +CSV +InnoDB +MEMORY +MRG_MyISAM +MyISAM +PERFORMANCE_SCHEMA +SEQUENCE
[--] Data in InnoDB tables: 999.9M (Tables: 9)
[OK] Total fragmented tables: 0

-------- Analysis Performance Metrics --------------------------------------------------------------
[--] innodb_stats_on_metadata: OFF
[OK] No stat updates during querying INFORMATION_SCHEMA.

-------- Security Recommendations ------------------------------------------------------------------
[OK] There are no anonymous accounts for any database users
[OK] All database users have passwords assigned
[!!] User 'root@%' does not specify hostname restrictions.
[!!] There is no basic password file list!

-------- CVE Security Recommendations --------------------------------------------------------------
[--] Skipped due to --cvefile option undefined

-------- Performance Metrics -----------------------------------------------------------------------
[--] Up for: 34m 1s (279K q [136.873 qps], 133 conn, TX: 74M, RX: 38M)
[--] Reads / Writes: 50% / 50%
[--] Binary logging is disabled
[--] Physical Memory     : 1.8G
[--] Max MySQL memory    : 15.2G
[--] Other process memory: 0B
[--] Total buffers: 1.4G global + 28.2M per thread (500 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[!!] Maximum reached memory usage: 1.7G (94.00% of installed RAM)
[!!] Maximum possible memory usage: 15.2G (845.58% of installed RAM)
[!!] Overall possible memory usage with other process exceeded memory
[OK] Slow queries: 0% (0/279K)
[OK] Highest usage of available connections: 2% (11/500)
[OK] Aborted connections: 1.50%  (2/133)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[!!] Query cache may be disabled by default due to mutex contention.
[!!] Query cache efficiency: 0.0% (0 cached / 1M selects)
[OK] Query cache prunes per day: 0
[OK] No Sort requiring temporary tables
[OK] No joins without indexes
[OK] Temporary tables created on disk: 0% (22 on disk / 37K total)
[OK] Thread cache hit rate: 90% (13 created / 133 connections)
[OK] Table cache hit rate: 95% (141 open / 147 opened)
[OK] Open file limit used: 1% (59/4K)
[OK] Table locks acquired immediately: 100% (108 immediate / 108 locks)

-------- Performance schema ------------------------------------------------------------------------
[--] Performance schema is disabled.
[--] Memory used by P_S: 0B
[--] Sys schema isn't installed.

-------- ThreadPool Metrics ------------------------------------------------------------------------
[--] ThreadPool stat is enabled.
[--] Thread Pool Size: 2 thread(s).
[--] Using default value is good enough for your version (10.3.17-MariaDB)

-------- MyISAM Metrics ----------------------------------------------------------------------------
[!!] Key buffer used: 18.2% (24M used / 134M cache)
[OK] Key buffer size / total MyISAM indexes: 128.0M/123.0K
[OK] Read Key buffer hit rate: 98.9% (180 cached / 2 reads)

-------- InnoDB Metrics ----------------------------------------------------------------------------
[--] InnoDB is enabled.
[--] InnoDB Thread Concurrency: 4
[OK] InnoDB File per table is activated
[OK] InnoDB buffer pool / data size: 1.0G/999.9M
[!!] Ratio InnoDB log file size / InnoDB Buffer pool size (99.609375 %): 340.0M * 3/1.0G should be equal to 25%
[!!] InnoDB buffer pool <= 1G and Innodb_buffer_pool_instances(!=1).
[--] Number of InnoDB Buffer Pool Chunk : 8 for 8 Buffer Pool Instance(s)
[OK] Innodb_buffer_pool_size aligned with Innodb_buffer_pool_chunk_size & Innodb_buffer_pool_instances
[OK] InnoDB Read buffer efficiency: 99.84% (26160668 hits/ 26202270 total)
[!!] InnoDB Write Log efficiency: 83.1% (617680 hits/ 743341 total)
[OK] InnoDB log waits: 0.00% (0 waits / 125661 writes)

-------- AriaDB Metrics ----------------------------------------------------------------------------
[--] AriaDB is enabled.
[OK] Aria pagecache size / total Aria indexes: 128.0M/1B

-------- TokuDB Metrics ----------------------------------------------------------------------------
[--] TokuDB is disabled.

-------- XtraDB Metrics ----------------------------------------------------------------------------
[--] XtraDB is disabled.

-------- Galera Metrics ----------------------------------------------------------------------------
[--] Galera is disabled.

-------- Replication Metrics -----------------------------------------------------------------------
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] Binlog format: MIXED
[--] XA support enabled: ON
[--] Semi synchronous replication Master: OFF
[--] Semi synchronous replication Slave: OFF
[--] This is a standalone server

-------- Recommendations ---------------------------------------------------------------------------
General recommendations:
    Restrict Host for user@% to user@SpecificDNSorIp
    MySQL was started within the last 24 hours - recommendations may be inaccurate
    Reduce your overall MySQL memory footprint for system stability
    Dedicate this server to your database for highest performance.
    Configure your accounts with ip or subnets only, then update your configuration with skip-name-resolve=1
    Performance schema should be activated for better diagnostics
    Consider installing Sys schema from https://github.com/mysql/mysql-sys for MySQL
    Consider installing Sys schema from https://github.com/good-dba/mariadb-sys for MariaDB
    Before changing innodb_log_file_size and/or innodb_log_files_in_group read this: https://bit.ly/2TcGgtU
Variables to adjust:
  *** MySQL's maximum memory usage is dangerously high ***
  *** Add RAM before increasing MySQL buffer variables ***
    query_cache_size (=0)
    query_cache_type (=0)
    query_cache_limit (> 1M, or use smaller result sets)
    performance_schema = ON enable PFS
    innodb_log_file_size should be (=85M) if possible, so InnoDB total log files size equals to 25% of buffer pool size.
    innodb_buffer_pool_instances (=1)

 


Perl로 작성된 쉘이 아래 주소에 있으며,

 

https://github.com/major/MySQLTuner-perl

 

major/MySQLTuner-perl

MySQLTuner is a script written in Perl that will assist you with your MySQL configuration and make recommendations for increased performance and stability. - major/MySQLTuner-perl

github.com

 

2019.08.14 

mysqltuner.pl
0.22MB

 

실행법

#> perl mysqltuner.pl --user root --pass='root'

 

지원하는 DB는

 

Test result are available here: Travis CI/MySQLTuner-perl

  • MySQL 8 (partial support, password checks don't work)
  • MySQL 5.7 (full support)
  • MySQL 5.6 (full support)
  • MariaDB 10.3 (full support)
  • MariaDB 10.2 (full support)
  • MariaDB 10.1 (full support)
  • MariaDB 10.0 (full support, 6 last month support)
  • Percona Server 5.7 (full support)
  • Percona Server 5.6 (full support)
  • Percona XtraDB cluster (full support)
  • MySQL 3.23, 4.0, 4.1, 5.0, 5.1, 5.5 (partial support - deprecated version)
  • Perl 5.6 or later (with perl-doc package)
  • Unix/Linux based operating system (tested on Linux, BSD variants, and Solaris variants)
  • Windows is not supported at this time (Help wanted !!!!!)
  • Unrestricted read access to the MySQL server (OS root access recommended for MySQL < 5.1)
  • CVE vulnerabilities detection support from https://cve.mitre.org

 

반응형
반응형

Eclipse 기반에 추가 설치를 통해 무료 ERD 툴을 사용할 수 있습니다.

 

장점 : 많은 Database를 지원

단점 : 정렬 기능, 물리 및 논리 변환 기능등 상세하기 조작은 어려웠습니다.

 

단순하게 논리 ERD를 DB로 부터 읽어서 역으로 바로 그려줄수 있는 장점이 있습니다.

(추가 작업을 하면 되겠지만 상세하게 지원되는 DB는 다른것 같습니다.)

 

1. Eclipse를 설치합니다.

   Eclipse IDE for Enterprise Java Developers 

 

2. Eclipse 실행 후 Help => Install New Software 선택

   관련 Repository 위치를 

   http://ermaster.sourceforge.net/update-site 

   추가 후 검색되어 나오는

   ERMaster를 설치합니다.

 

3. 이클립스 재시작 후

   신규 프로젝트를 생성합니다.

   General --> Project (임의의 이름을 정하고 생성합니다.)

 

   그후

   프로젝트 -> New -> Other -> ERMaster 선택 -> 종속될 프로젝트 (3번 처음 시작할 때 만든 프로젝트 선택)

   선택 합니다.

 

   Database 선택 부분

 

   Tibero 예)

   데이터베이스 : StandardSQL

   

   화면이 뜨면 바탕화면에서 마우스 우클릭

     => 가져오기 -> 데이터베이스

       

   3.1 DB 정보 입력

   데이터 베이스 : StandardSQL

 

   (DBA 문의)

   데이터베이스 명 : 사용하는 데이터베이스 명 입력

   사용자 명 : 사용자명 입력

   패스워드 :  패스워드입력

   포트번호 : 8629 (디폴트 8629)

 

   만약 JDBC 관련 입력이 안된다면 창을 닫고 다시 선택하면 활성화 됩니다.

 

   JDBC URL : tibero:thin:@<DB 아이피>:<포트번호>:<SID>

   JDBC 드라이버 클래스 이름 : com.tmax.tibero.jdbc.TbDriver

   

   JDBC 드라이버 (tibero 6 용)

   

tibero6-jdbc-14.jar
1.39MB

    

   Next 버튼으로 연결

   

   가져올 스키마, 개체 선택, 시퀀스 포함하면 오류발생

 

   기타 테이블 개수가 많은경우 오류가 발생합니다.

   

   => workspace 밑에 .matadata 밑에 .log 파일을 열면 상세 원인을 분석 가능합니다.

 

   급하게 찾고 정리한 내용이라 상세 옵션이나 설정은 인터넷을 검색하시면 더욱 좋습니다.!  

   

   끝.

반응형

'Database' 카테고리의 다른 글

「SQLP 핵심노트」 Ⅰ & Ⅱ 출간  (0) 2021.09.08
무료 DB 접근 툴  (0) 2019.08.19
damo 암호화 컬럼 복원시 주의사항  (0) 2017.08.20
Sybase IQ Administrator 사용 Script  (0) 2012.10.18
JNDI Log4SQL 적용 예...  (0) 2011.04.21
반응형


출처 : http://ukja.tistory.com/232 에서 퍼온 자료입니다.



특정 Query를 수행한 후, 그 결과를 가로 형태가 아닌 세로 형태로 보기 좋게 출력하고 싶다. Tom Kyte가 멋지게 이 작업을 해냈는데, 핵심은 DBMS_SQL 패키지를 이용한 Dynamic SQL에 있다. 

create or replace procedure print_table( p_query in varchar2 )
AUTHID CURRENT_USER
is
    l_theCursor     integer default dbms_sql.open_cursor;
    l_columnValue   varchar2(4000);
    l_status        integer;
    l_descTbl       dbms_sql.desc_tab;
    l_colCnt        number;
begin
      dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
    dbms_sql.describe_columns
    ( l_theCursor, l_colCnt, l_descTbl );

    for i in 1 .. l_colCnt loop
        dbms_sql.define_column
        (l_theCursor, i, l_columnValue, 4000);
    end loop;

    l_status := dbms_sql.execute(l_theCursor);

    while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
        for i in 1 .. l_colCnt loop
            dbms_sql.column_value
            ( l_theCursor, i, l_columnValue );
            dbms_output.put_line
            ( rpad( l_descTbl(i).col_name, 30 )
              || ': ' ||
              l_columnValue );
        end loop;
        dbms_output.put_line( '-----------------' );
    end loop;
exception
    when others then
     raise;
end;
/


약간의 귀찮은 코딩이 필요하지만 그 효과는 입이 딱 벌어질 정도이다. 다음과 같이 아주 보기 편하게 데이터를 출력할 수 있다. 


SYSTEM> grant execute on print_table to public;

SYSTEM> create public synonym print_table for scott.print_table;



UKJA@ukja116> set serveroutput on
UKJA@ukja116> 
UKJA@ukja116> exec print_table('select * from v$session where sid = userenv(''sid'')');
SADDR                         : 35065B10                                        
SID                           : 127                                             
SERIAL#                       : 557                                             
AUDSID                        : 6755975                                         
PADDR                         : 35A94D88                                        
USER#                         : 88                                              
USERNAME                      : UKJA                                            
COMMAND                       : 3                                               
OWNERID                       : 2147483644                                      
TADDR                         :                                                 
...                             
CREATOR_SERIAL#               : 140                                             
-----------------                                                               

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.20


참고로, 나는 print_table 함수를 접하는 순간 Toad가 더 이상 불필요하게 되었다. 

DBMS_SQL 패키지를 이용한 Dynamic SQL 구현은 너무 강력하다. 아래는 내가 실제로 테스트를 할 때 많이 사용하는 간단한 PL/SQL Script이다. Column이 50개 이상 존재하는  V$SQL_SHARED_CURSOR 뷰에서 값이 'Y'인 것만 뽑아서 예쁘게 출력하고 싶기 때문이다. 

-- my shared cursor
/*
declare
  c         number;
  col_cnt   number;
  col_rec   dbms_sql.desc_tab;
  col_value varchar2(4000);
  ret_val    number;
begin
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c,
      'select q.sql_text, s.*
      from v$sql_shared_cursor s, v$sql q
      where s.sql_id = q.sql_id
          and s.child_number = q.child_number
          and q.sql_text like ''&1''',
      dbms_sql.native);
  dbms_sql.describe_columns(c, col_cnt, col_rec);

  for idx in 1 .. col_cnt loop
    dbms_sql.define_column(c, idx, col_value, 4000);
  end loop;


  ret_val := dbms_sql.execute(c);

  while(dbms_sql.fetch_rows(c) > 0) loop
    for idx in 1 .. col_cnt loop
      dbms_sql.column_value(c, idx, col_value);
      if col_rec(idx).col_name in ('SQL_ID', 'ADDRESS', 'CHILD_ADDRESS',
                    'CHILD_NUMBER', 'SQL_TEXT') then
        dbms_output.put_line(rpad(col_rec(idx).col_name, 30) ||
                ' = ' || col_value);
      elsif col_value = 'Y' then
        dbms_output.put_line(rpad(col_rec(idx).col_name, 30) ||
                ' = ' || col_value);
      end if;

    end loop;

    dbms_output.put_line('--------------------------------------------------');

   end loop;

  dbms_sql.close_cursor(c);

end;
/


만일 이러한 수고없이 V$SQL_SHARED_CURSOR 뷰를 보려고 하면, 곧 좌절하고 말 것이다. 아래 데이터를 보면서 좌절감을 잠깐 맛보자...

UKJA@ukja116> col sql_id new_value v_sql_id
UKJA@ukja116> 
UKJA@ukja116> select sql_id from v$sql where sql_text like 
    'select /* cursor_share */ * from t1%';

SQL_ID                                                                          
-------------                                                                   
2zu6xb9130t89                                                                   

Elapsed: 00:00:00.07
UKJA@ukja116> 
UKJA@ukja116> set serveroutput on
UKJA@ukja116> exec print_table( -
        'select * from v$sql_shared_cursor where sql_id = ''&v_sql_id''');
SQL_ID                        : 2zu6xb9130t89                                   
ADDRESS                       : 2867E250                                        
CHILD_ADDRESS                 : 2FABDDD8                                        
CHILD_NUMBER                  : 2                                               
UNBOUND_CURSOR                : N                                               
SQL_TYPE_MISMATCH             : N                                               
OPTIMIZER_MISMATCH            : N                                               
OUTLINE_MISMATCH              : N                                               
STATS_ROW_MISMATCH            : N                                               
LITERAL_MISMATCH              : N                                               
FORCE_HARD_PARSE              : N                                               
EXPLAIN_PLAN_CURSOR           : N                                               
BUFFERED_DML_MISMATCH         : N                                               
PDML_ENV_MISMATCH             : N                                               
INST_DRTLD_MISMATCH           : N                                               
SLAVE_QC_MISMATCH             : N                                               
TYPECHECK_MISMATCH            : N                                               
AUTH_CHECK_MISMATCH           : N                                               
BIND_MISMATCH                 : N                                               
DESCRIBE_MISMATCH             : N                                               
LANGUAGE_MISMATCH             : N                                               
TRANSLATION_MISMATCH          : N                                               
ROW_LEVEL_SEC_MISMATCH        : N                                               
INSUFF_PRIVS                  : N                                               
INSUFF_PRIVS_REM              : N                                               
REMOTE_TRANS_MISMATCH         : N                                               
LOGMINER_SESSION_MISMATCH     : N                                               
INCOMP_LTRL_MISMATCH          : N                                               
OVERLAP_TIME_MISMATCH         : N                                               
EDITION_MISMATCH              : N                                               
MV_QUERY_GEN_MISMATCH         : N                                               
USER_BIND_PEEK_MISMATCH       : N                                               
TYPCHK_DEP_MISMATCH           : N                                               
NO_TRIGGER_MISMATCH           : N                                               
FLASHBACK_CURSOR              : N                                               
ANYDATA_TRANSFORMATION        : N                                               
INCOMPLETE_CURSOR             : N                                               
TOP_LEVEL_RPI_CURSOR          : N                                               
DIFFERENT_LONG_LENGTH         : N                                               
LOGICAL_STANDBY_APPLY         : N                                               
DIFF_CALL_DURN                : N                                               
BIND_UACS_DIFF                : N                                               
PLSQL_CMP_SWITCHS_DIFF        : N                                               
CURSOR_PARTS_MISMATCH         : N                                               
STB_OBJECT_MISMATCH           : N                                               
CROSSEDITION_TRIGGER_MISMATCH : N                                               
PQ_SLAVE_MISMATCH             : N                                               
TOP_LEVEL_DDL_MISMATCH        : N                                               
MULTI_PX_MISMATCH             : N                                               
BIND_PEEKED_PQ_MISMATCH       : N                                               
MV_REWRITE_MISMATCH           : N                                               
ROLL_INVALID_MISMATCH         : N                                               
OPTIMIZER_MODE_MISMATCH       : N                                               
PX_MISMATCH                   : N                                               
MV_STALEOBJ_MISMATCH          : N                                               
FLASHBACK_TABLE_MISMATCH      : N                                               
LITREP_COMP_MISMATCH          : N                                               
PLSQL_DEBUG                   : N                                               
LOAD_OPTIMIZER_STATS          : N                                               
ACL_MISMATCH                  : N                                               
FLASHBACK_ARCHIVE_MISMATCH    : N                                               
LOCK_USER_SCHEMA_FAILED       : N                                               
REMOTE_MAPPING_MISMATCH       : N                                               
LOAD_RUNTIME_HEAP_FAILED      : N                                               
-----------------                                                               

PL/SQL procedure successfully completed.


너무 많은 데이터때문에 분석하는 시간이 즐거운 시간이 아니라 고생스러운(주로 눈이) 시간이 되어 버린다. 하지만 다음과 같이 간단하게 이 문제를 해결할 수 있다. 

UKJA@ukja116> @shared_cursor 'select /* cursor_share */%'
SQL_TEXT                       = select /* cursor_share */ * from t1 where c1 = 
:b1                                                                             
SQL_ID                         = 2zu6xb9130t89                                  
ADDRESS                        = 2867E250                                       
CHILD_ADDRESS                  = 2DCB06D0                                       
CHILD_NUMBER                   = 0                                              
OPTIMIZER_MODE_MISMATCH        = Y                                              
--------------------------------------------------                              
SQL_TEXT                       = select /* cursor_share */ * from t1 where c1 = 
:b1                                                                             
SQL_ID                         = 2zu6xb9130t89                                  
ADDRESS                        = 2867E250                                       
CHILD_ADDRESS                  = 2DD0DB6C                                       
CHILD_NUMBER                   = 1                                              
BIND_MISMATCH                  = Y                                              
--------------------------------------------------                              
SQL_TEXT                       = select /* cursor_share */ * from t1 where c1 = 
:b1                                                                             
SQL_ID                         = 2zu6xb9130t89                                  
ADDRESS                        = 2867E250                                       
CHILD_ADDRESS                  = 2FABDDD8                                       
CHILD_NUMBER                   = 2                                              
--------------------------------------------------                              

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.04


이런 간단하지만 아름다운 결과들이 엔지니어라면 누구나 남을 한번쯤은 놀라게 할 만한 프로그래밍 실력이 필요한 이유이다. 



출처: http://ukja.tistory.com/232 [오라클 성능 문제에 대한 통찰 - 조동욱]

출처: http://ukja.tistory.com/232 [오라클 성능 문제에 대한 통찰 - 조동욱]

반응형

+ Recent posts