Menyalin data dari dan ke Oracle dengan menggunakan Azure Data Factory atau Azure Synapse Analytics

BERLAKU UNTUK:Azure Data Factory Azure Synapse Analytics

Tip

Cobalah Data Factory di Microsoft Fabric, solusi analitik all-in-one untuk perusahaan. Microsoft Fabric mencakup semuanya mulai dari pergerakan data hingga ilmu data, analitik real time, kecerdasan bisnis, dan pelaporan. Pelajari cara memulai uji coba baru secara gratis!

Artikel ini menguraikan cara menggunakan aktivitas salin di Azure Data Factory untuk menyalin data dari dan ke database Oracle. Ini dibuat berdasarkan gambaran umum aktivitas salin.

Kemampuan yang didukung

Konektor Oracle ini didukung untuk kemampuan berikut:

Kemampuan yang didukung IR
Salin aktivitas (sumber/sink) ① ②
Aktivitas pencarian ① ②
Aktivitas skrip ① ②

① Runtime integrasi Azure ② Runtime integrasi yang dihost sendiri

Untuk daftar penyimpanan data yang didukung sebagai sumber atau sink oleh aktivitas salin, lihat tabel Penyimpanan data yang didukung.

Secara khusus, konektor Oracle ini mendukung:

  • Versi database Oracle berikut:
    • Oracle 19c R1 (19.1) dan yang lebih tinggi
    • Oracle 18c R1 (18.1) dan yang lebih tinggi
    • Oracle 12c R1 (12.1) dan yang lebih tinggi
    • Oracle 11g R1 (11.1) dan yang lebih tinggi
    • Oracle 10g R1 (10.1) dan yang lebih tinggi
    • Oracle 9i R2 (9.2) dan yang lebih tinggi
    • Oracle 8i R3 (8.1.7) dan yang lebih tinggi
    • Layanan Exadata Cloud Oracle Database
  • Penyalinan paralel dari sumber Oracle. Lihat bagian Penyalinan paralel dari Oracle untuk detailnya.

Catatan

Server proksi Oracle tidak didukung.

Prasyarat

Jika penyimpanan data Anda terletak di dalam jaringan lokal, jaringan virtual Azure, atau Amazon Virtual Private Cloud, Anda harus mengonfigurasi runtime integrasi yang dihosting sendiri untuk menghubungkannya.

Jika penyimpanan data Anda adalah layanan data cloud terkelola, Anda dapat menggunakan Azure Integration Runtime. Jika akses dibatasi untuk IP yang disetujui dalam aturan firewall, Anda dapat menambahkan IP Azure Integration Runtime ke daftar izinkan.

Anda juga dapat menggunakan fitur runtime integrasi jaringan virtual terkelola di Azure Data Factory untuk mengakses jaringan lokal tanpa menginstal dan mengonfigurasi runtime integrasi yang dihosting sendiri.

Untuk informasi selengkapnya tentang mekanisme dan opsi keamanan jaringan yang didukung oleh Data Factory, lihat Strategi akses data.

Runtime integrasi menyediakan driver Oracle bawaan. Oleh karena itu, Anda tidak perlu menginstal driver secara manual saat menyalin data dari dan ke Oracle.

Mulai

Untuk melakukan aktivitas Salin dengan alur, Anda dapat menggunakan salah satu alat atau SDK berikut:

Membuat layanan tertaut ke Oracle menggunakan UI

Gunakan langkah-langkah berikut untuk membuat layanan tertaut ke Oracle di UI portal Azure.

  1. Telusuri ke tab Kelola di ruang kerja Azure Data Factory atau Synapse Anda dan pilih Layanan Tertaut, lalu klik Baru:

  2. Cari Oracle dan pilih konektor Oracle.

    Screenshot of the Oracle connector.

  3. Konfigurasikan detail layanan, uji koneksi, dan buat layanan tertaut baru.

    Screenshot of linked service configuration for Oracle.

Detail konfigurasi konektor

Bagian berikut memberikan detail tentang properti yang digunakan untuk menentukan entitas khusus untuk konektor Oracle.

Properti layanan tertaut

