Comparar dos esquemas/entornos (schema diff)
Oracle
-- Extract the schema DDL from both environments and take a text diff
-- (generate deterministic DDL with DBMS_METADATA)
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',TRUE);
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',FALSE);
SELECT DBMS_METADATA.GET_DDL('TABLE', table_name) FROM user_tables ORDER BY table_name;
-- Spool the output to a file in both environments and compare with diff/fc.
-- Export the schema as a changelog with SQLcl's Liquibase integration:
-- SQL> lb generate-schema
-- Commercial: the Oracle SQL Developer 'Database Diff' tool is also used.Oracle no tiene un schema diff integrado de un solo comando. El método habitual es generar DDL determinista desde ambos entornos con DBMS_METADATA.GET_DDL (con los atributos STORAGE/de segmento desactivados) y hacer un diff de texto. Para una comparación visual/automatizada, use el asistente Database Diff de SQL Developer o SQLcl.
PostgreSQL
# Dump only the schema from both databases and diff them
pg_dump --schema-only --no-owner --no-privileges sourcedb > source_schema.sql
pg_dump --schema-only --no-owner --no-privileges targetdb > target_schema.sql
diff -u source_schema.sql target_schema.sql
# Tool that generates applicable ALTERs: apgdiff (Another PostgreSQL Diff Tool)
# apgdiff source_schema.sql target_schema.sql > migration.sql
# Alternatives: migra, Liquibase diffChangeLogLa forma más sencilla es obtener la salida de pg_dump --schema-only en ambos entornos y compararla con diff. apgdiff y migra son herramientas que convierten la diferencia directamente en sentencias ALTER ejecutables. Añada --no-owner --no-privileges para una salida determinista.
MySQL
# Schema/object comparison with MySQL Utilities (5.x):
mysqldbcompare --server1=root:password@host1 --server2=root:password@host2 \
shop:shop --difftype=sql --run-all-tests
# Built-in method: take CREATE statements from both environments and diff them
mysqldump --no-data --skip-comments shop > source_schema.sql
# SHOW CREATE TABLE customer; (to see a single table definition)La herramienta mysqldbcompare de MySQL Utilities informa de las diferencias de objetos/esquema entre dos servidores (como sentencias aplicables con difftype=sql). El método sin herramientas es obtener la salida de mysqldump --no-data (solo esquema) o de SHOW CREATE TABLE en ambos entornos y comparar con diff. mysqldbcompare ya está obsoleto; para MariaDB/8.x se prefiere Liquibase o Skeema.
SQL Server
-- Schema comparison/deploy report with SqlPackage (what will change before applying):
sqlpackage /Action:DeployReport /SourceFile:source.dacpac \
/TargetConnectionString:"Server=target;Database=shop;Integrated Security=true" \
/OutputPath:diff_report.xml
-- For data differences (row level), the tablediff utility:
tablediff -sourceserver S1 -sourcedatabase shop -sourcetable customer \
-destinationserver S2 -destinationdatabase shop -destinationtable customerPara diferencias de esquema, SqlPackage /Action:DeployReport devuelve como informe XML los cambios que se aplicarían al destino; /Action:Script genera un script de diferencias ejecutable. 'Schema Compare' de Visual Studio / Azure Data Studio usa el mismo motor. Para diferencias de datos a nivel de fila existe la utilidad de línea de comandos tablediff.
MongoDB
// The schema is implicit; extract and compare the field structure of both environments.
// Read the $jsonSchema validator definition (collection rules):
db.getCollectionInfos({ name: "customer" })[0].options.validator
// External tools for inferred schema comparison by sampling:
// mongodb-schema (npm) or the Compass 'Schema' tab
// Take samples with mongoexport and diff the field/type distribution of both environments.MongoDB no tiene esquema; no hay DDL fijo. La comparación se hace de dos formas: comparar las reglas del validador $jsonSchema definidas en la colección (mediante getCollectionInfos), o generar un esquema inferido a partir de los datos con mongodb-schema / Compass y comparar las distribuciones de campos y tipos. Para los índices, haga un diff de la salida de db.collection.getIndexes().
Redis
# Not applicable: Redis is a schemaless key-value store; there are no
# table/column definitions (DDL) to compare.
# Closest equivalent: compare the key space (namespace) structure
# redis-cli --scan --pattern 'customer:*' | sort > source_keys.txtNo aplica: Redis no tiene concepto de esquema (tabla/columna/DDL), por lo que un schema diff clásico no tiene sentido. Si se necesita una comparación estructural, solo se puede listar con SCAN el patrón de nombres de claves (namespace) y compararlo.
Elasticsearch
# Fetch the index mapping from both clusters and compare
curl -s 'http://source:9200/customer/_mapping?pretty' > source_mapping.json
curl -s 'http://target:9200/customer/_mapping?pretty' > target_mapping.json
diff -u source_mapping.json target_mapping.json
# To compare settings as well:
# GET customer/_settings and GET customer/_mappingEn Elasticsearch, el equivalente de un esquema es el mapping del índice. El método estándar es obtener la salida de GET <index>/_mapping (y _settings si es necesario) de ambos clústeres y comparar con diff. Como los campos del mapping son mayoritariamente inmutables, una diferencia detectada puede requerir un índice nuevo + _reindex.