İki şema/ortam arasında fark al (schema diff)
Oracle
-- Her iki ortamdan şema DDL'ini çıkarıp metinsel diff al
-- (DBMS_METADATA ile deterministik DDL üret)
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;
-- Çıktıyı iki ortamda dosyaya alıp diff/fc ile karşılaştır.
-- SQLcl'in Liquibase entegrasyonuyla şemayı changelog olarak dışa aktar:
-- SQL> lb generate-schema
-- Ticari: Oracle SQL Developer 'Database Diff' aracı da kullanılır.Oracle'da yerleşik tek komutlu şema-diff yoktur. Yaygın yöntem DBMS_METADATA.GET_DDL ile her iki ortamdan deterministik DDL üretip (STORAGE/segment özniteliklerini kapatarak) metinsel diff almaktır. Görsel/otomatik karşılaştırma için SQL Developer'ın Database Diff sihirbazı ya da SQLcl kullanılır.
PostgreSQL
# Her iki veritabanından yalnızca şemayı dök ve diff al
pg_dump --schema-only --no-owner --no-privileges kaynakdb > kaynak_sema.sql
pg_dump --schema-only --no-owner --no-privileges hedefdb > hedef_sema.sql
diff -u kaynak_sema.sql hedef_sema.sql
# Uygulanabilir ALTER üreten araç: apgdiff (Another PostgreSQL Diff Tool)
# apgdiff kaynak_sema.sql hedef_sema.sql > gecis.sql
# Alternatif: migra, Liquibase diffChangeLogEn basit yol pg_dump --schema-only çıktısını iki ortamda alıp diff ile karşılaştırmaktır. Farkı doğrudan çalıştırılabilir ALTER deyimlerine çeviren araçlar apgdiff ve migra'dır. Deterministik çıktı için --no-owner --no-privileges eklenir.
MySQL
# MySQL Utilities (5.x) ile şema/nesne karşılaştırma:
mysqldbcompare --server1=root:parola@host1 --server2=root:parola@host2 \
magaza:magaza --difftype=sql --run-all-tests
# Yerleşik yöntem: iki ortamdan CREATE ifadelerini alıp diff et
mysqldump --no-data --skip-comments magaza > kaynak_sema.sql
# SHOW CREATE TABLE musteri; (tek tablo tanımını görmek için)MySQL Utilities'in mysqldbcompare aracı iki sunucu arasındaki nesne/şema farkını (difftype=sql ile uygulanabilir ifade olarak) raporlar. Araçsız yöntem mysqldump --no-data (yalnız şema) veya SHOW CREATE TABLE çıktısını iki ortamdan alıp diff ile karşılaştırmaktır. mysqldbcompare artık deprecated'dır; MariaDB/8.x için Liquibase veya Skeema tercih edilir.
SQL Server
-- SqlPackage ile şema karşılaştırma/deploy raporu (uygulamadan önce ne değişecek):
sqlpackage /Action:DeployReport /SourceFile:kaynak.dacpac \
/TargetConnectionString:"Server=hedef;Database=magaza;Integrated Security=true" \
/OutputPath:fark_raporu.xml
-- Veri farkı için (satır düzeyi) tablediff aracı:
tablediff -sourceserver S1 -sourcedatabase magaza -sourcetable musteri \
-destinationserver S2 -destinationdatabase magaza -destinationtable musteriŞema farkı için SqlPackage /Action:DeployReport hedefe uygulanacak değişiklikleri XML rapor olarak verir; /Action:Script çalıştırılabilir fark betiği üretir. Visual Studio / Azure Data Studio 'Schema Compare' de aynı motoru kullanır. Satır düzeyi veri farkı için tablediff komut satırı aracı vardır.
MongoDB
// Şema örtüktür; iki ortamın alan yapısını çıkarıp karşılaştır.
// $jsonSchema validator tanımını oku (koleksiyon kuralları):
db.getCollectionInfos({ name: "musteri" })[0].options.validator
// Örneklemeyle çıkarımsal şema karşılaştırması için harici araç:
// mongodb-schema (npm) ya da Compass 'Schema' sekmesi
// mongoexport ile örnek alıp iki ortamın alan/tip dağılımını diff et.MongoDB şemasızdır; sabit bir DDL yoktur. Karşılaştırma iki yönde yapılır: koleksiyonda tanımlı $jsonSchema validator kurallarını (getCollectionInfos ile) karşılaştırmak, veya mongodb-schema / Compass ile veriden çıkarımsal şema üretip alan ve tip dağılımlarını karşılaştırmak. Index'ler için db.collection.getIndexes() çıktısı diff edilir.
Redis
# Uygulanamaz: Redis şemasız bir anahtar-değer deposudur; karşılaştırılacak
# tablo/kolon tanımı (DDL) yoktur.
# En yakın karşılık: keyspace (namespace) yapısını karşılaştırmak
# redis-cli --scan --pattern 'musteri:*' | sort > kaynak_anahtarlar.txtUygulanamaz: Redis'te şema (tablo/kolon/DDL) kavramı yoktur, dolayısıyla klasik şema-diff geçersizdir. Yapısal karşılaştırma gerekiyorsa yalnızca anahtar isimlendirme deseni (namespace) SCAN ile listelenip karşılaştırılabilir.
Elasticsearch
# İki kümeden index mapping'ini alıp karşılaştır
curl -s 'http://kaynak:9200/musteri/_mapping?pretty' > kaynak_mapping.json
curl -s 'http://hedef:9200/musteri/_mapping?pretty' > hedef_mapping.json
diff -u kaynak_mapping.json hedef_mapping.json
# Ayarları da karşılaştırmak için:
# GET musteri/_settings ve GET musteri/_mappingElasticsearch'te şema karşılığı index mapping'idir. GET <index>/_mapping çıktısını (ve gerekirse _settings) iki kümeden alıp diff ile karşılaştırmak standart yöntemdir. Mapping alanları çoğunlukla değiştirilemez olduğundan fark tespit edilirse yeni index + _reindex gerekebilir.