본문 바로가기
MySQL Tool

[percona toolkit] pt-table-checksum

by 모모레 2015. 6. 28.

이 프로그램은 MySQL 리플리케이션 사이에 일관성을 체크하게 하는 프로그램이다.


사용법

pt-table-checksum [OPTIONS] [DSN]


pt-table-checksum은 마스터 서버에서 checksum 쿼리를 실행하여 온라인 상에서 일관성을 체크하는 프로그램이다. 이때 DSN의 정보는 마스터 정보를 입력해야 한다. 만약, 무엇인가 다른 점을 찾게된다면 EXIT STATUS가 0이 아닌 값이 출력될 것이고, 경고나 에러가 발생하게 될것이다.

이 툴은 데이터가 같은지 다른지를 찾는데에 목적이 있고, 만약, 다르다면 사용자는 pt-table-sync 를 사용하여 맞출 수 있다.


pt-table-checksum은 명시된 서버에 접속하여 필어티해야 하는 스키마나 테이블만 있는지 확인한다. 그다음에 한번에 하나씩 테이블에 대해 동작한다. 그래서, 작업하기에 많은 리소스가 필요하지는 않다. 그래서, 많은 데이터가 있는 서버에서 사용해도 크게 문제가 되지 않는다. pt-table-checksum은 동작할때 데이터들을 chunk 단위로 분할하여 동작하게 하기 때문에 테이블 하나에 데이터가 많아도 크게 문제가 되지 않는다. 이렇게 데이터를 청크로 나누어 작업하게 하는 것은 이 작업으로 인해 서비스에 영향을 주거나 리플리케이션을 영향을 주지 않게 하기 위함이다. 각 청크는 기본적으로 작업 시간이 0.5초가 되도록 자른다. 


pt-table-checksum은 서버에 쿼리를 실행함으로서 동작을 하는 프로그램이다. 그래서, 서버의 서비스 성능에 문제를 주지 않는 상황에서 빠르게 쿼리를 실행하게 하는 것이 중요하다. 그래서 각 데이터 청크의 크기를 조절하는 것이 이 프로그램의 핵심이라고 할 수 있다. 


pt-table-checksum도 다른 프로그램에서 사용되는 nibbling이라는 기술을 사용한다. 이것은 pt-archiver에서도 사용하는 기능이다. 이 기능을 사용하기 때문에 청크로 데이터를 나눌 때 인덱스를 사용하여 나누게 되는데, 인덱스가 없고, 데이터가 어느정도 적다면 그냥 하나의 청크로 데이터를 처리한다. 


pt-table-checksum은 리플리케이션에 영향을 주지 않기 위한 여러가지 안전 장치를 가지고 있다. 작업 동안에 계속 모니터링을 통해 복제가 제대로 되고 있는지 확인한다. 만약, 리플리케이션 상태가 많이 밀린다고 판단되면 pt-table-checksum은 리플리케이션이 제대로 동작되도록 작업을 일시 중지한다. 또한, chunck 사이즈가 문제가 있는지 없는지 확인한다. 각 청크에 대해 explain 쿼리를 실행하여 문제가 있는지 없는지 체크한다. 또한, 추가적으로 안전 장치를 가지고 있다. innodb_lock_wait_timeout을 세션 레벨로 1값으로 설정하여 작업하게 하고, 데이터베이스 부하를 체크하여 부하가 너무 높지 않도록 체크한다. 이때 사용하는 설정값이 --max-load 옵션이다. 


이 작업은 우선순위가 낮은 작업으로 만약, 작업을 하다가 중지 한다고 해도 그리 문제가 되지 않는다. 혹시 문제가 되서 청크 작업을 kill하게 되는 경우, 다시 시도하게 되고, 만약, 문제가 된다면,  pt-table-checksum은 바로 다음 청크로 작업을 진행하게 된다. 그리고 이와 같은 현상은 전체 작업에 크게 문제가 되지 않는다.


pt-table-checksum은 모든 청크에 대한 작업을 끝내면, 마스터와 슬레이브 서버의 데이터가 동일한지 확인하고 그 결과를 출력한다. 


