- mysqldump를 이용하여 텍스트 형식으로 테이블의 내용을 저장하는 백업. (논리적 백업)
- MySQL서버에 접속해서 데이터를 복구 하기 위한, create table, insert … 문을 만들어 내기 때문에 물리적 백업보다 시간이 오래 걸린다.
- 테이블에 존재하는 index에 대한 정보는 백업 내용에 포함되어 있지 않지만, 덤프 파일을 이용해서 데이터를 복구 시에는 인덱스가 생성된다.
- 하드웨어가 틀린 다른 머신 에서도 호환이 된다.
- 설정파일이나 로그파일 등은 백업이 되지 않는다.
- --opt 옵션을 사용하면 덤프과정을 최적화 시키지만, --opt를 사용하는 순간 모든 테이블에 lock을 설정하기 때문에 다른 세션에서 DML이 불가능 하다.
- --opt 옵션은 기본적으로 extended-insert 를 활성화 시켜서, 한 건 한 건 insert하는 구문이 아니다. 그래서 로그 사이즈가 줄어든다.
- 전체 데이터 베이스를 백업 받을 때는 --flush-logs 옵션을 같이 사용하면 좋다.
- 기본적으로 테이블과 연관된 데이터만 백업을 받게 되므로 --routines --triggers --events 옵션을 사용하여 덤프 파일에 추가해야 한다.
- --master-data는 복제 슬레이브 서버를 만들 목적으로 master서버에서 덤프 파일을 생성할 때 유용하다.
mysqldump 사용법
# tpcc 데이터베이스의 customer 테이블만 백업 받기
[root@mmysql ~]# mysqldump tpcc customer > customer_2016_12_10.dmp
백업 받은 파일은 기존 테이블이 존재하면 drop하고 create한 후에 insert하는 식으로 만들어져 있다. 해당 테이블에 Index가 있을 경우 index 생성 스크립트는 없음.
# 백업 받은 customer 테이블의 데이터를 다시 복구 하기
[root@mmysql ~]# mysql tpcc < customer_2016_12_10.dmp
# 특정 데이터 베이스 안의 모든 테이블 백업 받기 create database 구문 없음 (백업 받으면서 압축하기)
[root@mmysql ~]# mysqldump -uroot tpcc | gzip > /root/tpcc_2016_12_10.sql.gz
[root@mmysql ~]# gzip -d /root/tpcc_2016_12_10.sql.gz [root@mmysql ~]# mysql < tpcc_2016_12_10.sql
# 데이터 베이스 백업 받기
[root@mmysql ~]# mysqldump --databases tpcc > tpcc_db.sql
# 데이터 베이스 복구
[root@mmysql ~]# mysql < tpcc_db.sql
# 테이블의 생성 스크립트만 백업 받기
[root@mmysql ~]# mysqldump tpcc customer_test --no-data > customer_test_ddl_only.sql
# 데이터만 백업 받기
[root@mmysql ~]# mysqldump tpcc customer_test --no-create-info > customer_test_data_only.sql
# 전체 데이터 베이스 백업 받기 (권한 테이블도 덤프 되기 때문에 다른 MySQL에 넣으려면 다른 옵션을 사용할 것 !!)
[root@mmysql ~]# mysqldump --all-databases | gzip > all_db_2016_12_10.sql.gz [root@mmysql ~]# mysqldump --all-databases --flush-logs --opt | gzip > all_db_flush_opt.sql.gz [root@mmysql ~]# mysqldump --all-databases --flush-logs --opt --routines --triggers --events | gzip > all_db_flush_opt_r_t_e.sql.gz
[root@mmysql ~]# ls -al all_db* -rw-r--r-- 1 root root 738113600 Dec 9 17:19 all_db_2016_12_10.sql.gz -rw-r--r-- 1 root root 738113601 Dec 9 17:28 all_db_flush_opt.sql.gz
# 전체 데이터 베이스 백업 파일을 가지고, 특정 데이터 베이스만 복구 하기
mysql> show databases ; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | tpcc | | tpch | +--------------------+
mysql> drop database tpcc ;
mysql> show databases ; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | tpch | +--------------------+
[root@mmysql ~]# zcat all_db_flush_opt.sql.gz | grep "CREATE DATABASE" > create_db.sql create_db.sql에서 DB Creation 문장 추출….. db가 존재하는 상태라면 skip….
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `tpcc` /*!40100 DEFAULT CHARACTER SET euckr */;
mysql> CREATE DATABASE /*!32312 IF NOT EXISTS*/ `tpcc` /*!40100 DEFAULT CHARACTER SET euckr */; Query OK, 1 row affected (0.01 sec)
mysql> show databases ; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | tpcc | | tpch | +--------------------+
mysql> use tpcc ; Database changed mysql> show tables ; Empty set (0.00 sec)
[root@mmysql ~]# zcat all_db_flush_opt.sql.gz | mysql -o tpcc (-o = one database )
mysql> show tables ; +----------------+ | Tables_in_tpcc | +----------------+ | customer | | customer_test | | district | | history | | item | | new_order | | order_line | | orders | | orders_test | | stock | | test | | warehouse | +----------------+
|