반응형

 

백업 . 

mysqldump --compress --max_allowed_packet=500M -h myhost mydb | gzip > /tmp/mydb.sql.gz 

 

복구

gunzip < /tmp/mydb.sql.gz | mysql --quick --reconnect -u myuser -pmypass -h localhost -D mydb 

 

출처: <https://m.blog.naver.com/PostView.nhn?blogId=kikikl&logNo=130171785626&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F>

반응형
반응형

mysqldump를 이용한 데이터 이관시 속도 개선 방법

Written by 김형진  on 오전 5:56  in mysql  with 댓글 없음

1. mysql 에서 아래 옵션을 변경

myisam_sort_buffer_size = 1000M
myisam_max_sort_file_size =
12G

스토레지 엔진을 myisam으로 변경한 다음 insert 완료후 


alter database **** engine=innodb

2. innodb_flush_log_at_trx_commit 설정 값 변경

innodb_flush_log_at_trx_commit 값이 1인경우 insert 할때 로그파일을 기록한다. 이로인해 초당 몇천건 정도 insert할 내용을 몇십건 정도 insert한다.


show variables like 'innodb_flush_log_at_trx_commit';

DB dump파일을 import 할때는 로그가 요 없으므로 0 으로 설정하고 변경 값 확인후 insert한 다음 추후 설정값을 다시 복구한다.


set global innodb_flush_log_at_trx_commit=0;

3. table 별로 백업 sql 만들기

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

4. 옵션을 통해 시간 줄이기

--no-autocommit=1 : autocommit을 끄고 개의 테이블 입력 완료후 commit 수행, 오류 발생시 다시 처음부터 시작함

 

--single-transaction=1 : 작업 후에 변경 된 데이터의 내역을 다시 적용하지 않는다.

 

--extended-insert=1 :  INSERT 구문이 늘어나는 것을 막아준다.

 

- export 할때


mysqldump -hHOST_NAME -uMY_ID -pMY_PASSWORD --databases DB_NAME --tables TABLES_OF_DB_NAME --no-autocommit=1 --single-transaction=1 --extended-insert=1 > DUMP.sql

- import 할때


mysql -hHOST_NAME -uMY_ID -pMY_PASSWORD --database DB_NAME < DUMP.sql

5. txt 파일이용하기

- export 할때

mysqldump DATABASE_NAME > DUMP.txt

- import 할때


mysql -u username -p –database=DATABASE_NAME < DUMP.txt

6. large dump

mysql -h localhost -uroot -pPASSWORD
set global net_buffer_length=1000000;
set global max_allowed_packet=1000000000;
SET foreign_key_checks = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
source /media/dbdump.sql

완료후

SET foreign_key_checks = 1;
SET UNIQUE_CHECKS = 1;
SET AUTOCOMMIT = 1;

7. 기타

my.cnf 위치찾기

mysql --verbose --help | grep -A 1 'Default options'

/etc/my.cnf 파일에서

innodb_buffer_pool_size = 4G
innodb_log_buffer_size =
256M
innodb_log_file_size =
1G
innodb_write_io_threads =
16
innodb_flush_log_at_trx_commit =
0

설정 후 와 데이터 입력후 2번 실행

service mysql restart

키워드 : mysql big data fast import

 

출처: <https://lalwr.blogspot.com/2017/12/mysqldump.html>

반응형
반응형

그럴 때 필요한 것이 바로 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 

 

 

mysqldump 옵션

--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);
 으로 늘려준다. 이러면 하루 온 종일 도는 거다 --;;

이 3가지 옵션으로 백업을 한결과.... 놀라움을 극치 못했습니다 연습용 10기가 용량이 육박하는

데이터베이스를 보통 백업을 뜰때 30~40분 정도가 소요됬습니다(서버가 켄츠할배와 같은시기에 나온 제온..)

근데............. 그런데!!!!!!!!!! 저 3가지 옵션을 준후에는 10분 안짝으로 백업이 되는것 입니다..

놀라움을 극치 못하고 그러면 원본 포스팅에서 복원 속도도 체감상 1/10로 줄어들었다는데.......

정말이지 진짜 체감상 1/10로 줄어든 기분입니다.....하~ 이렇게 좋은 옵션이 있을줄은 생각지도 못했네요

일단 대용량 백업을 자주 뜨시는 분들이 계시면 저 옵션도 추천해드리고 실시간 백업을 요하는 분들은

Xtrabackup 솔루션을 추천드립니다 ( 증분 백업이 가능합니다! )

 

출처: http://dongwonme.tistory.com/entry/MySQL-대용량-백업-복원-빨리하기 [Dongwon.me]

 

