Posted
Filed under 프로그래밍/PHP
230723181353581862 내용이 230723181353582000 으로 바뀌면서 엑셀로 만들어지는 신기한일이 생겼다.

config/excel.php 에서

'value_binder' => [
'default' => Maatwebsite\Excel\DefaultValueBinder::class,
],

이부분을

'value_binder' => [
'default' => PhpOffice\PhpSpreadsheet\Cell\StringValueBinder::class,
],

이렇게 바꾸면 해결된다.


2023/08/08 14:54 2023/08/08 14:54
Posted
Filed under 프로그래밍
외래키로 연결되어있어 삭제할때 오류가 날수 있다.
이럴때 외래키 데이터 무시하고 그냥 삭제하고 싶을때 사용하자

SET session_replication_role = 'replica';
delete from 블라블라
SET session_replication_role = 'origin';
2023/06/21 16:42 2023/06/21 16:42
Posted
Filed under 프로그래밍

파티션 설계

파티션 사용을 고려해야 할 상황

  • 파티션 테이블은 단일 테이블 사이즈가 20G 이상이 예상될 때 고려하는 것이 좋다.
  • 일반적으로 이력/내역과 같이 장기간 데이터를 보관하는 테이블에 대해서 보관주기를 설정하고, 날짜를 기준으로 RANGE PARTITION으로 구성하는 것을 권장한다.
  • 각 파티션별로 저장될 파일을 따로 지정할 수 있으므로 물리적인 저장소 분리가 필요할 때도 고려해볼 수 있다.
  • 과다한 INSERT가 발생하는 테이블에 대해서는 SUBPARTITION (혹은 PARTITION레벨)에서 HASH나 KEY형식의 파티션을 생성하여 INSERT 경합에 따른 INDEX LATCH나 Mutex 락을 최소화하도록 한다

파티션 제약

  • 파티셔닝 키는 반드시 PK에 포함되어야 한다.
  • Max partition 개수는 8192개이다. (subpartition 수 포함)
  • 추가 제약조건(유니크 속성)을 부여할 수 없다.
  • Innodb partition 테이블에는 foreign key 생성을 할 수 없다.
  • FullText Index를 지원하지 않으며, Temporary table은 파티션 생성이 블가하다.
  • Subpartition은 HASH/KEY PARTITION만 지원한다.
  • 파티션 테이블 ALTER명령어시 DML은 LOCKING된다. (ONLINE DDL수행하더라도 SELECT만 허용)
  • PARTITION TABLE생성후 SQL_MODE변경시 DATA corruption이나 loss 가 발생할 수 있다.
  • 파티션 테이블의 인덱스는 모두 로컬 인덱스이다. 글로벌 인덱스는 지원하지 않는다.
  • 파티션된 테이블에서 데이터는 파티션 내에서만 정렬이 된다.
  • AUTO_INCREMENT 속성을 갖는 테이블에서 파티션을 만들려면 파티션키가 되는 컬럼과 AUTO_INCREMENT 속성을 갖는 컬럼을 묶어서 PK로 생성해야 한다.
  • 파티션키가 되는 컬럼에 NULL이 들어오면 해당 레코드는 가장 작은 파티션으로 들어간다.
  • 파티션 키 값은 정수(INT)를 사용하는 것이 기본이지만 RANGE 파티션과 LIST 파티션에서는 "RANGE COLUMNS" 키워드를 사용하면 INT, STRING, DATE, DATETIME 타입을 그대로 파티션키로 사용할 수 있다.
  • PARTITION BY 표현식에 사용할 수 있는 함수들

ABS(), CEILING(), DAY(), DAYOFMONTH(), DAYOFWEEK(), DAYOFYEAR(), DATEDIFF(), EXTRACT(), FLOOR(), HOUR(), MICROSECOND(), MINUTE(), MOD(), MONTH(), QUARTER(), SECOND(), TIME_TO_SEC(), TO_DAYS(), WEEKDAY(), YEAR(), YEARWEEK()

