백업

 

docker exec <CONTAINER> /usr/bin/mysqldump -u root — password=root <DATABASE> > backup.sql

 

 

복구

 

cat backup.sql | docker exec -i <CONTAINER> /usr/bin/mysql -u root --password=root <DATABASE>

반응형

'IT > Docker' 카테고리의 다른 글

[Docker] 기본 명령어  (0) 2020.04.03
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

1. 백업

 

1.1 mysql 백업

 

- 기존 mysql 비밀번호 확인

# cat /opt/redmine-3.3.3-1/apps/redmine/htdocs/config/database.yml

 

production:

adapter: mysql2

database: bitnami_redmine

host: localhost

username: bitnami

password: xxxxxxxxxx

 

- mysql 백업 파일 생성

 

# /opt/redmine-3.3.3-1/mysql/bin/mysqldump -u bitnami -p bitnami_redmine > backup.sql

 

 

1.2 redmine 데이터 파일 백업

# cd /opt/redmine-3.3.3-1/apps/redmine/htdocs

# tar zcvf files.tar.gz files

 

1.3 redmine 플러그인 백업

# cd /opt/redmine-3.3.3-1/apps/redmine/htdocs

# tar zcvf plugins.tar.gz plugins


2. 복구

 

1.1 신규 서버에 bitnami-redmine 설치. 

 

- 설치 바이너리 다운로드 (https://bitnami.com/stack/redmine/installer)

 

# wget https://downloads.bitnami.com/files/stacks/redmine/3.3.3-1/bitnami-redmine-3.3.3-1-linux-x64-installer.run

 

 

- 설치

# chmod 755 bitnami-redmine-3.3.3-1-linux-x64-installer.run

# ./bitnami-redmine-3.3.3-1-linux-x64-installer.run

 

- 신규 서버의 http://xxx.xxx.xxx.xxx/redmine/phpmyadmin 외부 접근 가능하게 하기 위해 내 아이피를 추가

# vi /opt/redmine-3.3.3-1/apps/phpmyadmin/conf/httpd-app.conf

 

<IfVersion >= 2.3>

Require local

Require ip xxx.xxx.xxx.xxx

</IfVersion>

 

1.2 신규 서버의 mysql 비밀번호 확인

# cat /opt/redmine-3.3.3-1/apps/redmine/htdocs/config/database.yml

 

production:

adapter: mysql2

database: bitnami_redmine

host: localhost

username: bitnami

password: xxxxxxxxxx

 

1.3 mysql 복구

 

- 기본설치된 redmine db를 삭제

# /opt/redmine-3.3.3-1/mysql/bin/mysql -u bitnami -p bitnami_redmine

 

mysql> drop database bitnami_redmine;

Query OK, 1 rows affected (0.00 sec)

 

mysql> create database bitnami_redmine;

Query OK, 1 row affected (0.00 sec)

 

mysql> exit

Bye

 

복원용 DB파일을 로딩

 

# /opt/redmine-3.3.3-1/mysql/bin/mysql -u bitnami -p bitnami_redmine < backup.sql

 

 

1.4 redmine 데이터 파일 복구

# cd /opt/redmine-3.3.3-1/apps/redmine/htdocs/

# rm -f files

# tar zxvf files.tar.gz

 

1.5 redmine 플러그인 복구

# cd /opt/redmine-3.3.3-1/apps/redmine/htdocs

# rm -rf plugins

# tar zxvf plugins.tar.gz

 

1.6 DB migration 처리

# cd /opt/redmine-3.3.3-1/apps/redmine/htdocs

# /opt/redmine-3.3.3-1/ruby/bin/rake db:migrate RAILS_ENV="production"

# /opt/redmine-3.3.3-1/ruby/bin/rake redmine:plugins:migrate RAILS_ENV=production

 

1.7 시작 프로그램 등록

 

- Redhat 계열

$ cp /opt/redmine-3.3.3-1/ctlscript.sh /etc/init.d/bitnami-redmine

 

# 부팅스크립트 시작 부분 수정

$ vi /etc/init.d/bitnami-redmine

 

#!/bin/sh

#

# chkconfig: 2345 80 30

# description: Bitnami services

 

# 서비스로 등록

$ chkconfig --add bitnami-redmine

 

- Ubuntu 계열

$ sudo cp /opt/redmine-3.3.3-1/ctlscript.sh /etc/init.d/bitnami-redmine

$ sudo chmod +x /etc/init.d/bitnami-redmine

 

# 부팅 스크립트 시작부분 수정

$ sudo vi /etc/init.d/bitnami-redmine

 

### BEGIN INIT INFO

# Provides: bitnami-redmine

# Required-Start: $remote_fs $syslog

# Required-Stop: $remote_fs $syslog

# Default-Start: 2 3 4 5

# Default-Stop: 0 1 6

# Short-Description: Start daemon at boot time

# Description: Enable services provided by daemon.

### END INIT INFO

 

# 서비스로 등록

$ sudo update-rc.d -f bitnami-redmine defaults

$ sudo update-rc.d -f bitnami-redmine enable

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

우분투의 기본적인 방화벽은 UFW입니다. 이는 iptables를 좀 더 쉽게 설정할 수 있도록 한 것인데 간단한 방화벽 구성에는 문제가 없지만 수준 높은 방화벽 구성에는 iptables 룰을 직접 사용해야 합니다.

참고 : 우분투 UFW help 가이드

UFW 사용법

UFW 기본 설정법에 대하여 알아보자.

UFW 활성화/비활성화

UFW는 기본 비활성화 상태이기에 이를 활성화 한다.

BASH

sudo ufw enable

UFW 비활성화

BASH

sudo ufw disable

UFW 상태 확인

BASH

sudo ufw status verbose

UFW 기본 룰

UFW에 설정되어 있는 기본 룰은 아래와 같다.

  • 들어오는 패킷에 대해서는 전부 거부(deny)

  • 나가는 패킷에 대해서는 전부 허가(allow)

기본 룰 확인

BASH

sudo ufw show raw

기본 정책 차단

BASH

sudo ufw default deny

기본 정책 허용

BASH

sudo ufw default allow

UFW 허용과 차단

UFW 허용

sudo ufw allow <port>/<optional: protocal>

예) SSH 포트 22번 허용(tcp/udp 22번 포트를 모두 허용)

