Mysql DB백업 받는법

MySQL 2005/07/04 11:27
우선 클라이언트두 mysqldump 명령을 쓸수 있게
관리자 가 /bin 밑에 mysqldump 명령을 복사 해주어야 합니다.
그래야 클라이언트 사용자두 그 명령을 사용할 수 있으니까요..

그런후 아래와 같은 옵션을 써서 디비 백업 받으면 됩니다.

형식:
$ mysqldump [OPTIONS] database [tables]

설명:
테이블이 생략되면 전체 태이블을 백업.
예제:
$ mysqldump --opt database > backup-file.sql
$ mysqldump --opt database | mysql --host=remote-host -C database
$ mysqldump --quick -c -ujhs -p jhs > jhs.out.sql
$ mysqldump --quick -c -t --add-locks -urp bizaide110 > bae110.data.sql

마지막 예제 처럼, -u, -p 가 데이터베이스 앞에와야하며,
데이터베이스는 맨 뒤에 와야한다.


도움말:
$ mysqldump --help

주의: 만약, --quick 이나 --opt 없이 덤프하면 메모리가 많이 소모되어
큰 데이터베이스의 경우 문제가 발생할 수 있다.

옵션:
--add-locks
테이블의 덤프하기전에 해당 테이블을 잠그고 덤프한 후에
테이블을 풀어준다.
-c, --complte-insert
INSERT 구문에서 필드명을 포함한 전체를 덤프
-f, --force
덤프 중 에러가 있어도 계속 진행
-h, --host
특정 호스트의 MySQL 에서 데이터 덤프
-t, --no-create-info
테이블 생성 정보는 덤프하지 않음(데이터만 덤프)
-d, --no-data
테이블 스키마만 덤프
-q, --quick
버퍼를 사용하지 않고 바로 표준출력으로 보낸다.


위의 예기는 원론적인 예기구요..
실사용예
만약 사용자가 할당 받은 디비 이름이 hahaha 라면
그 디비 안에 여러개의 table 이 있지 않습니까?
그러면 여기서는 한번에 기냥 hahaha 라는 디비 전체를 다 긁어 오는 방법을 설명 드릴게요..

#mysqldump -u님의디비아뒤 -p님의디비패스 hahaha >
hahaha_backup.sql
이렇게 해주시면 됩니다.
그러면 hahaha 디비안에 들어있는 테이블과 전체 내용이 싹 읽혀서 .sql 화일 안에 들어 갑니다.
vi hahaha_backup.sql 이렇게 해보세요..
그럼 모든게 들어가 있는것이 확인 될테니..
2005/07/04 11:27 2005/07/04 11:27

MySQL Replication

MySQL 2005/07/04 10:25
1. Master 측 설정


Replication 에서는 Master 와 Slave 라는 말을 사용하게 된다. Master 라는 말은 즉 능동적인
작업을 수행하는 측을 의미한다. 즉 실제로 업데이트가 발생하고, 동기화를 할 서버의 기준이
되는 서버를 의미한다.

일단, Replication 기능을 사용하기 위해서는 Replication 의 기능을 수행 할 유저가 필요하며
이 유저는 모든 DB 에 대해서 file 의 권한을 가지고 있어야 한다.

GRANT file ON *.* TO $repjob_user@\$slave_host_addr' IDENTIFIED BY '$passwd'

명령을 이용하여 file 에 대해서만 모든 DB 에 권한을 가지는 유저를 추가하도록 한다. 여기서
$repjob_user 는 중복되지 않는 유일한 아무 이름의 유저로 지정하면 되며, $salve_host.addr
은 SLAVE server 로 만들 서버의 주소를 적어 줘야 한다. 그래야 SLAVE 에서 위에서 지정한 유
저로 MASTER server 에 접속이 가능하기 때문이다. 마지막의 $passwd 는 접속할 패스워드를 지
정하는 것이다.

다음 my.cnf 에 아래와 같이 Replication 기능을 위한 MASTER 설정을 한다.




Hanterm - cat /etc/my.cnf

[root@bbuwoo /etc]$ cat my.cnf

[mysqld]
....
....
log-bin
binlog-do-db = test
binlog-do-db = test1
server-id = 1

[root@bbuwoo /etc]$



log-bin 은 Replication 을 위한 binary log 를 남기게 한다. server-id 는 Replication 기능
을 사용하는 서버중 유일값을 가져야 한다. server-id 는 1 에서 2^32-1 까지 지정할 수 있다.

binlog-do-db 는 Replication 을 사용할 database 를 지정한다. binlog-do-db = test,test1 과
같이는 사용이 안된다. 이유는 모르겠지만 하나에 하나씩 적어 줘야 한다. 만약 모든 database
를 동기화 하려한다면 binlog-do-db 를 설정을 안하면 된다. 만약 mysql DB 만 Replication 기
능을 사용하고 싶지 않다면 binlog-ignore-db 를 사용하면 된다.

my.cnf 에서 사용할 수 있는 MASTER 에 관한 옵션은 다음과 같다

log-bin=filename

Replication 기능에 필요한 binary log 를 남기게 한다. filename 을 지정하지 않을 경우에는
mysql 의 lib directory 에 $host-bin.001 과 같이 남게 된다. RPM으로 설치했을 경우에는 보
통 /var/lib/rpm 에 남게되며, prefix 를 지정하지 않은 채 소스 컴파일을 했을 경우에는 보통
/usr/local/mysql/lib/ 에 남게 된다.

log-bin-index=filename

binary file 의 index 파일을 생성한다. 지정하지 않으면 $host-bin.index 로 남게 된다. 지정
하나 하지 않으나 별 상관은 없다.

sql-bin-update-same

If set, setting SQL_LOG_BIN to a value will automatically set SQL_LOG_UPDATE to the same
value and vice versa.

binlog-do-db=database_name

MASTER 의 여러 DB 중 Replication 기능으로 동기화를 할 Database를 선택한다. 이것이 지정이
되어 있으면 지정되지 않은 Database 들은 동기화에서 빠진다.

binlog-ignore-db=database_name

MASTER 의 여러 DB 중 Replication 기능으로 동기화를 하지 않을 Database 를 선택한다. 이것
이 지정이 되어 있으면 지정되지 않은 Database 들만 동기화를 한다. 만약 binlog-do-db 가 설
정이 되어 있을 경우 에는 binlog-do-db 를 먼저 적용하고나서 binlog-ignore-db 를 적용한다.

좀 더 자세한것을 알고 싶다면 http://www.mysql.com/doc/R/e/Replication_Options.html 를 참
고 하도록 한다.


2. SLAVE 측 설정

SLAVE 측의 설정에서는 별다른 유저 추가가 필요 없으며 MASTER 측의 추가한 유저 정보를 이용
하여 my.cnf 에서 SLAVE 설정만 해 주는 것으로 설정이 끝난다.




Hanterm - cat /etc/my.cnf

[root@bbuwoo /etc]$ cat my.cnf

[mysqld]
....
....
server-id = 2
master-host = mater_ipaddres
master-user = $repjob_user
master-password = $passwd
replicate-do-db = test
master-port = 3306

[root@bbuwoo /etc]$



server-id 는 역시 유일값 이어야 한다. MASTER 에서 1 을 사용했으니 SLAVE 에서는 2 를 사용
한다.

master-host 는 MASTER server 의 ip address 를 지정해 준다. master-user 는 Replication 작
업을 할 유저를 지정한다. 위의 MASTER 에서 등록해 준 유저를 적도록 한다.

master-passwd 는 Replication 작업을 할 유저의 패스워드를 지정한다.

master-port 는 MASTER server 가 사용하는 포트를 지정한다. 기본값으로 3306 이다.

만약 MASTER server 의 특정 DB만 Replication 기능을 사용하고 싶다면 replicate-do-db 를 이
용한다. 하지만 이 기능은 MASTER 에서 binlog-ignore-db 로 제한을 하고 있다면 적용이 되지
않는다. 즉 SLAVE level 에서는 MASTER 가 허락 하는 database 중에서 선택을 할 수 있을 뿐이
다. SLAVE 에서 사용할 수 있는 옵션들은

http://www.mysql.com/doc/R/e/Replication_Options.html

를 참고 하도록 한다.

위의 작업을 간단히 설명을 하자면 MASTER 에서는 Replication 을 위한 유저에게 file 에 대해
서는 모든 권한을 준 상태로 추가 했으며, test, test1 database 에 대해서 Replication 을 하
도록 설정을 한 것이다. SLAVE 에서는 replicate-do-db 가 설정이 되어 있으므로 test1 DB 만
동기화를 하게 설정한 것이다.


3. 동기화 초기화 작업

MASTER 와 SLAVE 의 설정을 마쳤으면 Replication 기능을 사용하기 전에 두대간의 동기화 작업
을 먼저 해 놓아야 한다. 먼저 동기화 할 database 를 SLAVE 로 옮긴다. (만약 MASTER 에서 아
무것도 없는 상태에서 시작한다면 이 작업은 필요없다. MASTER에서 운영중인 것을 Replication
기능을 이용하여 동기화 하기 위해 필요한 작업이다.) 위에서는 test1 DB 만 동기화를 하도록
설정을 했으니 MASTER 의 test1 DB를 압축해서 SLAVE 로 옮긴다 (mysql 의 경우에는 data file
만 옮겨도 그냥 적용을 할 수 있다.)

master) cd /var/lib/mysql
master) tar cvfpz test1.tgz test1
master) chmod 777 test1.tgz

slave) cd /var/lib/mysql
slave) ncftp -u user master_server
slave) (Afer login) cd /var/lib/mysql
slave) get test1.tgz
slave) delete test1.tgz (ftp 상의 파일을 삭제)
slave) quit (ftp logout)
slave) tar xvfpz test1.tgz
slave) chown -R mysql.mysql test1


4. Replication 확인

여기 까지의 작업이 완료 되었다면 이제 MASTER 와 SLAVE 의 mysql 을 구동하고 다음을 확인한
다. 여기서의 결과값은 3.23.42 를 기준으로 한다. 버젼 마다 결과값이 다른 형태로 나올 수가
있다.


MASTER Server


Hanterm - mysql -e "show process"

[root@bbuwoo /etc]$ /etc/rc.d/init.d/mysql restart

Shutting down MySQL: [ OK ]
Starting MySQL: [ OK ]

[root@bbuwoo /etc]$ mysql -uroot -p -e "show processlist"

+----+-------+--------+------+-------------+------+
| Id | User | Host | db | Command | Time |
+----+-------+--------+------+-------------+------+
| 7 | $user | $slave | NULL | Binlog Dump | 2865 |
+----+-------+--------+------+-------------+------+
+---------------------------------------------+------+
| State | Info |
+---------------------------------------------+------+
| Slave connection: waiting for binlog update | NULL |
+---------------------------------------------+------+

[root@bbuwoo /etc]$ mysql -uroot -p -e "show master status"

+---------------+----------+------------------+------------------+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+---------------+----------+------------------+------------------+
| $host-bin.001 | 729 | test,test1 | |
+---------------+----------+------------------+------------------+

[root@bbuwoo /etc]$




SLAVE Server


Hanterm - mysql -e "show process"

[root@bbuwoo /etc]$ /etc/rc.d/init.d/mysql restart

Shutting down MySQL: [ OK ]
Starting MySQL: [ OK ]

[root@bbuwoo /etc]$ mysql -uroot -p -e "show processlist"

+----+-------------+------+------+---------+------+-----------------------+------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+------+------+---------+------+-----------------------+------+
| 1 | system user | none | NULL | Connect | 2847 | Reading master update | NULL |
+----+-------------+------+------+---------+------+-----------------------+------+

[root@bbuwoo /etc]$ mysql -uroot -p -e "show slave status"

+-------------+-------------+-------------+---------------+---------------+-----+
| Master_Host | Master_User | Master_Port | Connect_retry | Log_File | Pos |
+-------------+-------------+-------------+---------------+---------------+-----+
| $master_ip | $rejob_user | 3306 | 60 | $host-bin.001 | 729 |
+-------------+-------------+-------------+---------------+---------------+-----+
+---------------+-----------------+---------------------+------------+
| Slave_Running | Replicate_do_db | Replicate_ignore_db | Last_errno |
+---------------+-----------------+---------------------+------------+
| Yes | test | | 0 |
+---------------+-----------------+---------------------+------------+
+------------+--------------+
| Last_error | Skip_counter |
+------------+--------------+
| | 0 |
+------------+--------------+

[root@bbuwoo /etc]$



와 같이 나와 있음을 확인하면 된다.


5. Replication Error 복구방법

Replication 이 잘 되다가 갑자기 slave 에서 master 가 반영이 되어 있지 않을 경우 slave 의
error log 를 보도록 한다. error log 를 보고 문제점을 fix 한 다음

shell> mysqladmin -uroot -p slave-start

명령을 실행하면 반영되지 않았던 master 의 자료가 하나씩 반영되는 것을 볼 수 있을 것이다.

또 한가지 주의할 점은 replication 을 구현할때 master 에서

mysql> create database DB명;

명령은 slave 에 반영이 되지를 않는다. 그러므로 slave 의 설정에

replicate-do-db = DB명

을 명확하게 밝혀 놓아야지 에러가 발생하는 것을 막을 수 있다. 그럼 Master 에서 DB 를 추가
할 때는 귀찮더라도 slave 에서 수동으로 create database 를 한 다음 추가된 db 를 my.cnf 에
서 replicate-do-db 를 설정한 다음 slave 를 재시작 하는 것을 권장한다.

database 추가가 반영이 되지 않는 것은 필자가 그 방법을 찾지 못한 것인지 아니면 원래 구현
이 안되어 있는 것인지를 모르겠다. 혹시 아는 사람이 있으면 필자에게 포스팅을 해 주면 감사
하겠다.


6. Replication Error 유형

mysql> show processlist;

+----+-------------+------+------+---------+------+-----------------------+------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+------+------+---------+------+-----------------------+------+
| 1 | system user | none | NULL | Connect | 2847 | Waiting to reconnect | NULL |
| | | | | | | after a failed read | |
+----+-------------+------+------+---------+------+-----------------------+------+
2 rows in set (0.00 sec)

mysql> show slave status;
+-------------+-------------+-------------+---------------+---------------+-----+
| Master_Host | Master_User | Master_Port | Connect_retry | Log_File | Pos |
+-------------+-------------+-------------+---------------+---------------+-----+
| $master_ip | $rejob_user | 3306 | 60 | $host-bin.101 | 729 |
+-------------+-------------+-------------+---------------+---------------+-----+
+---------------+-----------------+---------------------+------------+
| Slave_Running | Replicate_do_db | Replicate_ignore_db | Last_errno |
+---------------+-----------------+---------------------+------------+
| Yes | test | | 0 |
+---------------+-----------------+---------------------+------------+
+------------+--------------+
| Last_error | Skip_counter |
+------------+--------------+
| | 0 |
+------------+--------------+

이 경우를 보도록 하자. processlist 에서는 읽기 실패후에 재접속을 기다리고 있다고 상황을
출력하고 있고, slave status 에서는 host-bin.101 에서 멈춰있다. 그리고 master 에서는 로그
파일이 host-bin.130 번을 생성하고 있을 경우이다. 즉 로그 101 에서 slave 는 멈춰진 상태이
다. 그리고 slave 의 에러로그 파일에는 다음과 같은 내용이 있다.

020312 17:52:37 Error reading packet from server: Could not open log file
(read_errno 0,server_errno=13)
020312 17:53:37 Slave: Failed reading log event, reconnecting to retry, log
'$host-bin.101' position 729
020312 17:53:37 Slave: reconnected to master '$rejob_user@$master_ip:3306',
replication resumed in log '$host-bin.101' at position 729

이런 경우에는, master 의 바이너리 로그 파일의 소유권을 잘 살펴보기 바란다. 보통 mysql 은
mysql 유저로서 구동을 하는 경우가 많은데 이때 로그파일이 간혹 root 의 권한으로 생성이 되
는 경우가 있다. 이 경우 읽기 권한이 없어 위와 같은 에러가 발생하는 경우가 존재한다.
2005/07/04 10:25 2005/07/04 10:25
어느날 아침 로긴이 안되거나 혹은 게시판에서 데이터 베이스 엑세스를 할수 없습니다.. 이런 메세지를 볼수 있다. 난감하기 그지 없다... 어떻게 극복을 할것인가... ?
데이터 베이스는 항상 깨지기 마련이다. 1년은 운영한다면.. 적어도 1~2회 정도는 화일을 열수 없습니다.


에러 메세지 :
ERROR 1016: Can't open file: 'xxxxxx.MYD'. (errno: 145)

만약 /usr/local/mysql/var/데이터 베이스에 들어 가면 각각의 부분에 대하여
*.FRM : 테이블 정보
*.MYI : 인덱스 정보
*.MYD : 데이타 정보

[root@ilinuxbay ]# /usr/local/mysql/bin/myisamchk sessions.*
myisamchk: error: 'sessions.MYD' is not a MyISAM-table

---------

Checking MyISAM file: sessions.MYI
Data records: 6 Deleted blocks: 6
myisamchk: warning: Table is marked as crashed
- check file-size
- check key delete-chain
- check record delete-chain
myisamchk: warning: Not used space is supposed to be: 896 but is: 624
myisamchk: error: record delete-link-chain corrupted
- check index reference
- check data record references index: 1
myisamchk: error: Found 4 keys of 6
- check record links
myisamchk: error: Record-count is not ok; is 4 Should be: 6
myisamchk: warning: Found 4 deleted blocks Should be: 6
myisamchk: warning: Found 8 parts Should be: 11 parts
MyISAM-table 'sessions.MYI' is corrupted
Fix it using switch "-r" or "-o"

---------

누가 지웠나.. 혹은 화일이 없는 경우 다음과 같은 명령어를 이용 확인 복구를 할 수 있다.


]#myisamchk 옵션을 보면

# -r -o로 복구가 안되면다 -f 옵션을 이용한다.
-f, --force Overwrite old temporary files.

#복구
-r, --recover Can fix almost anything except unique keys that aren't unique.

#안전하게 복구
-o, --safe-recover Uses old recovery method; Slower than '-r' but can
handle a couple of cases where '-r' reports that it
can't fix the data file.

#데이터 정렬 및 속도 증가 -R1 저도 주면 될듯 싶네요
-R, --sort-records=#
Sort records according to an index. This makes your
data much more localized and may speed up things

일반적으로 -r 을 기본으로 사용하며 대상 화일은 * 확장자를 잡으면 된다.
그럼 복구를 해보자.


[root@ilinuxbay ]# /usr/local/mysql/bin/myisamchk -r sessions.*
myisamchk: error: 'sessions.MYD' is not a MyISAM-table

---------

- recovering (with sort) MyISAM-table 'sessions.MYI'
Data records: 6
- Fixing index 1
Data records: 4

---------
2005/07/04 10:24 2005/07/04 10:24