파티션 타입

  • RANGE 파티션 타입

범위에 따라 파티션을 설정하는 방법

예) 월단위 파티션을 갖는 테이블 생성
CREATE TABLE `test`.`tab_partition` 
(
 `seq` int unsigned auto_increment not null,
 `regist_dt` datetime not null default current_timestamp,
 `contents` varchar(1000),
 PRIMARY KEY (`seq`, `regist_dt`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE COLUMNS (regist_dt)
(
PARTITION p201601 VALUES LESS THAN ('2016-02-01 00:00:00'),
PARTITION p201602 VALUES LESS THAN ('2016-03-01 00:00:00'),
PARTITION p201603 VALUES LESS THAN ('2016-04-01 00:00:00'),
PARTITION pmaxvalues VALUES LESS THAN MAXVALUE
);
예) 날짜타입을 갖는 테이블에서 연단위 파티션을 갖는 테이블 생성
CREATE TABLE `test`.`tab_partition` 
(
 `seq` int unsigned auto_increment not null,
 `regist_dt` datetime not null default current_timestamp,
 `contents` varchar(1000),
 PRIMARY KEY (`seq`, `regist_dt`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE (YEAR(regist_dt))
(
PARTITION p2014 VALUES LESS THAN (2015),
PARTITION p2015 VALUES LESS THAN (2016),
PARTITION p2016 VALUES LESS THAN (2017),
PARTITION pmaxvalues VALUES LESS THAN MAXVALUE
);
  • LIST 파티션 타입

목록에 따라 파티션을 설정하는 방법

예)
CREATE TABLE `test`.`tab_partition` 
(
 `seq` int unsigned auto_increment not null,
 `region_cd` varchar(10) not null,
 `regist_dt` datetime not null default current_timestamp,
 `contents` varchar(1000),
 PRIMARY KEY (`seq`, `region_cd`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY LIST COLUMNS (`region_cd`)
(
PARTITION p_asia VALUES IN ('KOREA', 'CHINA'),
PARTITION p_europe VALUES IN ('FRANCE', 'ITALIA'),
PARTITION p_america VALUES IN ('CANADA', 'USA'),
PARTITION p_other VALUES IN (NULL)
);
  • HASH 파티션 타입

파티션은 필요하지만 파티션할 기간이나 특정 값의 집합을 정의하기 모호할 때 사용하는 파티션 타입이다.

예)
CREATE TABLE `test`.`tab_partition` 
(
 `seq` int unsigned auto_increment not null,
 `regist_dt` datetime not null default current_timestamp,
 `contents` varchar(1000),
 PRIMARY KEY (`seq`, `regist_dt`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY HASH (TO_DAYS(regist_dt))
PARTITIONS 12;

Partition Pruning의 한계

Partition Pruning 이란? 조건에 부합하는 파티션만 선택적으로 사용하게 하는 기능

  • 명시적으로 파티션키에 해당하는 실제 값을 정의해야만 특정 파티션을 선택한다.
  • RANGE, REF, EQ_REF 등올 조인시 해당 정보를 기준으로 특정 파티션을 선택하지 못한다.
조인방식 설명
RANGE =, <>, >, >=, <, <=, IS NULL, BETWEEN, IN 연산자를 사용한 비교/범위 검색
REF PRIMARY KEY 또는 UNIQUE INDEX가 아닌 일반적인 인덱스를 활용한 JOIN
EQ_REF PRIMARY KEY 또는 UNIQUE INDEX를 활용한 JOIN


출처 : https://good-dba.gitbooks.io/mariadb-sql-for-oracleuser/content/c02_4_partition_design.html
2023/05/11 10:10 2023/05/11 10:10
Posted
Filed under 프로그래밍
모든 작업 root에서 진행
기존에 swap없는 상태에서 시작

fallocate -l 8G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sysctl vm.swappiness=10


vi /etc/sysctl.conf

맨 아래에 추가 (나는 값을 20정도로 주고 있다)
vm.swappiness=10


2023/04/24 11:33 2023/04/24 11:33
Posted
Filed under 프로그래밍/PHP
add-apt-repository ppa:ondrej/php
apt update
apt install php8.2-fpm



2023/04/24 11:07 2023/04/24 11:07
Posted
Filed under 프로그래밍
dump뜬걸 올리려고 하니 오류가 난다.

#1227 - access denied; you need (at least one of) the super privilege(s) for this operation

create하는곳에서 definer 부분을 아에 삭제한다.

2023/04/19 16:02 2023/04/19 16:02
Posted
Filed under 프로그래밍
dump뜬걸 올리려고 했더니 오류가 난다.

#1118 - row size too large (> 8126). changing some columns to text or blob or using row_format=dynamic or row_format=compressed may help. in current row format, blob prefix of 768 bytes is stored inline.

테이블만드는 곳에서 ROW_FORMAT 값을 DYNAMIC 또는 COMPRESSED 으로 변경해준다.

2023/04/19 16:01 2023/04/19 16:01
Posted
Filed under 프로그래밍
dump뜬걸 올리려고 했더니 오류가 난다.

#1419 - you do not have the super privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

설정에서 log_bin_trust_function_creators을 ON 해준다.

2023/04/19 15:59 2023/04/19 15:59
Posted
Filed under 프로그래밍
apt로 gitlab을 update하는중에 signing key오류가 발생했다
이럴땐 어떻게 하냐고?

키를 다시 발급받아주면 된다.
간단하구만

curl "https://packages.gitlab.com/gpg.key" -o /tmp/omnibus_gitlab_gpg.key
sudo apt-key add /tmp/omnibus_gitlab_gpg.key
sudo apt update
2022/03/11 10:12 2022/03/11 10:12
Posted
Filed under 프로그래밍/JAVA
아니 apt upgrade했더니 젠킨스가 실행이 안된다 ㅋㅋㅋㅋ
업그레이드 안에 자바가 있는데 이게 문제인것이다.

root@devops:~# systemctl status jenkins.service
● jenkins.service - Jenkins Continuous Integration Server
 Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
 Drop-In: /etc/systemd/system/jenkins.service.d
 └─override.conf
 Active: failed (Result: exit-code) since Fri 2022-03-11 09:51:28 KST; 9s ago
 Process: 2226 ExecStart=/usr/bin/jenkins (code=exited, status=1/FAILURE)
 Main PID: 2226 (code=exited, status=1/FAILURE)

Mar 11 09:51:27 devops systemd[1]: jenkins.service: Main process exited, code=exited, status=1/FAILURE
Mar 11 09:51:27 devops systemd[1]: jenkins.service: Failed with result 'exit-code'.
Mar 11 09:51:27 devops systemd[1]: Failed to start Jenkins Continuous Integration Server.
Mar 11 09:51:28 devops systemd[1]: jenkins.service: Scheduled restart job, restart counter is at 5.
Mar 11 09:51:28 devops systemd[1]: Stopped Jenkins Continuous Integration Server.
Mar 11 09:51:28 devops systemd[1]: jenkins.service: Start request repeated too quickly.
Mar 11 09:51:28 devops systemd[1]: jenkins.service: Failed with result 'exit-code'.
Mar 11 09:51:28 devops systemd[1]: Failed to start Jenkins Continuous Integration Server.


젠킨스는 8과 11만을 지원하기때문에 자바 버전을 변경해줘야 한다.
root@devops:/# update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

 Selection Path Priority Status
------------------------------------------------------------
 0 /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1711 auto mode
* 1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 manual mode
 2 /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1711 manual mode
 3 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode

Press <enter> to keep the current choice[*], or type selection number: 




2022/03/11 10:08 2022/03/11 10:08