데이터베이스 2017. 6. 16. 15:44

TABLESPACE와 DATAFILE


- TABLESPACE : 논리적 데이터 저장 공간

- DATAFILE     : 물리적 데이터 저장 공간, 즉 실제 데이터가 저장되는 Disk영역을 말 함



TABLESPACE 생성 Script


 - DATAFILE 1개

1
2
3
CREATE TABLESPACE TABLESPACE_NAME
DATAFILE 'D:\ORACLE\ORADATA\ORCL\TEST_TS01' SIZE 100M
AUTOEXTEND ON NEXT 2M MAXSIZE 500M;
cs


 - DATAFILE 1개 이상

1
2
3
DATAFILE 'D:\ORACLE\ORADATA\ORCL\TEST_TS01' SIZE 30G AUTOEXTEND OFF
       , 'D:\ORACLE\ORADATA\ORCL\TEST_TS02' SIZE 30G AUTOEXTEND OFF
       , 'D:\ORACLE\ORADATA\ORCL\TEST_TS03' SIZE 30G AUTOEXTEND OFF
cs


AUTOEXTEND

- DATAFILE SIZE 자동확장 여부, ON/OFF로 설정

- AUTOEXTEND가 OFF로 설정할 경우, NEXT, MAXSIZE의 크기는 0으로 설정해야 한다.

  NEXT, MAXSIZE를 기술하지 않으면 Default 값(0)으로 설정됨


NEXT

- 초기설정 값(100M)보다 많은 공간이 요구될때 자동으로 확장되는 디스크 공간크기

- K(킬로 바이트), M(메가 바이트)단위 사용


MAXSIZE

 - 확장 될수 있는 최대 크기 입니다.

 - K(킬로 바이트), M(메가 바이트)단위 사용

 - MAXSIZE가 명시되지 않았으면 데이터 파일의 최대 크기는 디스크 공간과 OS에서 지원되는 최대 파일 크기로 제한 된다. 


ex) Windows 32bit : 16G

    Windows 64bit : 32G




TABLESPACE 수정 Script


1
2
3
4
5
6
7
8
9
10
1) TABLEPACE에 수동으로 DATAFILE 추가
ALTER TABLESPACE DQ_MAN_TS ADD DATAFILE 'D:\ORACLE\ORADATA\ORCL\DQ_MAN_TS02.DBF' SIZE 30G;
 
2) 기존 DATAFILE 속성 변경 -  수동으로 SIZE증가
ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\ORCL\DQ_MAN_TS01.DBF' resize 2G;
 
3) 기존 DATAFILE 속성 변경 -  자동으로 SIZE증가
  ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\ORCL\DQ_MAN_TS01.DBF'
  AUTOEXTEND ON NEXT 5M
  MAXSIZE 30G;
cs




