DB/MYSQL MariaDB2018. 2. 9. 14:09

**** MYSQLDUMP VARIABLES ***************************************************
Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- -----------------------------
all                               TRUE
all-databases                     FALSE
add-drop-database                 FALSE
add-drop-table                    TRUE
add-locks                         TRUE
allow-keywords                    FALSE
character-sets-dir                (No default value)
comments                          TRUE
compatible                        (No default value)
compact                           FALSE
complete-insert                   FALSE
compress                          FALSE
create-options                    TRUE
databases                         FALSE
debug-info                        FALSE
default-character-set             utf8
delayed-insert                    FALSE
delete-master-logs                FALSE
disable-keys                      TRUE
extended-insert                   TRUE
fields-terminated-by              (No default value)
fields-enclosed-by                (No default value)
fields-optionally-enclosed-by     (No default value)
fields-escaped-by                 (No default value)
first-slave                       FALSE
flush-logs                        FALSE
flush-privileges                  FALSE
force                             FALSE
hex-blob                          FALSE
host                              (No default value)
insert-ignore                     FALSE
lines-terminated-by               (No default value)
lock-all-tables                   FALSE
lock-tables                       TRUE
log-error                         (No default value)
master-data                       0
max_allowed_packet                25165824
net_buffer_length                 1047551
no-autocommit                     FALSE
no-create-db                      FALSE
no-create-info                    FALSE
no-data                           FALSE
order-by-primary                  FALSE
port                              3306
quick                             TRUE
quote-names                       TRUE
routines                          FALSE
set-charset                       TRUE
shared-memory-base-name           (No default value)
single-transaction                FALSE
socket                            (No default value)
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
tab                               (No default value)
triggers                          TRUE
tz-utc                            TRUE
user                              (No default value)
verbose                           FALSE
where                             (No default value)
************************************************************************************

나에겐 자주 있는 경우이지만, 대체적으로 남들은 하지 않는
DB 이전 작업을 해야할 때가 있다. 

그런데 만약 덤프 때 옵션을 어리벙하게 주면,
옮기고자 하는 데이터의 사이즈가 Giga Byte 단위를 넘어설 경우
하루 줄창 걸려도 될똥 말똥이다. 
뒌장 맞을 --;;

그래서 어케 하자고?

뭐, 역시 빠르고 명확하지만, 전혀 비주얼하지 않은 
수작업이 필요하지 않겄어?   /(-0-)/

그럴 때 필요한 것이 바로 mysqldump 다.

mysqldump --help 라고 치면 모든 OPTION들의 설명이 나와있겠지만,
그래도 아래 3가지 옵션은 알아 두는 것이 좋을 것 같다.

일단, 맨 위의 값들은 mysqldump가 사용하는 변수의 목록이다.
즉, 아무런 값도 치지 않고 (아! 물론  데이터 베이스는 선택해야 한다.)
명령어를 입력하면, 위의 값들을 바탕으로 결과가 만들어진다는 것이지.

그렇지만, 역시나 속도가 생명인 IT의 건아들은 
뭔가 오밀조밀하게 만져서 조금더 빠르게 덤프를 뜨고 싶을 것이다.


**** 속도가 관건인 분에게 아래의 OPTION들을 권하오~~

--no-autocommit=1 : 일단 autocommit을 끄고, 
                           1개의 테이블 입력이 완료될 때 까지
                           기다렸다가 commit을 수행 한다. 요거이 좋다!!!
                           대신 뻑나면, 다시 첨부터~~~ 우어!!!

--single-transaction=1 : 작업 후에 변경 된 데이터의 내역을 다시 적용하지 않는다.
                                 즉, 중간에 값이 바뀌질 않는다면 가능하다는 말씀.

--extended-insert=1 : 요거이 관건인데, 쓸데 없이 INSERT 구문이 늘어나는 것을 
                             막아준다. 가령 
                            ->  INSERT INTO `A` VALUES (1,10),(2,20);
                             이러면 될 것을 , 
                            -> INSERT INTO `A` VALUES (1,10); 
                            -> INSERT INTO `A` VALUES (2,20);
                             으로 늘려준다. 이러면 하루 온 종일 도는 거다 --;;


그럼 덤프 방법을 보자.
리눅스건 윈도우 커맨드건 간에 어차피 양식은 같다.
(아래의 대문자는 당신이 넣어야 할 내용들이다.)

