본문 바로가기

LINUX 프로그래밍

LINUX에 SQL 서버 운용 -1-

***********************************************************
* MySQL 서버
***********************************************************
* MySQL 실행과 종료
- MySQL 실행
사용형식 : /usr/local/mysql/bin/mysqld_safe [각종 옵션들] &
- MySQL 종료
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p shutdown
* MySQL 기본관리
- MySQL 접속
사용형식 : /usr/local/mysql/bin/mysql -u MySQL_계정명 -p 접속할_데이터베이스명 -h 접속할 호스트이름 -P 접속포트번호 -S /tmp/mysql.sock
           mysql                 : MySQL 데이터베이스로 접속하기 위한 MySQL 클라이어트 프로그램
    -u                    : 접속할 MySQL 계정(사용자)명을 지정하기 위한 옵션
    MySQL_계정명          : 데이터베이스로 접속할 MySQL의 사용자(계정)명
    -p                    : 패스워드를 입력하기 위한 옵션(패스워드가 없을 경우에 생략가능함)
    접속할_데이터베이스명 : 접속 후 사요할 데이터베이스명
    -h                    : 접속할 호스트이름
    -P                    : 접속할 포트번호
    -S                    : 접속할 MySQL 소켓파일 위치 지정
# /usr/local/mysql/bin/mysql -u root -p mysql
Enter password: ********
# /usr/local/mysql/bin/mysql -u picasso -p picasso_db
Enter password: ********
# /usr/local/mysql/bin/mysql -u root -p'12345678' mysql
# /usr/local/mysql/bin/mysql -u user -p'11111111' user_db
# /usr/local/mysql/bin/mysql -u ruser -p ruser_db -h 192.168.0.111 -P 3306
Enter password: ********
- 패스워드 재설정
사용형식 : /usr/local/mysql/bin/mysqladmin -u 계정명 password 변경할_패스워드
# /usr/local/mysql/bin/mysqladmin -u root password 12345678 -> 기존에 패스워드가 존재하지 않을 때
Enter password: ********
# /usr/local/mysql/bin/mysqladmin -u root -p password 12345678 -> 기존에 패스워드가 존재할 때
Enter password: ********
# /usr/local/mysql/bin/mysqladmin -u user -p password 11111
Enter password: ********
# /usr/local/mysql/bin -u root -p'12345678' mysql
mysql> update user set password = password('12345678') where user = 'root';
mysql> set password for root = password('2345');
- 쉘상태에서 특정파일에 저장된 SQL문 실행하기
# /usr/local/mysql/bin -u user -p user_db < /home/user/user.sql
Enter password: ********
- 새로운 MySQL 사용자를 위한 MySQL 설정
mysql> create database user_db;
mysql> grant all on user_db.* to user@'localhost' identified by 'password';
## mysql> revoke all on user_db.* from user@'localhost';
## mysql> revoke all on user_db.* from user;
## mysql> delete from mysql.user where user = 'user';
* MySQL 패스워드 복구
1. 실행중인 MySQL을 종료한다.
# ps -ef | grep mysqld
# killall mysqld
2. table grant 권한없이 MySQL을 실행한다.
# /usr/local/mysql/bin/mysqld_safe --skip-grant-table &
3. 패스워드없이 MySQL root 계정으로 MySQL에 접속한다.
# /usr/local/mysql/bin/mysql -u root mysql -> 패스워드 지정 안함
4. UPDATE 문으로 MySQL root사용자의 패스워드를 변경한다.
mysql> update user set password = password('12345678') where user = 'root';
5. "flush privileges"로 MySQL데이터들을 동기화한다.
mysql> flush privileges;
6. MySQL을 빠져나와서 실행했던 MySQL을 종료한다.
# killall mysqld
# /usr/local/mysql/bin/mysqladmin -u root shutdown
7. 일반적인 방법으로 MySQL을 실행한다.
# /usr/local/mysql/bin/mysqld_safe --skip-grant-table &
8. 패스워드를 사용하여 MySQL의 root계정으로 접속하여 확인한다.
* "too many connections" 에러 해결방법
원인: 이에 대한 원인을 설명하기 위해서는 php에서 사용하는 MySQL 연결함수인 mysql_connect()와 mysql_pconnect의 차이점 그리고, mysql_close()함수에 대한 정확한 이해가 필요하다.
      mysql_connect()함수를 이용하여 MySQL에 연결하였다면 해당 스크립트가 종료됨과 동시에 mysql_close()함수를 호출하지 않았다 하더라도 자동으로 연결이 종료된다.
      하지만, mysql_pconnect()함수는 해당 스크립트가 종료된 후 mysql_close()함수가 호출되어도 연결이 끊어지지 않은 채로 계속 연결을 유지하고 있다.
      따라서, 얼핏보기에는 "too many connections"라는 에러메시지는 mysql_pconnect()라는 함수의 사용때문에 발생하는 것 같지만 (물로 그런 이유도 있을 수 있지만) 근본적인 원인은 이와 다를 수 있다.
      결론적으로 "mysqladmin -u -p variables"의 결과로서 볼 수 있었던 MySQL의 환경변수값들 가운데 "wait_timeout"의 값만큼 서버에 그대로 연결을 유지한 채로 남아있는 것이다.
      따라서, 이것이 "too many connections" 에러가 발생하는 긍극적인 원인이 되는 것이다.
      이를 해겨하면 MySQL이 빠른 응답을 할 수 있도록 서버 하드웨어 사양(CPU, 메모리 등)을 높이는 방법도 있겠지만 급하게 조치해야하는 경우에는 MySQL의 필요한 변수의 값을 보다 높게 설정하는 방법이 현명할 것이다.
      "mysqladmin -u root -p variables"라고 하면 MySQL의 전체 환경변수의 값을 확인할 수 있다.
      이들 MySQL 환경변수 가운데 다음 3가지의 값을 현재보다 높게 설정함으로서 "too many connection" 에러를 응급초지할 수 있다.
      - max_connection : MySQL에 connect할 수 있는 최대 개수
      - table_cache    : MySQL의 테이블 캐쉬크기
      - wait_timeout   : MySQL에 connect하여 쿼리를 지속할 수 있는 시간
      # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep max_connections
      | max_connections                 | 100                                   |
      # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep table_cache
      | table_cache                     | 64                                    |
      # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep wait_timeout
      | innodb_lock_wait_timeout        | 50                                    |
      | table_lock_wait_timeout         | 50                                    |
      | wait_timeout                    | 28800                                 |
      # /usr/local/bin/mysqld_safe -O max_connections=500 -O table_cache=256 -O wait_timeout=57600 &
