쿠버네티스에서 MySQL dump 하기 (uuid 필드를 사용할 때)
·
Kubernetes
이번 포스팅은 네이버 클라우드(NKS)에서 구글 클라우드(GCP)로 마이그레이션을 하며 MySQL dump를 수행했을 때 일어났던 문제를 다룹니다.문제 상황MySQL 덤프한 파일로 import 수행 시 아래와 같이 `ERROR 1062 (23000)` 에러가 발생했는데요,ERROR 1062 (23000) at line 347: Duplicate entry '\xEF\xBF\xBB\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF' for key 'letter.PRIMARY'command terminated with exit code 1PK에 중복된 값이 있어서 실패했음을 알 수 있습니다.원인PK 필드를 UUID로 사용했는데, 타입을 BINARY(16)로 사용했습..
MySQL 전문 검색(Full Text Search) 인덱스로 간단한 검색 엔진 구현하기
·
MySQL
프로젝트를 진행하며 "내가 작성한 편지를 검색하는 효율적인 방법이 없을까?"를 고민하다 MySQL의 전문 검색 인덱스(Full Text Search)를 이용해 간단한 검색 엔진을 구현해 보기로 했습니다.전문 검색 인덱스 (Full Text Search Index)1MB가 넘는 컬럼이 있다고 가정했을 때, B-Tree 인덱스는 1MB 전체를 인덱스 키로 잡지 않고 3,072 바이트(InnoDB)까지만 잘라서 인덱스 키로 사용합니다.그리고 B-Tree 인덱스는 특성상 전체가 같거나, 왼쪽부터 읽으며 일부가 일치하는지만 확인할 수 있습니다. 인덱스 키 값의 왼쪽을 기준(Left-most)으로 오른쪽 값이 정렬되어 있기 때문이죠. "LIKE"문으로 검색할 때 왼쪽 값이 없는 패턴이라면 Full Table Sca..
[스터디] Real MySQL 8.0 1권 - 5장 트랜잭션과 잠금 정리
·
MySQL
트랜잭션트랜잭션이란?데이터 정합성을 보장하는 기능정합성: (서로 다른 커넥션에서) 데이터가 서로 일치하는 상태작업의 완전성을 보장해 주는 기능작업의 완전성: 논리적인 작업을 모두 완벽하게 처리 or 처리 실패 시 모두 원 상태로 복구해서 부분 업데이트를 방지하는 기능MySQL의 트랜잭션논리적인 작업 셋 자체가 (COMMIT 할 때) 100% 적용 되거나 (ROLLBACK or ROLLBACK 자체가 오류가 발생했을 때) 아무것도 적용되지 않음을 보장해주는 것한 개의 쿼리에서 여러 값을 저장할 때 MyISAM과 InnoDB의 차이MyISAM ❌: 트랜잭션 지원 X => 실패된 부분만 롤백 (부분 업데이트) => 찌꺼기 데이터를 별도로 지우는 코드가 필요InnoDB ✅: 트랜잭션 지원 O => 모두 롤백 (..
[Querydsl] MySQL 공간 데이터(Point)의 반경 검색 (ST_CONTAINS)
·
Querydsl
이번 포스팅에선 숙소 예약 프로젝트를 진행하며 Querydsl로 공간 데이터를 조건으로하는 표현식(Expression)에 대해 알아보겠습니다.기본 환경 및 의존성기본 환경과 의존성은 다음과 같습니다.- Java 17- Spring Boot 3.3.0- DB: MySQL 8.0- ORM: querydsl 5.1.0- 공간 데이터 의존성: hibernate-spatial 6.5.2Entity@Entitypublic class Stay { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "STAY_ID") private Long id; @Column(name = "POINT", columnDefinitio..
[python] pymysql로 INSERT 할 때, 마지막 PK 값에서 1씩 증가시키는 방법
·
Python/Python Distilled
처음만나는 에러 python의 pymysql 라이브러리를 이용해서 MySQL 데이터베이스 내 특정 테이블에 INSERT를 할 때, 아래 예시와 같이, SET~; 문과 INSERT ~ SELECT; [테이블 속성1, 테이블 속성2, ...] 문 2개를 한 번에 실행해서 INSERT를 하는 경우가 있다. # 데이터베이스 INSERT 쿼리 : GolfMember 테이블에 있는 멤버의 id와 name을 Member 테이블에 추가 (중복시 name 업데이트) last_id_query = ''' SET @last_id := (SELECT MAX(id) FROM Member); -- Member 테이블의 마지막 pk 값을 변수로 저장 INSERT INTO Member (`id`, `name`) SELECT @last..
[MySQL] INSERT 할 때, 마지막 PK 값에서 1씩 증가시키는 방법
·
MySQL
서론pk가 `auto_increment` 로 설정하지 않을 때 사용하는 방법입니다.MySQL 서버에 변수를 저장하고, 저장한 변수를 재사용하는 방식으로 해결합니다. 대입 연산자와 함께 변수를 저장하는 방법은 `SET @{변수명} := {저장할 값}` 입니다.예시 쿼리SET @last_id := (SELECT MAX(id) FROM gsheet_interaction_table);SELECT @last_id:=@last_id+1, S.ct_id, P.platform 플랫폼, S.t_id, T.monitoring_title 작품명, S.url, TRIM(S.rt) 영상길이, S.i_idFROM monitoring_db.scraping_data_table SJOIN platform_list P ON P.p..
[MySQL] AUTO_INCREMENT 초기화하는 방법
·
MySQL
이번 포스팅은 근본적인 문제 해결은 아니지만, PK의 값을 초기화하고 1부터 연속적인 수로 바꾸는 방법에 대한 글입니다.서론보통 스키마를 구성할 때, PK에 `auto_increment`를 설정하는 경우가 많습니다.`auto_increment`는 편리함을 제공하지만 `INSERT IGNORE 문`을 사용했을 때, 또는 `UPSERT 문`을 사용했을 때 따라오는 `ON DUPLICATE KEY UPDATE` 에 의해 중복 데이터를 INSERT 하지 못함에도 PK 값은 `+1 씩 증가`하게 됩니다. auto_increment 초기화 쿼리ALTER TABLE [테이블] AUTO_INCREMENT=1; -- [테이블]의 AUTO_INCREMENT를 1로 초기화한다.SET @CNT = 0; -- @CNT 변수의..
[MySQL] 테이블 내 중복 데이터 삭제
·
MySQL
서론테이블에 UNIQUE 제약 조건이 없거나, 모종의 이유(?)로 중복 값이 들어있는 경우가 있다.아래의 쿼리를 사용하면 pk가 가장 작은 값은 살아남고, 나중에 들어온 중복 값들을 찾아 삭제한다.이 쿼리를 실행하기 전, 반드시 백업을 해놓고 실행하는 것을 권장한다.중복 제거 쿼리DELETE aFROM [테이블 이름] a, [테이블 이름] bWHERE a.[pk 컬럼] > b.[pk 컬럼] AND a.[중복 값이 들어있는 컬럼] = b.[중복 값이 들어있는 컬럼]; 주의 사항`테이블 이름`은 2개를 작성하지만, 테이블 이름은 똑같아야 한다.마찬가지로 `pk 컬럼`도 똑같은 이름을 작성해야하며, `중복 값이 들어있는 컬럼`도 마찬가지다.사용 예시DELETE aFROM test_db.user a, test_..