Layanan tertaut Oracle mendukung properti berikut ini:

Properti Deskripsi Wajib
jenis Properti jenis harus diatur ke Oracle. Ya
connectionString Menentukan informasi yang diperlukan untuk terhubung ke instans Oracle Database.
Anda juga dapat memasukkan kata sandi di Azure Key Vault dan menarik konfigurasi password dari string koneksi. Lihat sampel berikut dan artikel Menyimpan informasi masuk di Azure Key Vault untuk detail selengkapnya.

Tipe koneksi yang didukung: Anda dapat menggunakan SID Oracle atau Name Layanan Oracle untuk mengidentifikasi database Anda:
- Jika Anda menggunakan SID: Host=<host>;Port=<port>;Sid=<sid>;User Id=<username>;Password=<password>;
- Jika Anda menggunakan Nama Layanan: Host=<host>;Port=<port>;ServiceName=<servicename>;User Id=<username>;Password=<password>;
Untuk opsi koneksi asli Oracle tingkat lanjut, Anda dapat memilih untuk menambahkan entri di file TNSNAMES.ORA di server Oracle, dan di layanan tertaut Oracle, pilih untuk menggunakan tipe koneksi Nama Layanan Oracle dan konfigurasikan nama layanan yang sesuai.
Ya
connectVia Runtime integrasi yang akan digunakan untuk menyambungkan ke penyimpanan data. Pelajari selengkapnya dari bagian Prasyarat. Jika tidak ditentukan, Integration Runtime Azure default digunakan. Tidak

Tip

Jika Anda mendapatkan pesan kesalahan, "ORA-01025: Parameter UPI di luar jangkauan", dan versi Oracle Anda adalah 8i, tambahkan WireProtocolMode=1 ke string koneksi Anda. Kemudian coba lagi.

Jika Anda memiliki beberapa instance Oracle untuk skenario failover, Anda dapat membuat layanan tertaut oracle dan mengisi host utama, port, nama pengguna, kata sandi, dll., serta menambahkan "Properti koneksi tambahan" baru dengan nama properti sebagai AlternateServers dan nilai sebagai (HostName=<secondary host>:PortNumber=<secondary port>:ServiceName=<secondary service name>) - jangan lewatkan tanda kurung dan perhatikan titik dua (:) sebagai pemisah. Sebagai contoh, nilai server alternatif berikut ini menentukan dua server database alternatif untuk failover koneksi: (HostName=AccountingOracleServer:PortNumber=1521:SID=Accounting,HostName=255.201.11.24:PortNumber=1522:ServiceName=ABackup.NA.MyCompany).

Properti koneksi lainnya yang dapat Anda atur dalam string koneksi per kasus Anda:

Properti Deskripsi Nilai yang diizinkan
ArraySize Jumlah byte yang dapat diambil konektor dalam satu perjalanan pulang pergi jaringan. Misalnya, ArraySize=‭10485760‬.

Nilai yang lebih besar meningkatkan throughput dengan mengurangi frekuensi pengambilan data di seluruh jaringan. Nilai yang lebih kecil meningkatkan waktu respons, karena terdapat lebih sedikit penundaan yang menunggu server mengirimkan data.
Bilangan bulat dari 1 hingga 4294967296 (4 GB). Nilai default 60000. Nilai 1 tidak menentukan jumlah byte, tetapi menunjukkan pengalokasian ruang untuk tepat satu baris data.