* MySQL 관리자 전용 유틸리티 mysqladmin
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p 명령어
- 새로운 데이터베이스 생성하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p create 새로운_데이터베이스명
# /usr/local/mysql/bin/mysqladmin -u root -p create user_db2
Enter password: ********
- 특정 데이터베이스 삭제하기
사용형식: /usr/local/mysql/bin/mysqladmin -u root -p drop 삭제할_데이터베이스명
# /usr/local/mysql/bin/mysqladmin -u root -p drop user_db2
Enter password: ********
- MySQL 권한테이블 갱신하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p reload
# /usr/local/mysql/bin/mysqladmin -u root -p reload
Enter password: ********
- MySQL에 접속한 사용자 확인하기
사용형식: /usr/local/mysql/bin/mysqladmin -u root -p processlist
# /usr/local/mysql/bin/mysqladmin -u root -p processlist
- 접속되어 있는 MySQL 사용자(thread) 접속 끊기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p kill 쓰레드번호
# /usr/local/mysql/bin/mysqladmin -u root -p processlist -> 종료시킬 쓰레드 확인
# /usr/local/mysql/bin/mysqladmin -u root -p kill 8  -> Id가 8인 쓰레드 종료
- MySQL의 간단한 실행정보 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p status
# /usr/local/mysql/bin/mysqladmin -u root -p status
Uptime: 2095884  Threads: 12  Questions: 2578614  Slow queries: 0  Opens: 0  Flush tables: 1  Open tables: 138  Queries per second avg: 1.230
- MySQL의 현재 상황 자세히 살펴보기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p extended-status
# /usr/local/mysql/bin/mysqladmin -u root -p extended-status
- MySQL의 환경변수를 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p variables
# /usr/local/mysql/bin/mysqladmin -u root -p variables
- 현재 MySQL의 정확한 버전과 여러 가지 실행정보 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p version
# /usr/local/mysql/bin/mysqladmin -u root -p version
- MySQL이 죽었는지 살았는지 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p ping
# /usr/local/mysql/bin/mysqladmin -u root -p ping
* MySQL 로그
- 쿼리로그 옵션 형식 : --log=쿼리로그파일명
                       이 형식을 사용하면 MySQL 데이터 디렉토리에 "쿼리로그파일명"으로 지정된 로그파일이 생성되며 SQL 쿼리로그를 기록한다.
- 바이너리로그 옵션 형식 : --log-bin=바이너리로그파일명
                           바이너리로그를 보기위해서는 /usr/local/mysql/bin/mysqlbinlog 명령어를 사용해야 한다.
      이 형식을 사용하면 MySQL 데이터디렉토리에 "바이너리로그파일명"으로 지정된 바이너리로그파일이 생성되면 MySQL데이터의 변경내역을 기록한다.