BASH

sudo ufw allow 22

tcp 22번 포트만을 허용 - SSH는 tcp 22번 포트만 허용하는게 정답

BASH

sudo ufw allow 22/tcp

udp 22번 포트만을 허용

BASH

sudo ufw allow 22/udp

UFW 거부

sudo ufw deny <port>/<optional: protocol>

예) ssh 포트 22번 거부(tcp/udp 22번 포트를 모두 거부)

BASH

sudo ufw deny 22

tcp 22번 포트만을 거부

BASH

sudo ufw deny 22/tcp

udp 22번 포트만을 거부

BASH

sudo ufw deny 22/udp

UFW 룰의 삭제

ufw deny 22/tcp 설정이 되어있다고 가정

BASH

sudo ufw delete deny 22/tcp

service 명을 이용한 설정

/etc/services에 지정되어 있는 서비스명과 포트를 이용해 UFW를 설정할 수 있다.

서비스명 보기

BASH

less /etc/services

서비스명으로 허용

sudo ufw allow <service name>

예) SSH 서비스

BASH

sudo ufw allow sshsudo ufw deny ssh

UFW 로그 기록

BASH

sudo ufw logging on

sudo ufw logging off

Advanced Syntax

문법을 확장하여 목적지 주소와 포트, 프로토콜등을 지정할 수 있다.

특정한 IP 주소 허가/거부

특정한 IP주소 허용

sudo ufw allow from <ip address>