출처: <http://dongwonme.tistory.com/entry/MySQL-%EB%8C%80%EC%9A%A9%EB%9F%89-%EB%B0%B1%EC%97%85-%EB%B3%B5%EC%9B%90-%EB%B9%A8%EB%A6%AC%ED%95%98%EA%B8%B0>

 

 

 

 

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

 

출처: <http://blackbull.tistory.com/8>

반응형
반응형

8기가 램에 맞는 Mysql config 셋팅 값

 

################################################################################

#DATE: 2011-02-02

#SITE: http://datastrangler.com

#DESCRIPTION: MySQL config 5.0.x, 5.1.x, 5.5.x 

#RAM: 8GB RAM dedicated server

#Connections: 1000 connections

################################################################################

[mysqld_safe]

nice  = -15

 

[client]

socket  = /var/lib/mysql/mysql.sock

default-character-set  = utf8

 

[mysqld]

## Charset and Collation

character-set-server  = utf8

collation-server  = utf8_general_ci

 

## Files

back_log  = 300

open-files-limit  = 8192

open-files  = 1024

port  = 3306

socket  = /var/lib/mysql/mysql.sock

pid-file  = /var/lib/mysql/mysql.pid

skip-external-locking

skip-name-resolve

 

## Logging

datadir = /var/lib/mysql

relay_log = mysql-relay-bin

relay_log_index = mysql-relay-index

#log = mysql-gen.log

log_error = mysql-error.err

log_warnings

log_bin = mysql-bin

log_slow_queries = mysql-slow.log

#log_queries_not_using_indexes

long_query_time  = 10 #default: 10

max_binlog_size  = 256M #max size for binlog before rolling

expire_logs_days  = 4 #binlog files older than this will be purged

 

## Per-Thread Buffers * (max_connections) = total per-thread mem usage

thread_stack  = 256K   #default: 32bit: 192K, 64bit: 256K

sort_buffer_size  = 512K   #default: 2M, larger may cause perf issues

read_buffer_size  = 512K   #default: 128K, change in increments of 4K

read_rnd_buffer_size  = 512K   #default: 256K

join_buffer_size  = 512K   #default: 128K

binlog_cache_size  = 64K   #default: 32K, size of buffer to hold TX queries

## total per-thread buffer memory usage: 4736000K = 4.625GB

 

## Query Cache

query_cache_size  = 32M #global buffer

query_cache_limit  = 512K #max query result size to put in cache

 

## Connections

max_connections  = 2000 #multiplier for memory usage via per-thread buffers

max_connect_errors  = 100 #default: 10

concurrent_insert = 2 #default: 1, 2: enable insert for all instances

connect_timeout = 30 #default -5.1.22: 5, +5.1.22: 10

max_allowed_packet  = 32M #max size of incoming data to allow

 

## Default Table Settings

sql_mode  = NO_AUTO_CREATE_USER

 

## Table and TMP settings

max_heap_table_size  = 1G #recommend same size as tmp_table_size

bulk_insert_buffer_size  = 1G #recommend same size as tmp_table_size

tmp_table_size                  = 1G    #recommend 1G min

#tmpdir                         = /data/mysql-tmp0:/data/mysql-tmp1 #Recommend using RAMDISK for tmpdir

 

## Table cache settings

#table_cache  = 512 #5.0.x

#table_open_cache = 512 #5.1.x, 5.5.x

 

## Thread settings

thread_concurrency = 16  #recommend 2x CPU cores

thread_cache_size = 100 #recommend 5% of max_connections

 

## Replication

#read_only

#skip-slave-start

#slave-skip-errors = <default: none, recommend:1062>

#slave-net-timeout = <default: 3600>

#slave-load-tmpdir = <location of slave tmpdir>

#slave_transaction_retries = <default: 10>

#server-id                      =

#replicate-same-server-id       =  

#auto-increment-increment       =

#auto-increment-offset          =

#master-connect-retry           =

#log-slave-updates = <default: 0 disable>

#report-host = <master_server_ip>

#report-user = <replication_user>

#report-password                =

#report-port = <default: 3306>

#replicate-do-db             =

#replicate-ignore-db =

#replicate-do-table

#relicate-ignore-table =

#replicate-rewrite-db =

#replicate-wild-do-table =

#replicate-wild-ignore-table =

 

## Replication Semi-Synchronous 5.5.x only, requires dynamic plugin loading ability 

#rpl_semi_sync_master_enabled = 1 #enable = 1, disable = 0

#rpl_semi_sync_master_timeout = 1000 #in milliseconds , master only setting

 

## 5.1.x and 5.5.x replication related setting. 

#binlog_format = MIXED

 

