Zabbix Server Install Manual (자빅스 서버 설치 매뉴얼)


Zabbix

  • 네트워크나 서버(가상)등을 포함한 서비스들을 감시하고 실시간으로 자원을 체크하여 관리자에게 신속히 알리기위한 네트워크 관리 솔루션 소프트웨어 입니다.
  • zabbix 에이전트를 Unix, Linux, Windows 등의 OS에 설치하여 CPU,MEM,파일시스템(용량),특정 TCP 등을 포함한 많은 정보를 포함하여 감시를 할수 있으며 장애대비 모니터링으로써도 탁월합니다.

설치환경

  • OS: CentOS 7 64bit 1708
  • Kernel: 3.10
  • Zabbix: 3.4
  • mariadb: 5.5.56
  • php: 5.4.16
  • Zabbix-server-mysql: 3.4.5
  • zabbix-web-mysql.noarch: 3.4.5

Zabbix 설치

Zabbix Server

Yum 설치를 위한 EPEL 저장소 추가

# yum install epel-release -y
 
Installed:
epel-release.noarch 0:7-9
 
Complete!

Zabbix Package 설치

# rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-1.el7.centos.noarch.rpm
 
Updating / installing...
1:zabbix-release-3.4-1.el7 ################################# [100%]############### webtest11.com End #################

[Zabbix-DB, Zabbix-Web / DB(mariadb) / WEB(Apache) / PHP] yum 으로 한번에 설치

# yum -y install zabbix-server-mysql zabbix-web-mysql mysql mariadb-server httpd php

DB 실행 및 설정

DB 실행 및 프로세스 확인

# systemctl start mariadb
# systemctl enable mariadb
 
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
 
# ps -ef | grep mysql
 
mysql 11918 1 0 12:09 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql 12080 11918 1 12:-0 ? 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root 12134 11523 0 12:09 tty1 00:00:00 grep --color=auto mysql
 

기본설정 (DB 구동된 상태)

# mysql_secure_installation
 
Enter current password for root (enter for none): (패스워드 입력)
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

DB 접속 및 설정

  • 프록시는 생략 가능
# mysql -u root -p
Enter password: (패스워드 입력)
 
MariaDB [(none)]> create database zabbix_server;
MariaDB [(none)]> grant all privileges on zabbix_server.* to zabbix@localhost identified by 'ironman';
 
MariaDB [(none)]> create database zabbix_proxy;
MariaDB [(none)]> grant all privileges on zabbix_proxy.* to zabbix@localhost identified by 'ironman';
 
MariaDB [(none)]> flush privileges;
 
MariaDB [(none)]> exit;

Zabbix 테이블값 정보 데이터베이스에 적용

# cd /usr/share/doc/zabbix-server-mysql-3.4.5
# gunzip create.sql.gz
# ls
AUTHORS COPYING ChangeLog NEWS README create.sql (해당파일)
# mysql -u root -p zbx_server < create.sql
Enter password: (DB ROOT 패스워드 입력)
Zabbix Proxy
  • 프록시 생략 가능
# cd /usr/share/doc/zabbix-proxy-mysql-3.4.6
# gunzip schema.sql.gz
# ls
AUTHORS COPYING ChangeLog NEWS README schema.sql (해당파일)
# mysql -u root -p zbx_proxy < schema.sql
Enter password: (DB ROOT 패스워드 입력)

Config 설정

Zabix Config 설정

# vi /etc/zabbix/zabbix_server.conf
 
(맨 아래 추가)
 
DBHost=localhost
DBName=zabbix_server
DBUser=zabbix
DBPassword=ironman
 
:wq (저장)
Zabbix Proxy
  • 프록시 생략 가능
# vi /etc/zabbix/zabbix_proxy.conf
 
(맨 아래 추가)
 
# 0 - active mode
# 1 - passive mode
ProxyMode=0
Server=[서버 아이피 입력]
Hostname=[원하는 호스트명 입력 예) Zabbix proxy]
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=ironman

