Login 통계 관련하여 설계를 진행 했다.


그 동안 Login / out 정보를 테이블로 각기 다르게 추가를 하였다.

그러다 보니 Login/out 정보를 제대로 관리가 되지 않았다.


그래서 아래와 같이 설계 하였다.


create table LoginResult (

PlayerID varchar(50),

Name varchar(30),

WorldNum int(2) unsigned,

CurrentChannel int(2) unsigned,

LoginIP varchar(15) NOT NULL,

PayPlayCheck enum('0','1') NOT NULL default '0',

LoginDatetime datetime NOT NULL default '0000-00-00 00:00:00',

LogoutDatetime datetime NOT NULL default '0000-00-00 00:00:00',

Status enum('0','1','2') NOT NULL default '0'

);


create index idx_Login_PlayerID on LoginResult (PlayerID,Name);

create index idx_Login_Status on LoginResult (Status desc,Name);



간단하다.

- Login 할 때는 Insert / out 할때는 Update를 진행 한다.


Status

 0

 Logout 상태일 때  

 1

 Login 상태 일 때

 2

 Login 후 정상적으로 out 하지 않았을 때


이렇게 구성한 후 일일 평균 / 특정 구간 동안의 평균을 낸 쿼리를 다음과 같이 구성하였다.


SELECT 

WorldNum, 

D.Name, 

CurrentChannel, 

SUM(CASE WHEN STATUS='1' THEN 1 END) cntNow, 