- SLOW쿼리 옵션 형식 : --log-slow-queries=SLOW쿼리파일명
                       이 형식을 사용하면 MySQL 환경변수 "long_query_time"에 초단위로 지정된 시간보다 초과하는 쿼리문만을 기록한다.
* 텍스트파일의 데이터를 MySQL의 특정 데이터베이스로 입력하기
사용형식 : /usr/local/mysql/bin/mysqlimport -u MySQL사용자 -p 데이터베이스명 텍스트파일명
           이 형식으로 실행하면 "텍스트파일명"에 저장되어 있는 데이터가 "데이터베이스명"의 특정 "테이블"의 데이터로 입력된다.
    위의 형식에서 데이터가 저장될 테이블이름은 "텍스트파일명"과 동일한 테이블이 된다.
    위의 형식에서 "텍스트파일명"은 "테이블명"과 동일한 이름이어야 한다.
    또한 저장될 테이블은 이미 생성되어 있어야 한다.
# cat addressbook
PARKSUNGSOO 011-111-2222 SEOUL A+
JUNGWOOYOUNG 011-222-3333 SEOUL B+
LEEJAESUK 016-222-1111 BUSAN C+
CHOYUEJIN 019-333-4444 BUSAN D+
# /usr/local/mysql/bin/mysqlimport -u root -p user_db2 addressbook
Enter password: ********
user_db2.addressbook: Records: 4 Deleted: 0 Skipped: 0 Warning: 0
* MySQL 데이터베이스 스키마 확인
사용형식 : /usr/local/mysql/bin/mysqlshow [옵션] [데이터베이스 [테이블 [컬럼]]]
           1. 위의 형식에서 특정 데이터베이스명이 주어지지 않는다면 MySQL내에 존재하는 모든 데이터베이스들을 나열한다.
    2. 위의 형식에서 특정 테이블명이 주어지지 않는다면 지정된 데이터베이스내의 모든 테이블들을 나열한다.
    3. 위의 형식에서 특정 컬럼이 주어지지 않는다면 지정된 테이블내에 존재하는 모든 컬럼들과 컬럼타입들을 나열한다.
- MySQL에 존재하는 모든 데이터베이스들 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p
mysql> show databases;
- 특정 데이터베이스의 테이블들 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p user_db
mysql> use user_db;
mysql> show tables;
- 특정 테이블의 컬럼정보들 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p user_db addressbook
mysql> use user_db;
mysql> show columns from addressbook;
mysql> desc addressbook;
- 특정 테이블의 하나의 컬럼만 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p user_db addressbook name
* MySQL 데이터베이스 데이터 백업과 복구
- /usr/local/mysql 디렉토리 전체를 압축백업하기
# cd /usr/local
# tar cvfpz /backup/mysql.tar.gz mysql
- MySQL 데이터 백업하기
사용형식1 : /usr/local/mysql/bin/mysqldump [옵션] DB [TABLES ..] > 파일명
            DB는 백업대상이 되는 데이터베이스명이고 TABLES는 지정한 백업대상 데이터베이스내에 존재하는 테이블명이다.
     이 백업의 의미는 DB의 데이터베이스내에 존재하는 테이블의 내용을 백업해서 "파일명"에 저장하라는 의미이다.
사용형식2 : /usr/local/mysql/bin/mysqldump [옵션] --databases [옵션] DB1 [DB2 ..] > 파일명
            --databases라는 옵션에 의해 DB1 DB2 의 데이터베이스들을 백업하여 "파일명"에 저장한다.
     즉 백업대상이 되는 데이터베이스가 2개 이상이 될 때에는 --databases 옵션을 사용하고 그 뒤에 백업할 데이터베이스를 지정한다.
사용형식2 : /usr/local/mysql/bin/mysqldump [옵션] --all-databases [옵션] > 파일명
            --all-databases라는 옵션은 MySQL내에 존재하는 모든 데이터베이스를 백어밷상으로 한다는 의미이다.