Untuk mengaktifkan enkripsi pada koneksi Oracle, Anda memiliki dua opsi:

  • Untuk menggunakan Enkripsi Triple-DES (3DES) dan Standar Enkripsi Lanjutan (AES),di sisi server Oracle, buka Keamanan Tingkat Lanjut Oracle (OAS) dan konfigurasikan pengaturan enkripsi. Untuk detailnya, lihat dokumentasi Oracle ini. Konektor Kerangka Kerja Pengembangan Aplikasi (ADF) Oracle secara otomatis menegosiasikan metode enkripsi untuk menggunakan metode yang Anda konfigurasi di OAS saat membuat koneksi ke Oracle.

  • Untuk menggunakan TLS:

    1. Dapatkan info sertifikat TLS/SSL. Dapatkan informasi sertifikat yang dikodekan pada Distinguished Encoding Rules (DER) dari sertifikat TLS/SSL Anda, dan simpan output (----- Mulai Sertifikat … Akhiri Sertifikat -----) sebagai file teks.

      openssl x509 -inform DER -in [Full Path to the DER Certificate including the name of the DER Certificate] -text
      

      Contoh: Ekstrak info sertifikat dari DERcert.cer, lalu simpan output ke cert.txt.

      openssl x509 -inform DER -in DERcert.cer -text
      Output:
      -----BEGIN CERTIFICATE-----
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      XXXXXXXXX
      -----END CERTIFICATE-----
      
    2. Buat keystore atau truststore. Perintah berikut membuat file truststore, dengan atau tanpa kata sandi, dalam format PKCS-12.

      openssl pkcs12 -in [Path to the file created in the previous step] -out [Path and name of TrustStore] -passout pass:[Keystore PWD] -nokeys -export
      

      Contoh: Buat file truststore PKCS12 bernama MyTrustStoreFile dengan kata sandi.

      openssl pkcs12 -in cert.txt -out MyTrustStoreFile -passout pass:ThePWD -nokeys -export  
      
    3. Masukkan file truststore pada mesin IR yang dihost sendiri. Misalnya, masukkan file di C:\MyTrustStoreFile.

    4. Di layanan, konfigurasikan string koneksi Oracle dengan EncryptionMethod=1 dan nilai TrustStore/TrustStorePassword yang sesuai. Contohnya:Host=<host>;Port=<port>;Sid=<sid>;User Id=<username>;Password=<password>;EncryptionMethod=1;TrustStore=C:\\MyTrustStoreFile;TrustStorePassword=<trust_store_password>

Contoh:

