All Products
Search
Document Center

Data Management:Cadangan database on-premises dan cloud pihak ketiga

Last Updated:Aug 28, 2026

Data disaster recovery mendukung database Alibaba Cloud, database yang dikelola sendiri pada instance ECS, database on-premises, dan database pada platform cloud pihak ketiga.

Catatan penggunaan

Jika database sumber berisi tabel dengan skema yang dirancang buruk, tabel besar, atau field besar, instans cadangan dengan spesifikasi rendah dapat menghabiskan sumber dayanya dan memicu pengecualian pencadangan. Untuk mencegah masalah ini, pilih instans cadangan dengan spesifikasi lebih tinggi.

Prosedur

Pencadangan otomatis produk

Beli jadwal cadangan (cadangan logis)

  1. Masuk ke DMS 5.0.

  2. Pada bilah navigasi atas, pilih Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

    Catatan

    Jika Anda menggunakan konsol DMS dalam mode simple, arahkan pointer ke ikon 2023-01-28_15-57-17.png di pojok kiri atas konsol DMS dan pilih All Features > Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

  3. Pilih wilayah di bagian atas halaman. Pada tab On-premises and third-party cloud databases, klik Product Automatic Backup, lalu klik ID sumber data target untuk membuka halaman detailnya.

  4. Pada halaman Backup Policy, klik Configure Backup Policy.

  5. Pada halaman Select Backup Schedule, klik Purchase Backup Schedule untuk membuka halaman pembelian Layanan Cadangan Basis Data (DBS).

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

    Parameter

    Deskripsi

    Product type

    Pilih Backup Schedule (Subscription).

    Backup schedule region

    Pilih wilayah tempat Anda ingin menyimpan data cadangan.

    Catatan

    Pastikan jadwal cadangan dan instance ECS berada di wilayah yang sama.

    Data source type

    Saat ini, hanya MySQL yang didukung.

    Specification

    Spesifikasi jadwal cadangan yang ingin Anda gunakan. Spesifikasi lebih tinggi menawarkan kinerja pencadangan dan pemulihan yang lebih baik. DBS mendukung spesifikasi jadwal cadangan berikut: micro, small, medium, large, dan xlarge. Jenis spesifikasi xlarge menyediakan spesifikasi ekstra besar tanpa batas atas pada jumlah data cadangan.

    Catatan
    • Jika instans database Anda, seperti database produksi, memerlukan jadwal cadangan berkinerja-tinggi untuk tugas pencadangan dan pemulihan cepat, kami menyarankan memilih spesifikasi xlarge atau large.

    • Jika kinerja pencadangan dan pemulihan tinggi bukan prioritas utama, Anda dapat menghitung kebutuhan Anda untuk memilih spesifikasi jadwal cadangan yang paling hemat biaya. Untuk informasi selengkapnya, lihat Cara memilih spesifikasi jadwal cadangan.

    • Jika database dan tabel yang ingin Anda cadangkan melibatkan masalah seperti skema tidak wajar, tabel besar, dan field besar, sumber daya instans cadangan dengan spesifikasi lebih rendah mungkin tidak mencukupi untuk menyelesaikan pencadangan. Akibatnya, terjadi error pencadangan. Kami menyarankan Anda membeli instans cadangan dengan spesifikasi lebih tinggi untuk mencegah error pencadangan.

    Backup method

    Pilih logical backup.

    Storage space

    Anda tidak perlu menentukan kapasitas penyimpanan saat membeli jadwal cadangan. Anda dikenai biaya berdasarkan jumlah data yang disimpan di penyimpanan bawaan DBS. Untuk informasi selengkapnya tentang penagihan, lihat Biaya penyimpanan.

    Resource group

    Pilih grup resource default atau kustom untuk memudahkan pengelolaan jadwal cadangan.

    Quantity

    Pilih jumlah yang diinginkan. Diperlukan jadwal cadangan terpisah untuk setiap instans database. Misalnya, untuk mencadangkan instans database A dan instans database B, Anda harus membeli dua jadwal cadangan.

    Subscription duration

    Pilih durasi langganan untuk jadwal cadangan.

  7. Pada halaman Confirm Order, tinjau detail pesanan, baca dan setujui Terms of Service, lalu klik Pay.

    Setelah pembayaran selesai, kembali ke halaman Select Backup Schedule dari Langkah 5 dan klik Paid. Jadwal cadangan yang baru dibeli akan muncul dalam daftar.