## MyISAM Engine

key_buffer = 512K #global buffer

myisam_sort_buffer_size = 128M #index buffer size for creating/altering indexes

myisam_max_sort_file_size = 256M #max file size for tmp table when creating/alering indexes

myisam_repair_threads = 4 #thread quantity when running repairs

myisam_recover = BACKUP #repair mode, recommend BACKUP 

 

## InnoDB Plugin Dependent Settings

#ignore-builtin-innodb

#plugin-load=innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_reset=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so

 

## InnoDB IO Capacity - 5.1.x plugin, 5.5.x

#innodb_io_capacity = 200

 

## InnoDB IO settings -  5.1.x only

#innodb_file_io_threads = 16

 

## InnoDB IO settings -  5.5.x and greater

#innodb_write_io_threads  = 16

#innodb_read_io_threads = 16

 

## InnoDB Plugin Independent Settings

innodb_data_home_dir            = /var/lib/mysql

innodb_data_file_path = ibdata1:128M;ibdata2:10M:autoextend

innodb_log_file_size = 256M #64G_RAM+ = 768, 24G_RAM+ = 512, 8G_RAM+ = 256, 2G_RAM+ = 128 

innodb_log_files_in_group = 4 #combined size of all logs <4GB. <2G_RAM = 2, >2G_RAM = 4

innodb_buffer_pool_size = 4G  #global buffer

innodb_additional_mem_pool_size = 4M #global buffer

innodb_status_file    #extra reporting

innodb_file_per_table #enable always

innodb_flush_log_at_trx_commit = 2 #2/0 = perf, 1 = ACID

innodb_table_locks = 0 #preserve table locks

innodb_log_buffer_size  = 128M  #global buffer

innodb_lock_wait_timeout  = 60

innodb_thread_concurrency = 16 #recommend 2x core quantity

innodb_commit_concurrency = 16 #recommend 4x num disks

#innodb_flush_method = O_DIRECT    #O_DIRECT = local/DAS, O_DSYNC = SAN/iSCSI

innodb_support_xa = 0    #recommend 0, disable xa to negate extra disk flush

skip-innodb-doublewrite

 

## Binlog sync settings

## XA transactions = 1, otherwise set to 0 for best performance

sync_binlog = 0

 

## TX Isolation

transaction-isolation = REPEATABLE-READ #REPEATABLE-READ req for ACID, SERIALIZABLE req XA

 

## Per-Thread Buffer memory utilization equation:

#(read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size + binlog_cache_size) * max_connections

 

## Global Buffer memory utilization equation:

# innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + key_buffer_size + query_cache_size

 

[mysqldump]

quick

quote-names

max_allowed_packet  = 128M

 

 

출처: <http://urin79.com/blog/20654063>

 

 

 
 

 

반응형
반응형

MySQL 5.6.x Replication(MySQL 5.6 이중화)

 

참조

MySQL 공식문서

http://dev.mysql.com/doc/refman/5.6/en/replication.html

참고 블로그들

원리부터 설명까지http://blog.hibrainapps.net/130

여기도 설명 굿http://gywn.net/2012/02/mysql-replication-2/

 

여기서 설명은 대부분 MySQL 공식문서에서 Setting하는 순서와 여러 블로그 내용을 참조

 

Step1. Create a Data Snapshot

 

Replication을 시작하기전에 dump를 이용해 임포트하자.

 

case1) Using mysqldump

mysqldump -u root -p 'password' --all-databases --master-data=2 > dbdump.sql

mysqldump의 실행결과는 그냥 출력되기에 리다이렉트를 사용해야 한다.

--all-databases

모든 database   

--master-data

Slave Replication 프로세스를 시작하기전에 필요로하는 상태인 CHANGE MASTER TO를 자동적으로 추가

--master-data=1

이건 잘 모르겠다. 구글링해봥

--master-data=2

이건 sql문으로 작성된다는데 구글링해봥

 

그냥 --master-data 설정해놓고 찜찜해서 CHANGE MASTER TO를 그냥 해버렸다

 

Slave로는 다양한 방법이 있겟지만 scp를 사용해서 전송했다.

 

 

Slave에서는 다음과 같이 적용시켰다.

 

 

case2) Using Raw Data Files

DB가 크다면 Raw Data File들을 복사하는 것이 mysqldump를 사용하는 것 보다 효율적이다.

 

 

Step2. Master Configuration

 

- Enable binary logging

바뀐 데이터를 Master에서 Slaves로 보낸데 있어서 기본이기에 반드시 해야만한다.

 

- Establish a unique server ID

Replication group의 각각의 Server들은 고유의 Server ID를 가지고 있어야한다.

