라벨이 DB인 게시물 표시

PostgreSQL에서 databse does not exists 메세지

PostgreSQL에서 databse <user> does not exists 메세지 failed: FATAL: database “<user>” does not exist 오늘 뜬금없이 잘 되던 개발 서버가 에러를 뿜길래 디버그해보니 유저가 존재하지 않는다는 메세지가 출력되고 있었다. 문제는 DB를 건드린 적이 없다는 것이다. 따라서 ASP.NET의 로그 메세지를 보기보다는 직접 DB에 접속해보고자 DataGrip으로 연결을 시도했으나, 여기서도 마찬가지로 에러 메세지가 발생했다. 마지막으로 도커 컨테이너 터미널에서 psql -Uuser -W 로 접속을 시도했으나, 비밀번호 입력 창까지는 뜨고 입력을 완료하면 다음과 같은 에러 메세지가 출력됐다. psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: database "user" does not exist 음. 갑자기 식은땀이 흐르기 시작했다. 왜 갑자기 멀쩡한 DB가 날아갔는가 일단 원인 파악부터 해봤다. 가장 최근에 DB에 영향을 미칠 만한 짓을 했었던가… 아! DB에 영향을 끼칠 만한 짓은 안 했지만, DB 컨테이너에 영향을 끼칠 만한 짓은 했었다. 용량을 확보하겠다고 Docker Desktop 의 Disk Usage 확장 기능에서 미사용중인 데이터를 날렸는데, 여기서 사용되지 않는 볼륨도 날렸었다. 아니 근데, 분명 어디에서도 사용되지 않는 볼륨을 날린다고 써져있던 것 같은데 도대체 왜? 설마 하니 DISKPART COMPACT VDISK때문은 아닐 것이고… 가장 가능성 높은 것은 역시 사용되지 않는 볼륨을 날린 것이다. 여기까지 생각이 들고 나니 흐르던 식은땀이 오한으로 바뀌어가는 기분이었다. 설마 DB도 날아갔나 싶은 생각이 들었기 때문이다. 하지만 결론부터 말하자면, 다...

