320x100

DB 41

ibd 파일로 데이터 복구하기

mysql 에서 저장된 데이터들은 테이블이름.ibd 파일로 저장된다.해당 파일로 다른 곳에서의 복구를 위해선 해당 파일과 테이블의 스키마가 필요하다. t_table 이란 이름으로 예를 들어보자. 1. 복구할 DB에 테이블 스키마로 빈 테이블 생성CREATE TABLE t_table[구조].... 2. 빈 테이블의 데이터 파일 연결 해제ALTER TABLE t_table DISCARD TABLESPACE;FLUSH PRIVILEGES; 3. 빈 테이블 ibd 위치에 내가 복구하려는 ibd 파일 복사 및 사용 권한 부여cp /home/myaccount/t_table.ibd /var/lib/mysql/databasename/chown mysql:mysql t_table.ibd 4. 테이블에 데이터 파일 연결A..

DB/MYSQL 2024.04.28

ZSORT 에서 동일한 score 랭킹 동위 처리하기

zsort 에서는 socre가 동일한 경우 value에 따라(오름차순) 순위가 부여된다. 시스템과 별개로 동점인 경우 동위로 표현하고 싶을 때는 다음과 같은 순서대로 계산한다. key = "rank" value = 001 - ex:UserUid 1. 내 점수(A)를 가져온다. zscore "rank" 001 => A 2. 내 점수와 동일한 랭킹 목록(B)을 가져온다. zrevrangebyscore "rank" A => B 3. 가져온 랭킹 목록(B)에서의 첫 랭킹(C)을 가져온다 zrevrank "rank" B[0] => C

DB/Redis 2023.05.18

mysql에서 ip를 이용한 connect가 실패하는 경우

localhost로 접속할 때는 잘 되지만 외부에서 ip로 접속에 실패하는 경우, 유저를 생성하고 권한을 부여해야 가능하다. 내부용 CREATE USER 'id'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'id'@'localhost'; 외부용 CREATE USER 'id'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'id'@'%'; 메모리에 변경사항 저장하기 FLUSH PRIVILEGES;

DB/MYSQL 2022.12.05

[MariaDB] Commands out of sync; you can't run this command now

현상: C++ 서버에서 특정 쿼리를 실행할 때마다 Commands out of sync; you can't run this command now. 에러가 발생. 한 로직에서 stmt를 여러개 사용하는데, 첫번째 stmt 사용은 문제 없었고 두번째 stmt 사용시마다 에러가 발생. 원인: 기존 첫번째 stmt 사용하던 소스를 복붙하는 과정에서 stmt2를 사용하지 않고 stmt1을 써서 오류 void func() { sql::PreparedStatement* stmt1 = getstmt(Key1); stmt1->setInt(1, 1); stmt1->executeUpdate(); sql::PreparedStatement* stmt2 = getstmt(Key2); stmt1->setInt(1, 1); stmt..

DB/MYSQL 2022.12.02

[MariaDB] commands out of sync. Did you run multiple statements at once?

현상: go와 c++ 서버에서 공통적으로 DB 에러가 발생함 에러는 주로 commands out of sync. + 추가 에러로 발생했는데 go 에서는 Did you run multiple statements at once? 라는 에러가 발생했다. 원인: statement 실행 중 다른 statement를 실행하고 defer로 종료하는 것이 원인으로 추측돼서 내부 defer 내부stmt.Close()를 명시적으로 바꿔줬으나 변화 없었음 해당 에러를 검색한 결과 MariaDB v10에서만 발생하는 문제라는 이야기가 있었으나 구체적인 원인은 보이지 않아서 패스 https://github.com/go-gorm/gorm/issues/3001 최종 확인 결과 서버의 최대 Connection이 기본 값인 151으로..

DB/MYSQL 2022.12.01

서버에서 DB로 UTF-8 데이터 삽입시 데이터가 깨지는 문제

C++ 서버에서 "인벤토리 부족"이라는 텍스트를 DB에 삽입하려고 할 때 다음과 같이 저장되는 문제가 있었다. const char* text = u8"인벤토리 부족"; DB Tool로 직접 붙어 수정한 경우에는 정상적인 한글로 표기가 되었다. 단순히 표시만 깨진 데이터인가 했는데 HEX값으로 봤을 때도 다른 데이터였다. 좌> C3ACC29DC2B8C3ABC2B2C2A4C3ADE280A0C2A0C3ABC2A6C2AC20C3ABC2B6E282ACC3ACC2A1C2B1 우> EC9DB8EBB2A4ED86A0EBA6AC20EBB680ECA1B1 해결하려고 시도한 방법들 1. C:\Program Files\MariaDB 10.5\data\my.ini 파일 내용 추가 [client] default-character..

DB/MYSQL 2022.11.08

SELECT FOR UPDATE

일반적인 SELECT만 하게 되면 Shared lock 이 걸리므로 여러 세션에서 동시에 데이터에 접근이 가능하게 된다. Commit 쿼리를 실행하기 전까지 데이터가 변경되지 않으므로, 다른 세션에서 데이터 변경 작업(Update, Delete)이 있는 경우 데이터의 일관성이 깨지게 된다. 대신에 SELECT ~ FOR UPDATE 를 사용하게 되면 반환된 ROW에 대해 row level lock을 걸 수 있다. 다른 세션에서 Select은 가능하나, Update나 Delete 쿼리에 대해 단일 수행과 일관성을 보장하므로 변경할 수 없다. -- SELECT 할 때 LOCK을 제어할 수 없으면 무한정으로 기다린다. SELECT c FROM t WHERE key = 1 FOR UPDATE; -- SELECT..

DB/MYSQL 2022.10.20

[작성중]MYSQL Connector 8.0 C++ 빌드하기

Release 버전은 문제가 없었는데 Debug용은 Oracle에서 제공하는 Connector와 프로젝트에서 사용중인 런타임 라이브러리 옵션이 맞지 않아 MYSQL Connector 소스를 가지고 빌드를 해야되는 경우가 생겼다. (공식 홈페이지에서 제공하는건 /MD와 /MDd 뿐) 준비물은 다음과 같다. 1. MYSQL Connector C++ Source https://downloads.mysql.com/archives/c-cpp/ 2. CMake-GUI https://cmake.org/download/ 3. OpenSSL https://github.com/openssl/openssl 윈도우 버전 빌드: https://kb.firedaemon.com/support/solutions/articles/40..

DB/MYSQL 2022.05.19
320x100