갑자기 DB Lock 이 걸려 서버 장애가 생기는 경우가 있다. 그럴 경우 빠르게 Kill을 해줘서 장애를 해결 해야 한다. [DB Lock 걸린 트랜잭션 조회] 우선 트랜잭션 관련 아래 명령어 3개가 있다. 1번은 어떤 쿼리가 락을 걸어버렸는지 확인 할 수 있고, 2번은 락이 걸려 있는 테이블에서 작업하려고 대기중인 상태이고, 3번은 실행중인 트랜잭션이다. # 락을 걸어 버린 트랜잭션 확인 1. SELECT * from information_schema.INNODB_LOCKS; # 락이 걸려 대기중인 트랜잭션 2. SELECT * from information_schema.INNODB_LOCK_WAITS; # 트랜젝션 확인 3. SELECT * from information_schema.INNODB_T..
배포 shell 스크립트로 배포를 할때는 자동으로 tomcat이 shutdown되는 일이 있었는데 수동으로 한줄 한줄 스크립트를 실행시켜서 배포 할때는 자동으로 tomcat이 shutdown 되지가 않아 원인을 2달동안 못찾았다 원인 파악 후 위 이슈가 생기려면 아래와 같은 조건이 필요하다 1. 배포 스크립트에서 tomcat을 서비스로 실행시키지 않고 tomcat의 shutdown.sh, startup.sh 로 실행시킨다. 2. 1번 조건에서 shutdown.sh, start.sh를 백그라운드로 실행시키지 않는다. (&, nohup 사용 안함) 3. 2번 조건으로 tomcat을 start 한 후 마지막에 tail -f 로 로그를 확인한다 4. tail -f 로 로그를 확인 하는 중에 ssh 접속 프로그램..
[Master Server] mysql -u root -p -e 'SHOW MASTER STATUS \G' | egrep "File|Pos|Bin" [Slave Server] mysql -u root -p -e 'SHOW SLAVE STATUS \G' | egrep "Master_Log_Pos|Running|IO_Err|SQL_Err" 슬레이브 서버에서 IO_Running과 SQL_Running이 YES 이면 이중화가 성공적으로 된것이다. 만약에 Slave_IO_Running 이 No라면 복제를 진행하지 않고 있는 경우 Slave_SQL_Running이 No라면 복제를 시작했지만 어떤 이유로 복제 절차를 멈춘 상태이다. 마스터서버랑 슬레이브서버 데이터가 완전히 같으면 마스터 서버의 Position과 슬레..
이 에러는 다른 세션에서 이미 사용중인 테이블일때 Lock 을 거는데 그 Lock걸린 테이블에서 작업을 할때 기다리다가 시간초과 나서 나는 에러이다. 대기시간은 아래 쿼리로 확인 할 수 있다. show variables like 'lock_wait_timeout'; 솔직히 근본적인 에러는 해결이 어렵다. 첫번째 해결 방법으로 일단 첫번째로 할 수 있는 방법으로는 Lock 대기시간(lock_wait_timeout)을 늘려주는것이고 두번째로는 격리레벨을 낮추는 것이다. [격리레벨 조회 방법] 디비 격리레벨(isolation level)은 트랜잭션 끼리 얼마나 영향을 미칠것인가 인데 높은 레벨일 수록 영향을 많이 미친다. 격리레벨 수준은 크게 아래 4단계인데 기본적으로 마리아디비에서는 "REPEATABLE R..
tomcat9 버전이여서 써트코리아 공식 매뉴얼 참고해서 인증서를 적용하려고 했으나.. 매뉴얼대로 하니까 절대로 안돼서 구글링하여 겨우 하였다. 톰캣 server.xml 에서 아래 소스 추가해서 tomcat을 껐다 키기만 하면 ssl 적용이 완료가 되긴하는데.. 아래 소스 구조는 tomcat9버전이 아니라 tomcat8 버전이고 이렇게 세팅하니까 잘됐다.. ( 9로 하니까 원인모를 에러가 빵빵뜸..) 한가지 중요한 점은 SSL 파일명의 확장자인데 새로 받은 jks는 type = RSA 가 있어야 한다고 생각했지만 있으면 에러가났고 지우니까 잘 실행됐다.( tomcat8매뉴얼엔 없지만 tomcat9 매뉴얼엔 type = RSA가 있음) 만약 SSL 파일이 PFX/P12 이면 keystoretype="pkc..
"CALL 프로시저명" 까지 치고 프로시저명 뒤에 컨트롤 스페이스바로 하면 뒤에 insert 해야 할 파라미터들이 쭉나온다. :를 @로 바꿔준다. @변수명 은 현재 세션에서만 사용할 변수를 지정하는것이다. 그래서 스크립트창에서 SET @변수명 = 값 하면은 해당 스크립트창 내에서 쭉 사용할수있다. 필요한 세션 변수명에 값을 저장을 안하면 자동으로 null로 매핑된다. 그래서 꼭필요한 변수명에만 값을 넣어도 프로시저가 실행된다. 그리고 인자값이 in이 아니라 out인건 뒤에 수동으로 @변수명을 넣어줘야 한다. 만약에 Temp 테이블을 out 받는거고 조회하고 싶다면 select 해서 세션변수명에 저장된 테이블을 뽑아내고 그걸 조회해야 한다. Temp테이블을 생성한걸 다른 프로시저에서 사용하고 싶다면 세션 ..
ORA-04031 에러는 Shared Pool 내에 메모리가 단편화됨에 따라 연속된 parsing 공간을 제공하지 못해 발생하는 에러이다. 메모리가 단편화되는 이유는 리터럴 SQL을 많이 사용하는 경우에 그럴 수 있는데, 해결 방안으로는 리터럴 SQL을 줄이거나 Shared Pool size를 늘리는 방안이 있다. 나는 시스템 운영중에 ORA-04031 에러가 발생하였고 해결 방법을 찾아 다녔는데 ORA-04031 에러가 아무리 발생시키려고 해도 발생하지가 않았다. 그래서 확인해보니 에러가 난 시간에 Shared Pool이 자동 조정되어 반영이 되어 그 뒤에 똑 같은 에러가 발생하지 않은것이다. 에러 원인을 파악하고 해결하기 위한 방안 3가지 방법 1. 오래된 세션을 끊어서 shared pool에 잡고 ..
협력사와 같이 방화벽을 오픈 하고나서 Telnet으로 접속을 시도 하였을때 연결이 돼지 않았을때 Tracert 기능을 이용하면 어디까지 연결이 되고 어느 IP에서 막히는지 확인할 수 있다. tracert 명령어를 사용했을때 아래처럼 Request timed out 메시지만 뜬다면 이건 Tracert 명령어가 아에 막혔다는 뜻이다. 이를 해결하려면 Tracert 명령어를 사용할 수 있게 ICMP 프로토콜이 아웃바운드 규칙에 열려 있어야 한다. 아웃바운드 규칙에서 ICMP 프로토콜을 열어주었고 다시 Tracert 명령어를 사용하였더니 정상적으로 명령어가 실행 되었다.
PL/SQL 스크립트를 짜고 테스트를 해볼때 퍼포먼스가 낮다고 생각이 들면 SELECT문을 먼저 봐바야 한다. 생각없이 코딩하다가 놓치기 쉽고 고치기 쉬운 실수는 WHERE절에서 함수를 사용할때 조회한 테이블의 데이터를 함수로 변환하여 비교하는 실수이다. 아래 쿼리문 빨간박스에서 tDATE값은 상수이고 DAY_CODE2는 테이블의 컬럼인데 이 컬럼에 함수를 적용하면 라인별로 함수가 사용되고 비교가 되기 때문에 건수가 많을수록 퍼포먼스는 상당히 저하된다. 만약에 10만개의 레코드가 있다면 10만번의 함수가 돌아간다는 뜻이다. 그래서 상수쪽에 함수를 적용하여 비교하여야 한다. 아래 쿼리문 처럼 테이블 컬럼이 아니라 상수쪽에 함수를 적용하여 딱 한번만 함수가 실행되게 해야 한다. 레코드가 많을수록 꼭 신경을 ..
실무를 하면서 데이터를 비교해야 할 경우가 굉장히 많은데 가장 간편하게 UNION ALL을 사용하여 비교하는 방법이 있다. UNION ALL은 여러개의 SELECT 문을 합치는 것이고 컬럼 명은 맨 위에있는 SELECT 문으로 통일되며 합쳐질때 데이터 타입이 같아야 한다. [쿼리 만드는법] 1. 먼저 기준이 되는 SELECT문을 만드는데 비교할 데이터가 들어갈 컬럼에는 NULL을 넣어주고 컬럼명을 지어준다. 2. 비교 대상인 SELECT문을 만들어준다. UNION ALL은 컬럼개수가 같아야 하므로 NULL로 임의로 컬럼을 생성해줘야 한다. 3. 2개의 SELECT문을 UNION ALL 해준다. 그러면 아래처럼 데이터가 비교할 데이터가 한 테이블에서 조회가 된다. 4. UNION ALL한 SELECT문을 ..
앱 서비스를 하면서 상대방 컴퓨터에서 접속이 안될때 IP 오픈이 되어있는지 확인을 해야 한다. 그래서 공인 아이피를 먼저 알아야 하는데 찾는 방법은 네이버에 "내 아이피" 라고 검색을 하면 된다. 위 IP주소는 공인아이피이다. 위 공인 아이피의 대역대를 전부 오픈해주고 싶을때는 대역대를 찾아줘야 하는데 whois에서 검색을 해서 대역대를 찾아줄 수 있다. xn--c79as89aj0e29b77z.xn--3e0b707e/ IP대역대는 Net Range와 CIDR로 표시될 수 있는데 AWS는 CIDR로 저장을 해야 한다. 그래서 Net Range로 CIDR을 찾아야 하는데 아래 사이트에서 확인할 수 있다. CIDR을 찾고 인바운드에 저장해주면 정상적으로 앱 서비스를 사용할 수 있다. mxtoolbox.com/..
시스템 운영중 큰 파일처리로 인해서 시스템에러가 발생 하였다. 인데 힙메모리 사이즈가 적어서인데 힙메모리는 서비스가 처음 시작될때 정해진다. 그래서 시스템 시작시 파라미터로 기입해 줘야 한다. 톰캣은 아이콘 우클릭 후 Configre -> Java 탭에서 Initial memory pool과 Maximum memory pool을 기입해 주면 된다. Initial memory pool은 최소 메모리 사이즈 Maximum memory pool은 최대 메모리 사이즈 이다. JavaService는 -install 할때 파라미터로 넣어주면 된다. dll 경로 오른쪽에 기입 해주면 되고 -Xms256m -Xms3072m 를 기입하면 힙메모리 사이즈 최소 256MB, 최대 3G로 세팅 된다. DLL 경로 오른쪽에 -..