[C#/EF6] 서로 다른 컨텍스트가 업데이트된 레코드를 읽어야 할 때

여러개의 컨텍스트 사용 필연 우선 이 글은 커넥션 풀링과는 아주 관계가 없진 않으나, 관계가 없다고 생각한 채 읽으셔도 됨을 알려드립니다. 엔티티 프레임워크를 사용해 개발하다 보면 어쩔 수 없이 동일한 컨텍스트 클래스의 인스턴스를 여러 곳에서 생성해 사용하게 됩니다. 처음에 저는 단순한 프로젝트이니 그냥 컨텍스트 클래스를 싱글톤 패턴으로 만들어, 여러 사용처에서 호출해 사용하면 되지 않을까? 라는 어리석은 생각을 했으나, 아무리 단순한 프로젝트라도 그곳에 이벤트가 있고, 병렬 처리가 있다면, 그리고 그 곳에서 DB에 접근해야 한다면(즉, 컨텍스트 인스턴스 호출을 해야 한다면), 어쩔 수 없습니다. 싱글톤은 답이 아닙니다. 문제는 이렇게 할 경우에 여러 동일한 컨텍스트 클래스의 인스턴스에서 동일한 Entity의 정보를 읽고 쓸 수 있다는 것입니다. 예를 들어 동일한 컨텍스트 클래스의 서로 다른 인스턴스를 호출해 사용하는 A, B 클래스가 있다고 가정해봅시다. 아래 가정은 시간 순서로 쓰여졌습니다. B 인스턴스에서 Road 엔티티를 DB에서 컨텍스트로 읽어드렸습니다. (DB => In memory, FindAsync 사용) B 인스턴스에서 Road 엔티티의 (ICollection )Cars.Count 프로퍼티를 읽어 변수 prevCarCount 에 저장했습니다. B 인스턴스에서 유틸리티 클래스인 A 인스턴스의 AddCarOnRoad 를 호출했습니다. A 인스턴스에서 Road 엔티티의 (ICollection )Cars 프로퍼티를 수정했습니다. (새 컨텍스트 인스턴스에서 작업) B 인스턴스에서 Road 엔티티의 (ICollection )Cars.Count 프로퍼티를 읽어 변수 curCarCount 에 저장했습니다. B 인스턴스에서 prevCarCount와 curCarCount가 같으면 throw, 아니면 반환합니다. 위와 같은 상황에서, 어떤 한 로직을 빠뜨리면 3. 에서 Car 를 Road ...

[C#/EntityFrameworkCore] 닷넷 코어에서 Code First 마이그레이션 설정중 OnConfiguring을 오버라이드 할 수 없을 때 해결 방법 (+ SQLite UseSqlite 확장 메서드 사용 방법)

이미지
.Net Core EF 닷넷 코어도 당연히 닷넷 프레임워크와 같이 엔티티 프레임워크를 지원합니다. code-first 마이그레이션 역시 닷넷 프레임워크 EF와 굉장히 비슷합니다. 그러나, 패키지 설치 미스에 따라 곤란한 상황을 겪게 될 수도 있습니다. OnConfiguring 오버라이드 불가 그 문제는 바로 DbContext.OnConfiguring을 오버라이드해 사용해야 하는데, 정작 오버라이드할 DbContext 클래스의 OnConfiguring 메서드가 보이지 않는 문제입니다. OnModelCreating, OnChangeEventHandler등이 보이나, OnConfiguring은 보이지 않는 모습 왜 그럴까요? 사실, 생각해볼 것도 없이, 단순히 지금 여러분이 상속한 DbContext 클래스에 OnConfiguring 메서드가 없기 때문 입니다. 그렇다면 왜 없을까요? 여기서 바로 이 글 처음에 말했던 패키지 설치 미스가 나오게 됩니다. .Net Core EF Code-First를 사용하기 위해 필요한 패키지 닷넷 코어 엔티티 프레임워크를 사용하려면, 당연히 엔티티 프레임워크를 지원하는 DB의 라이브러리가 필요합니다. MySQL, MSSQL, SQLite, … 등등 많은 DB는 현재 엔티티 프레임워크를 지원하는 패키지를 NuGet에 배포하고 있습니다. 하지만, 거기서 끝이 아닙니다. 예를 들어 SQLite를 사용한다고 가정해볼까요? 여러분은 NuGet으로 System.Data.SQLite.Core, System.Data.SQLite.EF6 패키지를 설치할 겁니다. 만약 여기서 끝났다고 생각하고 DbContext를 만들면 위의 이미지와 같은 상황이 생기게 됩니다. 왜냐, System.Data.Entity.DbContext에는 OnConfiguration 메서드가 없기 때문입니다. 여러분이 제대로 된 DbContext를 상속받아 사용하시려면, Microsoft.EntityFrameworkCore 패키지 역시 설치...

[MySql] 연결 문자열에서 타임존 설정

  Spring MVC 작업 중 아래와 같은 에러가 발생했습니다. CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: The server time zone value    context-datasource.xml에 연결 문자열에 serverTimezone을 설정하라고 스택오버플로우에서 말하더군요. 문제는 timezone을 뭐로 설정해야하는가? 였습니다.   우선 첫 번째로, 서버에서 사용중인 타임존을 알아야겠죠? SELECT @@global.time_zone, @@session.time_zone;   위와 같이 쿼리를 날렸더니, 둘 다 SYSTEM이란 답만 돌아왔습니다. 그래서 아래와 같이 해봤습니다. SELECT timediff(curtime(), utc_time());   결과는 09:00:00 였습니다. 서울이죠. 그래서 serverTimezone=Seoul 이라고 했더니 안 되더라고요. 구글로 검색해본 결과 앞에 대륙명까지 적어야 한다는 것을 깨달았습니다. 참고: 위키피디아   serverTimezone=Asia/Seoul 로 설정하니 정상 작동되는 것을 확인했습니다.

MySQL Workbench SafeMode 해제 방법

이미지
  MySQL 워크벤치에서 DELETE, UPDATE문을 WHERE절 없이 실행하려 할 때 실행이 되지 않은 채 세이프모드를 해제하라는 경고가 나타날 경우 해결하는 방법입니다.   우선 Edit  -> Preferences  메뉴를 차례로 클릭해 환경설정 다이얼로그를 띄워주세요.   SQLEditor  섹션의 맨 아래, Safe Updates 체크박스의 체크를 해제 해주세요.   Workbench를 재시작 해주세요.   끝입니다. 참 쉽죠? 이제 DELETE, UPDATE문을 제약 조건 없이 실행해도 더이상 거부당하지 않습니다. 주의사항   위 방법을 실행할 경우, UPDATE, DELETE문에 WHERE절이 빠져도 경고 없이 실행 됩니다. 이것이 의미하는 바는, 실수로 WHERE절을 빠뜨린 채 실행해도 되돌릴 방법이 없어진다 는 것입니다.   DELETE문 같은 경우는 그 특성상 실수할 일이 적으나, UPDATE문같은 경우 실수로 마지막에 WHERE절을 빼먹는 경우가 심심찮게 발생할 수 있으므로, Safe Mode를 해제하고 작업할 경우 이 점을 반드시 잊지 말아야 합니다.   특수한 경우가 아닌 이상 세이프 모드를 켜놓고 제약 조건을 정확히 명시하는 것을 추천 드립니다. 여기서 특수한 경우란, 어느 한 테이블의 모든 행을 삭제해야 하는데, 특정할 만한 컬럼이 없는 경우 등  WHERE절을 쓸 수 없는 상황입니다.   특정할 만한 컬럼이 있는 경우, 예를 들어 auto-increment되는 id 컬럼이 있다면 아래와 같이 써서 모든 레코드를 지울 수 있습니다. DELETE FROM table_name WHERE id > 0;   그러므로 정말 특수한 경우가 아니라면, 세이프 모드는 켜두시는 것을 권장합니다.

[MySQL] Your password does not satisfy the current policy requirements 문제 발생시 해결 방법

1. 루트 권한으로 validate_password 플러그인 삭제 UNINSTALL PLUGIN validate_password; 복구할 경우 INSTALL PLUGIN validate_password SONAME 'validate_password.so'; 2. my.cnf에서 validate_password 플러그인 설정 조절 // my.cnf validate_password_policy=LOW // tty (ubuntu) sudo service mysql restart // tty (centos) sudo service mysqld restart

[MySQL] 유저 목록 확인하는 방법

USE mysql SELECT User, Host, Password FROM user; 참고: https://www.rosehosting.com/blog/mysql-show-users/

MySQL LIKE연산시 \(Escape Backslash) 처리 방법

SELECT * FROM `table` WHERE `path` LIKE "%C:\\ABC\\DEF%";   위와 같은 쿼리를 날리면 빈 응답만이 돌아올 겁니다. LIKE 연산자를 사용할 경우엔 백슬래시를 네 번 써줘야 정상적으로 작동합니다. SELECT * FROM `table` WHERE `path` LIKE "%C:\\\\ABC\\\\DEF%";