반응형

종종 데이터베이스 서버를 확인하다보면 어디서 접근중인지 확인하거나

정상적으로 접근이 종료되었는지 등등 확인해야하는 경우가 있는데 이럴때는 아래의 쿼리를 날리면

접근중인 세션의 정보들이 나온다.

 

접근중인 database명, IP정보 상태 등등

 

SHOW PROCESSLIST;
반응형
반응형

* mysql 기준으로 작성하였습니다. 타 DB는 조금씩 사용법이 다를 수 있습니다.

 

 

where절 조건문

<where>
    <if test="param1 != null and param1 !=''">
    	column1 = #{param1}
    </if>
    <if test="param2 != null and param2 !=''">
    	and column2 = #{param2}
    </if>
    <if test="param3 != null and param3 !=''">
    	and column3 = #{param3}
    </if>
</where>

where절에서 if문이 무조건 들어가지 않는 경우 1=1과 같은 편법으로 대처하는 경우가 보이는데

<where></where>을 사용하시면 조건 안에서 조건문이 있는 경우에만 검색해줍니다.

맨 위 param1의 값이 없고 param2의 값이 있는 경우 앞에 있는 and를 자연스럽게 지우고 쿼리를 작성하게되어

쿼리 문법에 문제가 되지 않도록 해줍니다.

 

즉, 아래와 같이 변경해줍니다.

where
    column2 = 'hello'
    and column3 = 100

자연스럽게 column2 앞에 텍스트로 박아놓은 AND문이 사라진걸 볼 수 있습니다.

 

 

 

IN절 검색하기

where column1 IN
  <if test="param1 != null and param1.size > 0">
    <foreach collection="param1" item="item"  open="(" close=")" separator=",">
    	#{item}
    </foreach>
  </if>

IN절의 검색은 해당 컬럼에 포함된 모든 데이터를 검색할때 보통 사용하는데,

(column1='1' or column2='2'...길게 나열하지 않기 위해)

 

$문법의 경우에는 배열을 넘겨주면 아주 쉽게 해결되지만, 취약점에 노출될 수 있으므로 #{}처리하는 방법으로

LIST형태로 param1값을 넘겨주고 해당값의 널체크와 사이즈체크를 한 후 ( ) 구분자, 처리를 통해

자연스럽게 IN (1, 2, 3)의 형태를 만들어 줄 수 있습니다.

 

ex 자바단)

String codeList = request.getParameter("codeList"); //파라미터값을 받고 //codeList = "1,2,3,4"
if(codeList != null && !codeList.equals("")){ //널 체크후
    String[] arr = codeList.split(",");  // ,으로 split처리
    param.put("codeList", Arrays.asList(arr)); //LIST에 파싱하여 파라미터값을 넘긴다.
    int res = service.func(param); //서비스 함수에 사용한다.
}

1,2,3 와 같은 형태로 넘어오는 파라미터 자체를 ,로 스플릿하고 LIST에 파싱하는 예제입니다.

 

 

 

like절 검색하기

$ 표기법

where
	column like '% ${검색값} %'

 

# 표기법 - mysql, maria db