예) 192.168.0.100 주소 허용(IP 주소192.168.0.100 에서만 접속이 가능해진다)

BASH

sudo ufw allow from 192.168.0.100

네트워크 단위로 지정하여 같은 네트워크 상에 있는 컴퓨터들은 접속가능해진다.

BASH

sudo ufw allow from 192.168.0.0/24

특정 IP 주소와 일치하는 포트 허용

sudo ufw allow from <ip address> to <protocol> port <port number>

예) 192.168.0.100 주소와 포트, 프로토콜 허용

BASH

sudo ufw allow from 192.168.0.100 to any port 22

특정 IP 주소와 프로토콜, 포트 허용

$ sudo ufw allow from <ip address> to <protocol> port <port number> proto <protocol name>

예) 192.168.0.100 주소와 tcp 프로토콜 22번 포트 허용

BASH

sudo ufw allow from 192.168.0.100 to any port 22 proto tcp

위의 예제들에서 allow 대신 deny를 입력하면 거부가 된다.

ping (icmp) 허용/거부

UFW 기본설정은 ping 요청을 허용하도록 되어있다.

BASH

sudo vi /etc/ufw/before.rules

 

# ok icmp codes

-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT

-A ufw-before-input -p icmp --icmp-type source-quench -j ACCEPT

-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT

-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT

-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

위 코드들의 ACCEPT 부분을 모두 DROP으로 변경하거나 삭제하면 ping 요청을 거부하게 된다.

ufw numbered rules

UFW 룰들에 숫자를 붙여서 볼 수 있다. 이를 이용해 룰에 수정이나 삭제, 추가를 할 수 있다.

ufw number 보기

BASH

sudo ufw status numbered

ufw numbered 수정

BASH

sudo ufw delete 1

sudo ufw insert 1 allow from 192.168.0.100

추천 방화벽 정책

BASH

sudo ufw enablesudo ufw allow from 192.168.0.3 to any port 22 proto tcp

sudo ufw allow 123/udp

sudo ufw allow 80/tcp

sudo ufw allow 3306/tcp

sudo ufw status

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

[root@10.10.10.10 ~]# curl -o /dev/null -w “Connect: %{time_connect} TTFB: %{time_starttransfer} Total time: %{time_total} \n” -s https://internal-test.bbunbro.com

 

Connect: 0.002 TTFB: 0.069 Total time: 0.069

 

외부는 그냥 webpagetest.org 에서 테스트 하시오. 좋습니다.

 

참고 :

(로컬 호스트 톰켓 http listener 체크)

[root@10.10.10.10 ~]# curl -o /dev/null -w “Connect: %{time_connect} TTFB: %{time_starttransfer} Total time: %{time_total} \n” -s http://127.0.0.1:8080/www

 

Connect: 0.000 TTFB: 0.026 Total time: 0.026

 

A friendly formatter for curl requests to help with debugging.

Raw (디버깅을 위한 스니프 포멧 생성 후 테스트 하는 법)

sniff.txt

\n

============= HOST: ==========\n

\n

local_ip: %{local_ip}\n

local_port: %{local_port}\n

remote_ip: %{remote_ip}\n

remote_port: %{remote_port}\n

\n

======= CONNECTION: ==========\n

\n

http_code: %{http_code}\n

http_connect: %{http_connect}\n

num_connects: %{num_connects}\n

num_redirects: %{num_redirects}\n

redirect_url: %{redirect_url}\n

\n

============= FILE: ==========\n

\n

content_type: %{content_type}\n

filename_effective: %{filename_effective}\n

ftp_entry_path: %{ftp_entry_path}\n

size_download: %{size_download}\n

size_header: %{size_header}\n

size_request: %{size_request}\n

size_upload: %{size_upload}\n

speed_download: %{speed_download}\n

speed_upload: %{speed_upload}\n

ssl_verify_result: %{ssl_verify_result}\n

url_effective: %{url_effective}\n

\n