@@@@ 덤프 할 때 @@@@
c:\>mysqldump -hHOST_NAME -uMY_ID -pMY_PASSWORD --databases DB_NAME --tables TABLES_OF_DB_NAME --no-autocommit=1 --single-transaction=1 --extended-insert=1 > c:\DUMP_FILE.sql


요러면, 아무것도 모르고 그냥 뽑아내는 방식보다,
(지가 무슨 고급 승용차인줄 아는지 거의가 풀 옵션이다 --;;)
사이즈가 1/4 정도로 확 줄고,
속도는 광속을 뽐내게 된다.

즉, 관건은, 
덤프의 시간이 아니라 RESTORE의 시간인데,
개인적인 체감 속도로 판단하자면, 
진짜 시간이 1/10 정도는 감소하는 것 같다눙... -0-/

@@@@ 복원 할 때 @@@@
c:\>mysql -hHOST_NAME -uMY_ID -pMY_PASSWORD --database DB_NAME < c:\DUMP_FILE.sql
 

뭐 기타 옵션들도 많지만, 
간단한 DB 하나 잡고서 한 가지씩 테스트 해본다면
대충 감은 잡을 수 있을 것이다.
 


출처: http://blackbull.tistory.com/8 [음머어's 까망별]

Posted by 무소유v
DB/MYSQL MariaDB2018. 2. 9. 14:09

▣ mysql 백업 4가지 방법

 

1. Data 디렉토리 백업

- Data 디렉토리를 정기적으로 백업하고 문제 발생했을 때 덮어쓰면 된다.

 

2. mysqldump 를 사용하는 방법

- 백업 시에 데이터베이스에 락을 걸수 없어 변경이 발생하면 다시 백업해야한다.

 

3. mysqlhotcopy 를 사용하는 방법

- mysql 백업 방법 중 속도가 바르며 DB 디렉토리를 다른 위치에 Copy 한다.

- Myl 및 ARCHIVE 테이블만 Hotbackup을 지원 한다. ( innoDB 지원하지 않는다. )

 

4. xtraback 을 사용하는 방법

- mysql 서버 중단하지 않고 InnoDB를 핫백업할 수 있다.

- InnoDB Hot Backup은 핫백업을 지원하나 상용이나 xtraback 은 무료로 사용이 가능.

 

※ Hot Backup : DB 서버가 온라인 상태에서 DB를 백업 하는 것

    Cold Backup : DB 서버를 중단시키고 백업하는 방법  

 

 

■ mysqldump 사용하는 방법

 

전체 데이터베이스 또는 특정 데이터베이스를 백업하거나 특정테이블만 백업 할 수 있다.

 

▷ 전체 데이터베이스 백업

 

- 서버의 전체 데이터베이스를 alldatabase.sql로 백업한다.

 

mysqldump -uroot -p -A > alldatabase.sql

 

▷ 특정 데이터베이스 백업

 

- test 데이터베이스만 백업한다.

 

mysqldump -uroot -p test > testdb.sql

 

▷ 특정 테이블만 백업

 

- test 데이터베이스의 board 테이블만 백업 한다.

 

mysqldump -uroot -p test board > testdbboard.sql

 

 

※ 특정 데이타베이스의 테이블생성(schema) 정보만 백업하는 방법

 

mysqldump -uroot -p --no-data test > testdbschema.sql

 

- mysqldump-? 명령어로 여러 옵션을 확인 할 수 있다.

 


▷ InnoDB에서 트리거 , 프로시져, 함수 포함하여 백업하기


  - 트리거는 default값으로 백업이 실행되나 저장 프로시져는 백업되지 않는다. 


  - 저장 프로시져가 백업되게 하기 위해서는 옵션에  --routines 을 넣어줘야 한다.  


mysqldump -u계정 -p비밀번호 --routines 특정DB명 > 함수프로시져트리거.sql


(예) mysqldump -uroot -ppassword --routines  northwind > northwind.sql

 

 

   ※ 트리거 , 프로시져, 함수 만 백업하기 - 쿼리문만  


 mysqldump -u계정 -p비밀번호 --routines  --no-create-info --no-data --no-create-db --skip-opt 특정DB명 > 함수프로시져트리거.sql 

(예) mysqldump -uroot -ppassword --routines --no-create-info --no-data --no-create-db --skip-opt northwind > northwind_only_sp_trigger_function.sql