- 특정 데이터베이스 데이터 백업과 복구
백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p 백업대상_데이터베이스명 > 저장할_파일명
복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p 복구할_데이터베이스명 < 저장한_파일명
# /usr/local/mysql/bin/mysqldump -u root -p mysql > mysql.sql
# /usr/local/mysql/bin/mysql -u root -p mysql < mysql.sql
# /usr/local/mysql/bin/mysqldump -u user -p user_db > user_db.sql
# /usr/local/mysql/bin/mysql -u user -p user_db < user_db.sql
- 특정 데이터베이스의 특정 테이블의 백업과 복구
백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p 데이터베이스명 테이블명 > 저장할_파일명
복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p 데이터베이스명 < 저장한_파일명
# /usr/local/mysql/bin/mysqldump -u user -p user_db addressbook > addressbook.sql
# /usr/local/mysql/bin/mysql -u user -p user_db < addressbook.sql
- 여러 개의 데이터베이스 한번에 백업과 복구
백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p --databases [옵션] DB1 [DB2 ..] > 저장할_파일명
          CREATE DATABASE문과 USE문이 추가되어 있다.
복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p < 저장한_파일명
# /usr/local/mysql/bin/mysqldump -u user -p --databases user_db user_db2 > user_dbs.sql
# /usr/local/mysql/bin/mysql -u user -p < user_dbs.sql
-- MySQL 전체 데이터베이스 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p --all-databases > 저장할_파일명
# /usr/local/mysql/bin/mysqldump -u root -p --all-databases > all_dbs.sql
- 기존 테이블을 삭제후 백업된 파일로 복구하기 위한 백업방법
  mysqldump문으로 데이터베이스 백업시에 각각의  CRETE TABLE문 앞에 DROP TABLE문 삽입하기
# /usr/local/mysql/bin/mysqldump -u user -p --add-drop-table user_db > user_db.sql
# /usr/local/mysql/bin/mysql -u user -p user_db < user_db.sql
- 데이터베이스 백업시 에러발생율 무시하고 계속 진행하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -f DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -f user_db > user_db.sql
- 원격서버의 MySQL 데이터베이스 백업하기 #1(기본포트 사용)
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -h 호스트명(IP주소) DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -h 192.168.0.111 user_db > user_db.sql
- 원격서버의 MySQL 데이터베이스 백업하기 #2(특정 포트번호 지정)
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -h 호스트명(IP주소) -P 포트번호 DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -h 192.168.0.111 -P 22222 user_db > user_db.sql
- 데이터 백업시 CREATE DATABASE 문을 생략하여 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -n [옵션] DB명 > 파일명
           /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-create-db [옵션] DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -n --databases user_db user_db2 > user_dbs.sql
# /usr/local/mysql/bin/mysqldump -u root -p -n --all-databases > all_dbs.sql
-- 데이터 백업시에 CREATE TABLE문을 생략하여 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -t DB명 > 파일명
           /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-crate-info DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -t user_db > user_db.sql
- 데이터는 백업하지않고 테이블 스키마만 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -d DB명 > 파일명
           /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-data DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -d user_db > user_db.sql
-- 특정 데이터베이스의 조건에 맞는 데이터만 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -w="WHERE 조건문" DB명 테이블명 > 파일명
           /usr/local/mysql/bin/mysqldump -u 사용자명 -p --where="WHERE 조건문" DB명 테이블명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -w="admin_id = 'admin'" user_db addressbook > admin_id.sql
- select문을 이용한 데이터 백업 및 복구
mysql> select * into outfile './backup.sql' from addressbook;
mysql> load data infile './backup.sql' into table addressbook;
* 데이터베이스의 깨진 테이블파일 복구
- 데이터파일 구성
테이블 하나에 아래의 파일형식을 가진 파일이 3개씩 생성되어 그 테이블의 데이터를 실제로 저장하는 용도로 사용된다.
*.MYD: 해당 테이블의 데이터가 저장되는 테이블 데이터파일이다.
*.MYI: 해당 테이블의 인덱스정보가 저장되는 테이블 인덱스파일이다.
*.frm: 해당 테이블의 테이블구조가 저장되는 테이블 스키마파일이다.
- myisamchk
사용형식 : myisamchk [옵션] 점검복구새상테이블인덱스파일(*.MYI)
           주의할 것은 myisamchk의 복구 대상파일은 반드시 MySQL의 인덱스파일이라는 것이다.
           또한 반드시 MySQL을 종료한 후에 사용하라.