Server ID값은 1부터 65535까지의 양수가 될 수 있다. 어떻게 부여할지는 전적으로 당신의 몫

 

 

- MySQL Server를 설치하고 my.cnf my.ini 파일을 수정해야한다.

mysqld 섹션에 다음과 같이 추가한다.(yum으로 깔았더니 /etc/my.cnf 라는 경로를 가졌다.)

[mysqld]

log-bin=mysql-bin

server-id=1

 

- Debian/Ubuntu 같은 OS ski-networking "bind-address to 127.0.0.1"로 표기

-- 이 주소에 Slave의 주소나 HostName을 넣어야한다.

 

아래와 같이 설정했다

 

 

참고사항

Server-id는 설정하지 않으면 기본값은 0이다.

트랜잭션들과함께 InnoDB를 이용해 Replication을 설정하는데 있어서 가능한한 최대한의 지속성과 일관성을 위해

당신은 innodb_flush_log_at_trx_commit=1 sync_binlog=1 my.cnf파일에 추가해야한다.

skip-networking 옵션은 당신의 Replication Master에서 사용할 수 없음을 보장한다.

만일 네트워킹이 중지된다면, 당신의 Slave Master와 통신할 수가 없고 Replication은 실패하게 된다.   

Master 또한 Slave라면 my.cnf my.ini "log-slave-updates"라는 구문을 추가해야한다.

 

 

Binary Log를 남기게 되는 순간부터 datadir에 가보면(/var/lib/mysql)에 보면 다음과 같이 Log들이 남는다.

 

 

Step3. Slave Configuration

- Establish a unique server ID.

server-id 값은 IP주소 같은거로 생각하면된다.

ID들은 Replication 파트너와의 통신에서 유일하게 각각의 server instance를 구분한다.

server-id 값을 생략하면 기본값은 0이되며, Master로의 연결을 거부하게 된다.

 

(Step1과 똑같은 파일입니다)

 

Slave들은 binary logging을 할필요가없지만 데이터 백업이나 충돌 회복 용으로도 사용이 가능하다.

물론 또다른 Slave들을 사용하는데에도 사용이 가능하다.

my.cnf "report-host=hostname"을 넣어주면 Master에서 "show slave hosts" 명령어가 작동한다.

 

 

Step4. Create a User for Replication

 

Slave들이 Master에 접근하기위해서 Master User계정이 필요하다

어떤 계정이든 상관없고 REPLICATION SLAVE 권한이 필요하다.

Slave마다 다른 계정을 줄 수도 있고 같은 계정을 줄 수도 있다.

어떤 계정을 따로 만들 필요없지만

master.info에 평문으로 User name password가 저장된다는 것을 알고 있어야 한다.

그러므로 Replication 작업만을 위한 계정을 따로 생성할 필요가 있다.

 

mysql> CREATE USER 'repl'@'IP주소 or 호스트이름' IDENTIFIED BY 'slavepass';

 

 

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com';

 

 

 

Step5. Obtaining the Replication Master Binary Log Coordinates

 

Replication하기전에 Master Binary Log File의 이름과 Position(아마 Coordinates가 이건듯)을 알아야한다.

이 정보들은 나중에 Slave들이 Replication하기 전에 CHANGE MASTER TO작업에서 필요하다.

 

Master가 남긴 수 많은 Binary Log File들 중에 어떤 File을 어디서 부터 읽을 것이냐? 이런걸 표현하는 것 같다.

 

MySQL 문서를 보면 이 작업하기전에 반드시 Master에서 하고있는 모든 실행 상태를 정지하라고 한다. 내 생각이지만 계속 작업을 진행중이라면 Binary Log File이 계속 수정될 것이고 Position(Coordinates) 또한 그럴 것이기 때문이다.

 

mysql> SHOW MASTER STATUS;

 

File명과 Position을 기록하라!

 

아래 부터는 MySQL 문서를 대강 번역했다.

-------------------------------------------------------------------------------------------------------------------------------

Replication 작업을 시작하기전에 Slave들과 동기화하길 원하는 Master Data들이 있다면반드시 Master에서의 모든 실행 상태를 정지하고

다시 실행하기 전까지 Master의 현재 Binary Log 좌표(Position)를 얻어라.

 

만일 실행상태를 멈출수 없다면, 데이터 dump와 당신이 사용할 마스터의 상황 정보는 match되지 않을 것이고(아다리가 안맞는다는말인듯)

Slave에서 불일치하고 퇴폐된 데이터베이스를 가지게될 것이다.

 

1st) Master에서 Command-line client로 접속함으로써 세션을 시작하고,

