Halaman ini menjelaskan cara menggunakan pemulihan point-in-time (PITR) untuk mempertahankan dan memulihkan data di Spanner.
Untuk mempelajari lebih lanjut, lihat Pemulihan point-in-time.
Prasyarat
Panduan ini menggunakan database dan skema seperti yang ditentukan dalam panduan memulai Spanner. Anda dapat menjalankan langkah-langkah memulai untuk membuat database dan skema, atau mengubah perintah untuk digunakan dengan database Anda sendiri.
Tetapkan periode retensi data
Untuk menetapkan periode retensi database:
Konsol
Buka halaman Instance Spanner di konsol Google Cloud.
Klik instance yang berisi database untuk membuka halaman Ringkasan.
Klik database untuk membuka halaman Ringkasan.
Pilih tab Cadangan/Pulihkan.
Klik ikon pensil di kolom Periode retensi versi.
Masukkan jumlah 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 akan dicatat ke dalam log sebagai UpdateDatabaseDdl dan dapat dilihat 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 data versi sebelumnya. Misalnya, jika Anda memperpanjang periode retensi dari 1 jam menjadi 24 jam, Anda harus menunggu 23 jam agar sistem dapat mengumpulkan data lama sebelum Anda dapat memulihkan data dari 24 jam sebelumnya.
Mendapatkan periode retensi data dan waktu versi paling awal
Referensi 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 lagi saat dikueri. Jika Anda menggunakan nilai ini untuk memulihkan data, pastikan untuk memperhitungkan waktu sejak 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 Ringkasan.
Pilih tab Pencadangan/Pemulihan untuk membuka halaman Pencadangan/Pemulihan dan menampilkan periode retensi.
Klik Buat untuk membuka halaman Buat cadangan dan menampilkan waktu versi paling awal.
gcloud
Anda bisa mendapatkan kolom ini dengan memanggil describe databases atau list databases. 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 Anda
Lakukan pembacaan yang sudah tidak berlaku dan tentukan stempel waktu pemulihan yang diinginkan. Pastikan stempel waktu yang Anda tentukan lebih baru dari
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
Simpan hasil kueri. Hal ini diperlukan karena Anda tidak dapat menulis hasil kueri kembali ke database dalam transaksi yang sama. Untuk data dalam jumlah kecil, Anda dapat mencetak ke konsol atau menyimpannya dalam memori. Untuk data dalam jumlah yang lebih besar, Anda mungkin perlu menulis ke file lokal.
Tulis data yang dipulihkan kembali 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.
Atau, jika ingin melakukan beberapa analisis pada data yang dipulihkan sebelum menulis ulang, Anda dapat membuat tabel sementara secara manual di database yang sama, menulis data yang dipulihkan ke tabel sementara ini terlebih dahulu, melakukan analisis, lalu membaca data yang ingin Anda pulihkan dari tabel sementara ini dan menulisnya ke tabel yang perlu dipulihkan.
Memulihkan seluruh database
Anda dapat memulihkan seluruh database menggunakan Cadangkan dan Pulihkan 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.
Di tab Backup/Restore, klik Create.
Centang kotak Buat cadangan dari titik waktu sebelumnya.
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 dari cadangan ke database yang dipulihkan.
Konsol
Buka halaman Detail instance di Cloud Console.
Di tab Cadangan/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 mengetahui 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 Detail instance di Cloud Console.
Di tab Import/Export, klik Export.
Centang kotak Ekspor database dari titik waktu sebelumnya.
Untuk petunjuk mendetail, lihat mengekspor database.
gcloud
Gunakan template Dataflow [Spanner] to Avro](/dataflow/docs/guides/templates/provided-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 dari
earliest_version_time
database. Jika data tidak lagi ada pada stempel waktu yang ditentukan, Anda akan menerima pesan error.
Mengimpor ke database baru.
Konsol
Buka halaman Detail instance di Cloud Console.
Di tab Import/Export, klik Import.
Untuk petunjuk mendetail, lihat Mengimpor File Avro Spanner.
gcloud
Gunakan template Dataflow [Cloud Storage] Avro to Spanner](/dataflow/docs/guides/templates/provided-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 versi database, Anda dapat memperkirakan peningkatan penggunaan penyimpanan database yang diharapkan dengan menjumlahkan byte transaksi selama jangka 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 dapat 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 meremehkan peningkatan penyimpanan.
- Kueri mencakup semua operasi tulis, tetapi hanya operasi update yang membuat versi data lama. Jika workload Anda mencakup banyak operasi penyisipan, kueri mungkin melebih-lebihkan peningkatan penyimpanan.