320x100

DB/MYSQL 27

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

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

C++ Connector 사용시 conntect 함수에서 std::bad_alloc 발생

C++ Connector를 사용해 MYSQL에 연결하려고 하는 경우 connect()를 try ~ catch해보면 std::bad_alloc exception이 발생하는 경우가 있다. 현재 실행하는 애플리케이션 빌드 타입과 MYSQL lib 타입을 확인해보자. MYSQL에서는 일반 lib와 Debug용 lib를 별도로 제공하고 있다. release 버전을 debug 버전에서 참조해 쓰면 std::bad_alloc이 발생한다.

DB/MYSQL 2022.05.13

LAST_INSERT_ID() 사용 시 주의할 점

인터넷으로 검색을 하다보면 insert의 성공 결과로 LAST_INSERT_ID()를 사용하는 내용이 많다. 하지만 LAST_INSERT_ID()는 '마지막으로 성공한 Auto increment의 값'을 반환하는 함수이며, 없다면 기본값인 0을 반환한다. 다음과 같은 경우에는 사용자의 주의가 필요하다. 1. auto increment 없이 insert를 하는 경우 LAST_INSERT_ID()는 auto increment의 성공한 값을 반환한다고 했다. auto increment 설정 없이 아무리 insert 한다고 해도 LAST_INSERT_ID()는 0을 반환할 뿐이다. 자동으로 증가해야 될 시퀀스들을 따로 구현해 사용하는 경우 해당 함수로는 insert의 성공 여부를 판단할 수 없다. 2. inno..

DB/MYSQL 2022.01.07
320x100