SUM(CASE WHEN DATE_FORMAT(LoginDatetime, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d') THEN 1 END) cntCon, 

SEC_TO_TIME

(AVG

(CASE WHEN 

STATUS IN ('0','1') 

AND DATE_FORMAT(LoginDatetime, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d') 

THEN IF (DATE_FORMAT(LogoutDatetime, '%Y-%m-%d') = '0000-00-00', SEC_TO_TIME(UNIX_TIMESTAMP(NOW())- UNIX_TIMESTAMP(LoginDatetime)), 

SEC_TO_TIME(UNIX_TIMESTAMP(LogoutDatetime)- UNIX_TIMESTAMP(LoginDatetime))) 

END)

) AS t

FROM USERINFO.LoginResult,DARKEDEN.WorldInfo D

WHERE 

DATE_FORMAT(LoginDatetime, '%Y-%m-%d') >= SUBDATE(NOW(), INTERVAL 1 MONTH) 

AND WorldNum = D.ID

GROUP BY WorldNum, CurrentChannel

ORDER BY WorldNum, CurrentChannel


위와 같이 구성하면 다음과 같은 실행 계획이 나온다.



Possible_keys 가 null 인 것을 보면 Index 를 사용하지 않는 것을 확인 할 수 있다.


여기서 빨간색으로 하이라이트 한 것을 확인 가능하다.


Index를 사용하지 못하는 경우가 몇가지가 있다.(가장 기본으로 알고 있어야 하는 것 중 하나로 난 생각한다)

그 중 한가지가 조건절을 함수로 변경하는 경우 Index를 사용 못하게 된다.


다음과 같이 변경해 보자


SELECT 

WorldNum, 

D.Name, 

CurrentChannel ,

sum(case when Status='1' then 1 end) cntNow ,

 sum(case when date_format(LoginDatetime, '%Y-%m-%d') = date_format(now(), '%Y-%m-%d') then 1 end) cntCon ,

sec_to_time( avg( case when Status in ('0','1') and date_format(LoginDatetime, '%Y-%m-%d') = date_format(now(), '%Y-%m-%d') then if ( date_format(LogoutDatetime, '%Y-%m-%d') = '0000-00-00' ,SEC_TO_TIME(unix_timestamp(now())-unix_timestamp(LoginDatetime)) ,SEC_TO_TIME(unix_timestamp(LogoutDatetime)-unix_timestamp(LoginDatetime)) ) end ) )as t 

FROM USERINFO.LoginResult ,DARKEDEN.WorldInfo D 

WHERE LoginDatetime >= SUBDATE(now(), INTERVAL 1 month) 

AND WorldNum = D.ID 

GROUP BY WorldNum, CurrentChannel 

ORDER BY WorldNum, CurrentChannel 


함수를 빼버렸다.

사실 나도 왜 저렇게 DATE_FORMAT 사용 했는지 모르겠다....습관도 아닐텐데...특정 날짜의 구간을 구하다 보니 반자동으로 DATE_FORMAT 를 사용했는 듯 싶다.


다음과 같이 확인해 볼 수 있다.



하지만 rows 수가 늘어난 것을 확인 가능하다......이건 아니잖아....ㅠ


나의 튜닝 목표 중 하나가 row 수를 줄이는 것이다.(랜덤 I/O 도 줄이는 것이다)


옵티마이저가 선택하는 것이니 이유가 있을 것이다.......OTL

반응형

1. Global Cache (Query Cache?? / SP에서 사용되는???) : 

- Oracle 에서는 Library Cache에서 쿼리들에 대한 Plan 을 보유한다. 또한, LRU 알고리즘을 이용하기 때문에 사용이 잘 안되느 쿼리들에 대해서는 메모리에서 밀려나게 된다. MySQL에서는 개념이 조금 다른듯...정리하자.

이참에 설정 값들에 대해서도 정리를 해놓자. my.cnf 에 설정하는 변수들에 대한 정보

- SP 는 실행과 동시에 session 단위로 메모리 할당한다고 하는데, Oracle 도 Procedure가 실행되면 관련 session 이 생긴다. 물론 모니터링하면 User는 Oracle로 뜬다. SP 가 실행되면 생기는 현상에 대해서 Detail 하게 정리가 필요하다.


2. found_rows


아래 내용을 의미하는 걸까?

https://blog.asamaru.net/2015/09/11/using-sql-calc-found-rows-and-found-rows-with-mysql/


- Oracle에서는 index를 추가하거나 변경을 하게 되면 기존에 잘 동작하던 쿼리들도 실행 계획이 변경되기도 한다. 또한 통계정보를 임의로 수집하는 경우 실행 계획이 변경되는 경우도 있다. 그래서 11g 에서부터는 "지연 적용?"의 개념으로 기존과 달라지는 부분을 확인할 수 있는 좋은 기능이다.

역시 검색하면 욱짜 선생님 블로그가 제일 눈에 띈다. 

참고하면 좋을 듯 싶다.

http://ukja.tistory.com/95


3. MySQL 의 격리 수준

이 부분은 이해하고 넘어가는 수준으로 알고 있었다.

"개발자와 DBA를 위한 Real MySQL" - 위키북스 의 191쪽을 확인하면 된다.


READ UNCOMMITTED 

 READ COMMITTED

 REPEATABLE READ

 SERIALIZABLE


4가지 인데, 각각의 설명이 잘 나와 있으니 이것만 보고 정리해도 될 듯 싶다.

참고로 InnoDB 는 REPEATABLE READ 이다 (3번째..ㅋㅋㅋ이건 알고 있었다..몇번째라는것과 대략 Commit 전후로 상황들...그림으로 이해한거라 말로 설명을 못한 부분이 어쩌면 제대로 모른다는 뜻이겠지....예전에 누군가가 말로 설명 못하는거면 모른다고 이야기 했던게 떠오른다.....ㅠㅠ)


4. log 종류 및 복제 구축을 위한 binlog 관련 설정 정리("개발자와 DBA를 위한 Real MySQL" - 위키북스 - 79page)


이외에도 생각나면 하나씩 추가하면서 정리 해야겠다.






DBA는 공부할 것이 많아서 알면 알수록 새롭다. 그래서 지루할 틈이 없다..하지만 모르면 모를수록 할게 없는게 DB 인 듯 싶다.

하던것만 장애 안생기면 상관 없으니 말이다.....


오늘도 No Pain No Gain.!!!

반응형

'Life' 카테고리의 다른 글

지난 추석 인사  (0) 2016.09.20
요즘 근황 16.07.15  (0) 2016.07.15
필요 테스트 및 공부해야 될 내용  (0) 2016.07.04
누군가에게 제안하기 전에..  (0) 2016.07.01
블로그의 의미  (0) 2016.03.14

지금까지 백업을 진행 했다면,

반대로 복구가 필요한 경우가 생긴다.


대부분의 블로그나 심지어 Percona 사이트에서도 아래와 같이 복구를 진행 한다.


아래는 복구 관련 메뉴얼이다.

https://www.percona.com/doc/percona-xtrabackup/2.3/innobackupex/incremental_backups_innobackupex.html


innobackupex --copy-back BASE-DIR

BASE-DIR 는 백업을 진행한 폴더를 뜻한다.


즉, 백업을 진행하고 나면 백업 폴더내 2016-09-20_11-40-34와 같은 폴더가 생긴다.(날짜_시간으로 폴더가 생김)


이렇게 하면 my.cnf 내 BASEDIR 에 있는 내용을 참고하여 해당 폴더에 복구를 진행하게 된다.

하지만, 문제는 BASEDIR 에 해당하는 디렉토리가 비어 있어야 한다. 비어 있지 않으면 에러가 발생한다.


160920 15:33:41 innobackupex: Starting the copy-back operation


IMPORTANT: Please check that the copy-back run completes successfully.

           At the end of a successful copy-back run innobackupex

           prints "completed OK!".


innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)

Original data directory /home/DATABASE/Default_DB is not empty!


하지만 말이 쉬워서 그렇지 해당 폴더를 비우게 되면 DB 운영을 중단해야 하는 경우가 발생한다.

운영해야 되는 상황에서는 힘든 경우가 발생한다.


그래서 여러 옵션을 찾아보고 시도를 했으나 번번히 실패했다.

내가 강구한 방법은 cnf 파일을 수정하는 것이다.


하지만, cnf 파일을 수정하기에는 위험하기에 /etc/my.cnf 를 백업한 후 백업한 파일을 수정하고 해당 수정 파일을 바라보도록 설정하였다.

(역시, 안될때에는 잠시 쉬면서 다른 방안 찾는것이.....ㅎ)



[root@DBTEST02:/home/backup/game/2016-09-20_11-40-34]# cp /etc/my.cnf /etc/my_backup.cnf


my_backup.cnf 내 BASEDIR 변수에 자신이 복구하고자 하는 위치의 정보를 설정

기존  /home/DATABASE/Default_DB를 /home/DATABASE/InnoDB/Game3로 변경


datadir         = /home/DATABASE/InnoDB/Game3


[root@DBTEST02:/home/backup/game/2016-09-20_11-40-34]# innobackupex --defaults-file=/etc/my_backup.cnf --copy-back /home/backup/game/2016-09-20_11-40-34


[root@DBTEST02:/home/backup/game/2016-09-20_11-40-34]# innobackupex --defaults-file=/etc/my_backup.cnf --copy-back /home/backup/game/2016-09-20_11-40-34

160920 16:37:17 innobackupex: Starting the copy-back operation


IMPORTANT: Please check that the copy-back run completes successfully.

           At the end of a successful copy-back run innobackupex

           prints "completed OK!".


innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)

160920 16:37:17 [01] Copying ibdata1 to /home/DATABASE/InnoDB/Game3/ibdata1

160920 16:37:19 [01]        ...done

160920 16:37:19 [01] Copying ./performance_schema/events_waits_summary_by_host_by_event_name.frm to /home/DATABASE/InnoDB/Game3/performance_schema/events_waits_summary_by_host_by_event_name.frm

160920 16:37:19 [01]        ...done

160920 16:37:19 [01] Copying ./performance_schema/table_lock_waits_summary_by_table.frm to /home/DATABASE/InnoDB/Game3/performance_schema/table_lock_waits_summary_by_table.frm

160920 16:37:19 [01]        ...done

....

160920 16:37:22 [01] Copying ./DARKEDEN/WeekItemGive.frm to /home/DATABASE/InnoDB/Game3/DARKEDEN/WeekItemGive.frm

160920 16:37:22 [01]        ...done

160920 16:37:22 [01] Copying ./DARKEDEN/SkullObject.frm to /home/DATABASE/InnoDB/Game3/DARKEDEN/SkullObject.frm

160920 16:37:22 [01]        ...done

160920 16:37:22 [01] Copying ./DARKEDEN/UserIPInfo.ibd to /home/DATABASE/InnoDB/Game3/DARKEDEN/UserIPInfo.ibd

160920 16:37:22 [01]        ...done

160920 16:37:22 [01] Copying ./DARKEDEN/SetItemOptionInfo.ibd to /home/DATABASE/InnoDB/Game3/DARKEDEN/SetItemOptionInfo.ibd

160920 16:37:22 [01]        ...done

160920 16:37:22 [01] Copying ./DARKEDEN/EffectHoodlumStigma.ibd to /home/DATABASE/InnoDB/Game3/DARKEDEN/EffectHoodlumStigma.ibd

160920 16:37:22 [01]        ...done

160920 16:37:22 [01] Copying ./DARKEDEN/FasciaInfo.ibd to /home/DATABASE/InnoDB/Game3/DARKEDEN/FasciaInfo.ibd

160920 16:37:22 [01]        ...done

160920 16:37:22 [01] Copying ./DARKEDEN/ETCInfo.ibd to /home/DATABASE/InnoDB/Game3/DARKEDEN/ETCInfo.ibd

160920 16:37:22 [01]        ...done

160920 16:37:22 [01] Copying ./DARKEDEN/VampireETCInfo.frm to /home/DATABASE/InnoDB/Game3/DARKEDEN/VampireETCInfo.frm

160920 16:37:22 [01]        ...done

160920 16:37:22 [01] Copying ./DARKEDEN/TunningOptionRatioInfo.ibd to /home/DATABASE/InnoDB/Game3/DARKEDEN/TunningOptionRatioInfo.ibd

160920 16:37:22 [01]        ...done

160920 16:37:22 completed OK!


이렇게 하면, 정상적으로 복구된 파일들을 확인할 수 있다.


하지만, 여기서 추가로 /etc/my.cnf 에 포트를 추가로 설정 및 복구된 파일들의 권한을 mysql로 변경해 준다.

이후, "mysqld_multi start 포트" 로 실행 후 자신이 복구하고자 하는 데이터를 복구 진행하면 된다.


정리

1. cnf 파일 백업 및 백업파일 BASEDIR 수정(복구를 원하는 폴더로 설정)

2. innobackupex --defaults-file=/etc/my_backup.cnf(BASEDIR 수정한파일) --copy-back /home/backup/game/2016-09-20_11-40-34(백업한 폴더)

3. 복구가 완료된 폴더에 권한을 mysql 로 수정

4. 복구를 위해 복구 파일을 DB로 올리기 위해 my.cnf 에 multi start 로 추가 (포트 추가- Clone DB)

5. mysqld_multi start 포트 

6. 복구 확인


이렇게 mysql clone DB??? 를 진행해 보았다.

반응형

지난 innobackupex 명령어를 단순히 따라 하는 것에서 벗어나


하나씩 저희 회사에 맞게 변경을 하고 있습니다.


이게 진정 회사를 위한 공부겠죠..?

각설하고...


지난 명령어는 아래와 같습니다.



[root@DBTEST02:/root]# innobackupex --user=DB유저명 --password=비밀번호--socket=/tmp/mysql_8003.sock  /home/backup/game/



나름 저희 회사에 맞게 변경한다고 한 것이지만 여기서 빼놓고 간 부분이 있습니다.

위와 같이 진해을 하면 Default DB 의 위치를 backup 한 다는 것을..


잠시 /etc/my.cnf 를 확인해 보면


[mysqld]

user            = mysql

basedir         = /usr/local/mysql

datadir         = /home/DATABASE/Default_DB

tmpdir          = /usr/local/mysql/DB/tmp


datadir 가 Default DB 위치다.


그래서 위의 innobackupex 를 하면 port 가 8003 인 곳의 datadir 가 아닌 Default 위치의 데이터가 백업 되는 것을 확인할 수 있다.


그렇다면, 어떻게 진행해야 될까?


아래와 같이 defaults-file 를 선언해 주면 된다.


[root@DBTEST02:/root]#innobackupex --defaults-file=/home/DATABASE/InnoDB/Game2/ --user=root --password= --socket=/tmp/mysql_8003.sock /home/backup/game/


여기서 --defaults-file 은 앞쪽에 위치해야 한다. 혹시나 해당 변수를 뒤에다 선언하면 에러가 발생한다.


xtrabackup: Error: --defaults-file must be specified first on the command line


제대로 백업이 되는지는 로그만 봐도 알 수 있다.

아래 보면 해당 위치의 DB까지 모두 백업 되는 것을 확인할 수 있다.



[root@DBTEST02:/home/backup/game]# innobackupex --defaults-file=/home/DATABASE/InnoDB/Game2/ --user=root --password= --socket=/tmp/mysql_8003.sock --databases=DARKEDEN /home/backup/game/

160920 10:52:00 innobackupex: Starting the backup operation


IMPORTANT: Please check that the backup run completes successfully.

           At the end of a successful backup run innobackupex

           prints "completed OK!".


160920 10:52:00  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;mysql_socket=/tmp/mysql_8003.sock' as 'root'  (using password: NO).

160920 10:52:00  version_check Connected to MySQL server

160920 10:52:00  version_check Executing a version check against the server...

160920 10:52:00  version_check Done.

160920 10:52:00 Connecting to MySQL server host: localhost, user: root, password: set, port: 0, socket: /tmp/mysql_8003.sock

Using server version 5.6.32-debug-log

innobackupex version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)