=== TIME BREAKDOWN: ==========\n

\n

time_appconnect: %{time_appconnect}\n

time_connect: %{time_connect}\n

time_namelookup: %{time_namelookup}\n

time_pretransfer: %{time_pretransfer}\n

time_redirect: %{time_redirect}\n

time_starttransfer: %{time_starttransfer}\n

———-\n

time_total: %{time_total}\n

 

\n

 

Steps to Use:

#1. Make a file named sniff.txt and paste the contents of this gist into it

#2. Make an alias in your .bash_profile or .zshrc ( or whatever you use ) that looks like this ( make sure to source .bash_profile the file afterwards ):

alias sniff=’curl -w “@/path/to/sniff.txt” -o /dev/null -s ‘

#3. Now you can use your alias to get some fun data back:

sniff https://api.twitter.com/1.1/search/tweets.json?q=@mrmidi

You will get a response that looks like this:

============= HOST: ==========

local_ip: 192.168.0.67

local_port: 49469

remote_ip: 199.16.156.231

remote_port: 443

======= CONNECTION: ==========

http_code: 400

http_connect: 000

num_connects: 1

num_redirects: 0

redirect_url:

============= FILE: ==========

content_type: application/json; charset=utf-8

filename_effective: /dev/null

ftp_entry_path:

size_download: 62

size_header: 380

size_request: 110

size_upload: 0

speed_download: 57.000

speed_upload: 0.000

ssl_verify_result: 0

url_effective: https://api.twitter.com/1.1/search/tweets.json?q=mrmidi

=== TIME BREAKDOWN: ==========

time_appconnect: 0.724

time_connect: 0.566

time_namelookup: 0.526

time_pretransfer: 0.724

time_redirect: 0.000

time_starttransfer: 1.078

———-

 

time_total: 1.078

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

Network Interface 우선 순위 변경하기

Ubuntu에서 랜카드를 여러 개 꽂아서 네트워크 인터페이스(Network Interface)가 여러 개 존재할 경우 우선 순위를 바꾸는 방법입니다.

 

먼저 ifmetric를 설치합니다.

 

sudo apt install ifmetric

 

이후 다음 명령어를 이용해 Routing Table을 확인합니다.

 

$ route -n

 

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 10.51.0.1 0.0.0.0 UG 100 0 0 eth0

0.0.0.0 192.168.0.1 0.0.0.0 UG 600 0 0 wlan0

맨 뒤의 Iface 항목이 각 네트워크 인터페이스 이름이며 Metric 항목이 우선 순위라고 생각하면 됩니다. Metric 값이 낮을 수록 우선 순위가 높습니다.

 

ifmetric 명령어를 이용해서 다음과 같이 우선 순위를 변경할 수 있습니다.

 

sudo ifmetric wlan0 50

 

다시 route -n 명령어로 Routing Table을 확인해봅니다.

 

$ route -n

 

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 192.168.0.1 0.0.0.0 UG 50 0 0 wlan0

0.0.0.0 10.51.0.1 0.0.0.0 UG 100 0 0 eth0

우선 순위가 바뀐 것을 확인할 수 있습니다.

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

pdftotext: Linux / UNIX Convert a PDF File To Text Format

Install pdftotext under RedHat / RHEL / Fedora / CentOS Linux

pdftotext is installed using poppler-utils package under various Linux distributions:

 

# yum install poppler-utils

 

 

OR use the following under Debian / Ubuntu Linux

 

$ sudo apt-get update -y

 

$ sudo apt-get install poppler-utils

 

pdftotext syntax

 

pdftotext {PDF-file} {text-file}

 

How do I convert a pdf to text?

Convert a pdf file called hp-manual.pdf to hp-manual.txt, enter:

 

$ pdftotext hp-manual.pdf hp-manual.txt

 

 

Specifies the first page 5 and last page 10 (select 5 to 10 pages) to convert, enter:

 