TABLESPACE 용량 및 사용량 확인


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT A.TABLESPACE_NAME AS "테이블스페이스"
     , ROUND(SUM(A.TOTAL)/1024/1024,1"전체(MB)"
     , ROUND(SUM(A.TOTAL)/1024/1024,1)-ROUND(SUM(A.FREE_SPACE)/1024/1024,1"사용(MB)"
     , ROUND(SUM(A.FREE_SPACE)/1024/1024,1"여유(MB)"
     , ROUND((ROUND(SUM(A.TOTAL)/1024/1024,1)- ROUND(SUM(A.FREE_SPACE)/1024/1024,1))/ROUND(SUM(A.TOTAL)/1024/1024,1)*100,2"사용률(%)"
  FROM (SELECT TABLESPACE_NAME
             , 0 AS TOTAL
             , SUM(BYTES) AS FREE_SPACE
          FROM DBA_FREE_SPACE
         GROUP BY TABLESPACE_NAME
        UNION
        SELECT TABLESPACE_NAME
             , SUM(BYTES) TOTAL
             , 0 AS FREE_SPACE
          FROM DBA_DATA_FILES
         GROUP BY TABLESPACE_NAME) A
 GROUP BY A.TABLESPACE_NAME
 ORDER BY TABLESPACE_NAME
;
cs


DBA_SEGMENTS   : 세그먼트의 할당량을 조회

DBA_FREE_SPACE : 사용가능한 익스텐트 정보 조회

DBA_DATA_FILES : 할당된 물리적 공간


'데이터베이스' 카테고리의 다른 글

오라클 권한 조회  (0) 2017.06.28
오라클 계정과 권한  (0) 2017.06.23
TIMESTAMP 연산  (0) 2017.05.11
오라클 - PIVOT과 UNPIVOT  (0) 2017.02.02
오라클의 동적 PL SQL 작성 - EXECUTE IMMEDIATE  (0) 2017.01.24
posted by 생각퍼즐
:
프로그래밍 2017. 5. 22. 00:56



브라우저를 이용해 파일을 다운로드할 경우 인코딩 문제로인해 한글 및 특수문자 깨짐현상이 발생하죠!


이런문제를 해결하기 위해서는 첫 번째 Client가 사용하는 브라우저 확인이 필요합니다. 두 번째 브라우저별 파일명 인코딩 처리가 필요합니다.





1. 파일다운로드를 위한 컨트롤러 소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RequestMapping(value="/notice/fileDownload")
    public void fileDownload(HttpServletRequest req, HttpServletResponse res, NoticeBean noticeBean) throws Exception{
        
        String fileStrNm = req.getParameter("fileStrNm");
        String fileOrgNm = req.getParameter("fileOrgNm");
        
        byte fileByte[] = FileUtils.readFileToByteArray(new File(path+ "/" +fileStrNm));
         
        String encodedFileName = FileUtil.getEncodedFileName(fileOrgNm, CommonUtil.getBrowser(req));
        res.setContentType("application/octet-stream");
        res.setContentLength(fileByte.length);
        res.setHeader("Content-Disposition""attachment; fileName=\"" +encodedFileName +"\";");
        res.setHeader("Content-Transfer-Encoding""binary");
        res.getOutputStream().write(fileByte);
         
        res.getOutputStream().flush();
        res.getOutputStream().close();
        
    }
cs



2. Client의 브라우저 확인


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static String getBrowser(HttpServletRequest request) {
   String userAgent = request.getuserAgent("User-Agent");
  
   if (userAgent.indexOf("MSIE"> -1 || userAgent.indexOf("Trident"> -1 ){
        //IE 버전 별 체크  >>  Trident/7.0(IE 11), Trident/6.0(IE 10) , Trident/5.0(IE 9) , Trident/4.0(IE 8)
        return "MSIE";
   } else if (userAgent.indexOf("Chrome"> -1) {
        return "Chrome";
   } else if (userAgent.indexOf("Opera"> -1) {
        return "Opera";
   } else if ( userAgent.indexOf("Firefox"> -1 ) {
        return "Firefox";
   }
   return "Safari";
}
cs



3. 브라우저별 파일명 인코딩 처리


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  // 파일 다운로드 시 Cilent의 브라우저에 따라 파일명의 인코딩 설정
    public static String getEncodedFileName(String filename, String browser) throws Exception {
        
           String encodedFilename = null;
           if (browser.equals("MSIE")) {
               // 한글 파일명 깨짐현상을 해결하기 위해 URLEncoder.encode 메소드를 사용하는데,
               // 파일명에 공백이 존재할 경우 URLEncoder.encode 메소드에의해 공백이 '+' 로 변환됩니다.
               // 변환된 '+' 값을 다시 공백으로(%20)으로 replace처리하시면 됩니다.
               // \\+의 의미는 정규표현식에서 역슬래시(\)는 확장문자로
               // 역슬래시 다음에 일반문자가 오면 특수문자로 취급하고 
               // 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미 
               // 기존 파일명에 있던 '+' 는 URLEncoder.encode() 메소드에 의해 '%2B' 로 변환이 됩니다.
                encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+""%20");
           } else if (browser.equals("Firefox")) {
                encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1"+ "\"";
           } else if (browser.equals("Opera")) {
                encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1"+ "\"";
           } else if (browser.equals("Chrome")) {
              StringBuffer sb = new StringBuffer();
              for (int i = 0; i < filename.length(); i++) {
                          char c = filename.charAt(i);
                          if (c > '~') {
                                     sb.append(URLEncoder.encode("" + c, "UTF-8"));
                          } else {
                                // ASCII문자(0X00 ~ 0X7E)는 URLEncoder.encode를 적용하지 않는다.     
                                  sb.append(c);
                          }
              }
              encodedFilename = sb.toString();
           } else {
              throw new RuntimeException("Not supported browser");
           }
           return encodedFilename;
    }
cs


위와 같이 처리하시면 파일 다운로드 시 파일명이 깨지는 현상을 방지할 수 있습니다.


posted by 생각퍼즐
:
데이터베이스 2017. 5. 11. 18:02



SQL의 실행 시간 측정등 밀리 세컨드 단위의 정밀한 작업이 필요한 곳에 TIMESTAMP 데이터 타입을 사용하죠!



그렇다면, TIMESTAMP 형식으로 등록된 데이터의 비교연산은 어떻게 할까요?



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- TIMESTAMP 연산을 위한 2개의 COLUMN이 포함된 테이블을 생성합니다.
CREATE TABLE TB_TIME_STAMP(
FROM_TIME           TIMESTAMP,
TO_TIME             TIMESTAMP
)
;
 
-- 생성된 테이블에 TIMESTAMP 형식의 데이터를 등록합니다.
INSERT INTO SCOTT.TB_TIME_STAMP(FROM_TIME, TO_TIME)
VALUES(SYSTIMESTAMP - 1/24, SYSTIMESTAMP)
;
 
-- 마직막으로 아래처럼 TIMESTAMP 연산을 수행하여 시간차이를 초단위로 변환합니다.
SELECT EXTRACT(HOUR FROM DT) * 3600 + EXTRACT(MINUTE FROM DT) * 60 + EXTRACT(SECOND FROM DT) AS DIFF_TIME
  FROM (
        SELECT TO_TIME - FROM_TIME AS DT
          FROM SCOTT.TB_TIME_STAMP
       )
;
cs


참고로, 위의 SYSTIMESTAMP - 1/24의 의미는 현재 시간에서 1시간 전의 값을 의미합니다.

그래서 두 컬럼의 연산 결과는 항상 3600.XXX가 되겠죠!

'데이터베이스' 카테고리의 다른 글

오라클 권한 조회  (0) 2017.06.28
오라클 계정과 권한  (0) 2017.06.23
오라클 TABLESPACE와 DATAFILE  (0) 2017.06.16
오라클 - PIVOT과 UNPIVOT  (0) 2017.02.02
오라클의 동적 PL SQL 작성 - EXECUTE IMMEDIATE  (0) 2017.01.24
posted by 생각퍼즐
: