[Project :: Server] MariaDB 백업설정 및 데이터 이관 2017-09-27

데이터베이스를 주기적으로 파일로 백업하기 위한 과정을 정리해본다.

Step 1. 쉘스크립트 파일을 작성한다.

vi [쉘파일저장경로]backup.sh
#!/bin/bash
today=`date +%Y%m%d`
deleteDay=`date +%Y%m%d -d '-[백업파일보존일수]days'`
backupDirectory="[파일저장경로]"
dbList='[데이터베이스1] [데이터베이스2]'

### create Folder ###
echo "createDay : "$today
/bin/mkdir -p ${backupDirectory}/${today}_all
cd ${backupDirectory}/${today}_all
echo "OK"

### backup Project ###
for db in $dbList; do
   echo "backupDB : "$db
   /bin/mkdir -p ${backupDirectory}/${today}_all/$db
   mysqldump -u [아이디] -p'[비밀번호]' --skip-add-drop-table --no-create-info --complete-insert --ignore-table=[제외시킬테이블] $db > ${backupDirectory}/${today}/$db/$db.sql
done

Step 2. 스크립트 파일이 주기적으로 실행되도록 스케쥴러에 등록한다.

crontab -e
# 새벽 5시에 백업
00    05    *    *    *    [쉘파일저장경로]backup.sh

[참고] 백업 받은 파일을 또다른 서버(개발 또는 스테이징)에 복사한 후 다음 명령으로 데이터를 IMPORT할 수 있다.
* 백업파일 IMPORT (리눅스)

[MYSQL경로]/mysql -u [아이디] -p [데이터베이스1] < [백업파일저장경로][데이터베이스1].sql
[MYSQL경로]/mysql -u [아이디] -p [데이터베이스2] < [백업파일저장경로][데이터베이스2].sql

* 백업파일 IMPORT (윈도우)

[MYSQL경로]\mysql.exe -u [아이디] -p"[비밀번호]" [데이터베이스1] < "[백업파일저장경로][데이터베이스1].sql"
[MYSQL경로]\mysql.exe -u [아이디] -p"[비밀번호]" [데이터베이스2] < "[백업파일저장경로][데이터베이스2].sql"

[문제해결] Can’t create/write to file ‘/mysql/tmp/ibSAi4kh’ (Errcode: 28 – No space left on device) 2016-07-04

1. 문제상황

> 여러 사이트를 운영중인 서버에서 mysql이 stop 되어 start를 시도 하였으나 다음과 같은 에러가 발생하며 시작되지 않았다.

제목 없음

Can't create/write to file '--/mysql/tmp/ibSAi4kh' (Errcode: 28 - No space left on device)
InnoDB: Error: unable to create temporary file; errno: 28
InnoDB: Assertion failure in thread 140119057037088 in file lock0lock.cc line 620

2. 문제확인

> 임시파일을 생성할 수 없다는 에러 문구로 보아 디스크 용량 부족을 체크하였다.

> df
Filesystem           1K-blocks     Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root
                      15971272  8504680   6648624  57% /
tmpfs                   508116        0    508116   0% /dev/shm
/dev/xvda1              487652    48917    413135  11% /boot
/dev/xvdb             82438832 22826180  55418348  30% /data

디스크 용량은 문제가 없어보인다.
> Inodes 를 체크하였다.

> df -i
Filesystem            Inodes  IUsed   IFree IUse% Mounted on
/dev/mapper/VolGroup-lv_root
                     1024000 1023999  1   100% /
tmpfs                 127029      1  127028    1% /dev/shm
/dev/xvda1            128016     44  127972    1% /boot
/dev/xvdb            5242880    257 5242623    1% /data

IUse% 가 100%가 되어 “No space left on device”에러가 발생한 것으로 보인다.
inode는 파일마다 하나씩 부여되는데 가득차서 더이상 파일을 생성할 수 없게 된다. 그렇다면 1024000라는 크기만큼 파일이 생성된듯 하다.

시스템에서 이정도로 많은 파일을 생성하지는 않을 듯하여 서비스 중인 폴더를 체크하였다.

> for i in /*; do echo $i; find $i |wc -l; done
/bin
92
/boot
35
/data
248
/dev
564
/etc
1353
/home
899792
/lib
6235
/lib64
490
/lost+found
1
/media
1
/mnt
1
/opt
3925
/proc
35597
/root
27
/sbin
232
/selinux
1
/_Service
268
/srv
1
/sys
4257
/tmp
775
/usr
50693
/var
4580

home폴더의 파일갯수가 무려 899792 나 된다.
하위 폴더를 검색하자

> for i in /home/*; do echo $i; find $i |wc -l; done
...

대체적으로 간단한 홈페이지를 만들기위해 사용된 그누보드에서 파일갯수가 많다. 아마도 세션파일이나 캐싱 파일로 짐작된다.
하위 폴더에서 확인결과 그누보드의 /data/session폴더에 파일 갯수가 엄청났다.


3. 문제해결

> 세션파일의 경우 현재 필요한 세션이 아닌것이 대부분이다. 주기적인 삭제가 필요하다. 일단 mysql 서비스를 실행하기 위해 rm 명령으로 삭제하자.

> rm -rf --/session/*

제목 없음2
> -bash: /bin/rm: Argument list too long 라는 에러가 발생한다. 파일 갯수가 너무많아 한번에 삭제가 불가능한 것이다.

> rm -rf --/session/sess_0*
> rm -rf --/session/sess_1*
> rm -rf --/session/sess_2*
> rm -rf --/session/sess_3*
...

> ls로 파일명을 확인하여 패턴에 따라 삭제하였다.
> 파일을 삭제하니 정상적으로 mysql이 구동되었다.

제목 없음3

> 세션 파일을 주기적으로 삭제하기 위해 스크립트 파일을 만들어 cron에 등록하도록 하자.

[문제해결] 아파치 재시작 에러 2015-07-21

1. 문제상황

> Linux-CentOS환경에서 apache를 재시작시 다음과 같은 에러가 발생하였다.

> service httpd restart
(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs

2. 문제확인

> 포트는 정상적으로 열려있는 상태이고 서비스도 문제가 없다. 검색결과 이전 서버 시작 또는 종료시 비정상적으로 수행되었기 때문이라고 한다.


3. 문제해결

> 강제로 프로세스를 죽이고 80포트가 죽었음을 확인하고 시작하도록 한다.

프로세스 확인 & KILL
ps -ef|grep httpd
root      7854     1  0 09:10 ?        00:00:00 /usr/local/server/apache/bin/httpd -k start
daemon    7949  7854  0 09:10 ?        00:00:37 /usr/local/server/apache/bin/httpd -k start
daemon    7950  7854  0 09:10 ?        00:00:36 /usr/local/server/apache/bin/httpd -k start
daemon    7953  7854  0 09:10 ?        00:00:40 /usr/local/server/apache/bin/httpd -k start
opendocs 22654 22634  0 14:39 pts/0    00:00:00 grep httpd
kill -9 7953
kill -9 7950
kill -9 7949
kill -9 7854
포트 확인
netstat -an|grep LISTEN
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 :::3306                     :::*                        LISTEN      
unix  2      [ ACC ]     STREAM     LISTENING     18088  /tmp/mysql.sock
unix  2      [ ACC ]     STREAM     LISTENING     6618   @/com/ubuntu/upstart
* 아파치는 자동으로 프로세스를 생성하고 대기 하기 때문에 다시 생겨날 수 있다. 그러므로 포트가 죽지 않았다면 프로세스가 추가로 생성되었는지 확인해야한다.
아파치 시작
service httpd start