- MySQL 테이블파일의 이상유무 점검
# /usr/local/mysql/bin/myisamchk /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk -c /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --check /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL 테이블 점검시 이상발견시만 알려주기
# /usr/local/mysql/bin/myisamchk -s /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --silent /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL의 테이블 점검(복구)시 가능한 상세하게 메시지 출력하기
# /usr/local/mysql/bin/myisamchk -v /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --verbose /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL의 테이블 이상유무 점검시 결과를 상세히 종합하여 보여주기
# /usr/local/mysql/bin/myisamchk -i /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --information /usr/local/mysql/var/user_db/addressbook.MYI
-- MySQL의 특정테이블 이상유무를 가장 정밀하게 점검하기
# /usr/local/mysql/bin/myisamchk -ev /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --extend-check --verbose /usr/local/mysql/var/user_db/addressbook.MYI
- 정형적인 방법으로 MySQL의 깨진 테이블파일 복구하기
# /usr/local/mysql/bin/myisamchk -rv /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --recover --verbose /usr/local/mysql/var/user_db/addressbook.MYI
-- MySQL의 깨진 테이블파일 안전모드로 복구하기
# /usr/local/mysql/bin/myisamchk -o /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --safe-recover /usr/local/mysql/var/user_db/addressbook.MYI
  -r옵션을 사용하여 테이블파일을 복구하는 것은 MySQL의 테이블 복구 방법 가운데 가장 정형적인 방법이다.
  하지만 데이터의 안전성을 고려한다면 -o옵션을 사용하라.
  깨진 테이블파일의 오류를 복구할 때에 시간이 좀 더 소요되더라도 데이터의 안전성이 걱정이 된다면 -o옵션을 사용하라.
  -o옵션을 사용하면 전통적인 방법으로 복구를 하며 -r옵션을 사용하는 것보다 속도는 좀 떨어지지만 -r옵션으로 복구하지 못하는 데이터파일을 복구할 수 있다.
- MySQL 테이블이 완전히 깨졌을 때의 최후의 복구방법
# /usr/local/mysql/bin/myisamchk -re /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk -oe /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL 내부명령어 사용
사용형식 : repair table 테이블명;
mysql> repair table addressbook;
***********************************************************
* 리눅스 호스팅서버 관리
***********************************************************
* 호스팅서비스에 필요한 것들
- 리눅스 운영체제
- 아파치 웹서버
- MySQL 데이터베이스
- PHP, Perl 등과 같은 웹프로그래밍언어
- 메일서비스 지원을 위한 Sendmail, Qmail, POP, IMAP
- Webalizer와 accesswatch 등을 이용한 웹로그분석 제공
- Proftpd, vsftpd를 이용한 FTP서비스
- BIND를 이용한 DNS서비스
- 여러가지 라이브러리 및 어플리케이션들
- 백업서버 구축
* 신규 호스팅가입자 서버셋팅
1. 사용자 ID, 패스워드 생성
# useradd bible
# passwd bible
2. 사용자 호스팅용 홈디렉토리 구성하기
# mkdir /home/bible/www
# mkdir /home/bible/www_log
# mkdir /home/bible/www/weblog
# mkdir /home/bible/ftp
# mkdir /home/bible/ftp_log
# cp index.html /home/bible/www
# chmod 701 /home/bible
# chown -R bible:bible /home/bible
3. DNS에 사용자 도메인 설정하기
# vi /etc/named.conf
zone "bible.co.kr" {
 type master;
 file "bible.co.kr.zone";
};
# vi /var/named/bible.co.kr.one
$TTL 86400
@  IN SOA ns.dns.co.kr. root.bible.co.kr. (
  2006040101 ; serial number
  28800  ; secondaries refresh every 8 hours
  14400  ; if refresh fails, retry every 4 hours
  2419200  ; if cannot refresh, expire IN 30 days
  86400  ; default ttl
)
  IN NS 192.168.0.2
  IN MX 10 bible.co.kr.
  IN A 192.168.0.101
www  IN A 192.168.0.101
ftp  IN A 192.168.0.101
4. 아파치에 가상호스트 설정하기
# vi /usr/local/apache2/conf/httpd.conf
#

    ServerAdmin webmaster@bible.co.kr
    DocumentRoot /home/bible/www
    ServerName bible.co.kr
    ServerAlias www.bible.co.kr
    ErrorLog /home/bible/www_log/error_log
    CustomLog /home/bible/www_log/access_log common
    Alias /bible/ "/home/bible/www/"
   
        Options ExecCGI
        AllowOverride AuthConfig
   

5. 일hit수와 일트랙픽량 제한 설정하기
# vi /usr/local/apache2/conf/httpd.conf
#

    ServerAdmin webmaster@bible.co.kr
    DocumentRoot /home/bible/www
    ServerName bible.co.kr
    ServerAlias www.bible.co.kr
    ErrorLog /home/bible/www_log/error_log
    CustomLog /home/bible/www_log/access_log common
    Alias /bible/ "/home/bible/www/"
    ThrottlePolicy Volume  2048M 1d
    ThrottlePolicy Request 20000 1d
   
        Options ExecCGI
        AllowOverride AuthConfig
   