xtrabackup: uses posix_fadvise().

xtrabackup: cd to /home/DATABASE/InnoDB/Game2/

xtrabackup: open files limit requested 0, set to 1024

xtrabackup: using the following InnoDB configuration:

xtrabackup:   innodb_data_home_dir = .

xtrabackup:   innodb_data_file_path = ibdata1:12M:autoextend

xtrabackup:   innodb_log_group_home_dir = ./

xtrabackup:   innodb_log_files_in_group = 2

xtrabackup:   innodb_log_file_size = 50331648

InnoDB: Number of pools: 1

160920 10:52:00 >> log scanned up to (21174002)

xtrabackup: Generating a list of tablespaces

InnoDB: Allocated tablespace ID 442 for DARKEDEN/ShoulderArmorInfo, old maximum was 0

160920 10:52:01 >> log scanned up to (21174002)

160920 10:52:02 >> log scanned up to (21174002)

160920 10:52:03 >> log scanned up to (21174002)

160920 10:52:04 [01] Copying ./ibdata1 to /home/backup/game/2016-09-20_10-52-00/ibdata1

160920 10:52:04 >> log scanned up to (21174002)

160920 10:52:05 >> log scanned up to (21174002)

160920 10:52:05 [01]        ...done

160920 10:52:06 [01] Copying ./DARKEDEN/ContributeDegree.ibd to /home/backup/game/2016-09-20_10-52-00/DARKEDEN/ContributeDegree.ibd