Konfigurasikan kebijakan cadangan

  1. Pada halaman Select Backup Schedule, pilih jadwal cadangan yang ingin Anda konfigurasikan dan klik Next.

  2. Pada halaman Select Databases and Tables, pilih database atau tabel yang ingin Anda cadangkan, klik image untuk memindahkannya ke kotak Selected Objects, lalu klik Submit.

  3. Setelah pengaturan dikirim, buka halaman Backup Policy. Pada tab Logical Backup, klik Start untuk memulai pencadangan.

    Setelah Anda mengklik Start, sistem segera memulai tugas cadangan penuh dan tugas cadangan inkremental.

    Catatan

    Jika Anda perlu melakukan operasi lain terlebih dahulu, seperti mengubah kebijakan cadangan, Anda dapat memilih untuk tidak segera memulai pencadangan. Sistem akan secara otomatis memulai pencadangan pada waktu yang ditentukan dalam kebijakan cadangan.

Pencadangan otomatis yang disediakan pengguna

Penting
  • Saat ini, hanya sumber data MySQL 5.5 yang didukung.

  • Saat ini, hanya wilayah China (Hangzhou) yang didukung.

Konfigurasikan sumber cadangan dan unggah file

  1. Masuk ke DMS 5.0.

  2. Pada bilah navigasi atas, pilih Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

    Catatan

    Jika Anda menggunakan konsol DMS dalam mode simple, arahkan pointer ke ikon 2023-01-28_15-57-17.png di pojok kiri atas konsol DMS dan pilih All Features > Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

  3. Pilih wilayah di bagian atas halaman. Pada tab On-premises and third-party cloud databases, pilih cara menambahkan sumber data berdasarkan jenisnya.

  4. Klik Add Data Source. Pada kotak dialog yang muncul, konfigurasikan parameter berikut, pilih jadwal cadangan target, lalu klik Next.

    Parameter

    Deskripsi

    Data source name

    Masukkan nama deskriptif.

    Engine type

    Jenis engine database. Hanya MySQL yang didukung.

    Engine version

    Pilih versi engine database.

    Engine parameters

    {"lower_case_table_names":1}

    Jika tidak tersedia jadwal cadangan, klik Purchase Backup Schedule untuk membuka halaman pembelian DBS dan membelinya.

    Deskripsi

    Product type

    Pilih Backup Schedule (Subscription). Metode penagihan pay-as-you-go tidak didukung.

    Backup schedule region

    Pilih wilayah tempat Anda ingin menyimpan data cadangan.

    Data source type

    Pilih MySQL.

    Specification

    Pilih xmicro. Untuk informasi tentang kuota data gratis yang disertakan dengan spesifikasi ini, lihat Spesifikasi jadwal cadangan.

    Backup method

    Pilih physical backup.

    Storage space

    Anda tidak perlu menentukan kapasitas penyimpanan saat membeli jadwal cadangan. Anda dikenai biaya berdasarkan jumlah data yang disimpan di penyimpanan bawaan DBS. Untuk informasi selengkapnya tentang penagihan, lihat Biaya penyimpanan.

    Resource group

    Pilih grup resource default atau kustom untuk memudahkan pengelolaan jadwal cadangan.

    Quantity

    Pilih jumlah yang diinginkan. Diperlukan jadwal cadangan terpisah untuk setiap instans database. Misalnya, untuk mencadangkan instans database A dan instans database B, Anda harus membeli dua jadwal cadangan.

    Subscription duration

    Pilih durasi langganan untuk jadwal cadangan.

  5. Unggah set cadangan ke bucket yang ditentukan. Untuk detailnya, lihat Unggah data untuk pencadangan otomatis yang disediakan pengguna.

  6. Setelah unggahan selesai, klik OK.

Lihat informasi cadangan