6. 메일사용을 위한 메일설정하기
# vi /etc/mail/access
bible.co.kr RELAY
# makemap hash /etc/mail/access.db < /etc/mail/access
# vi /etc/mail/local-host-names
bible.co.kr
# vi /etc/mail/virtusertable
webmaster@bible.co.kr bible
# makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable
7. 데이터베이스 사용을 위한 MySQL 설정하기
# /usr/local/mysql/bin/mysql -u root -p mysql
Enter password: ********
mysql> create database bible;
mysql> grant all on bible.* to bible@'localhost' identified by '1234';
8. 웹로그분석서비스를 위한 webalizer 설정하기
# cp /etc/webalizer.conf.sample bible.co.kr.conf
# bible.co.kr.conf
LogFile  /home/bible/www_log/access_log
OutputDir /home/bible/www/weblog
HistoryName bible.co.kr
ReportTilte bible.co.kr WebSite
HostName www.bible.co.kr
9. 디스크사용량 제한을 위한 Quota 설정하기
# edquota -u bible
Disk quotas for user bible (uid 600):
Filesytem blocks soft hard inodes soft hard
/dev/sda2 1200 307200 358400 34 0 0
10. 가상 FTP호스팅을 위한 proftpd의 가상호스트 설정하기
# vi /usr/local/proftpd/etc/proftpd.conf
ftp.bible.co.kr>
ServerName  "ftp.bible.co.kr FTP Server"
ServerAdmin  webmaster@bible.co.kr
Port   40001
TranferLog  /home/bible/ftp_log/xferlog
MaxClients  10
MaxClientPerHost 3
11. 아파치, FTP, MySQL, DNS, 메일서비스 재시작하기
# /usr/local/apache2/bin/apachectl restart
# /usr/local/mysql/bin/mysqladmin -u root -p reload
# killall -9 proftpd
# /usr/local/proftpd/sbin/proftpd
# /etc/init.d/sendmail restart
# /etc/init.d/named restart
* 메일포워딩 서비스 설정
.forwar 파일에 포워딩할 이메일주소를 등록한다.
* 도메인포워딩 설정

***********************************************************
* 리눅스 백업서버 구축
***********************************************************
* cron을 이용한 로컬 백업
- 백업 스크립트 작성
# cat backup.sh
#!/bin/sh
tar cvfpz /backup/etc.tar.g /etc
tar cvfpz /backup/usr.tar.g /usr
tar cvfpz /backup/var.tar.g /var
tar cvfpz /backup/home.tar.g /home
# chmod 755 backup.sh
- cron에 등록
# crontab -l
00 04 * * * su - root -c '/root/backup.sh' >& /dev/null
* ncftpget으로 원격자동 백업 구축
A서버 : 백업대상서버
        92.168.0.202
        로컬백업이 구현되어 있음(/backup 에 백업데이터가 매일 백업되고 있음)
B서버 : 백업서버
        192.168.0.211
        /backup 디렉토리에 백업대상서버에서 가져온 데이터를 매일 백업함
A서버의 데이터가 B서버로 매일 자동 백업됨
# cat login.cfg
host 19.168.0.202
user bible
pass 12345678
# cat remotebackup.sh
#!/bin/sh
ncftpget -R -f login.cfg /backup /backup
    -R : 서브디렉토리의 파일들까지 모두 포함하기 위한 옵션
    -f : 로그인설정파일을 지정하기 위한 옵션
    login.cfg : 로그인설정파일
# crontab -l
00 05 * * * su - root -c '/root/remotebackup.sh' >& /dev/null
* DAT테잎으로 백업과 복구하기
- DDS 테잎의 종류
  DDS1 타입 : 비압축으로 2GB까지 저장가능.
  DDS2 타입 : 비압축으로 4GB까지 저장가능. 압축하면 8GB까지 저장가능.
  DDS3 타입 : 비압축으로 12GB까지 저장가능. 압축하면 24GB까지 저장가능.
  DDS4 타입 : 비압축으로 20GB까지 저장가능. 압축하면 40GB까지 저장가능.
- 일반적으로 백업은 DAT라는 테입에 dump형식으로 저장하여 다시 원상복구하기 위하여 restore하는 것을 의미한다.
1. 먼저 imsi디렉토리를 만든다.
   imsi디렉토리는 테잎으로부터 restore되는 파일을 일시적으로 저장하기 위한 것이다.
2. ufsrestore를 실행한다.
   i : interactive모드로 restore를 하겠다느 ㄴ의미, 즉 원하는 파일들만 복구하기 위해 파일을 지정할 수 있는 모드
   v : verbose 지정(자세한 메시지 출력)
   h : hierarchical디렉토리를 생성하며 복구, 즉 백업된 경로대로 디렉토리도 생성하게됨.