160920 10:52:06 [01]        ...done

160920 10:52:06 [01] Copying ./DARKEDEN/OustersWristletObject.ibd to /home/backup/game/2016-09-20_10-52-00/DARKEDEN/OustersWristletObject.ibd

160920 10:52:06 [01]        ...done

160920 10:52:06 [01] Copying ./DARKEDEN/SubInventoryInfo.ibd to /home/backup/game/2016-09-20_10-52-00/DARKEDEN/SubInventoryInfo.ibd

160920 10:52:06 [01]        ...done

160920 10:52:06 [01] Copying ./DARKEDEN/HighEnchantLog.ibd to /home/backup/game/2016-09-20_10-52-00/DARKEDEN/HighEnchantLog.ibd

...

160920 10:52:10 [01] Copying ./DARKEDEN/VampireETCInfo.frm to /home/backup/game/2016-09-20_10-52-00/DARKEDEN/VampireETCInfo.frm

160920 10:52:10 [01]        ...done

160920 10:52:10 Finished backing up non-InnoDB tables and files

160920 10:52:10 [00] Writing xtrabackup_binlog_info

160920 10:52:10 [00]        ...done

160920 10:52:10 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...

xtrabackup: The latest check point (for incremental): '21174002'

xtrabackup: Stopping log copying thread.

.160920 10:52:10 >> log scanned up to (21174002)


160920 10:52:10 Executing UNLOCK TABLES

160920 10:52:10 All tables unlocked

160920 10:52:10 Backup created in directory '/home/backup/game/2016-09-20_10-52-00'

MySQL binlog position: filename 'Bin_Log.000051', position '120'

160920 10:52:10 [00] Writing backup-my.cnf

160920 10:52:10 [00]        ...done

160920 10:52:10 [00] Writing xtrabackup_info

160920 10:52:10 [00]        ...done

xtrabackup: Transaction log of lsn (21174002) to (21174002) was copied.

160920 10:52:11 completed OK!



incremental 백업도 비슷하게 진행하면 될 것 같다.


반응형

모두들 추석 연휴 잘 보내셨습니까!!!


역시 유부남은 추석 연휴도 바쁘네요-ㅎㅎ아버지가 이런 말씀을 하시더군요..


"내 아들놈이 이제는 아빠가 되어 있더라..."


ㅎㅎ참 많은 뜻이 숨어 있네요-


이 말이 머리로 먼저 이해 하기 이전에 가슴에서 이해가 되더군요.


정확히 이해가 되기 보다는 가슴에서 알아 듣는 듯한 느낌이..


세계 일주를 하는 친구놈한테서도 메시지가 오더군요. 추석 잘 보내라고-ㅎ


"니가 먼저 연락이 안와서 내가 한다..."

로 시작 되는 카톡..ㅎ



이 말은 가슴에 화살이 슝...ㅋㅋㅋㅋ미안해-ㅎㅎ


언제부턴가 주위 사람을 챙기는 습관을 바쁘다는 이유로 버리고 있더군요.


어느 하나를 포기하고 하나를 얻는 다는거...그로 인해서 서운한 감정들..미안한 감정들..

꼭 포기를 하지 않고 한걸음 더 움직이면 되는 것을...


저는 변명을 하고 있네요-

반응형

'Life' 카테고리의 다른 글

[20160927] 공부해야 될 내용  (0) 2016.09.27
요즘 근황 16.07.15  (0) 2016.07.15
필요 테스트 및 공부해야 될 내용  (0) 2016.07.04
누군가에게 제안하기 전에..  (0) 2016.07.01
블로그의 의미  (0) 2016.03.14

Xtrabackup 을 사용하는 방법에 대해 테스트 해 보았다.

마음도 심숭생숭하여 빨리 진행될 일을 너무 느긋하게 진행 되었다.


InnoDB 를 이용한 백업 으로써 Incremental backup 도 함께 해 보았다.

Incremental 에 대한 개념은 Oracle Rman 백업과 같은 개념으로 생각해도 될 것 같다.


Full Backup 의 경우 데이터의 양이 증가할 수록 시간도 오래 걸린다.

이에 따라, 변경된 데이터만 백업을 함으로서 백업의 시간을 획기적으로 단축할 수 있다.


이후 복구 시에는 Full backup 으로 복구 후 나머지 변경된 데이터만 Incremental 백업을 가지고 적용함으로써 

무손실로 복구를 할 수 있다.


물론 이 개념들은 모두 Oracle Rman 백업 / 복구 때의 지식으로 Xtrabackup 의 경우 다를 수도 있다.


추가적으로 MySQL LSN 이 있는데

* lsn 이 log sequence number 의 약자로써 전체 DB의 버전 정보를 뜻함

  - 변경 사항이 발생할 때마다 번호가 증가하여 채번

* Oracle로 따져보면 SCN 와 비슷

  (DB Link를 많이 사용하다 보면 SCN 관련하여 full 이 차서 DB down 되는 현상이 있엇던 것이 기억난다...11g 등에서 어느정도 해결되었다고는 했는데..)



1. Full Backup


* innobackupex 명령어를 이용하여 user 와 passwd 를 입력하여 진행

* Port를 따로 지정한 경우나, 멀티로 띄우는 경우 --socket 옵션을 지정하여 명시

* /home/backup/game/  으로 어느 곳에 백업을 할 것인지 명시를 하게 되면, 자동으로 '2016-09-09_16-58-17'  처럼 날짜 시간으로 디렉토리 자동생성

* config 파일을 지정시 --defaults-file=MY.CNF 처럼 명시 가능


[root@DBTEST02:/root]# innobackupex --user=DB유저명 --password=비밀번호--socket=/tmp/mysql_8003.sock  /home/backup/game/