PHP Config 설정

# vi /etc/php.ini
max_execution_time = 600
max_input_time = 600
memory_limit = 256M
post_max_size = 32M
upload_max_filesize = 16M
date.timezone = Asia/Seoul (앞에 ; 주석제거후 한국시간으로 설정)
:wq (저장)

iptables 방화벽 포트 허용 및 재시작

# CentOS 7
firewall-cmd --permanent --add-port=10050/tcp
firewall-cmd --permanent --add-port=10051/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
systemctl restart firewalld
 
# CentOS 6
vi /etc/sysconfig/iptables
 
# Zabbix Agent Port
-A INPUT -p tcp -m tcp --dport 10050 -j ACCEPT
# Zabbix Server Port
-A INPUT -p tcp -m tcp --dport 10051 -j ACCEPT
# Zabbix Web Port
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# 포트 변경시 그에 맞춰 변경
 
service iptables restart

Apache & Zabbix 서버 구동

Apache Server 구동 및 재부팅시 자동시작 처리

#systemctl start httpd
#systemctl enable httpd

Zabbix Server 구동 및 재부팅시 자동시작 처리

#systemctl start zabbix-server
#systemctl enable zabbix-server

Zabbix 서버 웹으로 접속

  • http://localhost/zabbix
  • 하단의 설정 DB설정/server details 설정 후
  • 관리자 페이지 로그인(admin/zabbix)
  • VM일경우 ifconfig를 통해 inet 주소/zabbix, 연결이 안될경우 NAT 혹은 BRIDGE 방식 등의 관련하여 VM에서 웹서버 접속하는 법 찾기

Configure DB connection

  • 웹 관리자 페이지의 DB 설정을 위의 mariaDB에서 zabbix-server 설정한 것과 동일하게 설정
  • Database type: MySQL
  • Database host: localhost
  • Database port: 0
  • Database name: zabbix_server
  • User: zabbix
  • Password: ironman

Zabbix server details

  • Host: localhost
  • Port: 10051
  • Name: (웹 페이지 접속시 보여주고 싶은 메인페이지 명)

Trouble Shooting

아파치 80 Port 막혀서 웹페이지 안 뜰 경우

# 80 포트 방화벽 추가 확인
# 방화벽 확인
netstat -nlp | grep 80
 
# iptables 등록 확인
iptables -nL | grep 80
 
# 등록되어있을 경우 포트 변경
vi /etc/httpd/con/httpd.conf
Listen 다른 포트
# 다른 포트 방화벽 등록
위의 방화벽 포트 허용 및 재시작 부분 참고

SElinux

# SElinux 해제
vi /etc/sysconfig/selinux
SELINUX=disabled
 
reboot
 
# reboot 해도 SElinux 활성화 되어있을 경우
vi /etc/grub.conf
kernel ..., selinux=0 # 맨뒤에 selinux=0 추가
 
# SElinux 활성화 된 상태에서 등록
 
vi /etc/zabbix/zabbix_agent_t.te
 
# 아래 내용 신규 생성된 파일에 추가 후 저장/종료 (:wq)
module local-zabbix 1.0;
 
require {
    type zabbix_agent_t;
    class process setrlimit;
}
 
#============= zabbix_agent_t ==============
allow zabbix_agent_t self:process setrlimit;
 
:wq
 
semanage permissive -a zabbix_agent_t

이것이 자바다 리뷰

이것이 자바다

부제: 신용권의 Java 프로그래밍 정복
이것이 자바다
* 저자 : 신용권
* 출간 : 2015-01-06
* 페이지 : 1224 쪽
* ISBN : 9788968481475
* 물류코드 :2147