Pada tab User-provided automatic backup, klik ID sumber data target.

Pada halaman detail sumber data, panel navigasi di sebelah kiri menyediakan opsi termasuk Basic Information, Backup Policy, Backup Data, Recovery Drill, dan Task Management. Secara default, tab Basic Information ditampilkan, tempat Anda dapat melihat bidang seperti Data Source ID, Data Source Name, Resource Group ID, Data Source Type, Backup Method, Access Time, Engine Type, Data Source Authorization Status, Source Database Endpoint, dan Port.

Konfigurasikan kebijakan cadangan

  1. Pada tab User-provided automatic backup, temukan sumber data target dan klik View Backup Policy di kolom Actions.

    Pada kotak dialog Backup Policy, konfigurasikan Full backup retention period (7 hingga 7.300 hari, default: 30), Log backup retention period (7 hingga 7.300 hari, default: 7), dan Snapshot retention period (1 hingga 7.300 hari, default: 7), lalu klik OK.

  2. Setelah menyelesaikan konfigurasi, klik OK.

Lihat dan unduh data cadangan

  1. Pada tab User-provided automatic backup, klik ID sumber data target.

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

    Catatan

    Setelah Anda menjalankan skrip unggah data dan membuat sumber data, sistem manajemen cadangan menyinkronkan set cadangan yang baru dihasilkan ke halaman Backup Data.

  3. Temukan set cadangan target dan klik Download di kolom Actions untuk mengunduhnya ke komputer lokal Anda.

Buat tugas pemulihan

Catatan

Untuk membuat tugas pemulihan, set cadangan yang dihasilkan harus ada di halaman Backup Data, dan statusnya harus Completed.

  1. Pada tab User-provided automatic backup, klik ID sumber data target.

  2. Pada panel navigasi di sebelah kiri, klik Backup Data, lalu klik Create Restore Task untuk mengonfigurasi parameter pemulihan.

    Parameter

    Deskripsi

    Restore task name

    Masukkan nama deskriptif untuk tugas pemulihan.

    Restore to

    Pilih tujuan untuk instans yang dipulihkan. Secara default, data dipulihkan ke instans RDS baru.

    Database location

    Pilih lokasi database. Nilai default adalah RDS.

    Instance region

    Pilih wilayah tempat instans berada. Saat ini, hanya China (Hangzhou) yang didukung.

    VPC

    Pilih VPC.

    vSwitch

    Pilih vSwitch.

    Instance series

    Pilih seri instans untuk instans yang dipulihkan.

    Instance specification

    Pilih spesifikasi instans untuk instans yang dipulihkan.

    Storage space

    Pilih ruang penyimpanan yang diperlukan.

    Restore mode

    Pilih mode pemulihan. Saat ini, hanya point-in-time restore yang didukung.

    Restore time

    Pilih titik waktu. Untuk rentang waktu yang tersedia, lihat informasi di sebelah parameter Restore mode.

  3. Setelah mengonfigurasi tugas, klik Submit. Tugas pemulihan dibuat untuk titik waktu yang dipilih, dan detailnya muncul di halaman tugas pemulihan.

Lihat tugas pemulihan

  1. Pada tab User-provided automatic backup, klik ID sumber data target.

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

  3. Klik ID instans di kolom Restore Result untuk membuka halaman Basic Information dari instans RDS yang dipulihkan.

Lihat simulasi pemulihan

  1. Pada tab User-provided automatic backup, klik ID sumber data target.

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

    Recovery drill overview

    Lihat ikhtisar simulasi pemulihan, yang mencakup Restore task success rate, Average restore duration, Data backup drill coverage, dan Log backup drill coverage.

    Parameter

    Deskripsi

    Restore task success rate

    Tingkat keberhasilan tugas pemulihan yang dimulai dalam rentang waktu yang difilter.

    Average restore duration

    Rata-rata waktu yang diperlukan untuk tugas pemulihan yang berhasil dalam rentang waktu yang difilter.

    Data backup drill coverage

    Persentase cadangan data dari instans MySQL open-source atau RDS for MySQL yang telah menjalani simulasi pemulihan dalam rentang waktu yang difilter.

    Log backup drill coverage

    Persentase cadangan log dari instans MySQL open-source atau RDS for MySQL yang telah menjalani simulasi pemulihan dalam rentang waktu yang difilter.

    Timeline simulasi pemulihan

    Timeline menampilkan detail simulasi pemulihan. Anda dapat mengklik titik pada timeline untuk melihat informasi pada waktu tertentu tersebut.

    Detail simulasi pemulihan untuk data cadangan

    Klik Data Backup untuk melihat detail simulasi pemulihan untuk cadangan data. Klik ID instans di kolom Drill Result untuk membuka halaman Basic Information dari instans RDS yang dipulihkan.

    Klik Log Backup untuk melihat daftar detail simulasi pemulihan untuk cadangan log.