모든 테이블들을 flush하고 "FLUSH TABLES WITH READ LOCK"의 실행으로써 Write Statements들을 Block한다.

만약 client로 세션을 끊으면 Lock을 풀리게 된다.

 

2nd) Master의 또 다른 세션으로 "SHOW MASTER STATUS"을 통해 현재 binary log파일의 이름과 위치를 확인한다.

나중에 Slave를 세팅할때 필요한다음 기록해두어야한다.

그 정보들은 Slave Master로부터 새로운 update의 처리를 시작하기 위해 Replication 좌표를 표현한다.

 

만일 Master binary logging enabled없이(Step2.없이) 이때까지 실행되어왔다면,

로그 파일 이름과 포지션 값들은

SHOW MASTER STATUS"

mysqldump --master-data에서 empty값일 것이다.

(아까 --master-data CHANGE TO MASTER 구문을 자동으로 추가한다고 했는데

CHANGE TO MASTER 구문에서는 Binary Log File이름과 Position을 필요로한다.

자동으로 추가된 File 이름과 Position이 빈 값이라는 표현같다.)

이런 경우에는, Slave의 로그파일과 포지션들을 지정할때 당신이 필요로 할 값들은 empty string('') 값이다.

-------------------------------------------------------------------------------------------------------------------------------

 

 

Step6. Start Replication!

 

모든 준비가 끝났다. Replication을 시작하기전에 마지막 세팅을 하면 된다.

위 에서 mysqldump할때 --master-data 자동으로 추가한다는게 CHANGE MASTER TO 였다.

 

 

 

1) 설정을 해보자

빡 침 주 의 ! ! P u t t y 로 작업 요 망 (숫 자 에 는 작 은 따 옴 표 안 붙 음 ! )

 

mysql> CHANGE MASTER TO

MASTER_HOST = ' IP주소 ',

MASTER_USER = ' MASTER에 접속할 DB 계정 ',

MASTER_PASSWORD = ' MASTER에 접속할 DB계정의 패스워드',

MASTER_PORT = ' MASTER가 있는 DB의 리스터 포트(MySQL은 디폴트 포드가 3306이다) ',

MASTER_LOG_FILE = ' 아까 기록해두었던 Binary Log File의 이름이다. ',

MASTER_LOG_POS = 아까 기록해두었던 Position값이다. ,

MASTER_CONNECT_RETRY = MASTER로의 접속을 하는 주기이다. 양의 정수로 단위는 초(Second)이다.

;

 

2) SLAVE 시작

mysql > START SLAVE;

 

3) 상태확인해보자

mysql > SHOW SLAVE STATUS;

캡쳐가 상당히 더럽지만 핵심은 Waiting for master to send event이다.

Slave I/O Thread Master의 변경 Event를 감지하고 있는 것이다.

SHOW SLAVE STATUS \G; 이렇게하면 깔끔하게 나온다!! Shift + Page Down(OR UP) 으로 스크롤 업 다운

 

 

4) Master 쪽에서도 확인을 해보자.

mysql > show slaves host;

 

) 만일 Slave에서 계속 접속을 시도하고 있다면?

Solution1) 방화벽을 확인(firewall-cmd 3306포트를 풀어준다.)

 

 

중요한 점은 위에서 진행한 것처럼 해도 결국은 에러가 난다.. UUID가 겹친다. Dump

했으면 에러가 안나는데 전체 복사를 해서 그런 것이다. Auto.cnf 파일 지우면 됩니다.

 

 Cloning MySQL 5.6 instances

August 23, 2013 by ronald

A tip for all those cloud users that like cloning database servers (as reported in my book Effective MySQL – Replication Techniques in Depth).

Starting with MySQL 5.6, MySQL instances have a UUID. Cloning servers to quickly create slaves will result in the following error message.

mysql> SHOW SLAVE STATUSG
...
  Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
...

The solution is simple. Clear our the file based configuration file (located in the MySQL datadir) and restart the MySQL instance.

$ rm -f /mysql/data/auto.cnf
$ service mysql restart

 

출처: <http://ronaldbradford.com/blog/cloning-mysql-5-6-instances-2013-08-23/>

 

 

반응형
반응형
Mysql 리플리케이션(mysql 5.x 버전 기준!)      


- korea IDC 시스템엔지니어팀 -










#MYsql 리플리케이션이란? 
# Replication 3.23.15부터 지원되기 시작한 기능으로 ‘복제’라는 사전적 의미에 맞게 마스터의 MySQL 서버의 데이터를 여러 대의 슬레이브 MySQL 서버의 데이터와 동기화 시켜주는 기능이다. 주로, MySQL의 데이터를 실시간으로 백업하거나, 데이터 서버의 부하분산을 하고자 할 때 많이 사용된다.








