MySQL 의 database 와 table 의 size 를 알아내는 방법
 
DB_NAME 에 사이즈를 알고 싶은 database 를 넣으면 모든 테이블의 사이즈가 출력됨

SELECT TABLE_NAME AS "Tables",
                     round(((data_length + index_length) / 1024 / 1024), 2) "Size in MB"
FROM information_schema.TABLES
WHERE table_schema = "DB_NAME"
ORDER BY (data_length + index_length) DESC;

 

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

테이블 크기 계산 방법

1) 총 블럭 헤더 크기를 계산

TOTAL BLOCK HEADER   = BLOCK HEADER, PART A + BLOCK HEADER, PART B
BLOCK HEADER, PART A = (FIXED HEADER + VARIABLE TRANSACTION HEADER)
BLOCK HEADER, PART B = (TABLE DIRECTORY + ROW DIRECTORY)
- FIXED HEADER : 57 BYTE (고정된 블럭 헤드)
- VARIABLE TRANSACTION HEADER : 23 * I (I는 해당 TABLE의 INITRANS의 값)
- TABLE DIRECTORY : 4
- ROW DIRECTORY : 2*R (R : R(AVG.# OF ROWS/BLOCK) 데이터 블록 내의 평균 ROW 수 )
 

2) 데이터 블럭 당 사용 가능한 데이터 영역을 계산

AVAILABLE DATA SPACE = (BLOCK SIZE - TOTAL BLOCK HEADER) - ((BLOCK SIZE - BLOCK HEADER, PART A) * (PCTFREE/100))
- BLOCK SIZE : 데이터베이스의 블럭 크기 (SVRMGRL의 SHOW PARAMETER에서 DB_BLOCK_SIZE를 확인)
 

3) 평균 ROW의 전체 컬럼의 길이를 계산

ROW 길이를 계산하기 위하여 테이블 정의에서 컬럼 수, 각 컬럼의 데이터 타입, 가변 길이 컬럼의 평균 크기 등을 참조한다.
D(DATA SPACE/AVERAGE ROW) : 테이블의 ROW의 평균 길이
 

4) 총 평균 ROW 크기를 계산

BYTE/ROW = ROW HEADER + F + V + D
- ROW HEADER : ROW당 3BYTES (NON-CLUSTERED TABLE)
- F : 250 BYTES 이하를 사용하는 컬럼의 TOTAL LENGTH BYTES (각 컬럼 당 1 BYTE)
- V : 250 BYTES 이상를 사용하는 컬럼의 TOTAL LENGTH BYTES (각 컬럼 당 3 BYTE) 
- D : D(DATA SPACE/AVERAGE ROW 평균 ROW의 전체 컬럼의 길이)
 

5) 데이터 블록 내의 평균 ROW 수를 계산

R(AVG.# OF ROWS/BLOCK) = AVAILABLE SPACE / AVERAGE ROW SIZE
- AVAILABLE SPACE : AVAILABLE DATA SPACE (데이터 블럭 당 사용 가능한 데이터 영역)
- AVERAGE ROW SIZE : BYTE/ROW (총 평균 ROW 크기)
 

6) 테이블에서 요구되는 블럭과 바이트 수를 계산