이렇게 트리커 프로시져 함수만 백업한 경우는 반드시 Data와 테이블 스키마를 별도로 백업 받아 줘야 합니다


 

■ 일정 시간마다 자동 백업

 

- 데이타베이스 백업은 아무리 강조해도 지나치지 않다. 그러나 잊어버리지 않고 사람이 하기엔 너무 귀찮다. 정기적으로 자동으로 실행되게 하려면 리눅스에서는 Shell 프로그램을 작성하여 cron에 등록시키면 된다.

 

▷ 백업할 디렉토리 만들기

 

sudo mkdir /backup 

 

▷ 백업 디렉토리 권한 주기

 

sudo chmod 755 /backup

 

▷ shell 프로그램 작성

 

sudo vi /usr/local/bin/mysqldump.sh

 

#!/bin/sh

 

# 백업 위치를 /backup 아래로 정한다.

# 백업 시간을 년-월-일 형식으로 지정한다. 
DATE=`date +"%Y%m%d%H%M%S"`

 

# 사용자 계정과 비밀번호

USERNAME="MySQL계정"

PASSWORD="비밀번호"

 

# 백업할 데이타베이스

DATABASE="test"

 

# 백업 작업
mysqldump -u$USERNAME -p$PASSWORD  $DATABASE > /backup/mysql_db_bak_${DATE}.sql 

 

※ USERNAME, PASSWORD, DATABASE 다음(=)은 꼭 붙여쓴다


- 실행권한 부여

 

sudo chmod +x /usr/local/bin/mysqldump.sh

 

▷ cron 만들기 - 일정한 시간에 실행 되게 한다.

 

sudo vi /etc/crontab

 

- 04시 30분에 자동으로 실행하게 설정

 

30 4 * * * root /usr/local/bin/mysqldump.sh

 

▷ 크론 데몬 재실행
 

sudo /etc/init.d/cron restart

 

▷ 시스템 시작 시 스크립트 실행되도록 한다.

 

sudo vi /etc/rc.local


- 아래와 같이 입력하고 저장한다.

 

/usr/local/bin/mysqldump.sh

 



출처: http://bizadmin.tistory.com/entry/MySQL-백업-및-복구하기 [Happy Resource]

Posted by 무소유v
DB/MYSQL MariaDB2018. 2. 9. 14:08

mysql dump 파일 복구하기


 dump로 백업된 파일을 복구하는 방법은


- shell 에서 실행한다. 


mysql -u user -p db_name < 파일명



▶ 복구시 한글이 깨지는 경우 해결 방법 :  --default-character-set 옵션 사용


 - shell 에서 실행한다. 


mysql -u user -p --default-character-set=euckr db_name < 파일명


위와 같이  윈도우에서 shell을 사용해야 하는 이유는 GUI 툴에서 덤프 파일을 불러 올수 없기 때문임.


정확히 얘기하면 GUI 툴인 Toad나 sqllog등에서 덤프 파일 용량이 크기 때문에 읽어 들이지 못한다. 그래서 shell 화면에서 사용되야 한다. 



출처: http://bizadmin.tistory.com/entry/mysql-덤프백업파일-복구-하기?category=754883 [Happy Resource]

Posted by 무소유v
DB/MYSQL MariaDB2018. 2. 9. 14:08
실무에서 자주 사용되는 쉘 스크립트  #3
           (MySQL DB백업 유틸리티)




  지난강좌(#3)는 MySQL을 쉽게 관리 할 수 있는 툴을 만들어 보았다. 
금번 강좌에서는 mysql의 데이터를 백업하는 스크립트를 만들 것이다. 단순하게 mysql을 dump 하기 위해서는 mysqldump 명령어를 사용하면 쉽게 할 수 있다.
하지만, DB 전체를 백업해 두면, 원하는 데이터를 찾기 힘들고 시간이 오래 걸린다. 우리가 원하는 것은 각 DB에 각 table별로 백업 하는 것이다. 

먼저, 어떤일을 할 것인지 생각 해 보자...




1) MySQL의 데이터를 DUMP 하려면?
   mysql을 dump 하기 위해서 mysqldump라는 명령어를 제공한다. 이 명령어는 DB에서 원하는 DB만, table만 백업 할 수 있고, 전체 DB를 백업 할 수 있다.

  (1) 전체 백업
    mysqldump -uroot -p -A > all.sql

  (2) 특정 DB 백업
    mysqldump -uroot -p 특정DB명 특정DB명.sql

  (3) 특정 DB에 특정 테이블 백업
    mysqldump -uroot -p 특정DB명 특정table명 > 특정DB명.특정table.sql

   위와 같은 방법으로 백업을 진행하며 우리가 원하는 결과를 얻어내기 위해서는 "(3)"번의 방법을 여러번 실행 할 수 있는 프로그램이 필요하다.
 