0. 서버 설정 




1번서버 - master 서버  : 1차네임서버 : 192.168.1.111
2번서버 - slave 서버     : 2차네임서버 : 192.168.1.222


mysql 버전은 모두 mysql 5.X 이다
두 서버 모두 mysql 데이터는 /free/mysql_data 에 위치해 있다고 가정한다.






1. Master 서버 설정


# vi /etc/my.cnf


(1) my.cnf 파일에서 #log-bin=mysql-bin 부분의 주석을 반드시 해제해준다
슬레이브 서버에서 저 바이너리 로그를 기준으로 데이터 리플리케이션을 실행 하기 때문에 저 로그파일이 꼭 필요하다!


(2) server-id = 1 로 설정한다. 
마스터서버와 슬레이브서버의 번호가 서로 다르기만 하면 되기 때문에 원하는 번호를 지정한다.


 




(3) slave 서버 에서 접속 할 수 있는 Mysql 계정을 생성해준다
# mysql -u root -p 로 디비 접속
mysql > GRANT REPLICATION SLAVE ON *.*  TO 유저명@접속허용할IP IDENTIFIED BY '패스워드';


접속허용할 IP에 특정 IP만을 부여 할 수도 있고 '%' 를 적어주면 모든 외부의 접속을 허용한다는 의미이다.
mysql > use mysql
mysql > select * from user \G;
명령로 설정이 되어 있는지 확인 할 수 있다.


아래 셋팅은 실제 마스터 서버인 1차네임서버 서버의 설정 내용이다.


접속을 허용한 유저 이름은    : nayana
nayana 접속을 허용한 IP : 192.168.1.222 (2차 네임서버)


슬레이브 서버(192.168.1.222) 에서 nayana 라는 계정의 Replication 접속을 허용한 것을 볼 수 있다.
 




(4) mysql을 재시작 하고 마스터 서버의 동작을 확인한다.
"mysql-bin.000022" 라는 바이너리 로그 파일을 생성한 것을 볼 수 있다.
 






2. Slave 서버 설정
(1) 마스터 서버의 DB를 슬레이브 서버의 DB에 복사한다!(= 최초1회는 직접 복사해서 동기화해준다!)
이유는?


mysql 리플리케이션은 rsync와 다르게 동기화로 엮여진 시점부터의 DB변화를 동기화 시킨다.


[ 동기화 전 DB 구조]
마스터               슬레이브        
1                        1
2                        2
3


########## 동기화 후 마스터 서버에 4 라는 DB를 추가하면? #########


[ 동기화  DB 구조]
마스터               슬레이브        
1                        1
2                        2
3                        4
4


이렇게 4 라는 DB만 추가되고 3이라는 DB는 추가되지 않는다. 애초에 처음부터 DB내용이 달랐기 때문!
rsync 였다면 양쪽에 모두 똑같아 졌을 것이다.




[ 마스터 서버 ]
# cd /free
# tar zcvf mysql.tar.gz mysql_data
# sz mysql.tar.gz


압축한 파일을 다운받아 슬레이브 서버의 /free/mysql_data 디렉토리에 플어준다. 이로서 최초 동기화를 완료했다.


(2) /etc/my.cnf 파일을 수정한다!
57 , 62 번 라인은 주석처리해주고 98번 라인부터는 아래와 같이 주석을 풀고 마스터 서버에 접속할 정보를 적는다.


 




(3) mysql 을 재시작 한후 mysql에 접속하여 동기화가 되었는지 확인한다.
동기화가 정상적으로 되었다면 아래와 같이 "Waiting for master to send event" 라는 구문이 출력된다!


 


이제 마스터 서버에서 DB를 생성하거나 삭제하면 슬레이브 서버에서도 똑같이 동기화가 될 것이다!! 올레~!
반응형
반응형

MySQL Replication (마스터-슬레이브 동기화) 설정

MySQL 2014/04/08 17:08

 

 

서론
응용 프로그램 혹은 웹 페이지의 작은 기능 단위 연동을 위해서는, rsync로 db 파일을 동기화하는 경우가 있었다.
하지만 rsync 서비스도 정상인지 봐야 하고 스케줄링(crontab) 주기도 설정해야 하고 간혹 문제가 생기기도 하고 테이블 index가 꼬이거나 파일이 깨지는 등 번거로운 방법이다.


그래서 향후에는 작은 부분이더라도 Replication을 하기로 했다.
특정 DB 혹은 특정 Table만 동기화 설정이 가능하기 때문이다.

 

선행 작업

 