만약 필요하다고 사용자가 원하는 경우, 수동으로 데이터를 검색하여 조회할 수 있다. 다음은 결과에 대한 수동 결과를 출력할 수 있는 쿼리이다.


SELECT db, tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks

FROM percona.checksums

WHERE ( master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc)) GROUP BY db, tbl;


제약 사항


이 툴은 row-based 리플리케이션에서는 동작하지 않는다. 그래서 실행하게 하기 위해 binary log format을 변경하여 실행해야 한다.

이 툴은 마스터와 슬레이브 서버 사이의 스키가 동일하다는 가정하에서 동작하는 프로그램이다. 만약 다른 경우 작업은 중단된다.


결과 예제 설명

pt-table-checksum은 실행 후 다음과 같은 결과가 나타나게 된다. 

실행 후 발생되는 모든 로그는 standard error 로 출력된다.


각 테이블의 컬럼 내용은 다음과 같다.

TS : 연도 데이터가 없는 timestamp값으로 실행이 완료된 실행 시간을 알려준다.

ERROR : 작업을 하면서 발생된 경고나 에러의 갯수를 나타낸다.

DIFFS : 마스터와 슬레이브 서버사이에 데이터 결과가 다른 청크의 갯수를 나타낸다. --no-replicate-check 옵션을 명시하는 경우, 이 컬럼은 항상 0 값을 나타낸다. --replicate-check-only를 명시하는 경우 단지 데이터가 다른 테이블만 출력된다.

ROWS : 테이블에서 처리된 row의 수를 나타낸다. 이 갯수는 --where 옵션을 사용하게 되는 경우 다른 row 수를 출력할 수 있다.

CHUNCKS : 테이블에서 나누어진 청크의 수를 나타낸다.

SKIPPED : 어떤 문제가 있어서 재외된 청크의 수

TIME : 작업에 걸린 시간

TABLE : 처리된 테이블의 이름 db.tb로 보여줌.


--replicate-check-only가 명시되는 경우 데이터가 다르다고 판단되는 정보만 보여준다. 즉, 결과는 다음과 같이 보여진다.


TABLE : 테이블 이름

CHUNK : 데이터가 다른 청크의 수

CNT_DIFF : 복제 데이터에서 마스터 서버의 데이터를 뺀 청크의 row의 수

CRC_DIFF : 복제 데이터 CRC와 마스터 서버의 CRC가 다른 경우 1 같으면 0을 보여준다.

CHUNK_INDEX : 청크를 나누는데 사용한 인덱스

LOWER_BOUNDARY : 인덱스에서 데이터를 추출하는데 사용한 청크의 lower boundary

UPPER_BOUNDARY : 인덱스에서 데이터를 추출하는데 사용한 청크의 upper boundary


EXIT STATUS

pt-table-checksum은 3가지 결과값을 가진다. zero, 255, 그리고 다른 값을 보여준다. 다른 결과값은 다음의 테이블과 같다.



OPTIONS

사용할 수 있는 옵션은 다음과 같다.

--ask-pass

--[no]check-binlog-format

--binary-index

--check-interval

--[no]check-plan

--[no]check-replication-filters

--check-slave-lag

--[no]check-slave-tables

--chunk-index

--chunk-index-columns

--chunk-size

--chunk-size-limit

--chunk-time

--columns

--config

--[no]create-replicate-table

--databases

--databases-regex

--defaults-file

--[no]empty-replicate-table

--engines

--explain

--float-precision

--function

--help

--host

--ignore-columns

--ignore-databases

--ignore-databases-regex

--ignore-engines

--ignore-tables

--ignore-tables-regex

--max-log

--max-load

--password

--pid

--plugin

--port

--progress

--quiet

--recurse

--recursion-method

--replicate

--[no]replicate-check

--replicate-check-only

--replicate-check-retries

--replicate-database

--resume

--retries

--run-time

--separator

--set-vars

--socket

--tables

--tables-regex

--trim

--user

--version

--[no]version-check

--where


REPLICA CHECKS