2) DB리스트를 얻어 내려면?
  mysql의 DB리스트를 얻어 내려면, "show databases" 쿼리를 던지면 리스트를 구할 수 있다.
  
  echo "show databases;" | mysql -uroot -p 

 위 명령어로 DB리스트를 얻을 수 있다. 그런데 결과가 이상하다.
처음 라인에 "Database"가 하나 있는 것을 확인 할 수 있다. 필드명 같은데..
제거하는 방법은 .. mysql명령에서 제공한다. '-N'옵션을 적용시키면 없어진다.


  echo "show databases;" | mysql -N -uroot -p 


  위 명령어로 DB리스트를 얻을 수 있으며, 이 리스트를 변수에 담아 보자

  db_list=`echo "show databases;" | mysql -N -uroot -p`

 위 명령을 내리면, db_list에 DB리스트를 넣게 된다. 여기서 "`"이 등장한다. 이는 "''" 안에 있는 명령어를 실행 시키라는 것이다.
변수를 지정하였기 때문에 명령어의 실행 결과는 변수에 들어가게 된다.
 여기서, 위 명령어는 MySQL DB root 비밀번호를 물어 보게 된다.
비밀번호를 묻지 않게 하기위해서 다음과 같이 넣어준다.

  db_list=`echo "show databases;" | mysql -N -uroot -p"DBroot비밀번호"`

 위와같이 하면, 실행시간에 DB의 root 비밀번호를 물어보지 않는다.




3) DB의 TABLE 리스트를 얻어 내려면?
  mysql의 TABLE리스트를 얻어 내려면 "show tables" 쿼리를 던지면 된다. '2)'와 비슷하게 다음과 같이 작성한다.

  table_list=`echo "show tables;" | mysql -N -uroot DB명 -p"DBroot비밀번호"`




4) '2)' 에서 얻어낸 DB리스트를 어떻게 하나 하나 적용 시킬 것인가?
  공백으로 구분된 값을 분리 하여, 하나 하나 변수에 넣을 수 있다.  bash에서는 for in 문법을 적용할 수 있다. 문법은 다음과 같다.

for 변수 in 리스트 ; do
  <명령어들>
done

다음 예제를 보자

for i in 사과 배 감자 ; do
 echo $i
done

위 예제에서  'i'는 반복 변수이다. 일반적인 프로그래밍언어에서 반복문에 사용되는 변수를 i로 많이 지정한다.
'사과 배 감자'는 반복할 항목이다. 위 예제의 결과는 다음과 같다.

사과

감자


그렇다면, '2)'에서 구했던 DB리스트를 하나 하나 출력해 보자.


db_list=`echo "show databases;" | mysql -N -uroot -p"DBroot비밀번호"`
for db in $db_list ; do
 echo $db
done

위와같은 방법으로 DB 리스트를 출력 할 수 있다.




5) 우리의 목적을 달성해 보자..
 위에서 알아본 것들을 응용해서 다음과 같이 우리가 원하는 쉘스크립트를 만들어 보자.


db_root_pw='비밀번호'

db_list=`echo "show databases;" | mysql -N -uroot -p"$db_root_pw"`
 for db in $db_list ;do
  table_list=`echo "show tables" | mysql -N -uroot -p"$db_root_pw" $db`
  for table in $table_list ; do
    mysqldump -uroot -p"$db_root_pw" $db $table > $db.${table}.sql
  done
 done

위 쉘스크립트는 DB리스트를 구하고, 또 그 DB의 테이블 리스트를 구해서 각 테이블별로 mysqldump명령어를 사용해서 백업하는 것이다.
위와같이 for문은 여러번 중첩해서 사용할 수 있다. 


위 명령을 내리면, 
 DB명.TABLE명.sql 으로 모든 테이블을 백업할 수 있다.



출처 : https://www.linux.co.kr/home/lecture/index.php?leccode=11046


Posted by 무소유v