Утилита для проверки синхронности баз данных pt-table-checksum
Утилита сравнивает базы данных на источнике и его репликах потаблично. Каждая таблица делится на небольшие фрагменты, для каждого фрагмента подсчитывается количество строк и контрольная сумма значений всех колонок. Полученные данные вставляются в таблицу checksums
в базе данных percona. Каждая операция подсчёта контрольной суммы фрагмента таблицы выполняется в виде запроса REPLACE INTO percona.checksums ... SELECT ... FROM database.table
.
Утилита меняет на источнике формат журнала на STATEMENT
в рамках установленного подключения и выполняет запрос на вычисление контрольной суммы фрагмента таблицы. Этот запрос уходит на реплики и выполняется на них тоже, но результат выполнения запроса будет зависеть от исходных данных, имеющихся на том сервере, где выполняется запрос. Благодаря этому можно затем просто сравнить результаты выполнения запросов, записанные в таблицы checksums
в базах данных percona
.
Утилита рассчитана на то, что таблица checksums из базы данных percona не реплицируется с источника на реплику. В противном случае контрольные суммы на реплике будут перезаписываться контрольными суммами источника и результат сверки баз данных будет заведомо успешным.
Перед запуском утилиты нужно создать на СУБД, базы данных на которых подлежат сверке, базы данных percona с таблицами checksums при помощи следующих запросов:
CREATE DATABASE `percona`;
USE `percona`;
CREATE TABLE `checksums` (
`db` char(64) NOT NULL,
`tbl` char(64) NOT NULL,
`chunk` int(11) NOT NULL,
`chunk_time` float DEFAULT NULL,
`chunk_index` varchar(200) DEFAULT NULL,
`lower_boundary` text,
`upper_boundary` text,
`this_crc` char(40) NOT NULL,
`this_cnt` int(11) NOT NULL,
`master_crc` char(40) DEFAULT NULL,
`master_cnt` int(11) DEFAULT NULL,
`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`db`,`tbl`,`chunk`),
KEY `ts_db_tbl` (`ts`,`db`,`tbl`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Для сравнения синхронности базы данных db на источнике с IP-адресом 192.168.1.2 и на его репликах можно запустить такую команду:
$ pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --databases=db u=root,p=p4$$w0rd,h=192.168.1.2,P=3306
Смысл опций:
--nocheck-replication-filters
- не проверять фильтры репликации, настроенные, например, с помощью опций binlog-do-db, replicate-do-db,--no-check-binlog-format
- не проверять формат журнала репликации. Утилите нужен формат STATEMENT, но она может работать и с форматом ROW, если таблица checksums в базе данных percona не будет реплицироваться,--databases=db
- список сверяемых баз данных, перечисленных через запятую.
Далее следует так называемый DSN, который указывает на настройки подключения к серверу-источнику:
u=root
- имя пользователя,p=p4$$w0rd
- пароль пользователя,h=192.168.1.2
- IP-адрес сервера,P=3306
- порт сервера.
Для подключения к серверу-источнику через SSH-туннель можно воспользоваться такими командами:
$ ssh -NL3307:127.0.0.1:3306 192.168.1.2
$ pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --databases=db u=root,p=p4$$w0rd,h=127.0.0.1,P=3307
Если в процессе сверки таблиц часто появляются сообщения об отсутствии подходящих индексов или о слишком большом размере фрагмента, то можно добавить к команде дополнительные опции:
--chunk-time=4
- увеличить максимальное время вычисления контрольной суммы одного фрагмента до 2 секунд (со значения 0,5, которое используется по умолчанию),--chunk-size-limit=10
- увеличить терпимость к превышению размера фрагмента до 4 раз (по умолчанию используются фрагменты по 10000 строк и допускается превышение размера одного фрагмента только в 2 раза).
С этими опциями команда примет следующий вид:
$ pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --chunk-time=2 --chunk-size-limit=4 --databases=db u=root,p=p4$$w0rd,h=192.168.1.2,P=3306
Для устранения расхождений на реплике можно запустить утилиту pt-table-sync
, например, следующим образом:
$ pt-table-sync --execute --sync-to-master u=root,p=p4$$w0rd,h=192.168.1.2,P=3306,D=db,t=table