기본적으로 pt-table-checksum은 마스터 서버에 연결된 모든 슬레이브 서버드릐 연결을 찾기위해 시도한다. 이 작업은 자동적으로 이루어 지는데, "slave recursion" 이라고 한다. 이 작업은 --recursion-method 와 --recurse로 조절할 수 있다. pt-table-checksum은 기본적으로 모든 리플리케이션에 대해 동작한다.


테스트~~


[mysql@oraclelinux6 bin]$ pt-table-checksum h=10.0.0.103,u=root,p=test,P=3306

Replica oraclelinux6.localdomain has binlog_format MIXED which could cause pt-table-checksum to break replication.  Please read "Replicas using row-based replication" in the LIMITATIONS section of the tool's documentation.  If you understand the risks, specify --no-check-binlog-format to disable this check.


[mysql@oraclelinux6 bin]$ pt-table-checksum --no-check-binlog-format h=10.0.0.103,u=root,p=test,P=3306

            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE

07-01T02:29:01      0      0        0       1       0   0.018 mysql.columns_priv

07-01T02:29:01      0      0        2       1       0   0.014 mysql.db

07-01T02:29:01      0      0        0       1       0   0.013 mysql.event

07-01T02:29:01      0      0        0       1       0   0.009 mysql.func

07-01T02:29:01      0      0       40       1       0   0.009 mysql.help_category

07-01T02:29:01      0      0      499       1       0   0.010 mysql.help_keyword

07-01T02:29:01      0      0     1107       1       0   0.020 mysql.help_relation

07-01T02:29:01      0      0      553       1       0   0.266 mysql.help_topic

07-01T02:29:01      0      0        0       1       0   0.014 mysql.ndb_binlog_index

07-01T02:29:01      0      0        0       1       0   0.014 mysql.plugin

07-01T02:29:01      0      0        0       1       0   0.010 mysql.proc

07-01T02:29:02      0      0        0       1       0   0.011 mysql.procs_priv

07-01T02:29:02      0      0        2       1       0   0.008 mysql.proxies_priv

07-01T02:29:02      0      0        0       1       0   0.009 mysql.servers

07-01T02:29:02      0      0        0       1       0   0.013 mysql.tables_priv

07-01T02:29:02      0      0        0       1       0   0.009 mysql.time_zone

07-01T02:29:02      0      0        0       1       0   0.013 mysql.time_zone_leap_second

07-01T02:29:02      0      0        0       1       0   0.008 mysql.time_zone_name

07-01T02:29:02      0      0        0       1       0   0.010 mysql.time_zone_transition

07-01T02:29:02      0      0        0       1       0   0.013 mysql.time_zone_transition_type

07-01T02:29:02      0      1       10       1       0   0.010 mysql.user

07-01T02:29:02      0      1        1       1       0   0.012 test.test

[mysql@oraclelinux6 bin]$ pt-table-checksum --no-check-binlog-format --databases test h=10.0.0.103,u=root,p=test,P=3306

            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE

07-01T02:30:04      0      1        1       1       0   0.012 test.test

[mysql@oraclelinux6 bin]$ pt-table-checksum --no-check-binlog-format --replicate-check-only --databases test h=10.0.0.103,u=root,p=test,P=3306

Differences on oraclelinux6.localdomain

TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY

test.test 1 1 1  



작업 전 스키마 정보 

[root@oraclelinux6.localdomain][test]> show databases

    -> ;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

4 rows in set (0.00 sec)


작업 후 스키마 정보 
[root@oraclelinux6.localdomain][(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| percona            |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

[root@oraclelinux6.localdomain][(none)]> use percona
Database changed
[root@oraclelinux6.localdomain][percona]> show tables;
+-------------------+
| Tables_in_percona |
+-------------------+
| checksums         |
+-------------------+
1 row in set (0.00 sec)





'MySQL Tool ' 카테고리의 다른 글

[Percona Toolkit] pt-table-sync  (0) 2015.06.30
[Percona Toolkit] pt-table-usage  (0) 2015.06.29
[Percona Toolkit] 설치법 및 알아야 할 내용  (0) 2015.06.17
[Percona Toolkit] pt-config-diff  (0) 2015.06.16
[Percona Toolkit] pt-align  (0) 2015.06.16