Master에서 Slave로 동기화하기를 원하는 DB(및 Table)은 미리 Dump를 떠서 최초 1번은 Slave에 생성해 놓아야 한다.

 

 

 

Master 서버 설정

 

우선 server-id가 1로 설정되어 있는지 확인한다.

Master는 보통 1로 설정한다. 그래야 Slave에서 부가적인 설정을 할 필요가 없다.

 

# cat /etc/my.cnf -n | grep server-id
67 server-id          = 1

 

이번엔 mysql에 접속해서 상태를 확인한다.

 

mysql> show master status;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_do_db | Binlog_ignore_db |
+---------------+----------+--------------+------------------+
| mysql-bin.189 | 91120973 |              |                  |
+---------------+----------+--------------+------------------+

File, Position 값을 각각 메모해 둔다(mysql-bin.189, 91120973).

 

마지막으로 본 서버에 접속해서 동기화 받아갈 Slave 서버들에 권한을 주자.

 

mysql> GRANT REPLICATION SLAVE ON *.* TO 유저@'%' IDENTIFIED BY '패스워드';
mysql> FLUSH PRIVILEGES;

*.*은 DB.Table 이고 %는 ip 모두 허용... 인데 GRANT는 익숙한 구문이므로 자세한 설명은 생략한다.

 

 

 

Slave 서버 설정

 

Master와 같이 server-id 값을 확인한다.

는 Master와 다른 값을 가져야 하므로 2로 수정하는게 좋겠다.

 

# cat /etc/my.cnf -n | grep server-id
67 server-id          = 2

 

Slave의 mysql에 접속해서 동기화 받을 DB가 존재하는 Master 서버의 정보를 입력할 차례다.

 

mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST='192.168.xxx.xxx', MASTER_USER='유저',MASTER_PASSWORD='패스워드', MASTER_LOG_FILE='mysql-bin.189', MASTER_LOG_POS=91120973;
mysql> START SLAVE;

Master에서 메모한 2개의 값을 MASTER_LOG_FILE 부분과 MASTER_LOG_POS 부분에 대입한다.

 

Slave가 Master에게서 제대로 동기화 받아오는지 확인해 보자.

 

mysql> SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.xxx.xxx
                                     ...(생략)...

Waiting for master to send event 문구가 표시되면 정상이다.

 

여기서 일단 끝인데... 조금 더 세부적으로...

모든 DB를 동기화하는 것이 아니라, 특정 DB 특정 Table만 동기화 하고 싶다면 아래와 같이 my.cnf 파일에 설정한다.

 

vi /etc/my.cnf
[mysqld]
...(생략)...
replicate-do-table = DB.Table1
replicate-do-table = DB.Table2
replicate-do-db = DB1
replicate-do-db = DB2
  • Slave에 설정할 수도 있고 Master에 설정할 수도 있다.
  • 한 라인에 여러 값을 기입할 수는 없었다. 여러 라인에 각각 지정해야 한다.
  • replication-ignore-table은 동기화 받지 않을 테이블만 기록하는 설정이다.
    이 외에도 여러 설정이 존재한다(더 자세한건 구글링을).

 

 

 

참고 사항
1. 기본적인 것이지만 iptables 등의 방화벽 설정에서 서버 ip, port를 open해야 한다.
2. 역시 기본적인 것이지만 my.cnf 파일을 수정했다면 mysqld service를 재시작해야 한다.

 

반응형
반응형

 DB: MySQL / DB

2007/08/14 02:09

http://seuis398.blog.me/70020889375

전용뷰어 보기

LVM Linux 시스템에서 디스크 Volume을 논리적으로 관리할 수 있도록 해준다.

대략적인 구조는 아래와 같다.

 

LVM의 기능중에 Logical Volume 스냅샷 생성 기능을 활용하면,

InnoDB 스토리지 엔진의 경우 온라인 백업(Hot Backup)을 수행할 수 있고,

MyISAM의 경우에는 몇 초 정도의 TABLE LOCK으로 온라인 백업을 수행할 수 있다. (Warm Backup)

 

Logical Volume의 스냅샷을 생성하면, 즉시 Logical Volume 간 물리적인 복사가 이루어 지는 것은 아니고,

스냅샷 Volume 상에 Exception Table이라는 것이 생성되어 변경된 디스크 블럭의 정보를 보관하여,

그 정보를 바탕으로 스냅샷 생성 시점의 데이터를 읽을 수 있도록 해준다.

 

LVM을 이용한 MySQL 스냅샷 백업을 위해서는 아래와 같은 환경이 구성되어 있어야 한다.

- Linux 시스템에 LVM이 설치되어 있어야 한다. (LVM 1, 2 모두 가능)