이것이자바다 상세정보




  ‘이것이 자바다’는 비전공자로 국비지원 학원에서 자바를 시작하면서 교재로 사용한 책이다. 학원을 다니기 전에 자바를 독학할 때 ‘자바의 정석(2판)’을 봤었는데, 고등학교 때 보던 수학의 정석의 악몽이 생각나던 스타일이었다. 그만큼 정석적으로 자바에 대해서 상세하게 잘 설명한 책이기도 하지만 책의 표지만큼 딱딱했던 느낌을 지울 수 없었다.
  그러나 ‘이것이 자바다’는 표지부터 세련되었다. 흰 바탕에 우주항공에서 나올 법한 스케치 그림과 파란색 타이틀은 시원하면서도 뭔가 있구나 싶었다. 아마 학원에서 공부를 막 시작했던 설렘을 담아서 그랬던 것일지도 모르겠다.
  처음 책을 보면 저자소개와 서문, 목차부터 보게된다. 저자 신용권씨는 20년이 넘은 경력을 가진 개발자고 삼성멀티캠퍼스 자바 전임교수를 거쳐 현재는 SK Planet에서 운영하는 T 아카데미에서 강사로 활동 중이시다. 실무 경험과 탄탄한 강사 커리어를 겸비하셔서 그런지 여러 노하우들이 책 속에 베어있다.
이 책은 2권으로 구성되어있는데 목차를 보면 1권에는 언어의 기본 문법과 자바의 핵심인 JVM 메모리 구조와 OOP를 구현하는 클래스, 인터페이스 등을 설명한다. 2권에서는 Advanced한 개념으로 컬렉션 프레임워크와 쓰레드, NIO 등이 나온다. 특히 자바의 정석에서는 없던 JavaFX와 자바8 문법도 설명해줘 더 좋았던 것 같다.

  책도 쉽게 읽히고 정리하기에도 편하게 개념을 설명해준다. 개인적으로 헤드퍼스트 시리즈는 이샇안 스토리를 엮으면서 개념을 정리하기 힘들었었는데 ‘이것이 자바다’는 아주 좋았다. 블로그 글도 대부분 이 책을 참고한 것이다. 특히, 참조 객체 파트로 들어가면서 육각형으로 표현된 메모리 주소를 통해 값이 아닌 주소를 참조하는 것에 대해 잘 설명하고 있다. 당시에는 잘 몰랐던 JVM 구조에 대해서 알 수 있었다. (얼마나 중요한 개념이었는지는 나중에야 알았다.)
  지금은 자바 개발자로 일하고 있지만, 무언가 부족함을 느낄 때 항상 책을 찾아보게 된다. 그 어떤 구글링을 통해 보는 글 보다 잘 정리되어 있다. (물론 더 깊게 알기 위해해선 구글링도 필요하다!)

  당시에는 이용하지 않았지만, 저자가 운영하는 카페에서 인터넷 강의도 있고 질문에 답변도 잘 달아주신다. 또, 이벤트를 통해 프로그래밍 콘테스트 같은 것도 하고 있어 혼자 공부하는 사람들에게도 동기부여가 되어 끝까지 공부할 수 있게 도와준다.


자바를 시작한다면 꼭 읽어보라고 권해주고 싶은 책이다. 읽고나면 아, 이것이 자바구나라고 탄성을 자아내는 책이다.

올초부터 make 님의 기반기술세미나 에 참가하여 공부를 하다보니

새해 계획의 꾸준한 블로그 업데이트와 알고리즘 코딩 및 깃헙 커밋, 오픈소스 컨트리뷰트 등은 거의 하질 못하고 있습니다.

(결혼 준비에 게임도 꾸준히 하는건 비밀)


기반기술세미나에서는 비전공자 개발자로서 부족함을 느꼈던 

CS Fundamental (어셈블리, 운영체제, 네트워크, 시스템 프로그래밍, 자료구조, 리눅스 등)을 배우고 있어요.


매주 토,일 2시간씩 하기에 이 모든 것을 놀면서 하려니 벅차네요.

