DBAtlas · Atlas für Datenbankbetrieb

Prüfung nach der Migration (Zeilenzahl/Prüfsumme)

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;

Am schnellsten vergleichst du COUNT(*) pro Tabelle auf beiden Seiten. Um echte inhaltliche Unterschiede auf Zeilenebene zu finden, nutze das Package DBMS_COMPARISON: Es vergleicht Quell- und Zieltabellen zeilenweise über einen Database Link und kann die Unterschiede melden/angleichen. Für Prüfsummen lässt sich mit ORA_HASH oder STANDARD_HASH ein Spalten-Digest bilden.

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;

Der erste Schritt ist, count(*) jeder Tabelle zu vergleichen. Zur inhaltlichen Prüfung bildest du das md5 der Textdarstellung jeder Zeile, verkettest sie sortiert und hashst erneut; so entsteht eine reihenfolgeunabhängige Prüfsumme für beide Seiten. Bei großen Datenmengen bilde den Digest nur über die veränderlichen/Schlüsselspalten; die Sortierung nach PK ist für Wiederholbarkeit wichtig.

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)

In MySQL liefert CHECKSUM TABLE eine einzige Prüfsumme des Tabelleninhalts; führe es auf Quelle und Ziel aus und vergleiche (Engine/Version müssen gleich sein). Für die Zeilenzahl nutze COUNT(*). In laufender Produktion und für Replikationskonsistenz ist pt-table-checksum aus dem Percona Toolkit der Branchenstandard; es vergleicht chunkweise, online und mit geringer Last.

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;

In SQL Server ist tablediff das offizielle Kommandozeilentool für Unterschiede auf Zeilenebene (es meldet hinzugefügte/geänderte Zeilen und schreibt mit optionalem -f ein Korrekturskript). Für eine schnelle Gesamtprüfung liefert CHECKSUM_AGG(BINARY_CHECKSUM(*)) einen einzigen Tabellen-Digest; vergleiche beide Seiten zusammen mit COUNT_BIG(*) (unabhängig von der Zeilenreihenfolge).

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.

Die erste Prüfung ist, die Dokumentanzahl auf beiden Seiten mit countDocuments() zu vergleichen (estimatedDocumentCount ist schnell, stützt sich aber auf Metadaten; für eine exakte Zählung countDocuments nutzen). Zur inhaltlichen Prüfung erzeugt der Befehl dbHash einen md5-Digest auf Collection-/Datenbankebene; vergleiche die Hashes beider Umgebungen. Indizes separat mit getIndexes() prüfen.

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 {})

In Redis besteht die Grundprüfung im Vergleich der Gesamtzahl der Schlüssel mit DBSIZE; die Verteilung pro Datenbank zeigt INFO keyspace. Redis hat keine eingebaute Tabellenprüfsumme; ist eine exakte Inhaltsprüfung nötig, hole pro Schlüssel die DUMP-Serialisierung und vergleiche beide Seiten (TTL-Unterschiede beachten). Auch das Tool riot compare lässt sich nutzen.

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

In Elasticsearch besteht die Grundprüfung im Vergleich der Dokumentanzahl auf beiden Clustern mit GET <index>/_count (_cat/indices docs.count liefert ebenfalls eine schnelle Übersicht). Stütze den Vergleich auf _count: _cat/indices docs.count zählt auf Lucene-Ebene (inklusive nested Unterdokumente, z. B. zählt ein Dokument mit zwei nested Elementen als 3) und kann daher von _count abweichen. Zur inhaltlichen Prüfung vergleiche stichprobenartig Dokumente über dieselbe Menge von _ids oder über ein Hash-Feld.

In DBAtlas öffnen →