# ufsrestore ivh /dev/rmt/0
3. 원하는 파일 찾기
   restore명령어는 다음과 같은 것들이 있다.
   ls      : 현재디렉토리에서 백업테잎에 저장된 파일들 보기
   cd      : 디렉토리 이동
   delete  : 복구할 파일에서 제외
   add     : 복구할 파일 선택
   extract : 복구하기
   pwd     : 현재위치를 절대경로로 표시하기
   quit    : 종료
4. 원하는 파일 선택(add)
5. 파일생성 extract하기
6. 빠져나오기
7. 복구한 파일 확인
8. 파일내용 확인
9. 복구한 파일을 원하는 위치에 복사
* rsync를 이용한 원격네트워크백업서버 구축 실무
- rsync 설치
# wget http://rsync.samba.org/ftp/rsync/rsync-2.6.3.tar.gz
# tar xvfz rsync-2.6.3.tar.gz
# cd rsync-2.6.3
# ./configure
# make
# make install
- 873번 포트를 통한 rsync 네트워크백업 개론
환경:
      백업 대상서버들(백업할 데이터가 있는 서버들)
        SU1: 211.220.1.1
        SU1: 211.220.1.2
        SU1: 211.220.1.3
      백업서버(백업데이터를 가져와 보관할 백업서버)
        BS: 211.220.1.4
1. SU1, SU2, SU3 서버들 자체적으로 cron에 의한 백업을 수행하여 각각의 디렉토리에 저장이 외더 있다.
   이 작업은 각각의 로컬서버에 주기적으로(일별, 주별) 자동백업되어 특정한 디렉토리(backup)에 저장이 된다.
2. BS에서 SU1, SU2, SU3서버에 백업되어 있는 데이터들을 네트워크를 통해 가져오게 된다.
   이 작업은 BS서버의 cron에 의해 수행되며 주기적인(일별, 주별, 월별 등) 작업수행이 가능하며 여기서는 매일 새벽 6시에 데이터를 자뎌오도록 설정한다.
3. 백업대상 서버(SU1, SU2, SU3)의 설정내용
# grep 873 /etc/services
rsync           873/tcp                         # rsync
rsync           873/udp                         # rsync
# grep rsync /etc/hosts.allow
rsync : 211.220.1.4
# cat /etc/xinetd.d/rsync
service rsync
{
 disable   = no
# port   = 873
 socket_type  = stream
# protocol  = tcp
 wait   = no
 user   = root
 server   = /usr/bin/rsync
 server_args  = --daemon
 log_on_failuer  += USERID
}
# /etc/init.d/xinetd restart
# cat /etc/rsyncd.conf
[SU3]    서비스이름. 일반적으로 서버의 이름
path = /host6/backup  백업대상 데이터가 저장된 절대경로
comment = SU3   설명문. 서버이름이나 컨텐츠의 이름 입력
uid = nobody   데이터를 전송할 user명
gid = nobody   데이터를 전송할 group명
user chroot = yes  path에서 설정한 경로를 루트경로로 사용함. 보안을 위해 꼭 yes 로 설정할 것을 권함.
read only = yes   백업대상서버에 wrie할 경우에는 no로 설정. 즉, 백업서버에서 백업대상서버로 데이터를 가져가기만하므로 일반적으로 read only만 설정함.
hosts allow = 211.220.1.4 접근허용할 서버의 IP. 백업서버의 IP입력
max connections = 3  동시에 접속할 수 있는 동시접속자 수. 무제한으로 설정하려면 0을 설정함.
timeout 600   깁ㄴ값은 60초이며 백업서버에서 접근하여 타임아웃될 시간을 설정함.
4. 백업서버(BS)의 서정내용
# grep 873 /etc/services
rsync           873/tcp                         # rsync
rsync           873/udp                         # rsync
# cat /home/hansoo2/backup.sh
#!/bin/sh
rsync -avz 211.220.1.1::SU1/ /home/hansoo2/backup/SU1
rsync -avz 211.220.1.2::SU1/ /home/hansoo2/backup/SU2
rsync -avz 211.220.1.3::SU1/ /home/hansoo2/backup/SU3
  -a : achive mode로서 기존의 속성 및 퍼미션, 소유권 등의 설정내용을 그대로 유지.
  -v : verbose mode로서 작업내용을 상세하게 보여줌.
  -z : 전송속도를 높이기 위해 압축수행 후 전송을 함.