....


160909 16:58:19 Executing UNLOCK TABLES

160909 16:58:19 All tables unlocked

160909 16:58:19 Backup created in directory '/home/backup/game/2016-09-09_16-58-17'

MySQL binlog position: filename 'Bin_Log.000049', position '7396794'

160909 16:58:19 [00] Writing backup-my.cnf

160909 16:58:19 [00]        ...done

160909 16:58:19 [00] Writing xtrabackup_info

160909 16:58:19 [00]        ...done

xtrabackup: Transaction log of lsn (1600627) to (1600627) was copied.

160909 16:58:19 completed OK!


2. Preparing a full backup with innobackupex


* 백업을 생성한 후에 해당 백업 데이터는 아직 restore 할 수 있는 상태가 아님. 
* rollback 하는 commit되지 않은 transaction이나 재실행 되어야 하는 transaction이 있을 수 있음
* 미완된 작업들을 정리하는 작업을 함으로서 데이터 파일의 일관성을 유지하는 작업을 Prepare작업
* 해당 작업이 정상적으로 완료 되면 백업된 데이터 파일들은 이제 복구용으로 사용 가능

* innobackupex를 사용하여 백업 파일의 일관성을 맞추기 위해 --apply-log 옵션을 사용하면 된다. 백업된 위치를 옵션으로 주어 작업을 진행한다.

* Prepare 작업 동안에 백업이 진행되는 동안에 생성된 Transaction 내용을 담은 로그 파일안에 커밋된 Transaction 들을 재실행을 한다. 그리고, 그것들 중에 커밋 구문이 실행되지 않은 transaction들은 롤백된다.
이 작업을 완료하게 되면, 모든 정보들은 테이블 스페이스에 저장되고, 새로운 로그 파일이 생성된다.

내부적으로는 xtrabackup --prepare 를 2번 실행하게 된다. 
Prepare 작업 시에 좀 더 빨리 진행하고 싶다면 --use-memoryh 옵션을 사용할 수 있다.(Default 100mb)

* innobackupex --apply-log --use-memory=4G /home/backup/game/2016-09-09_16-58-17

※ Transaction 의 일관성을 유지하기 위해서 innobackupex 의 Full backup을 진행한 후 완료된 작업에 대해(생성된 백업 디렉토리) --apply-log 옵션을 추가하여 한번 더 진행하면 파일의 일관성을 맞출 수 있다.


* 아래는 apply-log 를 진행 한 후의 메시지 들이다.


3. Incremental backup

- Incremental backup에 대한 개념은 초반에 살짝 언급한 바와 같이 백업 이후의 변경된 내용들에 대해서만 백업을 진행

- 기준은 LSN 의 정보를 보고 추적하여 진행


* --incremental-basedier 의 경우 마지막으로 full backup 한 위치에 대한 데이터 내용을 뜻하는 것으로, 해당 내용들을 확인 후 incremental backup을 진행하기 위한 기본 정보이다.


* 풀백업이든 증분 백업이든 최종 위치를 작성 후에 진행해야지만, 증분백업을 제대로 진행할 수 있다.


* innobackupex --incremental --user=DB유저ID --password=DB유저 패스워드 --socket=/tmp/mysql_8003.sock  /home/backup/game/ --incremental-basedir=/home/backup/game/2016-09-12_10-59-37/


* incremental 백업을 완료 하게 되면 xtrabackup_checkpoints 파일이 생기는데 해당 내용을 확인해 보면 아래와 같다

backup_type = incremental
from_lsn = 1601102
to_lsn = 1601102
last_lsn = 1601102
compact = 0
recover_binlog_info = 0

* 혹시라도 lsn 을 알고 있다면, 해당 번호가지고 수동으로 incremental 를 진행할 수 있다.

(시작되는 번호를 명시하면 자동으로 마지막까지 진행 한다.)

innobackupex --incremental --user=DB유저ID --password=DB유저 패스워드 --socket=/tmp/mysql_8003.sock  /home/backup/game/ --incremental-lsn=1600627

[root@DBTEST02:/home/backup/game/2016-09-12_11-26-40]# ll
total 108
-rw-r----- 1 root root   418 Sep 12 11:26 backup-my.cnf
-rw-r----- 1 root root 81920 Sep 12 11:26 ibdata1.delta
-rw-r----- 1 root root    44 Sep 12 11:26 ibdata1.meta
-rw-r----- 1 root root    23 Sep 12 11:26 xtrabackup_binlog_info
-rw-r----- 1 root root   117 Sep 12 11:26 xtrabackup_checkpoints
-rw-r----- 1 root root   563 Sep 12 11:26 xtrabackup_info
-rw-r----- 1 root root  2560 Sep 12 11:26 xtrabackup_logfile
[root@DBTEST02:/home/backup/game/2016-09-12_11-26-40]# vi xtrabackup_checkpoints

backup_type = incremental
from_lsn = 1600627
to_lsn = 1601102
last_lsn = 1601102
compact = 0
recover_binlog_info = 0

* backup_type = incremental 이라고 적혀 있으며 lsn 관련된 내용을 보면 위치를 확인할 수 있다.
* 반드시 백업이 완료 된 후 


* incremetal 실행 결과 xtrabackup_checkpoints  파일을 확인해 보는 습관이 필요할 듯 싶다.






해당 문서는 아래 블로그를 참고로 하였습니다.


http://ani2life.com/wp/?p=1290


http://mysqldba.tistory.com/240


반응형

현재까지 우리회사 DB는 순전히 python으로 coldbackup 으로 일일 백업 및 주간 백업은 Coldbackup & MySQLDump 를 이용한 schema 백업을 해왔다.

이것이 가능한 이유는 매주 한번씩 정기점검을 진행하고, Slave 로 일일 백업 및 복구하여 조회용으로 했기에 가능했다.


하지만 5.6.32로 버전 업 및 InnoDB로 업그레이드 예정이라 이제는 다른 식으로 백업을 진행하는 것이 좋지 않을까 고민해 보다,

XtraBackup 에 대해 알게되어 테스트해 본다.


해당 Percona XtraBackup 의 경우 무료다.