{
    "name": "OracleLinkedService",
    "properties": {
        "type": "Oracle",
        "typeProperties": {
            "connectionString": "Host=<host>;Port=<port>;Sid=<sid>;User Id=<username>;Password=<password>;"
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

Contoh: simpan kata sandi di Azure Key Vault

{
    "name": "OracleLinkedService",
    "properties": {
        "type": "Oracle",
        "typeProperties": {
            "connectionString": "Host=<host>;Port=<port>;Sid=<sid>;User Id=<username>;",
            "password": { 
                "type": "AzureKeyVaultSecret", 
                "store": { 
                    "referenceName": "<Azure Key Vault linked service name>", 
                    "type": "LinkedServiceReference" 
                }, 
                "secretName": "<secretName>" 
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

Properti himpunan data

Bagian ini menyediakan daftar properti yang didukung oleh himpunan data Oracle. Untuk daftar lengkap bagian dan properti yang tersedia untuk menentukan himpunan data, lihat Himpunan data.

Untuk menyalin data dari dan ke Oracle, atur properti jenis himpunan data ke OracleTable. Properti berikut ini didukung.

Properti Deskripsi Wajib
jenis Properti type himpunan data harus diatur ke OracleTable. Ya
skema Nama skema. Tidak untuk sumber, Ya untuk sink
tabel Nama tabel/tampilan. Tidak untuk sumber, Ya untuk sink
tableName Nama tabel/tampilan dengan skema. Properti ini didukung untuk kompatibilitas mundur. Untuk beban kerja baru, gunakan schema dan table. Tidak untuk sumber, Ya untuk sink

Contoh:

{
    "name": "OracleDataset",
    "properties":
    {
        "type": "OracleTable",
        "schema": [],
        "typeProperties": {
            "schema": "<schema_name>",
            "table": "<table_name>"
        },
        "linkedServiceName": {
            "referenceName": "<Oracle linked service name>",
            "type": "LinkedServiceReference"
        }
    }
}

Properti aktivitas salin

Bagian ini menyediakan daftar properti yang didukung oleh sumber dan sink Oracle. Untuk daftar lengkap bagian dan properti yang tersedia untuk menentukan aktivitas, lihat Alur.

Oracle sebagai sumber

Tip

Untuk memuat data dari Oracle secara efisien dengan menggunakan partisi data, pelajari lebih lanjut dari Penyalinan paralel dari Oracle.

Untuk menyalin data dari Oracle, atur jenis sumber dalam aktivitas penyalinan ke OracleSource. Properti berikut ini didukung di bagian sumber aktivitas salin.

Properti Deskripsi Wajib
jenis Properti type dari sumber aktivitas salin harus diatur ke OracleSource. Ya
oracleReaderQuery Gunakan kueri SQL kustom untuk membaca data. Contohnya "SELECT * FROM MyTable".
Saat Anda mengaktifkan pemuatan yang dipartisi, Anda harus menghubungkan parameter partisi bawaan yang sesuai dalam kueri Anda. Lihat bagian Penyalinan paralel dari Oracle untuk contohnya.
Tidak
convertDecimalToInteger Jenis Oracle NUMBER dengan skala nol atau tidak ditentukan akan dikonversi ke bilangan bulat yang sesuai. Nilai yang diperbolehkan adalah true dan false (default). Tidak
partitionOptions Menentukan opsi partisi data yang digunakan untuk memuat data dari Oracle.
Nilai yang diizinkan adalah: Tidak ada (default), PhysicalPartitionsOfTable, dan DynamicRange.
Ketika opsi partisi diaktifkan (yaitu, bukan None), tingkat paralelisme untuk memuat data secara bersamaan dari Oracle dikendalikan oleh pengaturan parallelCopies pada aktivitas penyalinan.
Tidak
partitionSettings Tentukan grup pengaturan untuk pemartisian data.
Terapkan saat opsi partisi bukan None.
Tidak
partitionNames Daftar partisi fisik yang perlu disalin.
Terapkan saat opsi partisi adalah PhysicalPartitionsOfTable. Jika Anda menggunakan kueri untuk mengambil data sumber, kaitkan ?AdfTabularPartitionName di klausul WHERE. Lihat bagian Penyalinan paralel dari Oracle untuk contohnya.
Tidak
partitionColumnName Tentukan nama kolom sumber dalam jenis bilangan bulat yang akan digunakan oleh partisi rentang untuk penyalinan paralel. Jika belum ditentukan, kunci primer tabel akan terdeteksi secara otomatis dan digunakan sebagai kolom partisi.
Terapkan saat opsi partisi adalah DynamicRange. Jika Anda menggunakan kueri untuk mengambil data sumber, kaitkan ?AdfRangePartitionColumnName di klausul WHERE. Lihat bagian Penyalinan paralel dari Oracle untuk contohnya.
Tidak
partitionUpperBound Nilai maksimum kolom partisi untuk menyalin data.
Terapkan saat opsi partisi adalah DynamicRange. Jika Anda menggunakan kueri untuk mengambil data sumber, kaitkan ?AdfRangePartitionUpbound di klausul WHERE. Lihat bagian Penyalinan paralel dari Oracle untuk contohnya.
Tidak
partitionLowerBound Nilai minimum kolom partisi untuk menyalin data.
Terapkan saat opsi partisi adalah DynamicRange. Jika Anda menggunakan kueri untuk mengambil data sumber, kaitkan ?AdfRangePartitionLowbound di klausul WHERE. Lihat bagian Penyalinan paralel dari Oracle untuk contohnya.
Tidak

Contoh: menyalin data dengan menggunakan kueri dasar tanpa partisi

"activities":[
    {
        "name": "CopyFromOracle",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<Oracle input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "OracleSource",
                "convertDecimalToInteger": false,
                "oracleReaderQuery": "SELECT * FROM MyTable"
            },
            "sink": {
                "type": "<sink type>"
            }
        }
    }
]

Oracle sebagai sink

Untuk menyalin data ke Oracle, atur jenis sink dalam aktivitas penyalinan ke OracleSink. Properti berikut ini didukung di bagian sink aktivitas salin.

Properti Deskripsi Wajib
jenis Properti jens sink aktivitas penyalinan harus diatur ke OracleSink. Ya
writeBatchSize Sisipkan data ke dalam tabel SQL saat ukuran buffer mencapai writeBatchSize.
Nilai yang diizinkan adalah Bilangan bulat (jumlah baris).
Tidak (defaultnya adalah 10.000)
writeBatchTimeout Waktu tunggu untuk operasi penyisipan batch selesai sebelum waktu habis.
Nilai yang diizinkan adalah Rentang Waktu. Contohnya adalah 00:30:00 (30 menit).
Tidak
preCopyScript Tentukan kueri SQL untuk aktivitas penyalinan yang akan dijalankan sebelum menulis data ke dalam Oracle di setiap eksekusi. Anda dapat menggunakan properti ini untuk membersihkan data yang telah dimuat sebelumnya. Tidak
 maxConcurrent Koneksi ions Batas atas koneksi bersamaan yang ditetapkan ke penyimpanan data selama eksekusi aktivitas. Menentukan nilai hanya saat Anda ingin membatasi koneksi bersamaan.  Tanpa

Contoh:

"activities":[
    {
        "name": "CopyToOracle",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<Oracle output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "<source type>"
            },
            "sink": {
                "type": "OracleSink"
            }
        }
    }
]

Penyalinan paralel dari Oracle

Konektor Oracle menyediakan partisi data bawaan untuk menyalin data dari Oracle secara paralel. Anda dapat menemukan opsi pemartisian data pada tab Sumber aktivitas salin.

Screenshot of partition options

Saat Anda mengaktifkan penyalinan berpartisi, layanan menjalankan kueri paralel terhadap sumber Oracle Anda untuk memuat data menurut partisi. Derajat paralel dikendalikan oleh pengaturan parallelCopies pada aktivitas salin. Misalnya, jika Anda mengatur parallelCopies ke empat, layanan secara bersamaan akan membuat dan menjalankan empat kueri berdasarkan opsi dan pengaturan partisi yang ditentukan, dan setiap kueri akan mengambil sebagian data dari database Oracle Anda.

Sebaiknya Anda mengaktifkan penyalinan paralel dengan partisi data terutama ketika memuat data dalam jumlah besar dari database Oracle Anda. Berikut ini adalah konfigurasi yang disarankan untuk skenario yang berbeda. Saat menyalin data ke penyimpanan data berbasis file, disarankan untuk menulis ke satu folder sebagai beberapa file (hanya tentukan nama folder), dalam hal ini, performanya lebih baik daripada menulis ke satu file.

Skenario Pengaturan yang disarankan
Pemuatan penuh dari tabel besar, dengan partisi fisik. Opsi partisi: Partisi fisik tabel.

Selama eksekusi, layanan secara otomatis mendeteksi partisi fisik, dan menyalin data berdasarkan partisi.
Pemuatan penuh dari tabel besar, tanpa partisi fisik, sedangkan dengan kolom bilangan bulat untuk partisi data. Opsi partisi: Partisi rentang dinamis.
Kolom partisi: Menentukan kolom yang digunakan untuk mempartisi data. Jika belum ditentukan, kolom kunci primer digunakan.
Muat data dalam jumlah besar menggunakan kueri kustom, dengan partisi fisik. Opsi partisi: Partisi fisik tabel.
Kueri: SELECT * FROM <TABLENAME> PARTITION("?AdfTabularPartitionName") WHERE <your_additional_where_clause>.
Nama partisi: Tentukan nama partisi untuk menyalin data. Jika belum ditentukan, layanan secara otomatis mendeteksi partisi fisik pada tabel yang Anda tentukan dalam himpunan data Oracle.

Selama eksekusi, layanan mengganti ?AdfTabularPartitionName dengan nama partisi yang sebenarnya, dan mengirimnya ke Oracle.
Muat data dalam jumlah besar dengan menggunakan kueri kustom, tanpa partisi fisik, sedangkan dengan kolom bilangan bulat untuk partisi data. Opsi partisi: Partisi rentang dinamis.
Kueri: SELECT * FROM <TABLENAME> WHERE ?AdfRangePartitionColumnName <= ?AdfRangePartitionUpbound AND ?AdfRangePartitionColumnName >= ?AdfRangePartitionLowbound AND <your_additional_where_clause>.
Kolom partisi: Menentukan kolom yang digunakan untuk mempartisi data. Anda dapat mempartisi kolom dengan jenis data bilangan bulat.
Batas atas partisi dan batas bawah partisi: Tentukan apakah Anda ingin memfilter kolom partisi untuk mengambil data hanya antara rentang bawah dan atas.

Selama eksekusi, layanan mengganti ?AdfRangePartitionColumnName, ?AdfRangePartitionUpbound, dan ?AdfRangePartitionLowbound dengan nama kolom dan rentang nilai aktual untuk setiap partisi, dan mengirimnya ke Oracle.
Misalnya, jika "ID" kolom partisi Anda diatur dengan batas bawah sebagai 1 dan batas atas sebagai 80, dengan penyalinan paralel ditetapkan sebagai 4, layanan mengambil data dengan 4 partisi. ID-nya masing-masing antara [1, 20], [21, 40], [41, 60], dan [61, 80].

Tip

Saat menyalin data dari tabel yang tidak dipartisi, Anda dapat menggunakan opsi partisi "Rentang dinamis" untuk mempartisi kolom bilangan bulat. Jika data sumber tidak memiliki jenis kolom tersebut, Anda dapat memanfaatkan fungsi ORA_HASH dalam kueri sumber untuk membuat kolom dan menggunakannya sebagai kolom partisi.

Contoh: kueri dengan partisi fisik

"source": {
    "type": "OracleSource",
    "query": "SELECT * FROM <TABLENAME> PARTITION(\"?AdfTabularPartitionName\") WHERE <your_additional_where_clause>",
    "partitionOption": "PhysicalPartitionsOfTable",
    "partitionSettings": {
        "partitionNames": [
            "<partitionA_name>",
            "<partitionB_name>"
        ]
    }
}

Contoh: kueri dengan partisi rentang dinamis

"source": {
    "type": "OracleSource",
    "query": "SELECT * FROM <TABLENAME> WHERE ?AdfRangePartitionColumnName <= ?AdfRangePartitionUpbound AND ?AdfRangePartitionColumnName >= ?AdfRangePartitionLowbound AND <your_additional_where_clause>",
    "partitionOption": "DynamicRange",
    "partitionSettings": {
        "partitionColumnName": "<partition_column_name>",
        "partitionUpperBound": "<upper_value_of_partition_column>",
        "partitionLowerBound": "<lower_value_of_partition_column>"
    }
}

Pemetaan jenis data untuk Oracle

Saat Anda menyalin data dari dan ke Oracle, pemetaan jenis data interim berikut digunakan dalam layanan. Untuk mempelajari bagaimana aktivitas salin memetakan skema sumber dan jenis data ke sink, lihat Pemetaan skema dan jenis data.

Jenis data Oracle Jenis data interim
BFILE Byte[]
BLOB Byte[]
(hanya didukung pada Oracle 10g dan yang lebih tinggi)
CHAR String
CLOB String
TANGGAL DateTime
FLOAT Desimal, String (jika presisi > 28)
INTEGER Desimal, String (jika presisi > 28)
LONG String
RAW PANJANG Byte[]
NCHAR String
NCLOB String
ANGKA (p,s) Desimal, String (jika p > 28)
ANGKA tanpa presisi dan skala Laju
NVARCHAR2 String
RAW Byte[]
ROWID String
TANDA WAKTU DateTime
TANDA WAKTU DENGAN ZONA WAKTU LOKAL String
STEMPEL WAKTU DENGAN ZONA WAKTU String
BILANGAN BULAT TIDAK BERTANDA Angka
VARCHAR2 String
XML String

Catatan

Jenis data INTERVAL TAHUN KE BULAN dan INTERVAL HARI KE DETIK tidak didukung.

Properti aktivitas pencarian

Untuk mempelajari detail tentang properti, lihat Aktivitas pencarian.

Untuk daftar penyimpanan data yang didukung sebagai sumber dan sink oleh aktivitas salin, lihat Penyimpanan data yang didukung.