특정 테이블의 조회 결과(대량 ROW)를 파일로 저장하고

저정된 결과 파일을 다시 DB(Table)로 저장하는 방법 입니다.

대량의 Row(수백 MB)이기 때문에 쿼리를 통한 Insert가 아닌 load data 명령을 통해 수행 합니다.

  대상 테이블 구조

tbl_user_mode_score

 

  다량의 조회 결과를(1000만건) 파일로 저장하는 쿼리 입니다.

select * from tbl_user_mode_score limit 10000000
INTO OUTFILE 'e:\query_result_1000man.txt'
FIELDS TERMINATED BY '\t'
ENCLOSED BY ''
LINES TERMINATED BY '\n';

  - 조회 결과는 아래와 같습니다. (Field 와 Field 는 탭으로 구분)

Row 수: 1000만건, 시간: 7.203 sec, 파일 크기: 367 MB

 

 

 위 조회 결과를 별도 Table에 저장하는 방법 입니다.

    1. 데이터를 저장할 DB에 조회 내용과 동일한 구조의 테이블을 생성 합니다.

    2. cmd 창에서 mysql 콘솔에 접속 합니다.

    3. 아래 명령어를 실행하여 데이터를 입력 합니다.

load data infile 'e:/query_result_1000man.txt' into table tbl_user_mode_score ( usn, mode_idx, win_cnt, lose_cnt, last_play_date ) ;

    - 입력 완료시 메시지 : 입력 건수 및 오류 상황이 표시 됩니다.

Row 수: 1000만건, 시간: 1 min 6.337 sec

 

이상 입니다.

Oracle 과 MSSQL에 있는 DB Link 서비스를 MySQL에서 지원하는 FEDERATED 엔진을 이용하여 구현하는 방법 입니다.


1. 설치되어 있는 엔진 확인

  - CentOS에서 yum 으로 설치했을때 기본적으로 사용 가능한 엔지들의 목록 입니다.

2. 엔진을 사용할 수 있도록 설치

 

3. FEDERATED 엔진의 설치여부 확인

  - FEDERATED 엔진이 목록에 표시되지만 사용 가능하지 않은 상태 입니다.


4. 엔진 사용 가능 하도록 my.cnf 수정

  - [mysqld] 하위에  federated 항목을 추가 합니다.


5. 엔진의 상태를 확인 합니다.

 - FEDERATED 엔진의 Support 상태가 YES 로 변경 되었습니다.


----------------------------- FEDERATED 엔진을 사용하여 테이블을 생성하여 원격지 테이블과 연결 -------------------------

1. 원격지에 테이블을 생성 합니다.

- 실제 데이터가 입력되는 테이블 입니다.

- 데이터 폴더에는 .frm(구조) / .ibd(데이터) 파일이 생성 됩니다.

CREATE TABLE `cityholic_db`.`cart_product` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '아이디',

  `users_id` bigint(20) unsigned NOT NULL COMMENT '고객아이디',

  `product_id` bigint(20) NOT NULL COMMENT '상품아이디',

  `option_code` varchar(50) NOT NULL COMMENT '상품옵션코드',

  `quantity` int(11) NOT NULL DEFAULT '0' COMMENT '상품 개수',

  PRIMARY KEY (`users_id`,`product_id`,`option_code `),

  UNIQUE KEY `id_UNIQUE` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='카트에 담긴 상품';


◈ 만약 원격지 DB의 비밀번호에 특수문자'@' 를 사용하는 경우 2번 방식으로는 테이블을 생성할 수 없으니

     2번을 제외하고 3번 항목부터 진행해 주시면 됩니다.


2. 로컬에 테이블을 생성 합니다.

 - 원격지의 테이블을 참조하기 위한 테이블 입니다

 - 데이터 폴더에는 .frm(구조) 파일만 생성 됩니다.

CREATE TABLE `cityholic_db`.`cart_product` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '아이디',

  `users_id` bigint(20) unsigned NOT NULL COMMENT '고객아이디',

  `product_id` bigint(20) NOT NULL COMMENT '상품아이디',

  `option_code` varchar(50) NOT NULL COMMENT '상품옵션코드',

  `quantity` int(11) NOT NULL DEFAULT '0' COMMENT '상품 개수',

  PRIMARY KEY (`users_id`,`product_id`,`option_code `),

  UNIQUE KEY `id_UNIQUE` (`id`)

) ENGINE=FEDERATED DEFAULT CHARSET=utf8 COMMENT='카트에 담긴 상품'

CONNECTION='mysql://root:dldusrn1@10.3.0.27:3306/cityholic_db/cart_product';

   - CONNECTION 옵션의 구성 = 'mysql://[계정]:[비밀번호]@[서버ip]:[port]/[원격지DB명]/[원격지 테이블명]'

   - Pass 에서 특수문자 '@' 를 사용하는 경우 아래와 같이 테이블 생성시 오류가 발생합니다.

     



3. 테이블 생성시 사용할 SERVER 개체를 생성 합니다.

1
2
3
CREATE SERVER [서버명]
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'root', PASSWORD 'XXXX@XXXX', HOST '192.168.197.128', PORT 3306, DATABASE 'db_link_test');
cs

      - 생성된 서버 정보를 조회합니다.