아래는 Percona에서 제공하는 MySQL backup 툴과 자신들의 XtraBackup 의 차이점에 대해서 나열한 것이다. (내가 무료란것만 살짝 강조를...ㅋㅋ)

무료 및 Open Source 이며, MySQL 및 MariaDB 까지 지원되는 것이 강점이며, Linux 만 가능한게 단점이 아닐까 싶다.ㅠ


https://www.percona.com/doc/percona-xtrabackup/2.4/intro.html

MySQL Backup Tool Feature Comparison

FeaturesPercona XtraBackupMySQL Enterprise backup
LicenseGPLProprietary
PriceFreeIncluded in subscription at $5000 per Server
Streaming and encryption formatsOpen sourceProprietary
Supported MySQL flavorsMySQL, Percona Server, MariaDB,Percona XtraDB Cluster, MariaDB Galera ClusterMySQL
Supported operating systemsLinuxLinux, Solaris, Windows, OSX, FreeBSD.
Non-blocking InnoDB backups [1]YesYes
Blocking MyISAM backupsYesYes
Incremental backupsYesYes
Full compressed backupsYesYes
Incremental compressed backupsYes 
Fast incremental backups [2]Yes 
Incremental backups with archived logs feature in Percona ServerYes 
Incremental backups with REDO log only Yes
Backup locks [8]Yes 
Encrypted backupsYesYes [3]
Streaming backupsYesYes
Parallel local backupsYesYes
Parallel compressionYesYes
Parallel encryptionYesYes
Parallel apply-logYes 
Parallel copy-back Yes
Partial backupsYesYes
Partial backups of individual partitionsYes 
Throttling [4]YesYes
Backup image validation Yes
Point-in-time recovery supportYesYes
Safe slave backupsYes 
Compact backups [5]Yes 
Buffer pool state backupsYes 
Individual tables exportYesYes [6]
Individual partitions exportYes 
Restoring tables to a different server [7]YesYes
Data & index file statisticsYes 
InnoDB secondary indexes defragmentationYes 
rsync support to minimize lock timeYes 
Improved FTWRL handlingYes 
Backup history tableYesYes
Backup progress table Yes
Offline backups Yes
Backup to tape media managers Yes
Cloud backups support Amazon S3
External graphical user interfaces to backup/recoveryZmanda Recovery Manager for MySQLMySQL Workbench, MySQL Enterprise Monitor


사실 설치를 진행하면서 yum으로 설치는 하지 말자라고 생각 했지만...

결국은 패키지 의존성 체크 및 key 관련되서 애를 먹어 그냥 yum 으로 설치 하였다.




설치 방법은 아래 참고하면 된다.

https://www.percona.com/doc/percona-xtrabackup/2.2/installation/yum_repo.html


나는 아래에서 rpm 다운을 받은 뒤 진행했다.

https://www.percona.com/downloads/XtraBackup/


Yum으로 설치


$ yum localinstall percona-xtrabackup-24*


* key 관련하여 에러메시지는


1.  vi /etc/yum.repos.d/percona-release.repo


2.  맨 하단에 아래 추가
############################################
# XTRABACKUP #
############################################

[percona]
name = CentOS $releasever - Percona
baseurl=http://repo.percona.com/centos/$releasever/os/$basearch/
enabled = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Percona
gpgcheck = 1

