MySQL 테이블 partition 설정 하기

리눅스/MySQL|2020. 6. 30. 12:00
반응형

1. 지원 확인


mysql 에 로그인하여 아래 명령으로 지원 여부를 확인 합니다.


mysql> show variables like '%partition%;    // have_partitioning 항목 확인


MySQL 5.6.29 버전부터는 아래 명령으로 확인이 가능 합니다.


mysql> show plugins;  // partition 항목 확인



2. 사용 예제


파티셔닝은 테이블의 데이터가 많거나 용량 사이즈가 커서 데이터 입출력이 느린 경우 사용합니다.

여기에서는 처리를 빠르게 하기 위해 데이터를 연도를 기준으로 나누는 예제를 준비 하였습니다.



1) 기존 일반 테이블을 파티셔닝 테이블로 변경


(일반 테이블 생성)


mysql> create table test (id int(10) AUTO_INCREMENT PRIMARY KEY, Name varchar(20), Insert_time DATETIME);


(파티셔닝 적용)


mysql> alter table test PARTITION BY RANGE (TO_DAYS(Insert_time))

(

PARTITION p2017 VALUES LESS THAN (TO_DAYS('2018-01-01')),

PARTITION p2018 VALUES LESS THAN (TO_DAYS('2019-01-01')),

PARTITION p2019 VALUES LESS THAN (TO_DAYS('2020-01-01')),

PARTITION p2020 VALUES LESS THAN (TO_DAYS('2021-01-01')),

partition eternal values less than MAXVALUE

);


위 네 개의 조건에 해당되지 않는 데이터는 (2021년 이후 데이터) eternal 이라는 파티션에 저장 하도록 했습니다.

   (생략 가능)

* 파티션 이름은 반드시 영문으로 시작해야 합니다.

* LESS 는 미만을 뜻합니다.

* 추후에 2021년도 파티션 생성을 원할 경우 MAXVALUE 삭제 후 2021 년, MAXVALUE 를 차례로 다시 생성하는 방법으로 추가가 가능합니다.


mysql> alter table test drop partition eternal;

mysql> alter table test add partition (PARTITION p2021 VALUES LESS THAN (TO_DAYS('2022-01-01'))); 

mysql> alter table test add partition (PARTITION eternal VALUES LESS THAN MAXVALUE);


* 파티션 설정 쿼리 실행시 PRIMARY KEY 관련 에러가 출력 될 수 있습니다.

ERROR 1503 (HY000) at line 25: A PRIMARY KEY must include all columns in the table's partitioning function


이경우 show create table {테이블 이름} 을 실행하여 출력 내용을 참고 합니다.


PRIMARY KEY (`id`) 이렇게 있으면 안되고

KEY `id` (`id`) 이렇게 되어 있어야 됩니다.



2) 처음부터 파티셔닝 테이블 생성


mysql> CREATE TABLE test (

  id int(10) AUTO_INCREMENT,

  Name varchar(20),

  Insert_time DATETIME,

  KEY id (id)

) ENGINE=InnoDB CHARSET=utf8

PARTITION BY RANGE(TO_DAYS(Insert_time)) (

  PARTITION p2017 VALUES LESS THAN (TO_DAYS('2018-01-01')),

  PARTITION p2018 VALUES LESS THAN (TO_DAYS('2019-01-01')),

  PARTITION p2019 VALUES LESS THAN (TO_DAYS('2020-01-01')),

  PARTITION p2020 VALUES LESS THAN (TO_DAYS('2021-01-01')),

  partition eternal values less than MAXVALUE

);



3) 파티션 추가 & 삭제


위에서 파티션 추가 예시처럼 사용하시면 됩니다.

mysql> alter table test add partition (PARTITION p2021 VALUES LESS THAN (TO_DAYS('2022-01-01'))); 

mysql> alter table test drop partition p2021;



4) 파티션 없는 일반 테이블로 변경 (데이터 합치기)


mysql> alter table test remove partitioning;



반응형

댓글()

MySQL 에서 가져온 최근 데이터를 오래된 순서대로 정렬하기

프로그래밍/PHP|2020. 6. 30. 08:49
반응형

DB 테이블 (fruit) 에 가령 아래와 같은 데이터가 존재한다고 치면

최신데이터 3개를 가져와야 할 일이 생겼습니다.

단, 순서는 유지하면서.


name | fruit

--------------------

CDH      파인애플

JJE        바나나

CHY       딸기

CJW      포도

JOY       사과


