쿼리 라우팅 설정하기: ProxySQL 활용법
·
📊DB/MySQL
⚙️ VersionOS: rocky 9.5ProxySQL 3.0.2백앤드 DB: MySQL 8.4.X 버전서비스 API 에서 붙어야하는 백앤드 DB(master[Writer/Read], ReadReplica[Read])가 두개였다. 서비스 API 에서 보내는 쿼리 CRUD에 맞게 라우팅을 해야하는 상황이었다.🔖 사전정보Admin 포트 6032 (기본 계정 admin/admin)MySQL 프록시 포트 6033ProxySQL 설정은 메모리(Runtime) ↔ 디스크(SQLite, /var/lib/proxysql/proxysql.db) 레이어로 관리하고, 필요시 config 파일도 사용. Admin에서 변경 후 LOAD … TO RUNTIME; SAVE … TO DISK;가 관례.⚙️ 설치 (Rocky/Al..
DB 실행계획 차이: 원인 및 해결책
·
📊DB/MariaDB
🚨 문제 상황 소개개발 DB와 운영 DB, 같은 버전/같은 테이블/같은 쿼리인데 실행계획이 달라졌다.한쪽은 인덱스를 타고, 다른 한쪽은 풀스캔 + filesort 발생원인 추적 과정 간단히 설명 (EXPLAIN 결과 비교)🧱 실행계획 차이 원인옵티마이저는 비용 기반(cost-based) 으로 플랜을 선택.이때 “선택도(selectivity)” 추정이 중요.그런데 추정 방식이 통계값만 보느냐, 실제 인덱스를 내려가 보느냐에 따라 결과가 달라짐.⚠️ 인덱스 다이브(Index Dive)란?개념: 옵티마이저가 실제 인덱스 레벨에서 값 분포를 확인해 정확한 선택도를 계산하는 과정.장점: 더 정확한 실행계획.단점: 옵티마이저가 실행계획 계산에 시간이 조금 더 걸림.⚙️ EQ_RANGE_INDEX_DIVE_LIM..
PostgreSQL: DB Dump 방식으로 다운그레이드 가이드
·
📊DB/PostgreSQL
✅ 1단계: PostgreSQL 17 클라이언트 설치sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpmsudo dnf -qy module disable postgresqlsudo dnf install -y postgresql17✅ 2단계: 백업 (pg_dump 사용) - 17버전export PGPASSWORD='password'/usr/pgsql-17/bin/pg_dump \ -h 192.168.3.72 \ -p 5432 \ -U DB-User \ -d NineMemos_Dev_BC_01 \ -Fc \ ..
MariaDB: Memory 관련 개념
·
📊DB/MariaDB
■ MariaDB Memory 종류- MariaDB Memory는 두가지로 분류가된다. 모든 세션이 공유하고 사용하는 Global Memory 영역과 각각의 세션들별로 사용되는 Session Memory영역이 있다.■ Global Memory 영역DB가 최초 기동되었을 때에는 메모리를 최소한만 사용하다가 설정된 값 까지 증가하며 증가한 이후에는 “메모리를 반환하지 않고” 설정 된 값 이내에서 계속 사용됩니다.(오라클의 경우 DB기동시 설정된 값 만큼 메모리를 할당 받고 올라가는 반면 Mariadb 는 기동시 설정된 메모리 값만큼 할당 받는것이 아닌 설정된 값 만큼 서서히 증가하게 됩니다) 1) Innodb_buffer_pool_size- 디스크에서 데이터를 메모리에 캐싱함과 동시에 데이터의 변경을 버퍼링..
MongoDB: MongoDB에서 Oplog 사이즈 확인하는 법
·
📊DB/MongoDB
MongoDB에서 Oplog 사이즈 확인하는 법MongoDB의 oplog(Operation Log, 작업 로그)는 MongoDB 복제(replication)에서 사용되는 특별한 컬렉션으로, 변경 사항을 기록하는 역할.📦 oplog란?• oplog(rs.oplog)는 MongoDB 복제 세트(replica set)에서 Primary 노드의 데이터 변경 사항을 기록하는 컬렉션입니다.• Secondary 노드는 Primary의 oplog를 읽고 동일한 작업을 수행하여 데이터를 동기화함.• 컬렉션 이름: local.oplog.rsCapped Collection(고정 크기 컬렉션)으로 동작하며, 일정 크기가 차면 가장 오래된 데이터부터 삭제!📦 oplog의 동작 방식1. Primary 노드에서 변경 발생• i..
MongoDB: MongoDB 설치한 OS 에서 “Too many open files” 에러 발생 시 해결 가이드
·
📊DB/MongoDB
MongoDB 설치한 OS 에서 “Too many open files” 에러 발생 시 해결 가이드Linux 서버(여기선 AWS EC2)를 운영하다보면 어제만해도 잘 돌아가던 서버 어플리케이션이 “Too many open files” 에러를 뱉고 죽는 현상이 발생함.이런 오류가 생기는 이유는 프로세스가 OS에 요청할수 있는 리소스의 개수/양 (여기서는 NOFILE 이라 불리는 최대 Open 가능한 파일 개수)에 Limit가 있고, 프로세스가 그 제한을 넘었기 때문이다.해결방법각 프로세스의 Limit는 그 프로세스가 실행되는 계정의 Limit를 바탕으로 만들어지므로 프로세스의 Limit를 올려준다고 해서 문제가 해결되진 않는다. 계정과 프로세스 모두 변경해 주어야 그 프로세스를 다시 시작했을때에도 같은 문제..
MongoDB: Replica Set Secondary Node 동기화 시간 확인하는 방법
·
📊DB/MongoDB
MongoDB 에서 Replica Set Secondary Node 동기화 시간 확인하는 방법몽고디비 레플리카 셋으로 구축 되어 있을 때 secondary node가 primary node를 어느정도 동기화 하고 있는지, 알아 볼 수 있다.use admindb.auth({...})rs.printSecondaryReplicationInfo()나오는 시간이 Primary Node에 대해 동기화 하는 정도까지의 지연시간이다.
MongoDB: DB 다운 시 재가동 방법
·
📊DB/MongoDB
MongoDB DB 다운 시 재가동 방법mongoDB가 어떤 이유로 인해 DB 프로세스가 다운될 수 있다. 이유는 log를 살펴봐야한다. 보통 /var/log/mongodb/ 쪽에 기록되어 있다. 실제로 root로 접속 후, mongo가 죽었는지 확인해봐야 한다.mongo다시 살리는 code# root 권한으로.mongod --config /etc/mongod.conf만약에 다시 살리지 못하면, 백업 시켜둔 파일을 교체해서 다시 기동해야 한다./var/lib/ 폴더를 봐야 한다.rm -rf mongo # 기존 파일 지우기.mv mongo.203.20240505 mongo # 파일 교체.그 다음, 재기동 해보자# root 권한으로.mongod --config /etc/mongod.conf그럼, 보통 재기동..
MongoDB: wiredTiger engine 파일 찾는 법
·
📊DB/MongoDB
MongoDB 에서 wiredTiger engine 파일 찾는 법찾게 된 이유 : 몽고디비에서 CRUD를 할때 checksum이 match가 되지 않는 오류 발생 => 몽고디비 다운으로 이어졌다.log를 찾아보면, collection-218–4990451227493674325.wt 식의 파일 이름들이 보임.해당 wt파일이 어떤 database의 collection인지 찾아 볼 수 있음.from pymongo import MongoClientconn = MongoClient(host='host', port=port, username='username', password='password')databases = conn.list_database_names()# 몽고디비에서 wt파일 찾는 법.for db_na..
MongoDB: TooManyLogicalSessions 에러
·
📊DB/MongoDB
ERROR Casepymongo.errors.OperationFailure: cannot add session into the cache, full error: {‘operationTime’: Timestamp(1714353661, 2), ‘ok’: 0.0, ‘errmsg’: ‘cannot add session into the cache’, ‘code’: 261, ‘codeName’: ‘TooManyLogicalSessions’, ‘$clusterTime’: {‘clusterTime’: Timestamp(1714353661, 2), ‘signature’: {‘hash’: b’\x81\xd5\x8f0[\x82\xcb{\xd8]\xd4\xba\x97\xc4\x0f+R \x88"’, ‘keyId’: 73174..