BLOCKS FOR TABLE = # ROWS / R
# ROWS : 테이블의 ROW 수
R : R(AVG.# OF ROWS/BLOCK) 데이터 블록 내의 평균 ROW 수
BYTES FOR TABLE = # BLOCKS FOR TABLE * BLOCK SIZE

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

암호화 항목중 일부분인 단방향 SHA256 해시 암호화 함수 생성하기를 설명한다.

1. 메모장을 열어 아래 내용을 붙여넣고 파일명을 SHA256Encryptor.java 로 합니다.


---------------------------------- 단방향(SHA256) -----------------------------------

CREATE OR REPLACE and RESOLVE JAVA SOURCE NAMED "SHA256Encryptor.SHA256" AS /*파일명*/
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
  
public class SHA256Encryptor {
    public static String SHA256(String str){
        String SHA = "";
        try{
            MessageDigest sh = MessageDigest.getInstance("SHA-256");
            sh.update(str.getBytes());
            byte byteData[] = sh.digest();
  
            StringBuffer sb = new StringBuffer();
            for(int i = 0 ; i < byteData.length ; i++){
                sb.append(Integer.toString((byteData[i]&0xff) + 0x100, 16).substring(1));
            }
            SHA = sb.toString();
        }catch(NoSuchAlgorithmException e){
            e.printStackTrace();
            SHA = null;
        }
        return SHA;
    }
     
    public static void main(String[] args) {
        String in_str = args[0];
        String out_str = SHA256(in_str);
         
        System.out.println(">>in["+in_str+ "],out[" + out_str + "]" + out_str.length() );
    }
}
 

2. 콘솔을 열어 아래와 같이 실행하여 JAVA 파일을 오라클에 적재한다.

생성 : C:\>loadjava -u 아이디/암호@계정 -v -resolve C:\SHA256Encryptor.java
원격지에서 실행가능하며 DBA 권한이 필요합니다.
 

3. 오라클접속하여 아래와 같은 함수를 만들고 실행하여 함수를 생성한다.

CREATE OR REPLACE FUNCTION SHA265(NAME VARCHAR2) RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'SHA256Encryptor.SHA256(java.lang.String) return java.lang.String';

 

4. 테스트를 수행한다.

 SELECT SHA256('1234') FROM DUAL

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

오라클에서 사용할 수 있는 Simple Name 마스킹 함수


create or replace FUNCTION M2U_MASKING_NAME(in_date IN varchar2)
    return varchar2
IS
    RS VARCHAR2(50) :=null;
BEGIN
    IF LENGTH(in_data) > 2 THEN
        RS := SUBSTR(in_data, 1, 1) || LPAD('*', 1, '*') || SUBSTR(in_data, 3, LENGTH(in_data)-2);
    ELSEIF LENGTH(in_data) = 2 THEN
        RS := SUBSTR(in_data, 1, 1) || LPAD('*', 1, '*');
    ENDIF

    return (RS);
END;

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

MySQL 의 default character set 은 MySQL 의 설정 파일에 설정할 수 있다.


배포판
위치
RHEL/CentOS
 /etc/my.cnf
Ubuntu 
/etc/mysql/mysql.conf.d/mysqld.cnf


명시적으로 설정하지 않으면 기본 캐릭터 셋은 latin1 이 된다. 현재 characterset 확인은 다음과 같이 mysql 클라이언트로 연결한 후에 status 명령어로 알수 있다.


또는 다음과 같이 mysql 콘솔에서 show variable 을 사용해도 된다.


mysql> show variables like 'char%';



redmine, gitlab 등 거의 모든 app 들은 charset 으로 UTF-8 을 권장하고 있고 실제로도 UTF-8 을 사용하는게 정신건강에 좋다.
MySQL 5.1 과 5.5 이상은 my.cnf 에 캐릭터 셋 설정하는 방식이 약간 다르다.

설정

MySQL 5.5 이상

MySQL 5.5 부터는 default-character-set 옵션이 제거되었고 character-set-server 만 설정해 주면 된다.
skip-character-set-client-handshake 가 빠지면 client 의 시스템 encoding 을 사용하는데 윈도의 경우 euckr 로 설정 될수 있으므로 필요하다.
MySQL 5.5

[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
skip-character-set-client-handshake


이제 service mysqld restart 로 재구동후에 mysql client 에서 status 명령어로 보면 charset 이 utf-8 로 변경되었을 것이다.



MySQL 5.1

5.1 은 다음과 같이 설정해야 한다.
MySQL 5.1

[mysqld]
character-set-server = utf8
  
[client]
default-character-set=utf8
 
[mysql]
default-character-set=utf8

UTF8-MB 

Emoji 는 기존 utf-8 로는 표현을 못하므로 MySQL에서 이모지를 저장하려면 4바이트의 가변 길이를 갖는 utf8mb4 캐릭터 셋을 사용해야 한다. (MySQL 5.5.3 이상 필요)

[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
skip-character-set-client-handshake


이미 기존에 만들어진 database 라면 alter database 명령어로 캐릭터 셋과 collate 를 변경할 수 있다.
character set 변경

ALTER DATABASE homestead CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;


캐릭터 셋 변경 후에는 MySQL 서비스를 재시작해야 한다. 아래의 MySQL 재시작 명령어를 참조하여 수행한다.

MySQL 서비스 재시작 

작업
우분투 명령어
CentOS6 명령어
CentOS7 명령어
시작
정지
재시작
상태확인
→ service mysql 대신 /etc/init.d/mysql,
→ service mysqld 대신 /etc/init.d/mysqld를 써도 됨

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,