MySQL 에서 가져오는 방법으로 아래와 같은 쿼리가 주로 사용됩니다.

하지만 최신 데이터를 가져오기 위해 사용한 DESC 때문에 순서는 뒤바뀌게 되므로

array_reverse 함수를 이용해 간단히 배열에 넣은 값을 역순으로 재정렬 하면 됩니다.


$query = "SELECT * FROM fruit ORDER BY no DESC LIMIT 3";


if ($result = mysqli_query($link, $query)) {

    $Arrays = []; // 배열 선언

    while ($row = mysqli_fetch_row($result)) { 

        $Arrays["$row[0]"] = $row[1]; // 이름에 과일 넣기

    }


    // 배열 역순 정렬

    $ArrayHour = array_reverse($ArrayHour);

}



반응형

댓글()

PHP 배열 사용하기

프로그래밍/PHP|2020. 6. 26. 11:12
반응형

출처: https://pikabu.tistory.com/83 [피카부]


배열이란

배열은 '여러개의 값을 담아 놓는 상자'라고 생각하시면 됩니다. 배열로 선언하면 값이 없어도 배열이 됩니다. 또한 배열 선언과 동시에 값을 대입하는 것도 가능합니다.

$days = []; // 빈 배열 $days 선언

$family = ['dad', 'mom', 'son', 'daughter']; // 값이 있는 배열 $family 선언

배열의 첨자

배열 요소의 위치를 첨자라고 합니다. 첨자는 보통 연속되는 값으로 0,1,2..로 이어집니다. 이러한 첨자로 배열에 바로 접근이 가능하게 됩니다.

// 첨자는 0, 1, 2, 3
$family = ['dad', 'mom', 'son', 'daughter'];

echo $family[0]; // 'dad'

echo $family[3]; // 'daughter'

연상 배열

첨자 대신 요소의 이름(key)을 지정하여 접근 할 수도 있습니다.

$family_name = [
    'dad' => 'Bob',
    'mom' => 'Jessy',
    'son' => 'James',
    'daughter' => 'Emily'
];

echo $family_name['dad']; // 'Bob'

요소의 추가

마지막에 요소를 추가

배열의 제일 끝에 새로운 요소를 추가합니다.

//첨자 배열의 경우 
$family = ['dad', 'mom', 'son', 'daughter'];

$family[] = 'puppy'; // 배열의 제일 끝에 요소를 추가

echo $family[4]; // 'puppy'


// 연상 배열의 경우
$family_name = [
    'dad' => 'Bob',
    'mom' => 'Jessy',
    'son' => 'James',
    'daughter' => 'Emily'
];

$family_name['puppy'] = 'John';

echo $family_name['puppy']; // 'John'

가장 첫 위치에 요소를 추가

배열의 가장 첫 위치에 요소를 추가할 경우는 array_unshift()를 사용합니다.

$family = ['dad', 'mom', 'son', 'daughter'];

array_unshift($family, 'grandma');

// $familyは['grandma', 'dad', 'mom', 'son', 'daughter'] 로 됩니다.

임의의 위치 요소를 추가

배열의 임의의 위치에 요소를 끼워넣습니다. array_splice()는 원래 요소를 치환하는 함수이지만, 제3인수에 0을 지정하면 요소를 지우지 않고 끼워넣을 수 있습니다.

$family = ['dad', 'mom', 'son'];

// $family[2]의 앞에'uncle'를 추가
array_splice($family, 2, 0, 'uncle');

// ['dad', 'mom', 'uncle', 'son']

복수의 요소를 추가

array_push() 함수를 사용하여 한번에 여러개의 요소를 추가합니다.

$family = ['dad', 'mom', 'son'];
array_push($family, 'puppy', 'citty');

// ['dad', 'mom', 'son', 'puppy', 'citty']

array_merge() 함수를 사용하면 배열과 배열을 결합합니다.

$family = ['dad', 'mom', 'son'];
$add_member = ['grandma', 'grandpa'];

$new_family = array_merge($add_member, $family);

// $new_family는 ['grandma', 'grandpa', 'dad', 'mom', 'son']
//array_merge는 원래의 배열 $family에 영향을 주지 않습니다.

다차원 배열

배열의 요소에도 배열 값을 가지게 할 수 있습니다.

$families = [
    [
        'dad', 'mom', 'son'
    ],
    [
        'dad', 'mom', 'daughter'
    ]
];

echo $families[0][0]; // 'dad'

echo $families[1][2]; // 'daughter'

// $families['Smith']와 $families['Williams']는 각각 배열입니다.

물론 연상 배열을 다차원 배열로 할 수도 있습니다.

$families = [
    'Smith' => [
        'dad' => 'Bob',
        'mom' => 'Jessy',
        'son' => 'James'
    ],
    'Williams' => [
        'dad' => 'Michael',
        'mom' => 'Jessy',
        'daughter' => 'Emily'
    ]
];

echo $families['Smith']['dad']; // 'Bob'

여기서는 $families['Smith']['mom']의 'Jessy'와 $families['Williams']['mom']의 'Jessy'는 문자열은 같지만 다른 배열입니다. 즉, 스미스 가문의 제시와 윌리엄 가문의 제시로 보시면 됩니다. 프로그래밍 초보 시절에는 많이 혼동되는 부분이지만 숙련되면 당연하게 생각되어질 것입니다.

배열의 삭제

배열의 삭제는 따로 정리해두었으니 참고 바로가기

마치며

PHP의 경우는 첨자 배열과 연상 배열이 같은 배열형태로 취급됩니다. 첨자 배열과 연상 배열을 합치거나 루프 구문에서 별 다른 신경쓸 것 없이 사용이 가능합니다. 하지만 다른 개발 언어에서는 전혀 다른 취급을 하는 경우도 있으니 주의하시기 바랍니다.



출처: https://pikabu.tistory.com/83 [피카부]


반응형

댓글()

소수점 두자리에서 자르기, 소수점 세자리에서 반올림하기

프로그래밍/BASH SHELL|2020. 6. 25. 12:18
반응형

1. 자르기


[ 명령 ]

# echo "scale=2;1.16628996273/1" |bc -l


[ 결과 ]

1.16


여기에서 scale=2 부분이 소수점 두 자리까지 출력을 한다는 의미 입니다.

그리고 1.16628996273/1 는 계산 식인데, 숫자만으로 표현하면 처리가 되지 않으니

꼭 계산식으로 해야 해서 나누기 1을 해준 것입니다.



2. 반올림 하기


[ 명령 ]

# echo $(printf %.2f 1.16628996273)


[ 결과 ]

1.17



반응형

댓글()

파일을 첫번째 필드를 기준으로 중복제거하여 전체필드 출력하기

프로그래밍/BASH SHELL|2020. 6. 25. 10:43
반응형

[출처] https://m.blog.naver.com/PostView.nhn?blogId=nativekim&logNo=220376409687


유닉스, 리눅스에서도 파일을 중복제거하는 기능이 있다.

 

보통 sort한후 uniq 명령어로 중복제거를 하는 방법은 많이 알고 있지만 첫번째 필드를 기준으로 중복제거를 하고

 

출력은 모두 필드가 나오도록 하는건 모르는 사람이 많다.

 

명령어의 옵션을 활용을 하면 이런 작업을 할수가 있다.

 

다음과 같은 내용의 a.txt 파일 있다.

 # cat > a.txt
11 aa xtp1
11 ab xtp2
11 ac xtp4
11 ad xtp4
11 af xtp2
22 bb xtp5
22 bp xtp5
22 bs xtp1

 

리눅스에서 uniq 옵션중에 -w 옵션이 있다. 처음부터 몇바이트가 중복기준으로 삼을건지.. -w 2 옵션을 쓰면 2바이트만 기준으로

중복을 제거한다.

cat a.txt | sort | uniq -w 2

결과

11 aa xtp1
22 bb xtp5

 

리눅스에서는 uniq옵션에 -w 옵션이 존재하지만 uniq에는 존재하지 않는것 같다. (확실치는 않음.. 모두 테스트못했음--;)

그래서 awk 구문을 이용하여 첫번째 필드를 기준으로 중복제거한후 uniq하게 모든 필드가 나오도록 로직을 만들어봤다.

 

cat a.txt |sort | awk '{if($1 != tmp1) { {tmp1 = $1} print $0 }} '

결과)

11 aa xtp1
22 bb xtp5

 

 다른 방법으로는

 

 cat a.txt |awk '!a[$1]++'

 

첫번째와 두번째필드를 모두 기준으로 하고 싶다면 다음과 같이 하면 된다.

 

 cat a.txt |awk '!a[$1,$2]++'

 

알아두면 좋을 옵션은 uniq -u 와 uniq -d 이다.

-u는 유닉스한 데이터만 출력하고 -d 는 유닉스하지 않은 데이터를 출력한다.

 

# cat > b.txt
uniq option -u check!

uniq option -d check!

uniq option -d check!

uniq option -d check!

 

전체중에 uniq한 데이터만 출력

 cat b.txt | sort | uniq -u

uniq option -u check!

 

전체중에 중복이 있는것만 출력(출력할때 uniq하게 출력됨)

 cat b.txt | sort | uniq -d

uniq option -d check!



[출처] https://m.blog.naver.com/PostView.nhn?blogId=nativekim&logNo=220376409687


반응형

댓글()

table tr td 에 링크걸기

반응형

<td onClick="location.href='?page=home'" style="cursor:pointer;">


onClick 에는 연결될 페이지,

style 에는 마우스 올려 놓을때 보여질 커서 모양입니다.



반응형

댓글()

html table <td> 에 그라데이션 배경 주기

반응형

<td style="background: linear-gradient(to right, #ef2700, #f6b368);"></td>


to right 는 to left 등으로 변경이 가능하고,

#ef2700 부터 #f6b368 로 색상이 바뀌어 간다는 뜻입니다.



반응형

댓글()

Advanced BAT to EXE Converter v4.11c (06/14/2020)

자료실|2020. 6. 15. 11:11
반응형

advancedbattoexeconverter.exe
다운로드

 

 

아래 공식 사이트에 가면 최신 버전을 받을 수 있습니다.

https://www.battoexeconverter.com/

 

반응형

댓글()

Bat to Exe Converter V.3.0.7 (2018-01-26)

자료실|2020. 6. 15. 08:40
반응형

Bat_To_Exe_Converter.exe

Bat_To_Exe_Converter_(x64).exe


* 권한 상승 코드 (관리자 계정으로 실행) 가 있을 경우, Windows Defender 등에서 멀웨어로 감지 할 수 있음. 그럴때는 iexpress 로 변환하면 된다.

다만, iexpress 로 변환시 %~dp0, %~s0 등의 기본 변수를 사용할 수 없음.

선택해야 할 듯..


반응형

댓글()

명령어로 작업 스케쥴러에 시작 프로그램으로 등록하기

윈도우즈/OS 일반|2020. 6. 9. 13:55
반응형

작업 스케쥴러를 이용합니다.

시작 프로그램의 대안은 예약 된 작업입니다. 시작시 작업이 실행되도록 예약 할 수 있습니다.

GUI 모드로 실행한 경우 예약 된 모든 작업을 생성, 삭제, 활성화, 비활성화 및 관리가 가능합니다.

> GUI 모드 관리창 실행 명령 : taskschd.msc


명령 프롬프트에서 예약 된 작업을 관리하려면 아래와 같이 사용하세요.

이 프로그램을 사용하면 예약 된 작업을 생성, 삭제 및 실행 할 수 있습니다.

아래와 같이 마지막에 물음표 옵션을 사용하면 명령에 대한 도움말을 얻을 수도 있습니다.

> 작업 스케쥴러 CLI 명령어 :  schtasks.exe


schtasks

schtasks /?

schtasks /Run /?

schtasks /End /?

schtasks /Create /?

schtasks /Delete /?

schtasks /Query  /?

schtasks /Change /?

schtasks /ShowSid /?


이러한 명령에 대해 관리자 명령 프롬프트로 실행 해야 합니다.


로그인시 로컬 사용자로 시작할 스크립트를 작성하는 예제 :


schtasks /create /tn "MyCustomTask" /sc onlogon /tr "cmd.exe /c pause"


다음과 같이 시스템이 시작할 때 스크립트를 실행하도록 지시 할 수 있습니다.


schtasks /create /tn "MyCustomTask" /sc onstart /ru system /tr "cmd.exe /c pause"



[출처] https://www.devdungeon.com/content/windows-run-script-startup



반응형

댓글()

배치파일 실행시 인자값 전달 받기

윈도우즈/OS 일반|2020. 6. 9. 08:56
반응형

c:\run.bat 내용


set name=%1

echo %name% 

 

실행

c:\> run.bat CDH

 

결과

CDH


* 참고

인자값을 받아서 MySQL 쿼리를 실행하려 할 때는 인자값 뒤에 한 byte 가 더 붙는다. (공백인지 엔터인지 모르겠음)

그래서 아래와 같이 사용하면 된다.


set name=%1

c:\mysql\bin\mysql.exe -uUSER -p"12345678" test -e "select * from member where name='%name:~0,-1%'" 


%name% 는 name 변수 내용을 출력하는 것이고,

%name:~0,-1% 하면 뒤에 한자리 제외하고 출력하는 것이다.

반응형

댓글()