(어셈블리 서적만 3권에 관련 아티클 2~3개 읽어야 하고 ARM CPU 설계도에 C언어, TCP/IP 강의 등....)


일단 9월까지 예정된 세미나 잘 듣고, 연말에는 복습하면서 블로그에 정리할 생각입니다.


사실 4월까지 하기로 했었는데 멤버들 진도가 좀 늦어서 9월까지 하기로 됐거든요. 

근데 제가 4월에 끝날 줄 알고 6~7월 스프링 스터디를 잡아버려서 이중고지만.. 둘다 잘 해보겠습니다.


스프링 스터디는 토비의 스프링 3.1 요약 발표 형식이라, 나중에 스터디 끝나고 스프링 블로그 글도 잘 정리해서 올리겠습니다.


그리고 내년에 2년차 개발자가 되는데, 3년차까지 1년 남았네요.

올해는 기본기를 탄탄히 했으니 내년에 알고리즘과 개인 프로젝트를 통해 더 레벨업 할 생각입니다.



저도 여러 좋은 분들의 블로그에서 도움을 받았듯이, 부족하지만 이 곳에서 제 글들도 누군가에게 도움이 되었으면 합니다.

부족함이 많은 글들이라 부끄럽지만 더 노력하여 개선해가겠습니다.


스프링의 소개

스프링이란?

  • 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
  • EJB(Enterprise Java Beans)의 단점을 보완한 프레임 워크
  • DI(Dependency Injection, 의존성 주입)과 AOP(Aspect-Oriented Programing, 관점 지향 프로그래밍)이 지원되는 경량 컨테이너 & 프레임워크


  • 자바 플랫픔으로서 자바 애플리케이션을 개발하는데 필요한 하부 구조를 포괄적으로 제공한다.
  • 스프링이 하부 구조를 처리하므로 개발자는 애플리케이션 개발에 집중할 수 있다.

경량화

  • 스프링 자체가 가볍거나 작은 규모의 코드로 이루어진 것은 아니다.
  • 오히려 스프링은 20여개의 모듈로 세분화되고 복잡하고 방대한 코드를 가진 프레임워크이다.
  • 경량화가 특징인 이유는 기존 자바 엔터프라이즈 기술의 불필요한 복잡함에 반대되는 개념에서 시작되었다.
  • 주류 기술이었던 EJB는 고가의 무거운 자바 서버(WAS)가 필요했고, 다루기 힘든 설정파일 구조, 패키징, 불편한 배포 등이 단점이었다.
  • 반면, 스프링은 톰캣과 같은 단순한 서버환경에서도 동작하며, 단순한 개발환경으로도 엔터프라이즈 애플리케이션 개발하는데 충분하다.
  • 또 EJB 등의 기존 프레임워크에서 만들어진 코드에 비해 코드량이 적고 단순하기도 하다.
  • 즉, 기존에 비해 빠르고 간편하게 애플리케이션을 개발할 수 있어 생산성이 뛰어난 프레임워크다.

스프링 기능

  • 경량 컨테이너로서 자바 객체를 직접 관리
    • 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
  • POJO(Plain Old Java Object) 방식의 프레임워크
    • 일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.
  • 제어 반전(또는 제어의 역전)(IoC: Inversion of Control)을 지원
    • 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
  • 의존성 주입(DI: Dependency Injection)을 지원
    • 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
  • 관점 지향 프로그래밍(AOP: Aspect-Oriented Programming)을 지원
    • 트랙잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
  • 확장성이 높음
    • 스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하다.
    • 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.
  • 다른 프레임워크들의 통합