$ pdftotext -f 5 -l 10 hp-manual.pdf hp-manual.txt

 

 

Convert a pdf file protected and encrypted by owner password:

 

$ pdftotext -opw 'password' hp-manual.pdf hp-manual.txt

 

 

Convert a pdf file protected and encrypted by user password:

 

$ pdftotext -upw 'password' hp-manual.pdf hp-manual.txt

 

 

Sets the end-of-line convention to use for text output. You can set it to unix, dos or mac. For UNIX / Linux oses, enter:

 

$ pdftotext -eol unix hp-manual.pdf hp-manual.txt

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

개요

docker hub에서 저장된 이미지를 하나하나 사용할 수 있지만 자신이 필요한 이미지를 만들기 위해서는 도커 이미지의 커스텀이 필요합니다.

이러한 도커 이미지를 커스텀하기 위한 Dockerfile에 대해서 알아보겠습니다.

Dockerfile

Dockerfile은 도커 이미지 설정 파일으로 내용대로 이미지를 생성해주는 도커 도구로 바로 테스트 프로젝트를 통해서 도커파일에 대해서 알아보겠습니다.

사전 작업

mkdir docker-node-app
cd docker-node-app

도커 파일 생성을 위해서 폴더를 하나 만들어줍니다.

package.json

{ 
 “name”: “docker_web_app”, 
 “version”: “1.0.0”, 
 “description”: “Node.js on Docker”, 
 “author”: “First Last <first.last@example.com>”, 
 “main”: “server.js”, 

“scripts”: { 
 “start”: “node server.js 
}, 
“dependencies”: { 
 “express”: “^4.16.1” 
 } 
}

테스트를 위해서 간단한 node.js 앱을 생성하겠습니다.

위와 같이 package.json을 만들고 npm install을 실행하여 앱을 만들어줍니다.

server.js

'use strict'; 

const express = require('express'); 

// 상수 
const PORT = 8080; 
const HOST = '0.0.0.0'; 

// 앱 
const app = express(); 
app.get('/', (req, res) => { 
  res.send('Hello World'); 
}); 

app.listen(PORT, HOST); 
console.log(`Running on http://${HOST}:${PORT}`);

웹서버 실행 확인을 위해서 server.js를 생성합니다.

Dockerfile 생성

​touch Dockerfile

Dockerfile

FROM node:12 

# 앱 디렉터리 생성 
WORKDIR /usr/src/app 

# 앱 의존성 설치 
COPY package*.json ./ 

RUN npm install 
# 프로덕션을 위한 코드를 빌드하는 경우 
# RUN npm ci —only=production 

# 앱 소스 추가 
COPY . . 

EXPOSE 8080 
CMD [ "node", "server.js" ]

위와 같이 Dockerfile을 생성하고 같은 폴더에 .dockerignore 파일을 만듭니다.

.dockerignore

node_modules
npm-debug.log

 

도커파일에 위와 같이 로컬 모듈과 디버깅 로그를 복사하는 것을 막아서 이미지 내에서 설치한 모듈을 덮어쓰지 않도록 해줍니다.

docker build -t <your username>/node-web-app .

Dockerfile이 있는 폴더에서 위와 같은 명령어로 도커 이미지를 생성합니다.

이미지 실행

-d로 이미지를 실행하면 분리 모드로 컨테이너를 실행해서 백그라운드에서 컨테이너가 돌아가도록 합니다. -p 플래그는 공개 포트를 컨테이너 내의 비공개 포트로 리다이렉트합니다. 앞에서 만든 이미지를 실행하세요.

docker run -p 49160:8080 -d <your username>/node-web-app

생성된 이미지를 실행해주면 웹서버가 실행된 것을 볼 수 있습니다.

​앱 로그 출력

# 컨테이너 아이디를 확인합니다
$ docker ps # 앱 로그를 출력합니다
$ docker logs <container id> # 예시 Running on http://localhost:8080

