DynamoDB Tablosunu Hesap/Bölge Arası Kopyalama
DynamoDB'de tek tıkla "tabloyu kopyala" komutu yoktur — ne AWS CLI'da ne de konsolda. Her kopyalama aslında iki yarımdır: veriyi kaynaktan dışarı çıkarın ve bir hedef tabloya yükleyin. İlk yarım, bir GUI'nin kendini kanıtladığı yerdir — kayıpsız, filtrelenmiş, doğrulanmış bir dışa aktarım — ikinci yarım ise her zaman AWS araçlarıyla yürür. Bu kılavuz ikisini de ve üretimde ısıran operasyonel tuzakları kapsar.
Bir DynamoDB tablosunu başka bir hesaba veya bölgeye nasıl kopyalarım?
Yerel bir tablo-kopyalama komutu yoktur. Dışarı yarısı için, tablonun kayıpsız bir DynamoDB-JSON dışa aktarımını çekin (DynoTable'da tek tık, betik yok) veya yönetilen S3 dışa aktarımıyla anlık görüntüsünü alın. İçeri yarısı için, uyan AWS-tarafı yaklaşımı seçin: küçük tek seferlik kopyalar için bir Scan + BatchWriteItem betiği, büyük tablolar için S3'e dışa-aktar-sonra-içe-aktar, tam sadakatle hesaplar arası taşımalar için AWS Backup kopyala + geri yükle veya süregelen canlı replikasyon için global tablolar. Her geri yükleme veya içe aktarım yeni bir tablo oluşturur.
| Durum | En iyi yaklaşım |
|---|---|
| Küçük tablo, tek seferlik, tam kontrol | Scan + BatchWriteItem betiği |
| Büyük tablo, anlık görüntüye tahammül edebilir | S3 dışa aktarım → içe aktarım (yeni tablo oluşturur) |
| Geri yüklemeli hesaplar arası / bölgeler arası | AWS Backup kopyala + geri yükle |
| Süregelen canlı replikasyon (tek seferlik kopya değil) | Global tablolar |
Hiçbir yaklaşım evrensel olarak "doğru" değildir — tablo boyutuna, belirli bir andaki anlık görüntüye mi yoksa canlı veriye mi ihtiyacınız olduğuna ve hedefin yeni mi mevcut mu bir tablo olduğuna bağlıdır.
Dışa aktarım yarısı: veriyi DynoTable ile çekin
Herhangi bir geri yükleme olabilmeden önce verinin kaynaktan ayrılması gerekir — ve elle yazılmış bir scan döngüsü, küçük bir taşımanın en hataya açık kısmıdır (düşen sayfalar, bozulan sayı hassasiyeti, çok erken soyulan tür etiketleri). DynoTable o yarıyı tek tıkla yapar:
- Tasarım gereği kayıpsız: tam filtre eşleşmesini, marshall edilmiş DynamoDB-JSON olarak dışa aktarın — düz JSON'ın bozduğu büyük sayıları (> 2⁵³) koruyan, tür sarmalı tel biçimi — veya hedef hiç DynamoDB değilse NDJSON/CSV olarak. Biçim ayrıntıları için CSV'ye dışa aktarma bölümüne bakın.
- Kapsamlı, ya-hep-ya-hiç değil: yönetilen S3 dışa aktarımı tüm tablonun
anlık görüntüsünü alır; DynoTable sorgunuzun eşleştiği her öğeyi, doğrudan
DynamoDB'den akıtılarak dışa aktarır — böylece "yalnızca
TENANT#42öğelerini staging'e kopyala" bir betik değil, bir filtredir. - Büyük tablolara açık: dışa aktarımlar ayrılır ve arka planda çalışır, diske satır satır akıtılır — çok gigabaytlık bir çekme, sekme geçişlerinden ve uygulama yeniden yüklemelerinden sağ çıkar.
- Yüklemeden sonra doğrulama: hedef tablo ayağa kalktığında, kaynağa ve hedefe yan yana göz atın, öğe sayımlarını karşılaştırın (tablo boyutu ve öğe sayısı) ve örnek kayıtları noktasal kontrol edin — bir doğrulama betiği yazmadan.
Dürüst sınır: DynoTable veriyi dışarı çeker ve sonucu doğrular — hedef tabloya yükleme, AWS araçlarıyla yürür (bir yazma betiği, S3 içe aktarımı veya Backup geri yüklemesi); sırada bunlar var.
Yaklaşım 1: Scan + BatchWriteItem (betik)
En düşük teknolojili seçenek: kaynaktaki her öğeyi Scan ile okuyun, hedefe
BatchWriteItem ile yazın. Betiğiniz iki taraf için de kimlik bilgileri tuttuğu
(veya hedef hesapta bir role büründüğü) sürece hesaplar arası ve bölgeler arası
çalışır.
# Sketch — read source, write target (pseudo; use the SDK in real life)
aws dynamodb scan --table-name SourceTable --region us-east-1 \
> items.json
# transform Items[] into BatchWriteItem RequestItems, then:
aws dynamodb batch-write-item --request-items file://batch.json \
--region eu-west-1Tuzaklar gerçektir ve gözden kaçırması kolaydır:
BatchWriteItemçağrı başına 25 öğe veya 16 MB ile sınırlıdır — parçalamak zorundasınız ve tek bir çağrı, üstel geri çekilme (exponential backoff) ile yeniden denemeniz gereken işlenmemiş öğeler döndürebilir (API referansı).- Yazmalar yazma kapasitesi tüketir. bir hedefte
hızla
ProvisionedThroughputExceededException'a çarparsınız; daha fazlasını emer ama yine de her bölümü katı bir 1.000 WCU / 3.000 RCU sınırıyla kısıtlar. Başlamadan önce yazma yükünü hedefin kapasitesine göre boyutlandırın. Scantüm tabloyu okur ve her öğeyi ölçer — klasik Query ve Scan maliyeti. Büyük bir tablo aynı zamandaLastEvaluatedKeyüzerinden sayfalamak demektir; bkz. sayfalama.- Atomik değildir. Tarama uçuştayken yazılan öğeler kaçırılabilir — tutarlı bir anlık görüntüyü ancak kaynak hareketsizse elde edersiniz.
Küçük tablolar için veya kopyalama sırasında dönüştürme/filtreleme gerektiğinde en iyisidir — ve okuma yarısı zaten bir DynoTable marshall edilmiş dışa aktarımı olarak mevcutsa, betik yalnızca parçala-ve-yaz döngüsüne küçülür.
Yaklaşım 2: S3'e dışa aktarın, sonra yeni bir tabloya içe aktarın
Büyük tablolar için, DynamoDB'nin yönetilen S3'e dışa aktarımı artı S3'ten içe aktarımı kapasitenizi hırpalamayı tamamen önler.
Dışa aktarım, tablonun anlık görüntüsünü bir S3 kovasına alır (nasıl çalışır):
- Kaynak tabloda point-in-time recovery (PITR) etkin olmasını gerektirir.
- Okuma kapasitesi tüketmez ve tablo performansı üzerinde etkisi yoktur — canlı tablodan değil, sürekli yedeklerden okur.
- DynamoDB JSON veya Amazon Ion biçiminde çıktılar. (DynamoDB-JSON tel biçimi, tür etiketleriyle birlikte, S3'e inen şeydir.)
- Başka bir hesaba ait ve farklı bir bölgedeki bir S3 kovasına yazabilir.
- Tam ve artımlı dışa aktarımları destekler (artımlı dışa aktarım GA, Eylül 2023).
İçe aktarım sonra o S3 verisinden taze bir tablo inşa eder (nasıl çalışır):
- Yalnızca yepyeni bir tabloya içe aktarır — mevcut bir tabloya içe aktaramazsınız.
- Yeni tabloda yazma kapasitesi tüketmez.
- CSV, DynamoDB JSON veya Amazon Ion kabul eder (isteğe bağlı GZIP/ZSTD sıkıştırmalı).
- Kaynak S3 kovası başka bir hesapta veya başka bir bölgede olabilir.
- İçe aktarım anında ikincil index'ler tanımlayabilirsiniz; içe aktarım biter bitmez sorgulanabilirler.
Belirli bir andaki anlık görüntünün (canlı veri değil) kabul edilebilir olduğu büyük bir hesaplar arası / bölgeler arası taşıma için en temiz yol budur.
Yaklaşım 3: AWS Backup kopyala + geri yükle
Zaten AWS Backup kullanıyorsanız, kurtarma noktalarını hesaplar ve bölgeler arası kopyalar (hesaplar arası taşıma kılavuzu):
- Kaynak tabloyu bir yedek kasasına yedekleyin.
- Yedeği hedef hesaptaki/bölgedeki bir kasaya kopyalayın.
- Hedefte yeni bir tabloya geri yükleyin.
Temel kısıtlar:
- Hesaplar arası kopyalama, her iki hesabın da aynı AWS Organization içinde olmasını gerektirir.
- Geri yükleme her zaman yeni bir tablo oluşturur — mevcut bir tablonun üzerine geri yükleyemezsiniz.
- varsayılan olarak korunur (geri yükleme süresinden/maliyetinden tasarruf için bazılarını veya tümünü hariç tutun); geri yüklemede yeni index ekleyemezsiniz.
- Şifreleme tuzağı: bölgeler arası bir geri yüklemede aynı KMS anahtarını tutmak için çok bölgeli bir anahtar gerekir; hesaplar arası içinse anahtarı hedef hesapla paylaşmalısınız. AWS'ye ait ve AWS tarafından yönetilen anahtarlar paylaşılamaz veya çok bölgeli yapılamaz (geri yükleme şifreleme notları).
Yaklaşım 4: Global tablolar (canlı replikasyon, tek seferlik kopya değil)
Global tablolar, bir tabloyu bölgeler arası — ve artık isteğe bağlı olarak hesaplar arası (çoklu hesap GA, Şubat 2026) — sürekli çoğaltır. Herhangi bir replika okumaları ve yazmaları sunar (çoklu-aktif), eşzamansız, son-yazan-kazanır replikasyonla (global tablolar belgeleri).
Bu bir "kopyala ve uzaklaş" aracı değildir — süregelen replikasyondur. Hedef bölgenin süresiz olarak eşzamanlı kalmasını istediğinde kullanın (felaket kurtarma, düşük gecikmeli yerel okumalar), temiz bir tek seferlik taşıma için değil. Mevcut bir tabloya bir bölge ekleyin; DynamoDB var olan veriyi yeni replikaya geriye dönük doldurur.
Operasyonel tuzaklar (tüm yaklaşımlar)
- GSI'ları yeniden oluşturmak bedava değildir. Bir scan+write kopyası index'leri taşımaz — onları hedefte tanımlarsınız ve ayrıca geriye dönük doldurulurlar (ve maliyet çıkarırlar). Hedefteki GSI ve LSI yerleşiminizi baştan planlayın; LSI'lar yalnızca tablo oluşturma anında oluşturulabilir (LSI belgeleri).
- Kapasite modu aktarılmaz. Yeni tablo, kaynağınkiyle değil, senin ayarladığınız modla başlar. Bir scan+write kopyasından önce yazma yükünü tahmin edin — temsili bir öğeyi öğe boyutu hesaplayıcısıyla boyutlandırın ve WCU'ları kabaca kestirmek için öğe sayısıyla çarpın.
- , , otomatik ölçekleme ve etiketler veri değil, tablo ayarlarıdır — kopyalama yöntemlerinin hiçbiri hepsini taşımaz. Onları hedefte yeniden uygulayın.
- DynamoDB JSON ≠ düz JSON. Dışa aktarımlar ve taramalar tür etiketli DynamoDB-JSON yayımlar; yol üstünde dönüştürüyorsanız, marshall etme işini DynamoDB JSON dönüştürücüsü halleder.
- Geçişten önce doğrulayın. İki tarafta öğe sayımlarını karşılaştırın ve
kayıtları noktasal kontrol edin —
DescribeTablesayımının altı saate kadar bayat olabileceğini hatırlayarak; taze bir hedef meşru olarak sıfır bildirebilir.
SSS
Bir DynamoDB tablosunu kopyalamak için bir AWS CLI komutu var mı?
Hayır. Yerel bir copy-table komutu yoktur. scan + batch-write-item'ı
birleştirirsiniz veya yönetilen dışa/içe aktarım ya da AWS Backup özelliklerini
kullanırsınız.
Bir DynamoDB tablosunu başka bir hesaba nasıl kopyalarım? Üç seçenek: iki hesap için de kimlik bilgileri olan bir scan+write betiği, bir S3 dışa/içe aktarımı (kova hesaplar arası olabilir) veya AWS Backup kopyala+geri yükle (iki hesap da aynı AWS Organization içinde olmalıdır).
Bir DynamoDB tablosunu başka bir bölgeye nasıl kopyalarım? S3 dışa/içe aktarımı ve AWS Backup, ikisi de bölgeler arasını destekler. Tek seferlik bir kopya yerine süregelen bölgeler arası eşzamanlama için, hedef bölgede bir global-tablo replikası ekleyin.
Bir tabloyu kopyalamak index'lerini de kopyalar mı? S3 içe aktarımı ve AWS Backup geri yüklemesi, ikincil index'leri tutmanıza/tanımlamanıza izin verir; bir scan+write betiği vermez — index'leri hedefte kendiniz oluşturursunuz ve ayrıca geriye dönük doldurulurlar.
Mevcut bir DynamoDB tablosuna içe aktarabilir miyim? Hayır. DynamoDB'nin S3 içe aktarımı ve AWS Backup geri yüklemesi, ikisi de yeni bir tablo oluşturur. Mevcut bir tabloya birleştirmek için bir scan+write betiği kullanın.
Bir tablonun yalnızca bir kısmını kopyalayabilir miyim? Yönetilen dışa/içe aktarım ve Backup yolları yalnızca tam tablodur. Bir alt küme için, filtre eşleşmesini DynoTable'dan dışa aktarın (kayıpsız marshall edilmiş DynamoDB-JSON) veya filtrelenmiş bir taramayı betikleyin, sonra alt kümeyi hedefe yazın.
Bir GUI geçişi akıl sağlığına kavuşturur: tam olarak taşıdığınız öğelerin kayıpsız bir dışa aktarımını çekin, sonra kaynağa ve hedefe yan yana göz atın, kopyadan sonra öğe sayımlarını ve birkaç örnek kaydı doğrulayın ve bir scan betiği yazmadan anlık kontroller çalıştırın. Bir taşımanın dışa-aktar-ve-doğrula yarısını hesaplar ve bölgeler arası yürütmek için DynoTable'ı indirin.