스프링의 구성

  • Spring Core
    • Core 컨테이너 기능
    • Spring 프레임워크의 근간이 되는 IoC (또는 DI) 기능을 지원하는 영역
    • BeanFactory를 기반으로 Bean 클래스들을 제어할 수 있는 기능을 지원한다.
  • Spring Context
    • Spring Core에서 지원하는 기능외에 추가적인 기능들과 좀 더 쉬운 개발이 가능하도록 지원한다.
    • 또, JNDI, EJB 등을 위한 Adaptor들을 포함하고 있다.
  • AOP
    • Spring 프레임워크에 AOP를 지원하는 기능이다.
  • DAO
    • JDBC 기반하의 DAO 개발을 좀 더 쉽고, 일관된 방법으로 개발하는 것이 가능하도록 지원한다.
  • ORM
    • Object-Relational Mapping 프레임워크인 Hibernate, MyBatis, JDO와의 결합을 지원하기 위한 기능이다.
  • Spring Web
    • Web Application 개발에 필요한 Web Application Context와 MultipartRequest 등의 기능을 지원한다.
  • Portlet
    • 포탈 서버에서 돌아가는 독립된 웹 애플리케이션 원격 지원 기능

스프링 창시자

  • 스프링의 창시자인 로드 존슨(Rod Johnson)
    • 2003년 『Expert One-on-One J2EE Design and Development』책을 출간하여 JE22 애플리케이션 설계와 독창적인 개발 전략을 다루었다.
    • “항상 프레임워크 기반으로 접근하라”를 강조하였다.

오픈소스

  • 스프링은 아파치 라이선스 2.0(Apache License Ver 2.0)을 따른다.
    • 영리 목적 및 비공개 프로젝트에 자유롭게 이용가능하다.
    • 스프링을 사용하고 원 저작자를 밝히고 라이선스 정보를 포함시키는 등의 의무사항을 지켜야 한다.
  • 오픈소스는 무료로 이용할 수 있고 소스코드가 모두 공개되어 수많은 다양한 환경의 개발자들이 사용하므로 테스트에 용이하고, 빠른 피드백을 받을 수 있는 장점이 있다.
  • 반면, 오픈소스 프로젝트 팀의 사정 상 개발이 여의치 않을 경우 프로젝트가 중단에 드랍되거나 버그 수정에 많은 시간이 소요될 수도 있다.
  • 특히 스프링은 애플리케이션 프레임워크로 그 규모가 일반 오픈 소스 프로젝트에 비해 크고 엔터프라이즈 개발자들에게는 중요한 프레임워크이므로 오픈 소스의 문제점을 안고 가기에는 부정적이었다.
  • 그래서 로드 존슨과 스프링 오픈소스화의 대표적 공로자인 유겐 흴러(Juergen Hoeller)와 자바 엔터프라이즈에서 최상급 개발자들이 스프링 소스(SpringSource)를 만들어 스프링 프레임워크의 실질적인 개발을 책임지고 있다.
  • 스프링 소스는 2009년 세계적인 IT업체인 VMware가 인수하여 더욱 안정적인 환경에서 개발되고 있다.


Application Context

  • 전체 계층구조에서 최상단에 위치한 컨텍스트
  • 서로 다른 서블릿 컨텍스트에서 공유해야하는 Bean들을 등록해놓고 사용할 수 있다.
  • 웹 애플리케이션 전체에 적용 가능한 프로퍼티, DB 연결, 로깅 기능 등에 이용한다.
  • Servlet Context에 등록된 Bean은 이용할 수 없다.
  • Servlet Context에 동일한 Bean이 있을 경우 Servlet Context Bean이 우선된다.
  • 하나의 컨텍스트에 정의된 AOP 설정은 다른 컨텍스트의 Bean에는 영향을 미치지 않는다.
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:egovframework/spring/com/applicationContext-*.xml</param-value>
  </context-param>

Servlet Context

  • 서블릿에서만 이용되는 컨텍스트
  • 다른 서블릿과 공유하기 위한 Bean들은 Application Context에 등록해놓고 사용해야 한다.
  • DispatcherServlet은 자신만의 컨텍스트를 생성, 초기화하고 동시에 Application Context를 찾아서 자신의 부모 컨텍스트로 사용한다.