- MySQL data 디렉토리는 LVM Logical Volume 상에 존재해야 한다.

 

data 디렉토리로 사용할 Logical Volume의 크기는,

DB의 사이즈 뿐만 아니라, 스냅샷을 생성을 위한 Volume의 크기까지 고려해서 결정해야 한다.

스냅샷 Volume의 크기는 원본 Volume 50% 정도면 충분하다.

 

<snapshot 백업 순서>

1. MyISAM 스토리지 엔진 사용시 테이블 락을 설정한다.

 

mysql> FLUSH TABLES WITH READ LOCK;

Query OK, 0 rows affected (0.01 sec)

 

2. 스냅샷 Volume을 생성한다.

 

# lvcreate --snapshot  -L 10G -n backup /dev/vg/mysqldata

lvcreate -- WARNING: the snapshot will be automatically disabled once it gets full

lvcreate -- INFO: using default snapshot chunk size of 64 KB for "/dev/vg/backup"

lvcreate -- doing automatic backup of "vg"

lvcreate -- logical volume "/dev/vg/backup" successfully created

현재 MySQL Data 디렉토리가 있는 Logical Volume(mysqldata)의 스냅샷을 생성하였다.

스냅샷 Volume의 이름은 backup으로 지정하였고, /dev/vg/backup 생성하였다.

(스냅샷 생성 시간은 1~2초 정도 걸렸다.)

 

스냅샷 생성 결과는 lvscan 명령으로 확인해 보면 된다.

 

#  lvscan

lvscan -- ACTIVE   Original "/dev/vg/mysqldata" [20 GB]

lvscan -- ACTIVE   Snapshot "/dev/vg/backup" [9.96 GB] of /dev/vg/mysqldata

lvscan -- 2 logical volumes with 29.96 GB total in 1 volume group

lvscan -- 2 active logical volumes

 

3. 1번 과정에서 테이블 락을 설정하였다면락을 해제한다.

mysql> UNLOCK TABLES;

Query OK, 0 rows affected (0.00 sec)

 

4. Snapshot Volume을 백업을 위한 새로운 MySQL 데몬의 data 디렉토리로 Mount 하고,

   mysqldump 툴을 사용하여 백업을 받는다.

 

# mount -t ext3 /dev/vg/backup /usr/local/mysql_backup/data/ 

# /usr/local/mysql_backup/safe_mysqld &

# /usr/local/mysql_backup/bin/mysqldump --all-databases > backup.sql

MySQL DB의 스냅샷 백업이 진행되는 동안에도, 기존 MySQL 서버는 정상적으로 서비스 되므로

백업에 영향을 받지 않고, 정상적으로 서비스를 유지할 수 있다.

하지만 스냅샷 생성을 하면 해당 시점부터 원본 Volume과 스냅샷 Volume에 대해 중복으로 I/O가 발생하며,

변경 작업이 과도하게 많이 일어나거나, 외부 스토리지가 아닌 일반적인 SCSI, SATA 디스크를 쓰는 경우,

스냅샷 유지를 위해 증가한 I/O로 인하여 퍼포먼스 저하를 일으킬 수 있으니 유의하자.

 

6. 백업을 위한 임시 MySQL 데몬을 종료하고, 스냅샷 Volume을 삭제한다.

 

# /usr/local/mysql_backup/bin/mysqladmin shutdown

# umount /dev/vg/backup

# lvremove -f /var/vg/backup

lvremove -- doing automatic backup of volume group "vg"

lvremove -- logical volume "/dev/vg/backup" successfully removed

백업이 완료된 후에는 스냅샷 Volume을 반드시 삭제해야 한다.

 

<장점>

- 테이블 락으로 인한 서비스 중단없이 시점 백업을 받을 수 있다. (온라인 백업)

- 리플리케이션 Slave 구성을 간편하게 할 수 있다.

 

<단점>

- 스냅샷 생성 후 유지하는 동안 I/O가 늘어난다.

- LVM 자체에 대한 안정성 검증(LVM 버그 등)이 필요하다. (Volume이 날라가 버린다면 낭패..)

[출처] LVM을 이용한 MySQL 스냅샷 백업|작성자 돌고래사육사

 

원본 위치 <http://blog.naver.com/PostView.nhn?blogId=seuis398&logNo=70020889375&beginTime=0&jumpingVid=&from=search&redirect=Log&widgetTypeCall=true&topReferer=http%3A%2F%2Fsearch.naver.com%2Fsearch.naver%3Fsm%3Dtab_hty.top%26where%3Dnexearch%26ie%3Dutf8%26query%3DLVM%2Bsnapshot>

반응형

+ Recent posts