Unggah data cadangan pengguna

Sebelum memulai

  • Konfigurasikan sumber data dan peroleh ID-nya. Untuk informasi selengkapnya, lihat Tambahkan sumber data.

  • Buat Pengguna RAM, berikan izin kepada Pengguna RAM untuk mengelola layanan Alibaba Cloud yang diperlukan, dan peroleh ID AccessKey dan Rahasia AccessKey. Untuk informasi selengkapnya, lihat Buat Pengguna RAM dan Kelola izin Pengguna RAM.

Dependensi

  • Alat command-line: Bash dan Python 3.

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

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

Skrip unggah lengkap

Skrip unggah data cadangan terdiri dari dua bagian:

Skrip Bash

Ini adalah titik masuk untuk eksekusi skrip. Ganti parameter placeholder dengan nilai aktual Anda sesuai kebutuhan.

boot_backup.sh: Skrip ini mensimulasikan pembuatan cadangan penuh lokal dengan menggunakan Xtrabackup.

#!/bin/bash
## Pasangan AccessKey Akun Alibaba Cloud memiliki izin atas semua operasi API. Menggunakan kredensial ini untuk melakukan operasi merupakan praktik berisiko tinggi. Kami menyarankan Anda membuat dan menggunakan Pengguna RAM untuk akses API atau O&M rutin.
## Untuk alasan keamanan, jangan hardcode ID AccessKey dan Rahasia AccessKey Anda dalam kode. Hal ini dapat menyebabkan kebocoran kredensial. Sebagai gantinya, simpan dalam file konfigurasi atau gunakan variabel lingkungan.
AK=<YOUR_ACCESS_KEY_ID>
SK=<YOUR_ACCESS_KEY_SECRET>
DBS_API=dbs-api.<your-region-id>.aliyuncs.com
DATASOURCE_ID=<your-data-source-id>
## Dapatkan path 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 Xtrabackup dan arahkan log error ke file xtrabackup.log.
~/innobackupex --defaults-file=/etc/my.cnf --user='<your-db-account>' --password='<your-db-password>' --host='<your-db-host>' --port=<your-db-port> --socket='/var/lib/mysql/mysql.sock' --parallel=4 $XTRA_DATA_DIR/ 2>$XTRA_DATA_DIR/xtrabackup.log
## Dapatkan direktori cadangan 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 direktori menjadi 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
## Panggil skrip Python untuk mengunggah file cadangan dan mendaftarkan metadata-nya.
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: Skrip ini mengunggah data cadangan penuh dan cadangan log, mengurai metadata yang sesuai, dan mendaftarkan metadata set cadangan ke Layanan Cadangan Basis Data (DBS).

    # -*- coding: utf-8 -*-
    # File ini di-generate secara otomatis, jangan diedit. 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="Parser command-line contoh.")
        parser.add_argument("--access_key_id", help="ID AccessKey Alibaba Cloud Anda.")
        parser.add_argument("--access_key_secret", help="Rahasia AccessKey Alibaba Cloud Anda.")
        parser.add_argument("--endpoint", help="Titik akhir API untuk layanan Anda.")
        parser.add_argument("--region_code", help="Kode wilayah sumber data Anda.")
        parser.add_argument("--datasource_id", help="ID sumber data Anda.")
        parser.add_argument("--data_type", help="Jenis set cadangan: FullBackup atau LogBackup.")
        parser.add_argument("--file_path", help="Path file set cadangan.")
        parser.add_argument("--xtrabackup_info_path", help="Path ke file xtrabackup_info.")
        parser.add_argument("--xtrabackup_log_path", help="Path ke file xtrabackup.log.")
        parser.add_argument("--begin_time", help="Waktu mulai binlog.")
        parser.add_argument("--end_time", help="Waktu akhir binlog.")
        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):
        # Mengonversi string tanggal ke timestamp Unix dalam milidetik.
        dt_obj = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
        timestamp_seconds = time.mktime(dt_obj.timetuple())
        return int(timestamp_seconds) * 1000
    def create_oss_client(params):
        # Detail autentikasi untuk OSS Alibaba Cloud.
        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):
        """
        Mengunggah file besar ke OSS menggunakan unggah multi-bagian.
        :param oss_client: Instance klien OSS.
        :param file_path: Path ke file lokal.
        :param object_key: Kunci objek di OSS, yang berfungsi sebagai nama file.
        """
        # Atur ukuran bagian dalam byte. Default adalah 5 MB.
        part_size = 1024 * 1024 * 5
        # Mulai unggah multi-bagian.
        upload_id = oss_client.init_multipart_upload(object_key).upload_id
        # Buka file dan baca isinya.
        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 multi-bagian.
            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, lihat https://api.alibabacloud.com/product/Dbs.
            config.endpoint = endpoint
            self.client = OpenApiClient(config)
        """
        Mendaftarkan metadata set cadangan.
        """
        def configure_backup_set_info(self, req_param):
            params = open_api_models.Params(
                # Nama operasi API.
                action='ConfigureBackupSetInfo',
                # Versi operasi API.
                version='2021-01-01',
                # Protokol.
                protocol='HTTPS',
                # Metode HTTP.
                method='POST',
                auth_type='AK',
                style='RPC',
                # Path operasi API.
                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 adalah map yang berisi badan respons, header, dan kode status HTTP.
            print(f"Permintaan ConfigureBackupSetInfo: {req_param}")
            data = self.client.call_api(params, request, runtime)
            print(f"Respons ConfigureBackupSetInfo: {data}")
            return data['body']['Data']
        """
        Mendapatkan informasi unggah OSS.
        """
        def describe_bak_datasource_storage_access_info(self, req_param):
            params = open_api_models.Params(
                # Nama operasi API.
                action='DescribeBakDataSourceStorageAccessInfo',
                # Versi operasi API.
                version='2021-01-01',
                # Protokol.
                protocol='HTTPS',
                # Metode HTTP.
                method='POST',
                auth_type='AK',
                style='RPC',
                # Path operasi API.
                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 adalah map yang berisi badan respons, header, dan kode status HTTP.
            print(f"Permintaan DescribeBakDataSourceStorageAccessInfo: {req_param}")
            data = self.client.call_api(params, request, runtime)
            print(f"Respons DescribeBakDataSourceStorageAccessInfo: {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 cadangan untuk pertama kali guna memperoleh ID set cadangan.
            data = self.configure_backup_set_info(params)
            params['BackupSetId'] = data['BackupSetId']
            print(f"------ configure_backup_set_info berhasil: {file_path}, {data_type}, {params['BackupSetId']}, WaitingUpload\n")
            # Unggah file 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 berhasil: {file_path}, {data_type}, {params['BackupSetId']}\n")
            # Tandai set cadangan sebagai telah diunggah.
            params['UploadStatus'] = 'UploadSuccess'
            self.configure_backup_set_info(params)
            print(f"------ configure_backup_set_info berhasil: {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)
        # Bangun extra_meta secara berbeda untuk cadangan penuh dan cadangan 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"Dapatkan string JSON extra meta: {extra_meta}")
        # Unggah data dan daftarkan metadata set cadangan.
        uploader.upload_and_register_backup_set(file_path=args.file_path, data_type=args.data_type, extra_meta=extra_meta)
  • xtrabackup_info_parser.py: Skrip ini mengurai metadata dari file xtrabackup_info.

    # -*- coding: utf-8 -*-
    # File ini di-generate secara otomatis, jangan diedit. 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: Skrip ini mengurai metadata dari file xtrabackup.log yang dihasilkan selama proses pencadangan.

    #!/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):
        """
        Mengurai dan mengembalikan string datetime lengkap dari bagian tanggal dan waktu yang diberikan.
        """
        # Dapatkan dua digit pertama tahun saat ini (abad).
        current_century = datetime.now().strftime("%Y")[:2]
        year_short = date_part[:2]
        # Bangun tahun penuh.
        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 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)
    

Alur kerja skrip Bash

  1. Konfigurasikan ID AccessKey dan Rahasia AccessKey Anda, titik akhir OpenAPI Layanan Cadangan Basis Data (DBS), dan ID sumber data.

    #!/bin/bash
    ## Pasangan AccessKey Akun Alibaba Cloud memiliki izin atas semua operasi API. Menggunakan kredensial ini untuk melakukan operasi merupakan praktik berisiko tinggi. Kami menyarankan Anda membuat dan menggunakan Pengguna RAM untuk akses API atau O&M rutin.
    ## Untuk alasan keamanan, jangan hardcode ID AccessKey dan Rahasia AccessKey Anda dalam kode. Hal ini dapat menyebabkan kebocoran kredensial. Sebagai gantinya, simpan dalam file konfigurasi atau gunakan variabel lingkungan.
    AK=<YOUR_ACCESS_KEY_ID>
    SK=<YOUR_ACCESS_KEY_SECRET>
    DBS_API=dbs-api.<your-region-id>.aliyuncs.com
    DATASOURCE_ID=<your-data-source-id>
  2. Jalankan perintah Xtrabackup untuk menyimpan data cadangan ke direktori tertentu dan arahkan log error ke file xtrabackup.log.

    ## Dapatkan path 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 Xtrabackup dan arahkan log error ke file xtrabackup.log.
    ~/innobackupex --defaults-file=/etc/my.cnf --user='<your-db-account>' --password='<your-db-password>' --host='<your-db-host>' --port=<your-db-port> --socket='/var/lib/mysql/mysql.sock' --parallel=4 $XTRA_DATA_DIR/ 2>$XTRA_DATA_DIR/xtrabackup.log
    • Skrip kemudian mengurai file xtrabackup.log untuk memperoleh metadata untuk set cadangan penuh. Metadata tersebut mencakup waktu mulai pencadangan, waktu akhir, titik konsistensi, dan nama file binlog yang sesuai.

    • Batasan:

      Perintah Xtrabackup saat ini tidak mendukung parameter kompresi dan enkripsi (--compress, --compress-threads, --encrypt, --encrypt-key-file, dan --encrypt-threads). Hapus parameter-parameter ini sebelum menjalankan perintah.

  3. Kompres dan kemas direktori data cadangan penuh menjadi file .tar.gz.

    ## Dapatkan direktori cadangan 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 direktori menjadi 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
    • Batasan: DBS hanya menerima data cadangan dalam format file berikut:

      • tar: Direktori dikemas menjadi arsip .tar.

      • tar.gz: Direktori dikemas menjadi arsip .tar lalu dikompresi menggunakan Gzip.

    • Catatan penggunaan:

      • Sebelum menjalankan perintah tar, jalankan perintah chmod 755 untuk mengatur izin direktori.

      • Sebelum menjalankan perintah tar, navigasi ke root direktori yang ingin Anda kemas.

  4. Jalankan skrip upload_and_register_backup_set.py untuk mengunggah data cadangan dan mendaftarkan metadata-nya.

    ## Panggil skrip Python untuk mengunggah file cadangan dan mendaftarkan metadata-nya.
    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 Alibaba Cloud Anda.

    --access_key_secret

    Rahasia AccessKey Alibaba Cloud Anda.

    --endpoint

    Titik akhir API untuk Layanan Cadangan Basis Data (DBS).

    --datasource_id

    ID sumber data di DBS.

    --region_code

    ID wilayah tempat sumber data berada.

    --data_type

    Jenis data cadangan. Nilai valid: FullBackup untuk cadangan penuh dan LogBackup untuk cadangan log.

    --file_path

    Path ke file data cadangan penuh.

    --xtrabackup_log_path

    Path ke file xtrabackup.log yang dihasilkan selama pencadangan penuh.

Alur kerja skrip Python

  1. Fungsi main adalah titik masuk.

    Bergantung pada parameter data_type (FullBackup atau LogBackup), skrip membangun informasi extra_meta yang diperlukan untuk pendaftaran metadata.

    Catatan
    • BINLOG_FILE: Nama file binlog.

    • dataBegin: Waktu mulai pencadangan, sebagai timestamp Unix dalam milidetik.

    • dataEnd: Waktu akhir pencadangan, sebagai timestamp Unix dalam milidetik.

    • consistentTime: Titik konsistensi, sebagai timestamp Unix dalam detik.

    • Format extra_meta untuk cadangan penuh:

      {
        'BINLOG_FILE':'mysql-bin.001',
        'version':'5.5',
        'dataBegin':17274********,
        'dataEnd':17274********,
        'consistentTime':17274********
      }
    • Format extra_meta untuk cadangan log:

      {
        'dataBegin':17274********,
        'dataEnd':17274********
      }
  2. Panggil metode OssUploader.upload_and_register_backup_set untuk mengunggah data cadangan dan mendaftarkan metadata-nya.

    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)
        # Bangun extra_meta secara berbeda untuk cadangan penuh dan cadangan 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"Dapatkan string JSON extra meta: {extra_meta}")
        # Unggah data dan daftarkan metadata set cadangan.
        uploader.upload_and_register_backup_set(file_path=args.file_path, data_type=args.data_type, extra_meta=extra_meta)
  3. Proses unggah dalam metode OssUploader.upload_and_register_backup_set.

    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, lihat https://api.alibabacloud.com/product/Dbs.
            config.endpoint = endpoint
            self.client = OpenApiClient(config)
        """
        Mendaftarkan metadata set cadangan.
        """
        def configure_backup_set_info(self, req_param):
            params = open_api_models.Params(
                # Nama operasi API.
                action='ConfigureBackupSetInfo',
                # Versi operasi API.
                version='2021-01-01',
                # Protokol.
                protocol='HTTPS',
                # Metode HTTP.
                method='POST',
                auth_type='AK',
                style='RPC',
                # Path operasi API.
                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 adalah map yang berisi badan respons, header, dan kode status HTTP.
            print(f"Permintaan ConfigureBackupSetInfo: {req_param}")
            data = self.client.call_api(params, request, runtime)
            print(f"Respons ConfigureBackupSetInfo: {data}")
            return data['body']['Data']
        """
        Mendapatkan informasi unggah OSS.
        """
        def describe_bak_datasource_storage_access_info(self, req_param):
            params = open_api_models.Params(
                # Nama operasi API.
                action='DescribeBakDataSourceStorageAccessInfo',
                # Versi operasi API.
                version='2021-01-01',
                # Protokol.
                protocol='HTTPS',
                # Metode HTTP.
                method='POST',
                auth_type='AK',
                style='RPC',
                # Path operasi API.
                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 adalah map yang berisi badan respons, header, dan kode status HTTP.
            print(f"Permintaan DescribeBakDataSourceStorageAccessInfo: {req_param}")
            data = self.client.call_api(params, request, runtime)
            print(f"Respons DescribeBakDataSourceStorageAccessInfo: {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 cadangan untuk pertama kali guna memperoleh ID set cadangan.
            data = self.configure_backup_set_info(params)
            params['BackupSetId'] = data['BackupSetId']
            print(f"------ configure_backup_set_info berhasil: {file_path}, {data_type}, {params['BackupSetId']}, WaitingUpload\n")
            # Unggah file 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 berhasil: {file_path}, {data_type}, {params['BackupSetId']}\n")
            # Tandai set cadangan sebagai telah diunggah.
            params['UploadStatus'] = 'UploadSuccess'
            self.configure_backup_set_info(params)
            print(f"------ configure_backup_set_info berhasil: {file_path}, {data_type}, {params['BackupSetId']}, UploadSuccess\n")