3. 해당 파일 확인 /etc/pki/rpm-gpg/RPM-GPG-KEY-Percona
없으면, 생성후 아래 내용 추가 (참조 : https://www.percona.com/downloads/percona-release/RPM-GPG-KEY-percona )

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.9 (GNU/Linux)

mQGiBEsm3aERBACyB1E9ixebIMRGtmD45c6c/wi2IVIa6O3G1f6cyHH4ump6ejOi
AX63hhEs4MUCGO7KnON1hpjuNN7MQZtGTJC0iX97X2Mk+IwB1KmBYN9sS/OqhA5C
itj2RAkug4PFHR9dy21v0flj66KjBS3GpuOadpcrZ/k0g7Zi6t7kDWV0hwCgxCa2
f/ESC2MN3q3j9hfMTBhhDCsD/3+iOxtDAUlPMIH50MdK5yqagdj8V/sxaHJ5u/zw
YQunRlhB9f9QUFfhfnjRn8wjeYasMARDctCde5nbx3Pc+nRIXoB4D1Z1ZxRzR/lb
7S4i8KRr9xhommFnDv/egkx+7X1aFp1f2wN2DQ4ecGF4EAAVHwFz8H4eQgsbLsa6
7DV3BACj1cBwCf8tckWsvFtQfCP4CiBB50Ku49MU2Nfwq7durfIiePF4IIYRDZgg
kHKSfP3oUZBGJx00BujtTobERraaV7lIRIwETZao76MqGt9K1uIqw4NT/jAbi9ce
rFaOmAkaujbcB11HYIyjtkAGq9mXxaVqCC3RPWGr+fqAx/akBLQ2UGVyY29uYSBN
eVNRTCBEZXZlbG9wbWVudCBUZWFtIDxteXNxbC1kZXZAcGVyY29uYS5jb20+iGAE
ExECACAFAksm3aECGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRAcTL3NzS79
Kpk/AKCQKSEgwX9r8jR+6tAnCVpzyUFOQwCfX+fw3OAoYeFZB3eu2oT8OBTiVYu5
Ag0ESybdoRAIAKKUV8rbqlB8qwZdWlmrwQqg3o7OpoAJ53/QOIySDmqy5TmNEPLm
lHkwGqEqfbFYoTbOCEEJi2yFLg9UJCSBM/sfPaqb2jGP7fc0nZBgUBnFuA9USX72
O0PzVAF7rCnWaIz76iY+AMI6xKeRy91TxYo/yenF1nRSJ+rExwlPcHgI685GNuFG
chAExMTgbnoPx1ka1Vqbe6iza+FnJq3f4p9luGbZdSParGdlKhGqvVUJ3FLeLTqt
caOn5cN2ZsdakE07GzdSktVtdYPT5BNMKgOAxhXKy11IPLj2Z5C33iVYSXjpTelJ
b2qHvcg9XDMhmYJyE3O4AWFh2no3Jf4ypIcABA0IAJO8ms9ov6bFqFTqA0UW2gWQ
cKFN4Q6NPV6IW0rV61ONLUc0VFXvYDtwsRbUmUYkB/L/R9fHj4lRUDbGEQrLCoE+
/HyYvr2rxP94PT6Bkjk/aiCCPAKZRj5CFUKRpShfDIiow9qxtqv7yVd514Qqmjb4
eEihtcjltGAoS54+6C3lbjrHUQhLwPGqlAh8uZKzfSZq0C06kTxiEqsG6VDDYWy6
L7qaMwOqWdQtdekKiCk8w/FoovsMYED2qlWEt0i52G+0CjoRFx2zNsN3v4dWiIhk
ZSL00Mx+g3NA7pQ1Yo5Vhok034mP8L2fBLhhWaK3LG63jYvd0HLkUFhNG+xjkpeI
SQQYEQIACQUCSybdoQIbDAAKCRAcTL3NzS79KlacAJ0aAkBQapIaHNvmAhtVjLPN
wke4ZgCePe3sPPF49lBal7QaYPdjqapa1SQ=
=qcCk
-----END PGP PUBLIC KEY BLOCK-----



* 이마저도 안된다면 과감하게 yum update 후 진행을 해 보는 것도 좋은 방법이다.



$ yum update

-- 꽤나 시간이 오래 걸려도 나름 이후에는 한방에 되는 경우도 있다.


$ yum list | grep percona

...
percona-xtrabackup-20.x86_64               2.0.8-587.rhel5             percona-release-x86_64
percona-xtrabackup-20-debuginfo.x86_64     2.0.8-587.rhel5             percona-release-x86_64
percona-xtrabackup-20-test.x86_64          2.0.8-587.rhel5             percona-release-x86_64
percona-xtrabackup-21.x86_64               2.1.9-746.rhel5             percona-release-x86_64
percona-xtrabackup-21-debuginfo.x86_64     2.1.9-746.rhel5             percona-release-x86_64
percona-xtrabackup-22.x86_64               2.2.13-1.el5                percona-release-x86_64
percona-xtrabackup-22-debuginfo.x86_64     2.2.13-1.el5                percona-release-x86_64
percona-xtrabackup-debuginfo.x86_64        2.3.2-1.el5                 percona-release-x86_64
percona-xtrabackup-test.x86_64             2.3.2-1.el5                 percona-release-x86_64
percona-xtrabackup-test-21.x86_64          2.1.9-746.rhel5             percona-release-x86_64
percona-xtrabackup-test-22.x86_64          2.2.13-1.el5                percona-release-x86_64
...

$ yum install percona-xtrabackup


참고 https://www.percona.com/doc/percona-xtrabackup/2.2/installation/yum_repo.html

반응형


참으로 레이드 구성은 이해가 어렵다고 하기 보다는 안 외워진다.

매번 물어볼때나 궁금할때 찾아보니 말이다...;;;


내 잘못이오...내 잘못이오..ㅠ
[출처] : http://blog.naver.com/jevida/140118943472



Raid Level

 

데이터 베이스의 성능은 쿼리를 얼만큼 효율적으로 잘 만드느냐!

옵티마이져를 얼마나 이해해서 최적의 수행경로를 찾느냐로 성능을 향상 시킬 수 있습니다.

하지만 소프트웨어는 하드웨어에 종속적이므로 하드웨어 성능 자체가 느리다면 아무리 튜닝을 해도 한계가 있기 마련입니다.

 컴퓨터에서 가장 느린 장치가 무엇일까요?

하드 디스크 입니다이번 시간은 하드디스크를 여러 개 묶어서 성능을 향상시키는 방법에 대해 알아 보겠습니다.

 

RAIDRedunadant Array of Inexpensive Disks 의 약자로 값싼 디스크를 여러장 묶어 대용량의 저장공간을 만들고자 하는 요구로1980년대 처음 등장하였습니다최근에는 디스크 가격이 고용량 저가격이 형성되면서 의미는 많이 퇴색해져 중복성과 성능향상으로 바뀌고 있습니다.

 

RAID는 구성에 따라 총6가지(0, 1, 2, 3, 4, 5, 6)레벨로 나눌 수 있으며 레벨에 따라 신뢰성과 성능 향상을 나타냅니다.

 

RAID 0

2개 이상의 디스크를 사용하여 구성스트라이핑 모드.

장점같은 섹터에 병렬기록읽기/쓰기 향상.

단점디스크 장애시 복구 불능.

사용처:  중요하지 않는 데이터에 빠른 처리가 요구될 때 사용.

 


 

RAID 1

동일한Raid 볼륨으 추가적으로 구성 한 것미러링 모드

장점디스크 장애시 복구 가능읽기 성능 향상.(다중 스레드 사용시)

단점동일 데이터를 중복해서 써야하므로 쓰기 속도 느림.

사용처:  속도보다는 안정성을 추구하는 데이터에 적합전체용량의1/2 만 사용가능.

 

<v></v>

 

RAID 2

RAID 0의 장점을 사용하면서 신뢰성을 높이기 위한 방법. 4개를 스트라이핑 모드 구성+ 3개의 패리티 체크 구성.

장점:  여러 개의 디스크 장애시 복구 가능.

단점볼륨 구성 단위가 크다.

 

<v></v>

 

 

 RAID 3

RAID2의 단점을 개선 한 모델하나의 볼륨에만 패리티 저장.

장점: RAID2보다 적은 볼륨 사용.(디스크 절약)

단점동일 위치 동시 장해시 복구 불능.

<v></v>

 

RAID 4

구성은RAID3와 동일단 저장 단위가RAID3는 바이트 단위. RAID4는 블록 단위.

<v></v>

 

 

RAID 5

RAID4의 단점을 개선 시킨 모델성능샹 효율을 위해 패리티 디스크들을 각 볼륨에 분할.

최소3개의 디스크 필요.

장점:  어느 정도 속도 보장.

단점다중 디스크 장애시 복구 불능. (1장 까지 장애 복구 가능)

<v></v>

 

RAID 6

RAID5에 비해 신뢰성에 기반을 둔 레벨패리티 디스크를 추가함으로써 동시 오류에 복구가 가능하도록 설계.

추가적인 패리티 기록을 위하여 속도가 느리다.

 

<v></v>

 

 

최근에는 하이브리드 방식으로RAID레벨의 장점을 섞어 성능과 신뢰성 비용 효과를 보고 있다.

-       RAID 0+1

-       RAID 1 + 0

-       RAID 5 + 0

-       RAID 5+ 1

-       RAID 6 + 0

 

RAID Level Comparision (Adaptec 자료)

<v></v>

 

[출처] RAID LEVEL|작성자 SungWook Kang


반응형

그동안 뭐에 홀렸는지...

블로그 업데이트 할 생각을 하지 못했다.


Nginx에 php 연동을 진행해 봤다.


먼저 yum으로 설치 진행


[출처] : http://jongkwang.com/?p=941


$ yum install php php-cli php-common php-fpm php-mysql


이 후 php-v 로 버전을 확인해 본다


$ php -v

# 5.3이 설치되어 있는것을 확인 할 수 있다.




컴퓨터 재 부팅 시 자동으로 php 가 올라오도록 서비스에 등록 하자.


$ chkconfig --add php-fpm

$ chkconfig php-fpm on


php 가 제대로 열리는 지 확인해 보자.


먼저 info.php 를 Nginx 의 html 에 생성해 보자.


이후 info.php 에는 다음과 같이 설정 후 웹에서 확인해 보자


$vi info.php


<?php

echo "Test";

?>


이후 웹에서 해당 info.php 가 제대로 오픈 되는지 열어보자


http://192.168.150.133/info.php



......Access denied. 이유가 뭘까...

정말 많은 부분을 검색하고 수정했다.


1. php-fpm 관련하여 설정 파일을 확인해 보자


참고로 로그는 아래에 있다. 


php-fpm 에러로그 위치 : /var/log/php-fpm/error.log


설정파일 위치


$ vi /etc/php-fpm.d/www.conf


여기서 다음과 같이 security.limit_extensions 를 수정해 보자


security.limit_extensions = .php .php3 .php4 .php5 .html .htm




저장 후 Nginx 설정파일도 아래도 다음과 같이 수정해 보자. (php 관련 설정 부분이다. php 를 사용하려면 Nginx도 수정해 줘야 한다)


$ vi /usr/local/nginx/conf/nginx.conf


php 부분이 주석으로 되어 있다면 풀어주자.


참고로 나는 fastcgi_param 부분을 수정하여 해결을 하였는데, $document_root; 는 profile에 다음과 같이 설정 되어 있다.


fastcgi_param SCRIPT_FILENAME $document_root;


$vi ~/.bash_profile



export document_root=/usr/local/nginx/html



이렇게 해서 Access denied 를 해결했다.


이로써 Nginx 와 php 연동을 끝낼 수 있었다.




* MySQL 연동 확인


상단에서 yum 으로 php-mysql 로 설치를 진행한 바가 있다.

이제 php로 mysql 연동이 잘 되는지 확인해 본다.


아래 스크립트로 간단하게 설계해서 진행해 보았다.


<?php

$db_host = "localhost";

$db_user = "mysql유저";

$db_passwd = "mysql비밀번호";

$db_name = "mysql DB명";

$conn = mysqli_connect($db_host, $db_user, $db_passwd, $db_name);

if (mysqli_connect_errno($conn))

{

echo "DB Connect Failed: " .mysqli_connect_error();

}

else 

{

echo "DB Connect Success";

}

?>


나의 허접한 php 실력...ㅠㅠ

어쨋든 똑같이 웹에서 호출해서 확인하면 된다.


아주 깔끔하네....ㅎㅎㅎ


mysql 관련하여 확인 가능하다

http://makand.tistory.com/entry/PHP-Mysql-ConnectPHP-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%97%B0%EB%8F%99

반응형

'NGINX' 카테고리의 다른 글

[NGinx] 설치 간단 정리  (0) 2016.08.05
[NGinX] 설명 - 소개 NGINX란? (펌)  (0) 2016.06.21

NGinx 설치는 yum으로 설치 하였다.


아래 사이트에서 접속하여 확인하여 설치 진행하면 쉽게 가능할 듯 싶다.


https://opentutorials.org/module/384/4332

http://ohgyun.com/478


간단 설치 정리:


Cent OS 에 설치


1. yum 으로 Mysql 설치 진행

2. wget http://nginx.org/download/nginx-1.11.3.tar.gz  로 받는다.

3. tar -xvzf nginx-1.11.3.tar.gz

4. cd nginx-1.11.3

5. ./configure


6. make && make install



진행한다.

설치는 무난하게 진행 되었다.


설치가 완료 되고 나면 다음과 같이 아래에서 nginx 를 실행 또는 중지 가능하다.


/usr/local/nginx/sbin


cd /usr/local/nginx/sbin


[root@Cacti sbin]# ./nginx -h

nginx version: nginx/1.11.3

Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]


