MySQL에서 복제시 binlog_format 에 따라 동기화가 되지 않을 수 도 있다.

5.1 버전대에 추가된 기능으로 기존에는 Statement로 동작한다.



binlog_format 는 설정 파일 혹은 글로벌 변수로 변경 가능하고 값은

Statement, Row, MIXED 세가지가 들어갈 수 있는데



Statement 는 마스터에 들어온 쿼리를 쿼리문으로 기록하기 때문에


- 쿼리는 짧고 데이터 변경은 많은 종류가 많이 실행될 때 유리할 수 있으며

- 일반적으로 로그 양이 작고(master - slave간 회선이 느릴때 유리)

- 나중에 열어봤을때 알아보기가 상대적으로 쉽다 (일부 쿼리만 사용 가능)

- 버젼이 서로 달라도 사용 가능


-*항상 일관된 값이 나오지 않는 함수의 실행을 보장 할 수 없다. ( NOW()는 정상 작동하지만 SYSDATE()는 동기화 되지않을 수 있다.)

- 상대적으로 느리다(보통 쿼리의 실행이 데이터 변경보다 크기 때문에)



ROW는 변경된 데이터를 기록하는 방식으로

Statement 와 장단점이 반대라 볼 수 있으며 SYSDATE() 의 경우도 일관되게 복제된다.



MIXED는 서로의 장점을 취하는 방법으로

기본적으로는 Statement 필요에 따라 ROW로 기록하는 방식



운영 중간에 설정을 바꿀 수 있으나

임시테이블 사용중, 트리거나 프로시저에서 변경 시도, NDB가 활성화 되어 있을때는

변경이 불가하다.



잘 모르겠으면 MIXED나 ROW로 설정하는 편이 동기화 오류로 고생하는 일이 없을것 같다.






master와 slave의 연결을 끊었다 이었다 하는 식으로 데이터 동기화를 지연 시키면서

now() 함수와 sysdate() 함수로 데이터를 넣을 때 결과다


왼쪽 master 오른쪽 slave

1 = MIXED,        now()

2 = MIXED,        sysdate()

3 = MIXED,        sysdate()

4 = Statement ,  sysdate()

5 = Statement ,  now()

6 = ROW,          now()

7 = ROW,          sysdate()




http://www.mysqlkorea.com/sub.html?mcode=develop&scode=51ha&m_no=22902&cat1=1106&cat2=1287&cat3=1377&lang=k


Posted by Mr.Jo :

테스트 하려 mariadb를 설치하려다 기회가 온김에 정리해 본다.



우선 Mariadb 홈페이지에 가서 자신의 서버에 맞는 Binary 버젼을 받는다.

ps. 순서는 Mysql도 같음으로 Mysql을 설치하고 싶다면 받는것만 Mysql을 받으면 OK

//주소는 버전과 환경에 따라 달라지니 그대로 하면 안됨

# wget -O mariadb-10.0.14-linux-x86_64.tar.gz https://downloads.mariadb.org/f/mariadb-10.0.14/bintar-linux-x86_64/mariadb-10.0.14-linux-x86_64.tar.gz/from/http%3A/ftp.kaist.ac.kr/mariadb?serve



다운로드 받아 졌으면 적당한 곳에 압축을 풀고 보통 많이들 하는 경로(/usr/local/mysql)로 심볼릭 링크를 걸어주자.

(추후 버젼 업그래이드시 심볼릭 링크만 바꿔주면 되는 이점이 있다.)

# tar -xzf mariadb-10.0.14-linux-x86_64.tar.gz

# ln -s /home/Mariadb/mariadb-10.0.14-linux-x86_64 /usr/local/mysql




Mariadb를 서비스 할 계정을 생성하고 권한을 준다.

# groupadd mariadb

# useradd -d /home/Mariadb -g mariadb -p mariadb -s /bin/bash mariadb

# chown -R mariadb.mariadb mariadb-10.0.14-linux-x86_64



my.cnf를 생성하기 위해 suport-file에서 적당한 파일을 복사하고 경로 및 서비스계정 등 자신의 상황에 맞게 옵션을 수정하자.

# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

# vi /etc/my.cnf



기본 디비 생성

ps. /usr/local/mysql에서 실행하지 않으면 에러가 발생하며 basedir, datadir 등의 옵션도 있으니 참고

# cd /usr/local/mysql

# ./scripts/mysql_install_db --defaults-file=/etc/my.cnf --user=mariadb