# crontab -l | grep backup
# network backup system
0 6 * * * su - root -c '/home/hansoo2/backup.sh'
- 백업수행시 에러 대책
1. 압축파일상태에러(inflate returned -3에러)
   이 에러는 백업대상이 되는 파일이 gzip으로 압축되어 있을 경우에 rsync의 실행옵션 중 z라는 옵션을 사용했기 때문에 발생하는 에러이디ㅏ.
   압축된 파일을 다시 압축해서 전송하려고 하는 도중에 발생하는 에러로서 자주 발생하는 에러 중 하나다.
   rsync에서 z옵션을 뺀 후에 실행하면 해결할 수 있다.
2. Timeout 관련 에러
   이 에러는 백업대상서버에 있는 /etc/rsyncd.conf 파일내의 timeout값이 너무 작게 설정되어 있어서 발생하는 에러이다.
   /etc/rsyncd.conf파일내의 timeout값을 조금 높게 설정해 준다.
3. Max Connections 관련 에러
   이 에러는 백업대상서버에 있는 /etc/rsyncd.conf파일내의 max connections에 설정된 값 이상의 연결이 시도되었기 때문에 발생한 에러이다.
   백업대상서버의 /etc/rsyncd.conf 파일내의 max connections 항목값을 적당하게 높여주거나 조절해 준다.
4. 전송대상파일 크기에서(out of memory)
   메모리에 관련된 에러로서 해결방법이 꽤 까다로운 에러 중 하나이다.
   전송대상 파일크기가 너무 커서 rsync에서 전송해야할 파일의 체크섬에서 발생하는 에러이다.
   전송대상 파일들의 크기를 점검해서 너무 클 경우에는 파일을 2-3개로 쪼개어서 다시 실행보시면 해결할 수 있다.
* rsync를 이용한 자동 미러링서버 구축
환경 : 원본소스서버의 데이터가 계속 바뀌어도 미러링서버에서 주기적으로 자동 동기화되므로 모두 동일한 데이터를 갖게된다.
       원본소스서버 : 192.168.0.202
                      원본소스가 보관된 서버이며 /var/ftp/pub 디렉토리에 FTP서비스다운로드파일들이 존재하고 있다.
       미러링 서버  : 192.168.0.211
                      주기적으로 원본소스서버의 /var/ftp/pub 디렉토리내의 소스파일들을 가져와서 미러링서버의 /var/ftp/pub 디렉토리에 저장한다.
- 원본소스서버의 설정사항 및 소스데이터 확인
# cat /etc/hosts.allow | grep rsync
rsync : 192.168.0.211
# cat /etc/rsyncd.conf
[SUPERUSER]
path = /var/ftp/pub
comment = SUPERUSER
uid = nobody
gid = nobody
user chroot = yes
read only = yes
hosts allow = 192.168.0.211
max connections = 3
timeout 600
# cat /etc/xinetd.d/rsync
service rsync
{
 disable   = no
 socket_type  = stream
 wait   = no
 user   = root
 server   = /usr/bin/rsync
 server_args  = --daemon
 log_on_failuer  += USERID
}
- 미러링서버의 설정사항
# rsync -avz 192.168.0.202::SUPERUSER /var/ftp/pub
# cat ftp_mirror.sh
#!/bin/sh
rsync -avz 192.168.0.202::SUPERUSER /var/ftp/pub
# crontab -l | grep rsync
00,10,20,30,40,50 * * * * su - root -c '/root/ftp_mirror.s' >& /dev/null
***********************************************************
* 리눅스 커널 컴파일
***********************************************************
* 커널 컴파일 전체 작업 공정표
1. 시스템 데이터 및 중요 파일들 모두 백업하기
2. 커널컴파일 작업위치로 이동하기
# cd /usr/src
3. 컴파일할 리눅스 커널소스 가져오기
# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.10.tar.gz
4. 커널소스 압축 해제하기
# tar xvfz linux-2.6.10.tar.gz
# ln -s linux-2.6.10 linux
# cd linux
5. 커널컴파일을 위한 작업장 청소작업
# make mrproper
6. 커널컴파일 옵션 설정작업
# make menuconfig -> or make config or make xconfig
7. 커널이미지파일 생성을 위한 컴파일 작업
# make bzImage  -> or make zImage or make zdisk or make zlilo
8. 커널모듈생성을 위한 컴파일
# make modules
9. 커널모듈파일 설치하기
# make modules_install
10. 커널이미지파일 및 관련파일복사, grub.conf파일 수정하기
# make install
# ls -l /boot/vmlinu-2.6.10
# ls -l /boot/vmlinuz
# ls -l /boot/initrd-2.6.10.img
# ls -l /boot/System.map-2.6.10
# ls -l /boot/System.map
# ls -l /boot/grub/grub.conf
11. 재부팅
# reboot
12. 새로운 커널버전확인 및 시스템서비스 확인
# uname -r
# uname -a