1
SELECT * FROM mysql.servers;
cs


4. 생성된 서버로 테이블을 생성 합니다.

- 로컬에 생성하는 테이블과 원격지 테이블이 동일하다면 CONNECTION 옵션에서 테이블명은 생략 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `cityholic_db`.`cart_product` (
  `id`             bigint(20)     NOT NULL AUTO_INCREMENT COMMENT '아이디',
  `users_id`     bigint(20)     unsigned NOT NULL COMMENT '고객아이디',
  `product_id`     bigint(20)     NOT NULL COMMENT '상품아이디',
  `option_code` varchar(50NOT NULL COMMENT '상품옵션코드',
  `quantity`     int(11)     NOT NULL DEFAULT '0' COMMENT '상품 개수',
 
  PRIMARY KEY (`users_id`,`product_id`,`option_code `),
  UNIQUE KEY `id_UNIQUE` (`id`)
ENGINE=FEDERATED DEFAULT CHARSET=utf8 COMMENT='카트에 담긴 상품'
CONNECTION='[서버명]/cart_product';
cs


>> . 이상 모든 설정을 완료 했다면 로컬에서 원격지의 Table을 로컬 테이블 처럼 사용 가능합니다. select, insert, update, delete 모두 가능 합니다.


현재 활성화된 창을 특정 위치로 이동하는 명령 입니다.

1
2
3
4
5
; 활성창을 특정 위치로 이동
^1::
    WinGetActiveTitle, title
    WinMove, %title%, , 2020
    return

 

사용해본 클램프 중에서는 Dewalt 제품이 가장 만족도가 높았습니다.

그중에서 M사이즈의 12인치 DWHT83140-KR 제품이 활용도가 높습니다.

Dewalt 규격표
디월트 클램프 짱 좋음

'기타 > 공구' 카테고리의 다른 글

[DeWalt] 퀵 체인지 드릴 드라이버  (0) 2023.03.12
Dremel 액세서리 중 절단비트에 대해서  (0) 2016.09.11

MySQL / MariaDB에서 Slow Query Log를 활성화하기 위한 방법과 실시간으로 변경 가능한 Variable에 대해서 설명드리겠습니다. 

개인적으로는 Slow Query Log를 테이블로 관리하는것을 좋아합니다. 실행된 쿼리 검색 및 통계내가가 편리하기 때문입니다.

아래 3개의 쿼리를 실행하여 설정 가능한 변수를 확인할 수 있습니다. 쿼리 결과

show global variables like '%slow%';

show global variables like '%long%';

show global variables like '%log_output%';

 

>> my.ini 파일 수정 : 노란색 영역의 3개 항목을 추가하신 후 MySQL / MariaDB 서비스를 재시작해주시면 됩니다.

set global 쿼리를 사용해서 설정을 변경할 수 있습니다.

하지만 long_query_time 변수는, 쿼리로는 변경은 가능하지만 실제 반영은 안 되고 있기에 ini 파일에서 설정해 주셔야 합니다.

my.ini 수정

slow_query_log, log_output 은 운용 중인 상태에서 서비스 재시작 없이 설정 변경이 가능하며 즉시 해당 설정이 적용됩니다.

제어판 > 서비스 > 재시작

 

>> 테이블에 기록된 Slow Query 결과입니다.

Slow Query Log in Table

Index 정보를 조회하여 하나의 컬럼에 Key 컬럼을 ','로 구분하여 출력하는 쿼리 입니다.
 
실행 결과)
쿼리)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
select ta.table_name
    , index_name, max(tb.constraint_type) INDEX_DESCRIPTION  
    , concat_ws(', ', max(col_1), max(col_2), max(col_3), max(col_4), max(col_5)  
    , max(col_6), max(col_7), max(col_8), max(col_9), max(col_10)) INDEX_KEYS  
from (  
        select table_schema, `table_name`  
        , (CONSTRAINT_NAME) INDEX_NAME  
        , ('') INDEX_DESCRIPTION  
        , (case ordinal_position when 1 then column_name else null end) col_1  
        , (case ordinal_position when 2 then column_name else null end) col_2  
        , (case ordinal_position when 3 then column_name else null end) col_3  
        , (case ordinal_position when 4 then column_name else null end) col_4  
        , (case ordinal_position when 5 then column_name else null end) col_5  
        , (case ordinal_position when 6 then column_name else null end) col_6  
        , (case ordinal_position when 7 then column_name else null end) col_7  
        , (case ordinal_position when 8 then column_name else null end) col_8  
        , (case ordinal_position when 9 then column_name else null end) col_9  
        , (case ordinal_position when 10 then column_name else null end) col_10  
        from information_schema.KEY_COLUMN_USAGE  
        where table_schema = 'db_schema' and `table_name` like '%info%'  
    ) ta  
left join information_schema.table_constraints tb   
on ta.table_schema = tb.table_schema and ta.`table_name` = tb.`table_name` and ta.index_name = tb.constraint_name  
group by ta.table_name, index_name 
order by ta.table_name, index_name asc
;
 
cs

+ Recent posts