자동 시작 할 수 있도록 서비스를 등록하고

//서비스에 등록될 파일 복사

# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld


//데비안

# update-rc.d mysqld defaults


//레드햇

# chkconfig –add /etc/init.d/mysqld



서비스 시작

# service mysqld start




/etc/profile 혹은 개인의 profile에

PATH=$PATH:/usr/local/mysql/bin

문구를 추가해 주면 mysql 문장으로 접속이 가능하다



이제 암호 설정 등 이것 저것 설정하고 사용하면 된다.






ps. 라이브러리가 없다는 메시지를 만났을 경우 데비안 기준

//libstdc++.so.6

# apt-get install lib32stdc++6

//libaio.so.1

# apt-get install libaio1


Posted by Mr.Jo :

Mysql과 MariaDB에 핫백업(Online Backup)을 지원하는 툴 중 무료에 쓸만한 툴은 Percona의 Xtrabackup이 제일 유명할 것이다.

하지만 한글로 정리된 자료 중 예와 함께 정리된 자료를 찾기 힘들어 이렇게 정리한다.




1) 백업 수행 계정

우선 백업하는 OS 계정은 root 혹은 mysql로 하는 것이 정신 건강상 편하다(보안을 위해 가능한 mysql계정으로)

설치 방법에 따라 다르지만 ubuntu에서 apt-get으로 설치했다고 하면 아마도 다음과 같이 소유권이 생성되어 있을 것이다.



여기서 소유권이 모두 접근 가능해야 하기 때문에 권한 설정을 잘 해 놓아야 하기 때문에 다른계정은 설정이 쉽지 않다.

(dba그룹을 만들고 참여하게 한다든지 방법이 없지는 않다.)




2) 모든 DB 백업

ex)

innobackupex  <백업경로>



위와 같이 하면 백업경로 아래에 시간 폴더가 생성되며 백업이 저장된다

(os계정 로그인에 관리자 권한이 없다면 "--user <관리자계정> --password <암호>"를 추가하자)




3) 로그 백업 (로그를 기존 백업에 수정된 내용이 반영됨)


ex)

innobackupex --apply-log <백업경로>/<시각폴더>




4) 모든 DB 복원


데이터 폴더 이름을 바꿔놓고(만약을 위해) 새로 생성후(빈 폴더) 권한을 바꿔주는 것이 포인트!

ex)

service mysql stop
mv /var/lib/mysql /var/lib/mysql_old
mkdir /var/lib/mysql
chown mysql:mysql /var/lib/mysql
innobackupex --copy-back <백업경로>
chown -R mysql:mysql /var/lib/mysql
service mysql start




5) 특정 DB복원


Database파일이 손상되었다면 그대로, Drop 하였다면 같은 이름으로 생성한(show databases에서 보이도록) 상태에서


ex)

service mysql stop
mv /var/lib/mysql/<대상디비명> /var/lib/mysql/<대상디비명>_old
cp -r <백업경로>/<대상디비명> /var/lib/mysql/<대상디비명>
chown -R mysql:mysql /var/lib/mysql/<대상디비명>
service mysql start

아마 여기까지 했다면 Database에 접속은 되지만 Table Select가 안될 것이다

찾아보면 서버에서 갖고 있는 테이블 정보와 매칭이 안되서라고 하니 다음을 수행시키자


확인해 보면 아마 복원 되어 있을 것이다




6) 특정 Table 복원


맹락은 특정 Database복원과 같다

show tables로 보이도록 만들어 두고


ex)

service mysql stop
mv /var/lib/mysql/<대상디비명>/<대상테이블명> /var/lib/mysql/<대상디비명>/<대상테이블명>_old
cp -r <백업경로>/<대상디비명>/<대상테이블명> /var/lib/mysql/<대상디비명>/<대상테이블명>
chown -R mysql:mysql /var/lib/mysql/<대상디비명>/<대상테이블명>
service mysql start


아마 여기까지 했다면 Database에 접속은 되지만 Table Select가 안될 것이다



mysqlcheck --all-databases


확인해 보면 아마 복원 되어 있을 것이다



'프로그래밍 > Mysql\정보' 카테고리의 다른 글

[MySQL] Stored Procedure 와 Compile  (1) 2014.10.23
[MySQL] Replication (복제) 동기화 문제  (0) 2014.10.23
Posted by Mr.Jo :