Halaman ini menjelaskan cara menggunakan pemulihan point-in-time (PITR) untuk menyimpan dan memulihkan data di Spanner.
Untuk mempelajari lebih lanjut, lihat Pemulihan point-in-time.
Prasyarat
Panduan ini menggunakan database dan skema seperti yang dijelaskan dalam Panduan memulai Spanner. Anda dapat menjalankan panduan memulai untuk membuat database dan skema, atau mengubah perintah untuk digunakan dengan database Anda sendiri.
Tetapkan periode retensi data
Untuk menetapkan periode retensi data database:
Konsol
Buka halaman Instance Spanner di Konsol Google Cloud.
Klik instance yang berisi database untuk membuka halaman Ringkasan.
Klik database untuk membuka halaman Overview.
Pilih tab Cadangkan/Pulihkan.
Klik ikon pensil di kolom Versi retensi periode.
Masukkan kuantitas dan satuan waktu untuk periode retensi, lalu klik Perbarui.
gcloud
Perbarui skema database dengan pernyataan ALTER DATABASE. Contoh:
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER DATABASE `example-db` SET OPTIONS (version_retention_period="7d");'
Untuk melihat periode retensi, dapatkan DDL database Anda:
gcloud spanner databases ddl describe example-db --instance=test-instance
Berikut output-nya:
ALTER DATABASE example-db SET OPTIONS (
version_retention_period = '7d'
);
...
Library klien
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
Catatan penggunaan:
- Periode retensi harus antara 1 jam dan 7 hari, dan dapat ditentukan dalam hari, jam, menit, atau detik. Misalnya, nilai
1d
,24h
,1440m
, dan86400s
setara. - Jika Anda telah mengaktifkan logging untuk Spanner API di project, peristiwa tersebut akan dicatat dalam log sebagai UpdateDatabaseDdl dan terlihat di Logs Explorer.
- Untuk kembali ke periode retensi default 1 jam, Anda dapat menetapkan opsi database
version_retention_period
keNULL
untuk database GoogleSQL atauDEFAULT
untuk database PostgreSQL. - Saat Anda memperpanjang periode retensi, sistem tidak akan mengisi ulang versi data sebelumnya. Misalnya, jika Anda memperpanjang periode retensi dari 1 jam menjadi 24 jam, Anda harus menunggu 23 jam agar sistem mengumpulkan data lama sebelum dapat memulihkan data dari 24 jam di masa lalu.
Mendapatkan periode retensi data dan waktu versi paling awal
Resource Database mencakup dua kolom:
version_retention_period
: periode saat Spanner menyimpan semua versi data untuk database.earliest_version_time
: stempel waktu paling awal saat versi data sebelumnya dapat dibaca dari database. Nilai ini terus diperbarui oleh Spanner dan menjadi tidak berlaku saat dikueri. Jika Anda menggunakan nilai ini untuk memulihkan data, pastikan untuk memperhitungkan waktu dari saat nilai dikueri hingga saat Anda memulai pemulihan.
Konsol
Buka halaman Instance Spanner di Konsol Google Cloud.
Klik instance yang berisi database untuk membuka halaman Ringkasan.
Klik database untuk membuka halaman Overview.
Pilih tab Pencadangan/Pemulihan untuk membuka halaman Pencadangan/Pemulihan dan menampilkan periode retensi data.
Klik Create untuk membuka halaman Create a backup dan menampilkan waktu paling awal untuk versi.
gcloud
Anda bisa mendapatkan kolom ini dengan memanggil jelaskan database atau database daftar. Contoh:
gcloud spanner databases describe example-db --instance=test-instance
Berikut output-nya:
createTime: '2020-09-07T16:56:08.285140Z'
earliestVersionTime: '2020-10-07T16:56:08.285140Z'
name: projects/my-project/instances/test-instance/databases/example-db
state: READY
versionRetentionPeriod: 3d
Memulihkan sebagian database
Melakukan pembacaan yang sudah tidak berlaku dan menentukan stempel waktu pemulihan yang diinginkan. Pastikan stempel waktu yang Anda tentukan lebih baru daripada
earliest_version_time.
databasegcloud
Gunakan execute-sql. Contoh:
gcloud spanner databases execute-sql example-db --instance=test-instance --read-timestamp=2020-09-11T10:19:36.010459-07:00 --sql='SELECT * FROM SINGERS'
Library klien
Menyimpan hasil kueri. Hal ini diperlukan karena Anda tidak dapat menulis hasil kueri kembali ke dalam database dalam transaksi yang sama. Untuk data dalam jumlah kecil, Anda dapat mencetak ke konsol atau menyimpannya dalam memori. Untuk jumlah data yang lebih besar, Anda mungkin perlu menulis ke file lokal.
Menuliskan kembali data yang dipulihkan ke tabel yang perlu dipulihkan. Contoh:
gcloud
gcloud spanner rows update --instance=test-instance --database=example-db --table=Singers --data=SingerId=1,FirstName='Marc'
Untuk mengetahui informasi selengkapnya, lihat memperbarui data menggunakan gcloud.
Library klien
Lihat memperbarui data menggunakan DML atau memperbarui data menggunakan mutasi.
Secara opsional, jika Anda ingin melakukan analisis pada data yang dipulihkan sebelum menulis kembali, Anda dapat membuat tabel sementara secara manual dalam database yang sama, menulis data yang dipulihkan ke tabel sementara ini terlebih dahulu, melakukan analisis, lalu membaca data yang ingin dipulihkan dari tabel sementara ini dan menulisnya ke tabel yang perlu dipulihkan.
Memulihkan seluruh database
Anda dapat memulihkan seluruh database menggunakan Pencadangan dan Pemulihan atau Impor dan Ekspor serta menentukan stempel waktu pemulihan.
Pencadangan dan pemulihan
Buat cadangan dan tetapkan
version_time
ke stempel waktu pemulihan yang diinginkan.Konsol
Buka halaman Database details di Cloud Console.
Pada tab Pencadangan/Pemulihan, klik Buat.
Centang kotak Create backup from an previous point in time.
gcloud
gcloud spanner backups create example-db-backup-1 --instance=test-instance \ --database=example-db --retention-period=1y --version-time=2021-01-22T01:10:35Z --async
Untuk mengetahui informasi selengkapnya, lihat Membuat cadangan menggunakan gcloud.
Library klien
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
Memulihkan dari cadangan ke database baru. Perhatikan bahwa Spanner mempertahankan setelan periode retensi data dari cadangan ke database yang dipulihkan.
Konsol
Buka halaman Instance details di Cloud Console.
Di tab Cadangkan/Pulihkan, pilih cadangan, lalu klik Pulihkan.
gcloud
gcloud spanner databases restore --async \ --destination-instance=destination-instance --destination-database=example-db-restored \ --source-instance=test-instance --source-backup=example-db-backup-1
Untuk informasi selengkapnya, lihat Memulihkan database dari cadangan.
Library klien
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
Mengimpor dan mengekspor
Ekspor database, dengan menentukan parameter
snapshotTime
ke stempel waktu pemulihan yang diinginkan.Konsol
Buka halaman Instance details di Cloud Console.
Di tab Import/Export, klik Export.
Centang kotak Export database from an previous point in time.
Untuk mendapatkan petunjuk mendetail, lihat mengekspor database.
gcloud
Gunakan template Dataflow [Spanner] untuk Avro](/dataflow/docs/guides/templates/available-batch#cloud_spanner_to_gcs_avro) untuk mengekspor database.
gcloud dataflow jobs run JOB_NAME \ --gcs-location='gs://cloud-spanner-point-in-time-recovery/Import Export Template/export/templates/Cloud_Spanner_to_GCS_Avro' --region=DATAFLOW_REGION --parameters='instanceId=test-instance,databaseId=example-db,outputDir=YOUR_GCS_DIRECTORY,snapshotTime=2020-09-01T23:59:40.125245Z'
Catatan penggunaan:
- Anda dapat melacak progres tugas impor dan ekspor di Konsol Dataflow.
- Spanner menjamin bahwa data yang diekspor akan konsisten secara eksternal dan transaksional pada stempel waktu yang ditentukan.
- Tentukan stempel waktu dalam format RFC 3339. Misalnya, 2020-09-01T23:59:30.234233Z.
- Pastikan stempel waktu yang Anda tentukan lebih baru daripada
earliest_version_time
database. Jika data tidak lagi ada pada stempel waktu yang ditentukan, Anda akan menerima pesan error.
Impor ke database baru.
Konsol
Buka halaman Instance details di Cloud Console.
Di tab Import/Export, klik Import.
Untuk petunjuk mendetail, lihat Mengimpor File Spanner Avro.
gcloud
Gunakan template Dataflow [Cloud Storage] Avro ke Spanner](/dataflow/docs/guides/templates/available-batch#gcs_avro_to_cloud_spanner) untuk mengimpor file Avro.
gcloud dataflow jobs run JOB_NAME \ --gcs-location='gs://cloud-spanner-point-in-time-recovery/Import Export Template/import/templates/GCS_Avro_to_Cloud_Spanner' \ --region=DATAFLOW_REGION \ --staging-location=YOUR_GCS_STAGING_LOCATION \ --parameters='instanceId=test-instance,databaseId=example-db,inputDir=YOUR_GCS_DIRECTORY'
Memperkirakan peningkatan penyimpanan
Sebelum meningkatkan periode retensi data versi database, Anda dapat memperkirakan peningkatan penggunaan penyimpanan database yang diperkirakan dengan menjumlahkan byte transaksi untuk periode waktu yang diinginkan. Misalnya, kueri berikut menghitung jumlah GiB yang ditulis dalam 7 hari terakhir (168 jam) dengan membaca dari tabel statistik transaksi.
GoogleSQL
SELECT
SUM(bytes_per_hour) / (1024 * 1024 * 1024 ) as GiB
FROM (
SELECT
((commit_attempt_count - commit_failed_precondition_count - commit_abort_count) * avg_bytes) AS bytes_per_hour,
interval_end
FROM
spanner_sys.txn_stats_total_hour
ORDER BY
interval_end DESC
LIMIT
168);
PostgreSQL
SELECT
bph / (1024 * 1024 * 1024 ) as GiB
FROM (
SELECT
SUM(bytes_per_hour) as bph
FROM (
SELECT
((commit_attempt_count - commit_failed_precondition_count - commit_abort_count) * avg_bytes) AS bytes_per_hour,
interval_end
FROM
spanner_sys.txn_stats_total_hour
ORDER BY
interval_end DESC
LIMIT
168)
sub1) sub2;
Perhatikan bahwa kueri memberikan perkiraan kasar dan mungkin tidak akurat karena beberapa alasan:
- Kueri tidak memperhitungkan stempel waktu yang harus disimpan untuk setiap versi data lama. Jika database Anda terdiri dari banyak jenis data kecil, kueri mungkin akan meremehkan peningkatan penyimpanan.
- Kueri ini mencakup semua operasi tulis, tetapi hanya operasi update yang membuat data versi lama. Jika beban kerja Anda mencakup banyak operasi penyisipan, kueri dapat melebih-lebihkan peningkatan penyimpanan.