320x100

MySQL 10

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

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

스케줄러 사용

MYSQL에서 Event Scheduler를 사용하기 위해선 'event_scheduler'가 활성화 되어있어야 한다. 다음 쿼리로 확인할 수 있다. SHOW VARIABLES event_scheduler; 해당 값이 OFF인 경우 다음 쿼리로 활성화 한다. SET GLOBAL event_scheduler = ON; 생성하기 CREATE EVENT [IF NOT EXISTS] 이벤트명 ON SCHEDULE 스케줄 [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT '주석'] DO [BEGIN] 실행할 sql문; [실행할 sql문]; [END] 스케줄: { AT 타임 [+ INTERVAL 간격 [+INTERVAL 간격...]] | EVERY 간격 [ST..

DB/MYSQL 2021.10.07

commands out of sync you can't run this command now

C++에서 API를 통해 MYSQL의 Query를 실행하는 와중에 commands out of sync you can't run this command now 라는 에러 메시지가 출력되며 Query가 작동하지 않았다. 공식 홈페이지에서는 mysql_use_result()를 사용 하고 mysql_free_result()를 호출해 리소스를 해제하기 전에 또 다시 Query를 시도하면 발생할 수 있다고 한다. 또는 mysql_use_result() 또는 mysql_store_result() 호출하지 않고 데이터를 반환하는 2개의 Query를 실행하려고 할 때도 발생한다고도 한다. https://dev.mysql.com/doc/refman/8.0/en/commands-out-of-sync.html MySQL :..

DB/MYSQL 2021.10.07

MYSQL을 위한 GUI 툴

MYSQL을 설치하면 WorkBench는 기본적으로 설치되는데, 몇몇 불편한 점이 있어서 다른 툴을 알아본 내용을 정리한다. 1. SQLYog SQLyog 에서 개발한 MySQL 전용 GUI 툴로, 유료버전(Trial)과 무료버전(Community Edition)이 있으니 상황에 맞게 설치하면 될 것 같다. 다운로드 주소 https://github.com/webyog/sqlyog-community/wiki/Downloads 2. heidisql heidsql은 ‘MySQL Front’로 알려졌던 제품이며 오픈 소스 클라이언트다. 다운로드 주소 https://www.heidisql.com/download.php 아직 둘 다 써본지 얼마 안되서 장단점은 잘 모르겠다. 더 사용 해보고 추후에 수정해보겠다.

DB/MYSQL 2021.10.05

Insert 할 때 value 조건문 걸기

가끔 insert나 select 등 값에 조건을 걸어 다른 값으로 표현하거나 삽입하고 싶은 경우가 있다. 나 같은 경우엔 테이블에 nullable한 datetime 컬럼이 있고 파라미터로 unix 시간을 받는데, 파라미터 값이 0인 경우엔 datetime에 NULL을 넣고, 0이 아니면 datetime으로 변환한 값을 넣고 싶었다. CASE ~ WHEN을 쓰는 방법과 IF를 쓰는 방법 2가지가 있다. CREATE PROCEDURE `sp` ( IN _start_time BIGINT ) BEGIN -- 1. CASE~WHEN INSERT INTO (start_date) VALUES ((CASE WHEN _start_time = 0 THEN NULL ELSE FROM_UNIXTIME(_start_time))..

DB/MYSQL 2021.10.05

시간 관련 함수

MYSQL에서는 UNIX_TIME과 DATE_TIME 사이 변환을 지원한다. UNIX_TIME->DATE_TIME SELECT FROM_UNIXTIME(1249052400) DATE_TIME -> UNIX_TIME SELECT UNIX_TIMESTAMP('2021-01-01') 그 외 날짜/시간 관련 함수는 다음과 같다. 현재 시간을 UNIX_TIME 으로 구하기 SELECT UNIX_TIMESTAMP() 이하 차후 정리 http://xe.issro.net/MySQL/299 MySQL - 타임스탬프(유닉스시간) 변환 출처 : http://hack4all.egloos.com/1841100 1) Unixtime -> Date 형식(일반적인 시간)으로 변환 SELECT user_id, FROM_UNIXTIME..

DB/MYSQL 2021.10.05
320x100