where
	column like concat('%', #{검색값} ,'%')

 

$방식은 sql Injection 취약점에 노출되므로 #방식을 추천합니다.

반응형
반응형

운영서버 운영 도중 Could not get JDBC Connection; nested exception is java.sql.SQLException

와 같은 연결 에러가 발생하였다.

 

해당 DB서버의 mysql 서비스가 종료되었는지 확인해봤지만 서비스는 정상적으로 기동중인것을 볼 수 있었다.

 

별 수 없이 재기동을 하기 위해 종료 명령어를 실행하였다.

service mysql stop

 

몇 분을 기다려도 mysql 서비스가 무기한으로 종료 요청만 진행될뿐 종료가 되지 않았다.

 

이상하다고 판단되어 서버의 용량을 확인해보니 남은 용량이 없었다.

df -h

 

서버 내 용량을 800메가 이상 사용중인곳을 확인하기 위해 아래 명령어를 실행하였다.

find ./* -size +800000k

 

명령을 입력하니 mysql/mysql-bin.000001과 같은 로그파일들이 잔득 쌓여있는 모습을 확인하였다.

 

 

해당 디렉토리로 이동하여 용량들을 확인해보니 약 30기가정도를 사용 중는데, 해당 로그들은 데이터를 지금 또는 나중에 업데이트하는 모든 명령문이 기록되어 있다.

각 명령문에 대한 데이터를 업데이트하는 시간 정보도 가지고 있는데, 사실 로그라 이미 한참 지난 불필요한 로그는 삭제처리하여도 문제가 없어서 삭제 조치를 하였다.

 

해당 로그 데이터가 5일 이상 지나면 삭제 될 수 있도록 설정파일에 옵션을 추가하였다.

 

/etc/my.cnf

[mysqld]
expire_logs_days = 5

 

5일 이상이 지난 로그파일들이 삭제되는 옵션이다.

 

삭제 후 용량을 확인시 32g가 확보되었고 정상적으로 mysql 서비스는 올라왔다.

 

이후 톰캣 재시작을 하니 정상적으로 운영이 가능해졌다.

반응형
반응형

오라클 설치에 대해 알아보겠습니다.

 

https://www.oracle.com/index.html

 

Oracle | Integrated Cloud Applications and Platform Services

About Oracle Unlock endless possibilities A culture of innovation has propelled Oracle since its inception. Today, thanks to exceptional people, we lead the market in autonomous, cloud, and applications technologies.

www.oracle.com

공식 홈페이지로 이동

 

하단의 Developers로 이동

 

 

Databases로 이동

 

오라클 데이터베이스 클릭

 

많은 버전들이 보일 텐데 여기서 원하는 버전으로 설치하면 된다.

우리는 11g버전으로 설치를 할것이니 맨 아래로 내려보면 11g가 존재한다.

자신의 OS환경에 올바른 버전의 파일1, 2를 다운받는다.

파일1, 2 다운로드

 

 

한번에 이동하는 URL도 남겨 둡니다.(url이 변경될 수도 있음)

https://www.oracle.com/database/technologies/oracle-database-software-downloads.html

 

Database Software Downloads | Oracle

Oracle Database 11g Release 2 Standard Edition, Standard Edition One, and Enterprise Edition 7/13: Patch Set 11.2.0.4 for Linux and Solaris is now available on support.oracle.com. Note: it is a full installation (you do not need to download 11.2.0.1 first)

www.oracle.com

 

설치방법은 추가예정...

반응형
반응형

작성한 테이블에 대해서 결과값을 뽑는 쿼리는 아래와 같다.

SELECT
	ORDINAL_POSITION `번호`,
	COLUMN_NAME `컬럼`,
	COLUMN_TYPE `타입(길이)`,
	COLUMN_KEY `KEY`,
	IS_NULLABLE `NULL 허용`,
	EXTRA `AUTO_INCREMENT`,
	COLUMN_DEFAULT `기본값`,
	COLUMN_COMMENT `COMMENT`
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = '데이터베이스명' AND TABLE_NAME = '테이블명'
ORDER BY TABLE_NAME, ORDINAL_POSITION

 

이 외에도 다른 컬럼값들이 있는데, 변경해서 사용하면 된다.

반응형
반응형

mysql 서버를 구성하고 웹에서 데이터를 조회해오는데 문제없이 잘 가져오다가

빈 컬럼이거나 NULL이 들어가있으면 Case When문구를 활용하여 치환하는 query가 있었는데

 

툴로 조회할때는 문제가 없지만, mybatis를 통해 조회할때만 문제가 되었다.

 

처음 의심한 곳은 mapper의 xml 인코딩이 깨졌을꺼라 생각했지만 문제없이 UTF-8 처리였다.

 

SET CHARACTER SET UTF8;

해당 쿼리를 던지고 조회하면 수정이 된다고해서 처리하였지만 동일한 증상이 발생하였고,

 

mysql -u root -p
비밀번호 입력

접속하여 status로 서버쪽 언어 인코딩 상태를 확인해보니 latin1로 조회되었다.

 

status 조회 결과

 

서버쪽 인코딩이 안맞는것으로 판단하여 mysql 설정파일인 my.ini를 열어

mysqld라인에 character-set-server=utf8 를 입력하였다.

[mysqld]
character-set-server=utf8

 

서비스에서 mysql 재기동 후 정상적으로 치환하여 보여지는것을 확인했다.

 

반응형
반응형

mysql 서비스를 종료 후 재기동을 하려고 하니 위와 같은 에러가 발생하고

 

my.ini 옵션에 bind-address를 추가하여도 동일하게 문제가 발생하였다.

 

명령 프롬프트를 관리자 권한으로 실행하고 mysql 설치된 위치로 이동하여

bin 위치에서 (C:\Program Files\MySQL\MySQL Server 8.0\bin)

 

mysqld --initialize

입력 후 약간의 시간이 지난 후

 

net start mysql

입력하여 서비스를 정상적으로 기동하였다.

반응형