DBAtlas · Атлас эксплуатации баз данных

Проверка после миграции (число строк/контрольная сумма)

Oracle

-- Compare row counts on source and target
SELECT 'customer' table_name, COUNT(*) row_count FROM customer;

-- To find content differences at object level, DBMS_COMPARISON (via db link)
BEGIN DBMS_COMPARISON.CREATE_COMPARISON(
  comparison_name => 'COMPARE_CUSTOMER',
  schema_name => 'SHOP', object_name => 'CUSTOMER',
  dblink_name => 'TARGET_DB'); END;
/
-- SELECT DBMS_COMPARISON.COMPARE('COMPARE_CUSTOMER', scan_info) FROM dual;

Самая быстрая проверка — сравнить COUNT(*) по каждой таблице на обеих сторонах. Чтобы найти реальные различия содержимого на уровне строк, используйте пакет DBMS_COMPARISON: он построчно сравнивает исходную и целевую таблицы через database link и может показать/устранить различия. Для контрольных сумм дайджест столбцов можно снять через ORA_HASH или STANDARD_HASH.

PostgreSQL

-- Row count
SELECT count(*) FROM customer;

-- Ordered digest (checksum) of the whole table content — compare on both sides
SELECT md5(string_agg(t.row_md5, '' ORDER BY t.row_md5)) AS digest
FROM (SELECT md5(customer::text) AS row_md5 FROM customer) t;

Первый шаг — сравнить count(*) по каждой таблице. Для проверки содержимого вычислите md5 текстового представления каждой строки, соедините их в отсортированном порядке и снова захэшируйте; это даёт контрольную сумму, не зависящую от порядка, для сравнения двух сторон. Для больших данных берите дайджест только по изменяемым/ключевым столбцам; для воспроизводимости важна сортировка по PK.

MySQL

-- Built-in table checksum (run on both servers and compare)
CHECKSUM TABLE customer;

-- Row count
SELECT COUNT(*) FROM customer;

-- Preferred tool for live/large environments (compares row chunks online):
-- pt-table-checksum h=source,D=shop  (Percona Toolkit)

В MySQL CHECKSUM TABLE даёт одну контрольную сумму содержимого таблицы; выполните его на источнике и цели и сравните (движок/версия должны совпадать). Для числа строк используйте COUNT(*). В живом продакшене и для согласованности репликации отраслевой стандарт — pt-table-checksum из Percona Toolkit; он сравнивает по чанкам, онлайн и с малым влиянием.

SQL Server

-- Full row-level comparison (official tool that produces differences)
tablediff -sourceserver S1 -sourcedatabase shop -sourcetable customer \
  -destinationserver S2 -destinationdatabase shop -destinationtable customer

-- Quick aggregate checksum (single query, compare on both sides):
SELECT COUNT_BIG(*) row_count, CHECKSUM_AGG(BINARY_CHECKSUM(*)) digest FROM dbo.customer;

В SQL Server официальная утилита командной строки для поиска различий на уровне строк — tablediff (сообщает, какие строки добавлены/изменены, а с необязательным -f пишет скрипт исправления). Для быстрой общей проверки CHECKSUM_AGG(BINARY_CHECKSUM(*)) даёт один дайджест таблицы; сравнивайте обе стороны вместе с COUNT_BIG(*) (не зависит от порядка строк).

MongoDB

// Compare document counts (on source and target)
db.customer.countDocuments({});

// For a content checksum, dbHash (md5 digest at collection/DB level):
db.runCommand({ dbHash: 1, collections: ["customer"] });
// -> compare the md5 field across both environments.

Первая проверка — сравнить число документов на обеих сторонах через countDocuments() (estimatedDocumentCount быстр, но опирается на метаданные; для точного подсчёта используйте countDocuments). Для проверки содержимого команда dbHash создаёт md5-дайджест на уровне коллекции/базы; сравните хэши двух сред. Индексы проверяйте отдельно через getIndexes().

Redis

# Compare key counts (on source and target)
redis-cli DBSIZE

# For a memory/data summary and key distribution:
redis-cli INFO keyspace     # db0:keys=... information
# For full content verification: DUMP each key and compare with the target
# (e.g. redis-cli --scan | xargs -I{} redis-cli DUMP {})

В Redis базовая проверка — сравнение общего числа ключей через DBSIZE; распределение по базам показывает INFO keyspace. Встроенной контрольной суммы таблиц в Redis нет; если нужна точная проверка содержимого, снимите сериализацию DUMP по каждому ключу и сравните обе стороны (учитывайте различия TTL). Можно также использовать инструмент riot compare.

Elasticsearch

# Compare document counts (on source and target clusters)
GET customer/_count

# Details: for health/segment/storage comparison
GET _cat/indices/customer?v&h=index,docs.count,store.size
# Content by sampling: compare GET customer/_doc/<id> for the same _ids

В Elasticsearch базовая проверка — сравнение числа документов в обоих кластерах через GET <index>/_count (_cat/indices docs.count тоже даёт быструю сводку). Опирайтесь на _count: _cat/indices docs.count считает на уровне Lucene (включая вложенные nested-поддокументы, напр. один документ с двумя nested-элементами считается как 3), поэтому может отличаться от _count. Для проверки содержимого сравнивайте выборку документов по одному набору _id или через поле хэша.

Открыть в DBAtlas →