컨테이너 안에 들어가 봐야 한다면 exec 명령어를 사용할 수 있습니다.

# 컨테이너에 들어갑니다
$ docker exec -it <container id> /bin/bash

테스트

앱을 테스트하려면 Docker 매핑된 앱 포트를 확인합니다.

$ docker ps 

# 예시 
ID            IMAGE                                COMMAND    ...   PORTS 
ecce33b30ebf  /node-web-app:latest  npm start  ...   49160->8080

위 예시에서 Docker가 컨테이너 내의 8080 포트를 머신의 49160 포트로 매핑했습니다.

이제 curl로 앱을 호출할 수 있습니다.(필요하다면 sudo apt-get install curl로 설치하세요.)

$ curl -i localhost:49160 

HTTP/1.1 200 OK 
X-Powered-By: Express 
Content-Type: text/html; charset=utf-8 
Content-Length: 12 
ETag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0" 
Date: Mon, 13 Nov 2017 20:53:59 GMT 
Connection: keep-alive 

Hello world

 

Cheat Sheet

- FROM : 도커를 구성할 기반 이미지 설정

| Docker Documentation

- RUN : 이미지 생성 중 명령 실행

| Docker Documentation

- CMD : 컨테이너 시작 후 명령 실행

| Docker Documentation

- EXPOSE : 포트 노출

| Docker Documentation

- ENV : 환경 변수 설정

| Docker Documentation

- WORKDIR : 작업 폴더 설정

| Docker Documentation

- COPY : 지정된 폴더에 파일 복사

| Docker Documentation

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

개요

도커에 대한 기본 명령어를 치트시트 형태로 보기 쉽게 정리합니다.

 

Containers

Lifecycle

- docker create : 도커 컨테이너 생성

docker create | Docker Documentation

- docker rename : 도커 컨테이너 이름 변경

docker rename | Docker Documentation

- docker run : 도커 컨테이너 시작

docker run | Docker Documentation

- docker rm : 도커 컨테이너 삭제

docker update | Docker Documentation

- docker update : 도커 컨테이너 업데이트

docker update | Docker Documentation

Start and Stop

- docker start : 도커 컨테이너 시작

docker update | Docker Documentation

- docker stop : 도커 컨테이너 정지

docker update | Docker Documentation

- docker restart : 도커 컨테이너 재시작

docker restart | Docker Documentation

- docker pause : 도커 컨테이너 정지

docker restart | Docker Documentation

- docker unpause : 정지된 도커 컨테이너 재시작

docker unpause | Docker Documentation

- docker kill : 도커 컨테이너 종료

docker kill | Docker Documentation

- docker exec : 도커 컨테이너 실행

docker exec | Docker Documentation

Info

- docker ps : 실행 중인 도커 컨테이너 확인

docker ps | Docker Documentation

- docker logs : 도커 컨테이너 로그 확인

docker logs | Docker Documentation

- docker stats : 도커 컨테이너 상태 확인

docker logs | Docker Documentation

Images

Lifecycle

- docker images : 도커 이미지 보기

docker images | Docker Documentation

- docker build : Dockerfile으로 구성된 도커 이미지 생성

docker build | Docker Documentation

- docker commit : 도커 컨테이너를 이미지로 변환

docker commit | Docker Documentation

- docker rmi : 도커 이미지 제거

docker rmi | Docker Documentation

Info

- docker history : 도커 이미지의 변화 내역 보기

docker history | Docker Documentation

- docker tag : 도커 이미지에 태그 설정

docker tag | Docker Documentation

Docker Repository

- docker login : 도커 저장소 로그인

docker login | Docker Documentation

- docker search : 도커 이미지 검색

docker search | Docker Documentation

- docker pull : 도커 이미지 가져오기

docker pull | Docker Documentation

- docker push : 도커 이미지 저장소에 저장

docker push | Docker Documentation

반응형
블로그 이미지

조이풀 라이프

Lift is short, enjoy the life

,

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

,