全部产品
Search
文档中心

Data Management:Cadangkan database lokal atau database cloud dari penyedia pihak ketiga

更新时间:Jul 06, 2025

Pemulihan Bencana Data mendukung database Alibaba Cloud, database yang dikelola sendiri di instance Elastic Compute Service (ECS), database lokal, serta database cloud dari penyedia pihak ketiga. Topik ini menjelaskan cara mencadangkan database lokal atau database cloud dari penyedia pihak ketiga.

Catatan Penggunaan

Jika database dan tabel yang ingin dicadangkan memiliki masalah seperti skema tabel yang tidak sesuai, tabel besar, atau bidang besar, jadwal pencadangan mungkin kekurangan sumber daya dan menyebabkan pengecualian dalam proses pencadangan. Oleh karena itu, disarankan untuk memilih spesifikasi besar saat membuat jadwal pencadangan guna menghindari pengecualian pada pencadangan berikutnya.

Prosedur

Pencadangan Otomatis untuk Layanan

Beli Jadwal Pencadangan (pencadangan logis)

  1. Masuk ke Konsol DMS V5.0.
  2. Di bilah navigasi atas, pilih Security and Specifications (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

    Catatan

    Jika menggunakan konsol DMS dalam mode sederhana, gerakkan pointer ke ikon 2023-01-28_15-57-17.png di sudut kiri atas konsol DMS dan pilih All Features > Security and Specifications (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

  3. Di bagian atas halaman, pilih wilayah. Di halaman Sumber Data Pemulihan Bencana, pilih On-premise Database and Cloud Database from Third-party Provider > Automatic Backup for Users, lalu klik ID sumber data yang ingin digunakan untuk membuka halaman detail.

  4. Di halaman Backup Policies, klik Configure Backup Policy.

  5. Di langkah Select Backup Schedule, klik Purchase Backup Schedule untuk membuka halaman pembelian.

  6. Konfigurasikan parameter berikut dan klik Buy Now di pojok kanan bawah halaman.

    Parameter

    Deskripsi

    Product Type

    Pilih Backup Schedule.

    Region

    Wilayah tempat Anda ingin menyimpan data pencadangan.

    Catatan

    Pastikan bahwa jadwal pencadangan dan instance Elastic Compute Service (ECS) berada di wilayah yang sama.

    Data Source Type

    Atur nilai menjadi MySQL.

    Specification

    Spesifikasi jadwal pencadangan yang ingin Anda gunakan. Spesifikasi lebih tinggi menawarkan performa pencadangan dan pemulihan yang lebih tinggi. DBS mendukung spesifikasi jadwal pencadangan berikut: mikro, kecil, sedang, besar, dan xlarge. Tipe spesifikasi xlarge memberikan spesifikasi ekstra besar tanpa batas atas jumlah data pencadangan.

    Catatan
    • Untuk memastikan pencadangan dan pemulihan cepat dari instance database tertentu, seperti instance database di lingkungan produksi, kami sarankan Anda memilih xlarge atau Large.

    • Jika Anda tidak memerlukan performa pencadangan dan pemulihan yang tinggi, Anda dapat memilih tipe jadwal pencadangan yang paling hemat biaya berdasarkan kebutuhan bisnis Anda. Untuk informasi lebih lanjut, lihat Pilih tipe jadwal pencadangan.

    • Jika database dan tabel yang ingin Anda cadangkan melibatkan masalah seperti skema yang tidak masuk akal, tabel besar, dan bidang besar, sumber daya dari instance pencadangan dengan spesifikasi rendah mungkin tidak cukup untuk menyelesaikan pencadangan. Akibatnya, terjadi kesalahan pencadangan. Kami sarankan Anda membeli instance pencadangan dengan spesifikasi lebih tinggi untuk mencegah kesalahan pencadangan.

    Backup Method

    Pilih Logical Backup.

    Storage Size

    Anda tidak perlu memilih kapasitas saat membuat jadwal pencadangan. Anda akan dikenakan biaya berdasarkan jumlah data yang disimpan di Pemulihan Bencana Data. Untuk informasi lebih lanjut, lihat Biaya Penyimpanan.

    Resource Group

    Grup sumber daya yang digunakan oleh jadwal pencadangan. Anda dapat menggunakan grup sumber daya default atau memilih grup sumber daya berdasarkan kebutuhan bisnis Anda.

    Quantity

    Jumlah jadwal pencadangan yang ingin Anda beli. Untuk mencadangkan beberapa instance database, Anda harus membeli beberapa jadwal pencadangan. Misalnya, jika Anda ingin mencadangkan Instance Database A dan Instance Database B, Anda harus membeli dua jadwal pencadangan.

    Subscription Duration

    Durasi langganan jadwal pencadangan yang ingin Anda beli.

  7. Di halaman Confirm Order, konfirmasikan informasi pesanan, baca dan setujui syarat layanan, lalu klik Pay.

    Setelah menyelesaikan pembayaran, kembali ke langkah Select Backup Schedule dan klik Paid untuk melihat jadwal pencadangan yang telah dibuat.

    image

Konfigurasikan kebijakan pencadangan

  1. Di langkah Select Backup Schedule, pilih jadwal pencadangan yang ingin dikonfigurasikan dan klik Next.

    image

  2. Di langkah Select Database and Table, pilih database dan tabel yang ingin dicadangkan, klik ikon image untuk memindahkannya ke bagian Selected Objects, lalu klik Submit.

    image..png

  3. Di halaman Backup Policy, klik tab Logical Backup, lalu klik Start untuk memulai pencadangan.

    Setelah mengklik Start, sistem segera memulai pencadangan penuh dan tambahan.

    image

    Catatan

    Jika ingin melakukan operasi lain, seperti memodifikasi kebijakan pencadangan, Anda dapat melewati langkah ini. Pemulihan Bencana Data secara otomatis memulai pencadangan nanti berdasarkan kebijakan pencadangan.

Pencadangan Otomatis untuk Pengguna

Penting
  • Hanya instance database yang menjalankan MySQL 5.5 yang didukung.

  • Hanya wilayah China (Hangzhou) yang didukung.

Konfigurasikan sumber pencadangan dan unggah file pencadangan

  1. Masuk ke Konsol DMS V5.0.
  2. Di bilah navigasi atas, pilih Security and Specifications (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

    Catatan

    Jika menggunakan konsol DMS dalam mode sederhana, gerakkan pointer ke ikon 2023-01-28_15-57-17.png di sudut kiri atas konsol DMS dan pilih All Features > Security and Specifications (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

  3. Di bagian atas halaman, pilih wilayah. Di halaman Sumber Data Pemulihan Bencana, klik tab On-premise Database and Cloud Database from Third-party Provider, lalu tambahkan sumber data berdasarkan tipe sumber data.

  4. Klik Add Data Source. Di kotak dialog yang muncul, konfigurasikan parameter berikut, pilih jadwal pencadangan yang ingin digunakan, lalu klik Next.

    image

    Parameter

    Deskripsi

    Data Source Name

    Kami sarankan Anda menggunakan nama deskriptif yang mudah diidentifikasi.

    Engine Type

    Tipe mesin database. Hanya MySQL yang didukung.

    Engine Version

    Versi mesin dari database yang ingin Anda cadangkan.

    Engine Parameters

    {"lower_case_table_names":1}

    Jika tidak ada jadwal pencadangan yang tersedia, klik Purchase Backup Schedule untuk membuka halaman pembelian dan membeli jadwal pencadangan.

    Deskripsi

    Product Type

    Pilih Backup Schedule. Metode penagihan bayar sesuai pemakaian tidak didukung.

    Region

    Wilayah tempat Anda ingin menyimpan data pencadangan.

    Data Source Type

    Pilih MySQL.

    Specification

    Pilih xmicro. Untuk informasi lebih lanjut tentang kuota gratis yang disediakan oleh tipe spesifikasi xmicro, lihat Tipe jadwal pencadangan.

    Backup Method

    Pilih Physical Backup.

    Storage Size

    Anda tidak perlu memilih kapasitas saat membuat jadwal pencadangan. Anda akan dikenakan biaya berdasarkan jumlah data yang disimpan di Pemulihan Bencana Data. Untuk informasi lebih lanjut, lihat Biaya Penyimpanan.

    Resource Group

    Grup sumber daya yang digunakan oleh jadwal pencadangan. Anda dapat menggunakan grup sumber daya default atau memilih grup sumber daya berdasarkan kebutuhan bisnis Anda.

    Quantity

    Jumlah jadwal pencadangan yang ingin Anda beli. Untuk mencadangkan beberapa instance database, Anda harus membeli beberapa jadwal pencadangan. Misalnya, jika Anda ingin mencadangkan Instance Database A dan Instance Database B, Anda harus membeli dua jadwal pencadangan.

    Subscription Duration

    Durasi langganan jadwal pencadangan yang ingin Anda beli.

  5. Unggah set pencadangan ke bucket yang ditentukan. Untuk informasi lebih lanjut, lihat Unggah Data (Pencadangan Otomatis untuk Pengguna).

  6. Klik OK.

Lihat informasi pencadangan

Di tab Automatic Backup for Users, klik ID sumber data yang ingin dikelola.

image

image

Konfigurasikan kebijakan pencadangan

  1. Di tab Automatic Backup for Users, temukan sumber data yang ingin dikelola dan klik View Backup Policy di kolom Tindakan.

    image

    image

  2. Klik OK.

Lihat dan unduh data pencadangan

  1. Di tab Automatic Backup for Users, klik ID sumber data yang ingin dikelola.

  2. Di panel navigasi di sebelah kiri, klik Backup Data.

    Catatan

    Setelah mengunggah skrip data dan membuat sumber data, ketika set pencadangan baru dihasilkan, sistem secara otomatis menyinkronkan set pencadangan ke halaman Data Pencadangan.

  3. Klik Download di kolom Actions dari set pencadangan untuk mengunduh set pencadangan.

Buat tugas pemulihan

Catatan

Untuk memulihkan data, set pencadangan harus ditampilkan di halaman Cadangan Data dan harus dalam status Selesai.

  1. Di tab Automatic Backup for Users, klik ID sumber data yang ingin dikelola.

  2. Di panel navigasi di sebelah kiri, klik Backup Data. Di tab Pencadangan Logis, klik Create Restore Task untuk mengonfigurasi parameter pemulihan berikut.

    Parameter

    Deskripsi

    Task Name

    Nama tugas pemulihan. Kami sarankan Anda menggunakan nama deskriptif yang mudah diidentifikasi.

    Restore To

    Instance database tujuan. Nilai default: Instance Baru (RDS).

    Database Location

    Lokasi instance database tujuan. Nilai default: RDS.

    Instance Region

    Wilayah tempat instance database tujuan berada. Hanya wilayah China (Hangzhou) yang didukung.

    VPC

    VPC (virtual private cloud) tempat instance database tujuan berada.

    VSwitch

    vSwitch yang terhubung ke database tujuan.

    Instance Edition

    Edisi dari instance database tujuan.

    Instance Specifications

    Tipe instance database tujuan.

    Storage Space

    Ruang penyimpanan yang diperlukan untuk instance database tujuan.

    Restore Mode

    Anda hanya dapat memulihkan database berdasarkan titik waktu.

    Restore Time

    Titik waktu untuk memulihkan set pencadangan. Rentang waktu yang tersedia ditampilkan setelah parameter Restore Mode.

  3. Setelah konfigurasi selesai, klik Submit. Tugas pemulihan akan dibuat, dan informasi tugas ditampilkan di halaman Tugas Pemulihan.

Lihat tugas pemulihan

  1. Di tab Automatic Backup for Users, klik ID sumber data yang ingin dikelola.

  2. Di panel navigasi di sebelah kiri, pilih Task Management > Restore Tasks.

  3. Klik ID instance di kolom Restoration Result untuk membuka halaman Informasi Dasar instance RDS tempat set pencadangan dipulihkan.

Lihat latihan pemulihan

  1. Di tab Automatic Backup for Users, klik ID sumber data yang ingin dikelola.

  2. Di panel navigasi di sebelah kiri, klik Recovery Drill.

    Recovery drill metrics

    Metrik latihan pemulihan adalah Recovery Task Success Rate, Average Recovery Duration, Data Backup Drill Coverage Rate, dan Log Backup Drill Coverage Rate.

    Metrik

    Deskripsi

    Recovery Task Success Rate

    Tingkat keberhasilan tugas pemulihan yang memulihkan data ke titik waktu dalam periode waktu tertentu.

    Average Recovery Duration

    Durasi rata-rata tugas pemulihan yang berhasil dalam periode waktu tertentu.

    Data Backup Drill Coverage Rate

    Tingkat cakupan latihan pemulihan data yang dilakukan pada instance MySQL open source atau instance ApsaraDB RDS for MySQL dalam periode waktu tertentu.

    Log Backup Drill Coverage Rate

    Tingkat cakupan latihan pemulihan log yang dilakukan pada instance MySQL open source atau instance ApsaraDB RDS for MySQL dalam periode waktu tertentu.

    Garis Waktu Latihan Pemulihan

    Garis waktu menampilkan detail latihan pemulihan pada setiap titik waktu dalam periode tertentu. Anda dapat mengklik garis waktu untuk melihat informasi latihan pada titik waktu saat ini.

    Detail Latihan Pemulihan

    Klik tab Data Backup untuk melihat detail latihan pemulihan untuk cadangan data. Klik ID instance di kolom Drill Result untuk membuka halaman Informasi Dasar instance RDS yang dipulihkan.

    Klik tab Log Backup untuk melihat detail latihan pemulihan untuk cadangan log.

Unggah data (pencadangan otomatis untuk pengguna)

Persiapan

  • Konfigurasikan sumber data dan dapatkan ID sumber data. Untuk informasi lebih lanjut tentang cara mengonfigurasi sumber data, lihat Tambahkan Sumber Data.

  • Buat pengguna RAM, berikan izin yang diperlukan kepada pengguna RAM untuk mengelola instance tertentu, dan siapkan ID AccessKey dan Rahasia AccessKey. Untuk informasi lebih lanjut, lihat Buat Pengguna RAM dan Berikan Izin kepada Pengguna RAM.

Dependensi

  • Alat Perintah: Bash dan Python3.

  • Pustaka Python: oss2, alibabacloud_openapi_util, alibabacloud_tea_openapi, dan alibabacloud_tea_util.

## Instal Alibaba Cloud SDK.
pip3 install --upgrade pip
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ oss2 alibabacloud_openapi_util alibabacloud_tea_openapi alibabacloud_tea_util

Unggah skrip lengkap

Anda perlu mengunggah data pencadangan menggunakan skrip berikut:

Skrip Bash

Ganti dengan parameter sumber data aktual sesuai kebutuhan.

boot_backup.sh: Mensimulasikan proses pencadangan penuh menggunakan alat xtrabackup.

#!/bin/bash
# Pasangan AccessKey dari akun Alibaba Cloud memiliki izin untuk semua operasi API. Menggunakan kredensial ini untuk melakukan operasi adalah operasi berisiko tinggi. Kami sarankan Anda membuat dan menggunakan pengguna RAM untuk akses API atau O&M rutin.
## Jangan simpan pasangan AccessKey di dalam kode. Ini dapat menyebabkan kebocoran kunci. Anda dapat menyimpan pasangan AccessKey dalam file konfigurasi berdasarkan kebutuhan bisnis Anda.

AK=<ALIBABA_CLOUD_ACCESS_KEY_ID>
SK=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
DBS_API=dbs-api.<ID wilayah tempat sumber data Anda berada, misalnya, cn-hangzhou>.aliyuncs.com
DATASOURCE_ID=<ID sumber data Anda>

## Dapatkan jalur saat ini dari skrip.
BASE_PATH=$(cd `dirname $0`; pwd)

TS=`date +%Y%m%d_%H%M%S`
XTRA_DATA_DIR=~/tool/xtrabackup_data/$TS

mkdir -p $XTRA_DATA_DIR

## Jalankan perintah pencadangan xtrabackup untuk mengeluarkan log kesalahan ke file xtrabackup.log.
~/innobackupex --defaults-file=/etc/my.cnf --user='root' --password='root' --host='localhost' --port=3306 --socket='/var/lib/mysql/mysql.sock' --parallel=4 $XTRA_DATA_DIR/ 2>$XTRA_DATA_DIR/xtrabackup.log

## Dapatkan direktori pencadangan xtrabackup saat ini.
backup_dir=`ls $XTRA_DATA_DIR | grep -v xtrabackup.log | head -n1`
echo -e "\033[33mexecute innobackupex success, backup_dir: $backup_dir" && echo -n -e "\033[0m" && chmod 755 $XTRA_DATA_DIR/$backup_dir

## Kemas data dalam file tar.gz.
cd $XTRA_DATA_DIR/$backup_dir && tar -czvf ../$backup_dir.tar.gz . && file ../$backup_dir.tar.gz
echo -e "\033[33mpackage to $backup_dir.tar.gz" && echo -n -e "\033[0m" && sleep 2

## Gunakan skrip Python untuk mengunggah data pencadangan dan mendaftarkan metadata set pencadangan.
python3 $BASE_PATH/upload_and_register_backup_set.py --access_key_id $AK --access_key_secret $SK --endpoint $DBS_API --datasource_id $DATASOURCE_ID --region_code=cn-hangzhou --data_type=FullBackup --file_path=$XTRA_DATA_DIR/$backup_dir.tar.gz --xtrabackup_log_path=$XTRA_DATA_DIR/xtrabackup.log

Skrip Python

  • upload_and_register_backup_set.py: Mengunggah data pencadangan penuh dan log, mengurai metadata yang sesuai, serta mendaftarkan metadata set pencadangan.

    # -*- coding: utf-8 -*-
    # File ini dihasilkan secara otomatis, jangan edit. Terima kasih.
    import os
    import argparse
    import re
    import time
    import json
    from datetime import datetime
    
    import oss2
    from alibabacloud_openapi_util.client import Client as OpenApiUtilClient
    from alibabacloud_tea_openapi import models as open_api_models
    from alibabacloud_tea_openapi.client import Client as OpenApiClient
    from alibabacloud_tea_util import models as util_models
    
    import xtrabackup_info_parser
    import xtrabackup_log_parser
    
    def init_command_args():
        parser = argparse.ArgumentParser(description="A sample command-line parser.")
        parser.add_argument("--access_key_id", help="Aliyun AccessKeyId.")
        parser.add_argument("--access_key_secret", help="Aliyun AccessKeySecret.")
        parser.add_argument("--endpoint", help="Aliyun API Endpoint.")
        parser.add_argument("--region_code", help="Aliyun DataSource RegionCode.")
        parser.add_argument("--datasource_id", help="Aliyun DataSourceId.")
        parser.add_argument("--data_type", help="BackupSet DataType: FullBackup | LogBackup.")
        parser.add_argument("--file_path", help="BackupSet File Path.")
        parser.add_argument("--xtrabackup_info_path", help="Xtrabackup Info Path.")
        parser.add_argument("--xtrabackup_log_path", help="Xtrabackup Log Path.")
        parser.add_argument("--begin_time", help="Binlog Begin Time.")
        parser.add_argument("--end_time", help="Binlog End Time.")
    
        args = parser.parse_args()
        if args.access_key_id:
            print(f"access_key_id: ************")
        if args.access_key_secret:
            print(f"access_key_secret: ************")
        if args.endpoint:
            print(f"endpoint: {args.endpoint}")
        if args.region_code:
            print(f"region_code: {args.region_code}")
        if args.datasource_id:
            print(f"datasource_id: {args.datasource_id}")
        if args.data_type:
            print(f"data_type: {args.data_type}")
        if args.file_path:
            print(f"file_path: {args.file_path}")
        if args.xtrabackup_info_path:
            print(f"xtrabackup_info_path: {args.xtrabackup_info_path}")
        if args.xtrabackup_log_path:
            print(f"xtrabackup_log_path: {args.xtrabackup_log_path}")
        if args.begin_time:
            print(f"begin_time: {args.begin_time}")
        if args.end_time:
            print(f"end_time: {args.end_time}")
    
        print('\n')
        return args
    
    
    def date_to_unix_timestamp(date_str):
        dt_obj = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
        # Gunakan metode .time() untuk mendapatkan tuple waktu, dan gunakan time.mktime untuk mengonversi tuple waktu menjadi timestamp hingga detik.
        timestamp_seconds = time.mktime(dt_obj.timetuple())
        return int(timestamp_seconds) * 1000
    
    
    def create_oss_client(params):
        # Informasi autentikasi Layanan Penyimpanan Objek Alibaba Cloud (OSS)
        access_key_id = params['AccessKeyId']
        access_key_secret = params['AccessKeySecret']
        security_token = params['SecurityToken']
        bucket_name = params['BucketName']
        endpoint = params['OssEndpoint']
    
        # Inisialisasi klien OSS.
        auth = oss2.StsAuth(access_key_id, access_key_secret, security_token)
        return oss2.Bucket(auth, endpoint, bucket_name)
    
    
    def upload_oss_file(oss_client, file_path, object_key):
        """
        Jalankan tugas unggah multipart untuk mengunggah objek besar ke OSS.
        :param oss_client:
        : param file_path: jalur file lokal.
        : param object_key: kunci objek di OSS, yaitu nama file.
        """
        # Atur ukuran bagian dalam byte. Nilai defaultnya adalah 1 MB.
        part_size = 1024 * 1024 * 5
        # Mulai tugas unggah multipart.
        upload_id = oss_client.init_multipart_upload(object_key).upload_id
    
        # Buka file dan baca kontennya.
        with open(file_path, 'rb') as file_obj:
            parts = []
            while True:
                data = file_obj.read(part_size)
                if not data:
                    break
                # Unggah bagian.
                result = oss_client.upload_part(object_key, upload_id, len(parts) + 1, data)
                parts.append(oss2.models.PartInfo(len(parts) + 1, result.etag))
    
            # Selesaikan unggah multipart.
            oss_client.complete_multipart_upload(object_key, upload_id, parts)
    
    
    class OssUploader:
    
        def __init__(self, access_key_id, access_key_secret, endpoint, region_code, datasource_id):
            self.access_key_id = access_key_id
            self.access_key_secret = access_key_secret
            self.endpoint = endpoint
            self.region_code = region_code
            self.datasource_id = datasource_id
    
            config = open_api_models.Config(access_key_id, access_key_secret)
            # Untuk informasi lebih lanjut tentang titik akhir, kunjungi https://api.aliyun.com/product/Rds.
            config.endpoint = endpoint
            self.client = OpenApiClient(config)
    
        """
        Daftarkan informasi set pencadangan.
        """
        def configure_backup_set_info(self, req_param):
            params = open_api_models.Params(
                # Operasi yang ingin Anda panggil.
                action='ConfigureBackupSetInfo',
                # Nomor versi operasi.
                version='2021-01-01',
                # Protokol operasi.
                protocol='HTTPS',
                # Metode HTTP operasi.
                method='POST',
                auth_type='AK',
                style='RPC',
                # URL operasi.
                pathname='/',
                # Format badan permintaan.
                req_body_type='json',
                # Format badan respons.
                body_type='json'
            )
            # opsi runtime
            runtime = util_models.RuntimeOptions()
            request = open_api_models.OpenApiRequest(
                query=OpenApiUtilClient.query(req_param)
            )
            # Respons bertipe MAP, yang berisi badan respons, header respons, dan kode status HTTP. 
            print(f"ConfigureBackupSetInfo request: {req_param}")
            data = self.client.call_api(params, request, runtime)
    
            print(f"ConfigureBackupSetInfo response: {data}")
            return data['body']['Data']
    
        """
        Dapatkan informasi unggah OSS.
        """
        def describe_bak_datasource_storage_access_info(self, req_param):
            params = open_api_models.Params(
                # Operasi yang ingin Anda panggil.
                action='DescribeBakDataSourceStorageAccessInfo',
                # Nomor versi operasi.
                version='2021-01-01',
                # Protokol operasi.
                protocol='HTTPS',
                # Metode HTTP operasi.
                method='POST',
                auth_type='AK',
                style='RPC',
                # URL operasi.
                pathname='/',
                # Format badan permintaan.
                req_body_type='json',
                # Format badan respons.
                body_type='json'
            )
            # opsi runtime
            runtime = util_models.RuntimeOptions()
            request = open_api_models.OpenApiRequest(
                query=OpenApiUtilClient.query(req_param)
            )
            # Respons bertipe MAP, yang berisi badan respons, header respons, dan kode status HTTP. 
            print(f"DescribeBakDataSourceStorageAccessInfo request: {req_param}")
            data = self.client.call_api(params, request, runtime)
    
            print(f"DescribeBakDataSourceStorageAccessInfo response: {data}")
            return data['body']['Data']
    
        def _fetch_oss_access_info(self, params):
            info = self.describe_bak_datasource_storage_access_info({
                'RegionId': params['RegionId'],
                'DataSourceId': params['DataSourceId'],
                'RegionCode': params['RegionCode'],
                'BackupType': params['BackupType'],
                'BackupSetId': params['BackupSetId']
            })
            return info['OssAccessInfo']
    
        def upload_and_register_backup_set(self, file_path, data_type, extra_meta):
            filename = os.path.basename(file_path)
            params = {'BackupMode': 'Automated', 'BackupMethod': 'Physical', 'RegionId': self.region_code,
                      'RegionCode': self.region_code, 'DataSourceId': self.datasource_id, 'BackupSetName': filename,
                      'ExtraMeta': extra_meta, 'BackupType': data_type, 'UploadStatus': 'WaitingUpload'}
    
            # Daftarkan set pencadangan untuk pertama kali. ID set pencadangan dikembalikan.
            data = self.configure_backup_set_info(params)
            params['BackupSetId'] = data['BackupSetId']
            print(f"------ configure_backup_set_info success: {file_path}, {data_type}, {params['BackupSetId']}, WaitingUpload\n")
    
            # Unggah data ke OSS.
            oss_info = self._fetch_oss_access_info(params)
            oss_client = create_oss_client(oss_info)
            upload_oss_file(oss_client, file_path, oss_info['ObjectKey'])
            print(f"------ upload_oss_file success: {file_path}, {data_type}, {params['BackupSetId']}\n")
    
            # Tandai bahwa set pencadangan telah diunggah.
            params['UploadStatus'] = 'UploadSuccess'
            self.configure_backup_set_info(params)
            print(f"------ configure_backup_set_info success: {file_path}, {data_type}, {params['BackupSetId']}, UploadSuccess\n")
    
    
    if __name__ == '__main__':
        args = init_command_args()
        uploader = OssUploader(args.access_key_id, args.access_key_secret,
                               args.endpoint, args.region_code, args.datasource_id)
    
        # Konstruksi extraMeta dengan metode berbeda untuk pencadangan penuh dan pencadangan log.
        extra_meta = '{}'
        if args.data_type == 'FullBackup':
            obj = {}
            if args.xtrabackup_log_path is not None:
                obj = xtrabackup_log_parser.analyze_slave_status(logpath=args.xtrabackup_log_path)
            elif args.xtrabackup_info_path is not None:
                parser = xtrabackup_info_parser.ExtraMetaParser(file_path=args.xtrabackup_info_path)
                obj = parser.get_extra_meta()
            extra_meta = {'BINLOG_FILE': obj.get('BINLOG_FILE'),
                          'version': obj.get("SERVER_VERSION"),
                          'dataBegin': date_to_unix_timestamp(obj.get("START_TIME")),
                          'dataEnd': date_to_unix_timestamp(obj.get("END_TIME")),
                          'consistentTime': int(date_to_unix_timestamp(obj.get("END_TIME")) / 1000)}
            extra_meta = json.dumps(extra_meta)
    
        elif args.data_type == 'LogBackup':
            obj = {'dataBegin': date_to_unix_timestamp(args.begin_time),
                   'dataEnd': date_to_unix_timestamp(args.end_time)}
            extra_meta = json.dumps(obj)
        print(f"get extra meta json string: {extra_meta}")
    
        # Unggah data dan daftarkan metadata set pencadangan.
        uploader.upload_and_register_backup_set(file_path=args.file_path, data_type=args.data_type, extra_meta=extra_meta)
  • xtrabackup_info_parser.py: Mengurai metadata menggunakan file xtrabackup_info.

    # -*- coding: utf-8 -*-
    # File ini dihasilkan secara otomatis, jangan edit. Terima kasih.
    import re
    import json
    
    
    class ExtraMetaParser:
        def __init__(self, file_path):
            self.file_path = file_path
            pass
    
        def _parse_xtrabackup_info(self):
            config_data = {}
            with open(self.file_path, 'r') as file:
                for line in file:
                    line = line.strip()
                    if line and not line.startswith('#'):
                        key, value = line.split('=', 1)
                        config_data[key.strip()] = value.strip()
            return config_data
    
        def get_extra_meta(self):
            config_data = self._parse_xtrabackup_info()
            print(f"xtrabackup_info: {config_data}")
    
            binlog_pos = config_data.get("binlog_pos")
            pattern = f"filename '(.*)', position (.*)"
            match = re.search(pattern, binlog_pos)
    
            return {'BINLOG_FILE': match.group(1),
                    'SERVER_VERSION': config_data.get("server_version"),
                    'START_TIME': config_data.get("start_time"),
                    'END_TIME': config_data.get("end_time")}
  • xtrabackup_log_parser.py: Mengurai metadata menggunakan file xtrabackup.log.

    #!/usr/bin/python
    # coding:utf8
    
    import io
    import re
    import sys
    from datetime import datetime
    
    from six import binary_type, text_type
    
    
    def parse_date_part(date_part, time_part):
        """
        Parse dan kembalikan string datetime lengkap berdasarkan bagian tanggal dan bagian waktu yang diberikan. 
        """
        # Dapatkan dua digit pertama tahun saat ini.
        current_century = datetime.now().strftime("%Y")[:2]
    
        year_short = date_part[:2]
        # Dapatkan nilai tahun lengkap.
        year_full = current_century + year_short
        date_full = year_full + date_part[2:]
        datetime_str = date_full + " " + time_part
    
        dt = datetime.strptime(datetime_str, "%Y%m%d %H:%M:%S")
        formatted_datetime = dt.strftime("%Y-%m-%d %H:%M:%S")
        return text_type(formatted_datetime)
    
    
    def analyze_slave_status(logpath=None):
        slave_status = {}
        start_time_pattern = (
            r"(\d{6}) (\d{2}:\d{2}:\d{2}) .*Connecting to MySQL server host:"
        )
        """
            240925 17:46:58 completed OK!
            240925 02:22:58 innobackupex: completed OK!
            240925 02:22:58 xtrabackup: completed OK!
        """
        end_time_pattern = r"(\d{6}) (\d{2}:\d{2}:\d{2}) .*completed OK!"
        with io.open(logpath, "rb") as fp:
            lines = fp.read().splitlines()
            for i in reversed(range(len(lines))):
                line = lines[i]
                if isinstance(line, binary_type):
                    line = line.decode("utf-8")
    
                m = re.search(start_time_pattern, line)
                if m:
                    # Ekstrak bagian tanggal dan bagian waktu.
                    date_part = m.group(1)
                    time_part = m.group(2)
                    slave_status["START_TIME"] = parse_date_part(date_part, time_part)
                    continue
    
                m = re.search(r"Using server version (\S*)", line)
                if m:
                    slave_status["SERVER_VERSION"] = text_type(m.group(1))
                    continue
    
                m = re.search("MySQL binlog position:", line)
                if m:
                    binlog_line = line
                    m = re.search(r"filename '(\S*)'", binlog_line)
                    if m:
                        slave_status["BINLOG_FILE"] = text_type(m.group(1))
                    m = re.search(r"position (\d+)", binlog_line)
                    m2 = re.search(r"position '(\d+)'", binlog_line)
                    if m:
                        try:
                            slave_status["BINLOG_POS"] = int(m.group(1))
                        except ValueError:
                            pass
                    elif m2:
                        try:
                            slave_status["BINLOG_POS"] = int(m2.group(1))
                        except ValueError:
                            pass
                    continue
    
                m = re.search("consistent_time (\d+)", line)
                if m:
                    try:
                        slave_status["CONSISTENT_TIME"] = int(m.group(1))
                    except ValueError:
                        pass
                    continue
    
                m = re.search(end_time_pattern, line)
                if m:
                    date_part = m.group(1)
                    time_part = m.group(2)
                    slave_status["END_TIME"] = parse_date_part(date_part, time_part)
                    continue
    
        return slave_status
    
    if __name__ == "__main__":
        logpath = sys.argv[1]
        slave_status = analyze_slave_status(logpath)
        print(slave_status)
    

Proses Skrip Bash

  1. Konfigurasikan ID AccessKey, Rahasia AccessKey, endpoint DBS_API, dan ID sumber data.

    #!/bin/bash
    # Pasangan AccessKey dari akun Alibaba Cloud memiliki izin untuk semua operasi API. Menggunakan kredensial ini untuk melakukan operasi adalah operasi berisiko tinggi. Kami sarankan Anda membuat dan menggunakan pengguna RAM untuk akses API atau O&M rutin.
    ## Jangan simpan pasangan AccessKey di dalam kode. Ini dapat menyebabkan kebocoran kunci. Anda dapat menyimpan pasangan AccessKey dalam file konfigurasi berdasarkan kebutuhan bisnis Anda.
    
    AK=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    SK=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
    DBS_API=dbs-api.<ID wilayah tempat sumber data Anda berada, misalnya, cn-hangzhou>.aliyuncs.com
    DATASOURCE_ID=<ID sumber data Anda>
  2. Jalankan perintah pencadangan xtrabackup untuk menyimpan data pencadangan ke direktori yang ditentukan dan mengeluarkan log kesalahan ke file xtrabackup.log.

    ## Dapatkan jalur saat ini dari skrip.
    BASE_PATH=$(cd `dirname $0`; pwd)
    
    TS=`date +%Y%m%d_%H%M%S`
    XTRA_DATA_DIR=~/tool/xtrabackup_data/$TS
    
    mkdir -p $XTRA_DATA_DIR
    
    ## Jalankan perintah pencadangan xtrabackup untuk mengeluarkan log kesalahan ke file xtrabackup.log.
    ~/innobackupex --defaults-file=/etc/my.cnf --user='<Akun database Anda, misalnya, root>' --password='<Kata sandi database Anda, misalnya, root>' --host='<Alamat IP database Anda, misalnya, localhost>' --port=<Nomor port database Anda, misalnya, 3306> --socket='parallel /var/lib/mysql/mysql.sock' --parallel=4 $XTRA_DATA_DIR/ 2>$XTRA_DATA_DIR/xtrabackup.log 
    • File xtrabackup.log diurai untuk mendapatkan metadata set pencadangan penuh. Metadata mencakup waktu mulai pencadangan, waktu akhir pencadangan, titik waktu konsistensi, dan nama log biner yang sesuai.

    • Batasan:

      Perintah pencadangan xtrabackup tidak mendukung parameter kompresi dan enkripsi (--compress --compress-threads dan --encrypt --encrypt-key-file --encrypt-threads). Sebelum menggunakan perintah pencadangan xtrabackup, hapus parameter yang sesuai.

  3. Kompres data pencadangan penuh dalam format direktori menjadi file tar.gz menggunakan kompresi gzip.

    ## Dapatkan direktori pencadangan xtrabackup saat ini.
    backup_dir=`ls $XTRA_DATA_DIR | grep -v xtrabackup.log | head -n1`
    echo -e "\033[33mexecute innobackupex success, backup_dir: $backup_dir" && echo -n -e "\033[0m" && chmod 755 $XTRA_DATA_DIR/$backup_dir
    
    ## Kemas data dalam file tar.gz.
    cd $XTRA_DATA_DIR/$backup_dir && tar -czvf ../$backup_dir.tar.gz . && file ../$backup_dir.tar.gz
    echo -e "\033[33mpackage to $backup_dir.tar.gz" && echo -n -e "\033[0m" && sleep 2
    • Anda hanya dapat mengunggah data pencadangan dalam format berikut:

      • tar: File direktori dikemas dengan tar.

      • tar.gz: File direktori dikemas dengan tar lalu dikompres dengan gzip.

    • Perhatian:

      • Sebelum menjalankan perintah tar untuk mengemas file, Anda perlu menjalankan perintah chmod 755 untuk memodifikasi izin direktori file.

      • Anda harus pergi ke direktori root folder lalu menjalankan perintah tar untuk mengemas file.

  4. Gunakan skrip upload_and_register_backup_set.py untuk mengunggah data pencadangan dan mendaftarkan metadata set pencadangan.

    ## Gunakan skrip Python untuk mengunggah data pencadangan dan mendaftarkan metadata set pencadangan.
    python3 $BASE_PATH/upload_and_register_backup_set.py --access_key_id $AK --access_key_secret $SK --endpoint $DBS_API --datasource_id $DATASOURCE_ID --region_code=cn-hangzhou --data_type=FullBackup --file_path=$XTRA_DATA_DIR/$backup_dir.tar.gz --xtrabackup_log_path=$XTRA_DATA_DIR/xtrabackup.log

    Parameter

    Deskripsi

    --access_key_id

    ID AccessKey.

    --access_key_secret

    Rahasia AccessKey.

    --endpoint

    Endpoint operasi API untuk Pemulihan Bencana Data. Untuk informasi lebih lanjut, lihat Endpoint.

    --datasource_id

    ID sumber data untuk Pemulihan Bencana Data.

    --region_code

    Informasi wilayah yang sesuai.

    --data_type

    Tipe data pencadangan. Nilai valid: FullBackup dan LogBackup.

    --file_path

    Jalur data pencadangan penuh.

    --xtrabackup_log_path

    Jalur file xtrabackup.log yang dihasilkan dengan menjalankan perintah xtrabackup.

Proses Skrip Python

  1. Gunakan fungsi utama sebagai fungsi masuk.

    Atur parameter data_type ke FullBackup atau LogBackup dan konstruksi informasi extra_meta yang bergantung pada pendaftaran metadata.

    Catatan
    • BINLOG_FILE: Nama log biner.

    • dataBegin: Waktu mulai pencadangan, akurat hingga milidetik.

    • dataEnd: Waktu akhir pencadangan, akurat hingga milidetik.

    • consistentTime: Titik waktu ketika data dalam set pencadangan konsisten, akurat hingga detik.

    • Berikut ini adalah format extra_meta untuk pencadangan penuh:

      {
        'BINLOG_FILE':'mysql-bin.001',
        'version':'5.5',
        'dataBegin':17274********,
        'dataEnd':17274********,
        'consistentTime':17274********
      }
    • Berikut ini adalah format extra_meta untuk pencadangan log:

      {
        'dataBegin':17274********,
        'dataEnd':17274********
      }
  2. Gunakan metode OssUploader.upload_and_register_backup_set untuk mengunggah data pencadangan dan mendaftarkan metadata set pencadangan.

    if __name__ == '__main__':
        args = init_command_args()
        uploader = OssUploader(args.access_key_id, args.access_key_secret,
                               args.endpoint, args.region_code, args.datasource_id)
    
        # Konstruksi extraMeta dengan metode berbeda untuk pencadangan penuh dan pencadangan log.
        extra_meta = '{}'
        if args.data_type == 'FullBackup':
            obj = {}
            if args.xtrabackup_log_path is not None:
                obj = xtrabackup_log_parser.analyze_slave_status(logpath=args.xtrabackup_log_path)
            elif args.xtrabackup_info_path is not None:
                parser = xtrabackup_info_parser.ExtraMetaParser(file_path=args.xtrabackup_info_path)
                obj = parser.get_extra_meta()
            extra_meta = {'BINLOG_FILE': obj.get('BINLOG_FILE'),
                          'version': obj.get("SERVER_VERSION"),
                          'dataBegin': date_to_unix_timestamp(obj.get("START_TIME")),
                          'dataEnd': date_to_unix_timestamp(obj.get("END_TIME")),
                          'consistentTime': int(date_to_unix_timestamp(obj.get("END_TIME")) / 1000)}
            extra_meta = json.dumps(extra_meta)
    
        elif args.data_type == 'LogBackup':
            obj = {'dataBegin': date_to_unix_timestamp(args.begin_time),
                   'dataEnd': date_to_unix_timestamp(args.end_time)}
            extra_meta = json.dumps(obj)
        print(f"get extra meta json string: {extra_meta}")
    
        # Unggah data dan daftarkan metadata set pencadangan.
        uploader.upload_and_register_backup_set(file_path=args.file_path, data_type=args.data_type, extra_meta=extra_meta)
  3. Gunakan metode OssUploader.upload_and_register_backup_set untuk memproses unggahan data pencadangan.

    class OssUploader:
    
        def __init__(self, access_key_id, access_key_secret, endpoint, region_code, datasource_id):
            self.access_key_id = access_key_id
            self.access_key_secret = access_key_secret
            self.endpoint = endpoint
            self.region_code = region_code
            self.datasource_id = datasource_id
    
            config = open_api_models.Config(access_key_id, access_key_secret)
            # Untuk informasi lebih lanjut tentang endpoint, kunjungi https://api.aliyun.com/product/Rds.
            config.endpoint = endpoint
            self.client = OpenApiClient(config)
    
        """
        Daftarkan metadata set pencadangan.
        """
        def configure_backup_set_info(self, req_param):
            params = open_api_models.Params(
                # Operasi yang ingin Anda panggil.
                action='ConfigureBackupSetInfo',
                # Nomor versi operasi.
                version='2021-01-01',
                # Protokol operasi.
                protocol='HTTPS',
                # Metode HTTP operasi.
                method='POST',
                auth_type='AK',
                style='RPC',
                # URL operasi.
                pathname='/',
                # Format badan permintaan.
                req_body_type='json',
                # Format badan respons.
                body_type='json'
            )
            # opsi runtime
            runtime = util_models.RuntimeOptions()
            request = open_api_models.OpenApiRequest(
                query=OpenApiUtilClient.query(req_param)
            )
            # Respons bertipe MAP, yang berisi badan respons, header respons, dan kode status HTTP. 
            print(f"ConfigureBackupSetInfo request: {req_param}")
            data = self.client.call_api(params, request, runtime)
    
            print(f"ConfigureBackupSetInfo response: {data}")
            return data['body']['Data']
    
        """
        Dapatkan informasi unggah OSS.
        """
        def describe_bak_datasource_storage_access_info(self, req_param):
            params = open_api_models.Params(
                # Operasi yang ingin Anda panggil.
                action='DescribeBakDataSourceStorageAccessInfo',
                # Nomor versi operasi.
                version='2021-01-01',
                # Protokol operasi.
                protocol='HTTPS',
                # Metode HTTP operasi.
                method='POST',
                auth_type='AK',
                style='RPC',
                # URL operasi.
                pathname='/',
                # Format badan permintaan.
                req_body_type='json',
                # Format badan respons.
                body_type='json'
            )
            # opsi runtime
            runtime = util_models.RuntimeOptions()
            request = open_api_models.OpenApiRequest(
                query=OpenApiUtilClient.query(req_param)
            )
            # Respons bertipe MAP, yang berisi badan respons, header respons, dan kode status HTTP. 
            print(f"DescribeBakDataSourceStorageAccessInfo request: {req_param}")
            data = self.client.call_api(params, request, runtime)
    
            print(f"DescribeBakDataSourceStorageAccessInfo response: {data}")
            return data['body']['Data']
    
        def _fetch_oss_access_info(self, params):
            info = self.describe_bak_datasource_storage_access_info({
                'RegionId': params['RegionId'],
                'DataSourceId': params['DataSourceId'],
                'RegionCode': params['RegionCode'],
                'BackupType': params['BackupType'],
                'BackupSetId': params['BackupSetId']
            })
            return info['OssAccessInfo']
    
        def upload_and_register_backup_set(self, file_path, data_type, extra_meta):
            filename = os.path.basename(file_path)
            params = {'BackupMode': 'Automated', 'BackupMethod': 'Physical', 'RegionId': self.region_code,
                      'RegionCode': self.region_code, 'DataSourceId': self.datasource_id, 'BackupSetName': filename,
                      'ExtraMeta': extra_meta, 'BackupType': data_type, 'UploadStatus': 'WaitingUpload'}
    
            # Daftarkan set pencadangan untuk pertama kali. ID set pencadangan dikembalikan.
            data = self.configure_backup_set_info(params)
            params['BackupSetId'] = data['BackupSetId']
            print(f"------ configure_backup_set_info success: {file_path}, {data_type}, {params['BackupSetId']}, WaitingUpload\n")
    
            # Unggah data ke OSS.
            oss_info = self._fetch_oss_access_info(params)
            oss_client = create_oss_client(oss_info)
            upload_oss_file(oss_client, file_path, oss_info['ObjectKey'])
            print(f"------ upload_oss_file success: {file_path}, {data_type}, {params['BackupSetId']}\n")
    
            # Tandai bahwa set pencadangan telah diunggah.
            params['UploadStatus'] = 'UploadSuccess'
            self.configure_backup_set_info(params)
            print(f"------ configure_backup_set_info success: {file_path}, {data_type}, {params['BackupSetId']}, UploadSuccess\n")