<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/config/egovframework/springmvc/*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

IoC 컨테이너 구성방법

  1. Application Context만 이용
  2. Servlet Context만 이용
  3. Application ContextServlet Context 하나씩 이용
  4. Application ContextServlet Context여러 개 이용
  5. 여러 Application ContextServlet Context 하나 이용
    • Application Context 설정을 목적에 맞게 분류 (Property, Validation, sqlMap, datasource, aop 등)

Component Scan 사용시 컨텍스트 설정 방법

  • Application Context에 Service, Repository, Servlet Context에 Controller만 등록해야한다.
  • Application Context 설정

    • Service와 Repository는 Include 하고 Controller는 Exclude 한다.
      <context:component-scan base-package="egovframework">
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
      </context:component-scan>
  • Servlet Context 설정

    • Service와 Repository는 Exclude 하고 Controller는 Include 한다.
      <context:component-scan base-package="egovframework">
          <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
          <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
      </context:component-scan>
  • 이렇게 설정하는 이유는 스프링이 Transaction을 적용하기 위해서이다.
  • 스프링 트랜잭션은 AOP를 이용해서 해당 빈의 proxy를 만들어서 tx가 적용되는 bean을 바꿔치기 한다. 그러면 원래 @Service(또는 @Transactional) 어노테이션이 붙은 빈은 뒤로 숨고 tx가 적용된 proxy bean이 @Service가 붙은 bean으로 대치된다.
  • 만약 Application ContextServlet Context가 모든 stereotype의 컴포넌트를 풀 스캔 할 경우, tx 설정은 Application Context에만 적용되어 있기 때문에 Application Context의 @Service는 트랜잭션이 적용이 되지만 Servlet Context의 @Service는 트랜잭션이 적용이 안된다.
  • Bean 객체는 Servlet Context가 우선되므로 @Controller가 동작하여 같은 context(Servlet Context)안에서 검색을 하고, @Service가 지정된 bean이 있으므로 이 bean을 사용한다. 이 @Service가 지정된 bean은 트랜잭션 적용이 안 되어 있어 트랜잭션 처리가 안된다.

DROP문

  • 테이블을 삭제하는 명령어
  • 테이블의 구조와 데이터를 모두 삭제하므로 사용에 주의해야 한다.
  • 삭제하려는 테이블의 기본키를 다른 테이블에서 참조하고 있다면 삭제가 거절된다.(제약조건 위배)
  • 참조하는 테이블부터 삭제하거나 CASCADE CONSTRAINTS 옵션을 사용하여 무결성 제약조건을 동시에 삭제하면 된다.
  • 테이블을 삭제하면 테이블의 컬럼에 대해 생성된 인덱스도 함께 삭제된다.
  • 삭제된 테이블과 관련된 뷰와 시노님은 invalid 상태가 된다.
  • 형식
    DROP TABLE 테이블이름 [CASCADE CONSTRATINS] [PURGE]

ALTER문

  • 객체에 대한 모든 변경을 위해 사용
  • 생성된 테이블의 속성과 속성에 관한 제약, 그리고 기본키 및 외래키를 변경한다
형식
ALTER TABLE 테이블이름
    [ADD 속성이름 데이터타입] -- 컬럼 추가
    [DROP COLUMN 속성이름] -- 컬럼 삭제
    [MODIFY 속성이름 데이터타입] -- 컬럼 수정
    [MODIFY 속성이름 데이터타입 [NULL | NOT NULL]] -- 컬럼 수정 (널 허용/비허용)
    [ADD PRIMARY KEY(속성이름)] -- 기본키 추가
    [[ADD | DROP] 제약이름] -- 제약조건 추가 또는 삭제

ALTER TABLE

  • 새로운 컬럼을 추가, 삭제 변경할 수 있다.
  • 새로운 컬럼을 추가하면 기존의 테이블의 마지막 컬럼이 된다.

 

추가 

수정 

삭제 

 column

가능

가능

가능 

constraint 

가능 

불가능 

가능 



ALTER TABLE ADD

  • 테이블에 컬럼 추가 또는 컬러멩 constraint(제약조건)이 없을 경우 constraint를 추가하는데 사용한다.
  • 컬럼 추가시 테이블의 행이 존재한다면, 새로 추가되는 컬럼은 이미 존재하는 모든 행의 값을 NULL로 초기화한다.
  • 컬럼추가 형식
ALTER TABLE 테이블명
    ADD (컬럼명 데이터타입 [DEFAULT 값] [, 컬럼명 데이터타입] .... );
  • 제약조건(Constraint) 추가 형식
ALTER TABLE 테이블명
    ADD (컬럼명 데이터타입 CONSTRAINT constraint명 constraint실제값
    [, 컬럼명 데이터타입]...);
  • 한 번의 ADD 명령으로 여러 개의 컬럼 추가 가능하고, 하나의 컬럼만 추가하는 경우에는 괄호를 생각해도 된다.
  • CONSTRAINT 변경 여부 확인은 USER_CONSTRAINTS 뷰를 사용하여 확인할 수 있다.
  • CREATE TABLE AS….와 같은 서브쿼리를 사용하여 만든 테이블은 NOT NULL만 복사되며, PRIMARY KEY와 같은 제약조건은 복사되지 않는다.
  • 그러므로 서브쿼리로 만든 테이블에 CONSTRAINT를 추가해 주어야 한다.
  • 추가된 컬럼은 테이블의 마지막 부분에 생성되며 사용자가 컬럼의 위치를 지정할 수 없다.
  • 추가된 컬럼에도 기본 값을 지정할 수 있다.
  • 기존 데이터가 존재하면 추가된 컬럼 값은 NULL로 입력 되고, 새로 입력되는 데이터에 대해서만 기본 값이 적용된다.

ALTER TABLE MODIFY

  • 테이블의 컬럼을 변경하고자 할 때 사용
  • 형식
ALTER TABLE 테이블명
    MODIFY (컬럼명 데이터타입 [DEFAULT 값] [, 컬럼명 데이터타입] ... );
  • 데이터의 타입, 크기, 기본값을 변경할 수 있다.
  • 변경 대상 컬럼에 데이터가 없거나 NULL 값만 존재할 경우에만 SIZE를 줄일 수 있다.
  • 데이터 타입의 변경은 CHAR와 VARCHAR2 상호간의 변경만 가능하다.
  • 컬럼 크기의 변경은 지정된 데이터의 크기보다 같거나 클 경우에만 가능하다.
  • NOT NULL 컬럼인 경우에는 크기의 확대만 가능하다.
  • 컬럼의 기본값 변경은 그 이후에 삽입되는 행부터 영향을 준다.
  • ALTER TABLE … MODIFY를 이용하여 CONSTRAINTS를 수정할 수 없다.

 구분

데이터 타입 변경 가능사항 

크기

 NULL 컬럼

문자 숫자 날짜

확대, 축소 가능 

NOT NULL 컬럼 

CHAR VARCHAR2

확대만 가능

ALTER RENAME COLUMN

  • 컬럼명 변경
  • 형식
ALTER TABLE 테이블명
    RENAME COLUMN 기존컬럼명 TO 변경할컬럼명;

ALTER TABLE DROP COLUMN 컬럼명

  • 특정 테이블의 컬럼을 삭제
  • 형식
ALTER TABLE 테이블명
    DROP COLUMN 컬럼명;
  • 컬럼을 삭제하면 해당 컬럼에 저장된 데이터도 함께 삭제된다.
  • 한번에 하나의 컬럼만 삭제할 수 있다.
  • 삭제 후 테이블에는 적어도 하나의 컬럼은 존재해야 한다.
  • DDL문으로 삭제된 컬럼은 복구할 수 없다.


+ Recent posts