Options:

  -?,-h         : this help

  -v            : show version and exit

  -V            : show version and configure options then exit

  -t            : test configuration and exit

  -T            : test configuration, dump it and exit

  -q            : suppress non-error messages during configuration testing

  -s signal     : send signal to a master process: stop, quit, reopen, reload

  -p prefix     : set prefix path (default: /usr/local/nginx/)

  -c filename   : set configuration file (default: conf/nginx.conf)

  -g directives : set global directives out of configuration file



`nginx` 커맨드의 스위치로 프로세스에 시그널을 보낼 수 있다.


$ ./nginx -s stop # 즉각 중단 (TERM 신호)

$ ./nginx -s quit # 정상 중단 (QUIT 신호)

$ ./nginx -s reopen # 로그 파일을 다시 오픈한다.

$ ./nginx -s reload # 환경 설정을 다시 로드한다.



이제 PHP 연동을 정리해 봤다.

사실 php연동에서 많이 해맸다. 참고로 iptables 에 80 포트를 오픈해 줘야(디폴트) Nginx 가 제대로 설치 되었는지 확인 가능하다.





php 연동은 다음 포스팅에 정리해 본다.

반응형

'NGINX' 카테고리의 다른 글

[NGINX] php 연동 (Access denied.) & mysql 연동  (0) 2016.08.12
[NGinX] 설명 - 소개 NGINX란? (펌)  (0) 2016.06.21

+ Recent posts