Todos os produtos
Search
Central de documentação

Data Management:Backups de bancos de dados on-premises e em nuvens de terceiros

Última atualização: Aug 27, 2026

O recurso Data disaster recovery oferece suporte a bancos de dados da Alibaba Cloud, bancos de dados autogerenciados em instâncias ECS, bancos de dados on-premises e bancos de dados em plataformas de nuvem de terceiros.

Observações de uso

Se o banco de dados de origem contiver tabelas com schemas mal projetados, tabelas grandes ou campos extensos, uma instância de backup com especificações baixas poderá esgotar seus recursos e gerar exceções no backup. Para evitar esses problemas, selecione uma instância de backup com especificações superiores.

Procedimento

Backup automático do produto

Adquirir um plano de backup (backup lógico)

  1. Faça login no DMS 5.0.

  2. Na barra de navegação superior, escolha Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

    Nota

    Se você utiliza o console do DMS no modo simples, passe o ponteiro sobre o ícone 2023-01-28_15-57-17.png no canto superior esquerdo do console do DMS e escolha All Features > Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

  3. Selecione uma região na parte superior da página. Na aba On-premises and third-party cloud databases, clique em Product Automatic Backup e, em seguida, clique no id da fonte de dados desejada para abrir sua página de detalhes.

  4. Na página Backup Policy, clique em Configure Backup Policy.

  5. Na página Select Backup Schedule, clique em Purchase Backup Schedule para acessar a página de compra do Database Backup service (DBS).

  6. Configure os parâmetros abaixo e clique em Buy Now no canto inferior direito.

    Parâmetro

    Descrição

    Product type

    Selecione Backup Schedule (Subscription).

    Backup schedule region

    Escolha a região onde deseja armazenar os dados de backup.

    Nota

    Certifique-se de que o plano de backup e a instância ECS estejam na mesma região.

    Data source type

    Atualmente, há suporte apenas para MySQL.

    Specification

    As especificações do plano de backup que você deseja utilizar. Especificações mais altas oferecem maior desempenho de backup e restauração. O DBS suporta as seguintes especificações de plano de backup: micro, small, medium, large e xlarge. O tipo de especificação xlarge fornece especificações extra grandes sem limite superior para a quantidade de dados de backup.

    Nota
    • Se sua instância de banco de dados, como um banco de produção, exige um plano de backup de alto desempenho para tarefas rápidas de backup e restauração, recomendamos selecionar a especificação xlarge ou large.

    • Caso o alto desempenho de backup e restauração não seja prioridade, calcule suas necessidades para escolher a especificação de plano de backup mais econômica. Para mais informações, consulte How to select a backup schedule specification.

    • Se os bancos de dados e tabelas que você deseja fazer backup apresentarem problemas como schemas inadequados, tabelas grandes e campos extensos, os recursos de uma instância de backup com especificações inferiores podem ser insuficientes para concluir o backup. Isso resulta em erro de backup. Recomendamos adquirir uma instância de backup com especificações superiores para prevenir erros.

    Backup method

    Selecione logical backup.

    Storage space

    Não é necessário especificar uma capacidade de armazenamento ao adquirir o plano de backup. A cobrança ocorre com base na quantidade de dados armazenados no armazenamento integrado do DBS. Para mais detalhes sobre faturamento, consulte Storage fees.

    Resource group

    Escolha o grupo de recursos padrão ou personalizado para facilitar o gerenciamento dos planos de backup.

    Quantity

    Defina a quantidade desejada. É necessário um plano de backup separado para cada instância de banco de dados. Por exemplo, para fazer backup da instância A e da instância B, você deve adquirir dois planos de backup.

    Subscription duration

    Escolha a duração da assinatura para o plano de backup.

  7. Na página Confirm Order, revise os detalhes do pedido, leia e concorde com os Terms of Service e clique em Pay.

    Após concluir o pagamento, retorne à página Select Backup Schedule da Etapa 5 e clique em Paid. O novo plano de backup adquirido aparecerá na lista.

Configurar uma política de backup

  1. Na página Select Backup Schedule, selecione o plano de backup que deseja configurar e clique em Next.

  2. Na página Select Databases and Tables, selecione os bancos de dados ou tabelas que deseja incluir no backup, clique em image para movê-los para a caixa Selected Objects e clique em Submit.

  3. Após enviar as configurações, acesse a página Backup Policy. Na aba Logical Backup, clique em Start para iniciar o backup.

    Ao clicar em Start, o sistema inicia imediatamente uma tarefa de backup completo e uma tarefa de backup incremental.

    Nota

    Caso precise executar outras operações antes, como modificar a política de backup, você pode optar por não iniciar o backup imediatamente. O sistema iniciará o backup automaticamente no horário especificado na política.

Backup automático fornecido pelo usuário

Importante
  • Atualmente, há suporte apenas para fontes de dados MySQL 5.5.

  • No momento, há suporte apenas para a região China (Hangzhou).

Configurar fonte de backup e carregar arquivos

  1. Faça login no DMS 5.0.

  2. Na barra de navegação superior, escolha Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

    Nota

    Se você utiliza o console do DMS no modo simples, passe o ponteiro sobre o ícone 2023-01-28_15-57-17.png no canto superior esquerdo do console do DMS e escolha All Features > Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

  3. Selecione uma região na parte superior da página. Na aba On-premises and third-party cloud databases, escolha como adicionar uma fonte de dados com base em seu tipo.

  4. Clique em Add Data Source. Na caixa de diálogo exibida, configure os parâmetros a seguir, selecione o plano de backup desejado e clique em Next.

    Parâmetro

    Descrição

    Data source name

    Insira um nome descritivo.

    Engine type

    Tipo de mecanismo de banco de dados. Há suporte apenas para MySQL.

    Engine version

    Selecione a versão do mecanismo de banco de dados.

    Engine parameters

    {"lower_case_table_names":1}

    Se nenhum plano de backup estiver disponível, clique em Purchase Backup Schedule para acessar a página de compra do DBS e adquirir um.

    Descrição

    Product type

    Selecione Backup Schedule (Subscription). Não há suporte para o método de pagamento conforme o uso.

    Backup schedule region

    Escolha a região onde deseja armazenar os dados de backup.

    Data source type

    Selecione MySQL.

    Specification

    Selecione xmicro. Para informações sobre a cota gratuita de dados incluída nesta especificação, consulte Backup schedule specifications.

    Backup method

    Selecione physical backup.

    Storage space

    Não é necessário especificar uma capacidade de armazenamento ao adquirir o plano de backup. A cobrança ocorre com base na quantidade de dados armazenados no armazenamento integrado do DBS. Para mais detalhes sobre faturamento, consulte Storage fees.

    Resource group

    Escolha o grupo de recursos padrão ou personalizado para facilitar o gerenciamento dos planos de backup.

    Quantity

    Defina a quantidade desejada. É necessário um plano de backup separado para cada instância de banco de dados. Por exemplo, para fazer backup da instância A e da instância B, você deve adquirir dois planos de backup.

    Subscription duration

    Escolha a duração da assinatura para o plano de backup.

  5. Carregue o conjunto de backup no bucket especificado. Para detalhes, consulte Upload data for user-provided automatic backups.

  6. Após concluir o upload, clique em OK.

Visualizar informações de backup

Na aba User-provided automatic backup, clique no id da fonte de dados desejada.

Na página de detalhes da fonte de dados, o painel de navegação à esquerda oferece opções como Basic Information, Backup Policy, Backup Data, Recovery Drill e Task Management. Por padrão, a aba Basic Information é exibida, permitindo visualizar campos como 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 e Port.

Configurar uma política de backup

  1. Na aba User-provided automatic backup, localize a fonte de dados desejada e clique em View Backup Policy na coluna Actions.

    Na caixa de diálogo Backup Policy, configure Full backup retention period (7 a 7.300 dias, padrão: 30), Log backup retention period (7 a 7.300 dias, padrão: 7) e Snapshot retention period (1 a 7.300 dias, padrão: 7) e clique em OK.

  2. Após concluir a configuração, clique em OK.

Visualizar e baixar dados de backup

  1. Na aba User-provided automatic backup, clique no id da fonte de dados desejada.

  2. No painel de navegação à esquerda, clique em Backup Data.

    Nota

    Após executar o script de upload de dados e criar a fonte de dados, o sistema de gerenciamento de backup sincroniza quaisquer novos conjuntos de backup gerados para a página Backup Data.

  3. Localize o conjunto de backup desejado e clique em Download na coluna Actions para baixá-lo para seu computador local.

Criar uma tarefa de restauração

Nota

Para criar uma tarefa de restauração, deve existir um conjunto de backup gerado na página Backup Data com status Completed.

  1. Na aba User-provided automatic backup, clique no id da fonte de dados desejada.

  2. No painel de navegação à esquerda, clique em Backup Data e, em seguida, clique em Create Restore Task para configurar os parâmetros de restauração.

    Parâmetro

    Descrição

    Restore task name

    Insira um nome descritivo para a tarefa de restauração.

    Restore to

    Selecione o destino para a instância restaurada. Por padrão, os dados são restaurados em uma nova instância rds.

    Database location

    Selecione a localização do banco de dados. O valor padrão é rds.

    Instance region

    Selecione a região onde a instância reside. Atualmente, há suporte apenas para China (Hangzhou).

    VPC

    Selecione a VPC.

    vSwitch

    Selecione o vSwitch.

    Instance series

    Selecione a série da instância para a instância restaurada.

    Instance specification

    Selecione a especificação da instância para a instância restaurada.

    Storage space

    Selecione o espaço de armazenamento necessário.

    Restore mode

    Selecione um modo de restauração. Atualmente, há suporte apenas para restauração pontual.

    Restore time

    Selecione um ponto no tempo. Para o intervalo de tempo disponível, consulte as informações ao lado do parâmetro Restore mode.

  3. Após configurar a tarefa, clique em Submit. Uma tarefa de restauração é criada para o ponto no tempo selecionado, e seus detalhes aparecem na página de tarefas de restauração.

Visualizar tarefas de restauração

  1. Na aba User-provided automatic backup, clique no id da fonte de dados desejada.

  2. No painel de navegação à esquerda, escolha Task Management > Restore Tasks.

  3. Clique no id da instância na coluna Restore Result para acessar a página Basic Information da instância rds restaurada.

Visualizar simulações de recuperação

  1. Na aba User-provided automatic backup, clique no id da fonte de dados desejada.

  2. No painel de navegação à esquerda, clique em Recovery Drill.

    Recovery drill overview

    Visualize o resumo da simulação de recuperação, que inclui Restore task success rate, Average restore duration, Data backup drill coverage e Log backup drill coverage.

    Parâmetro

    Descrição

    Restore task success rate

    A taxa de sucesso das tarefas de restauração iniciadas dentro do intervalo de tempo filtrado.

    Average restore duration

    O tempo médio gasto nas tarefas de restauração bem-sucedidas dentro do intervalo de tempo filtrado.

    Data backup drill coverage

    A porcentagem de backups de dados de instâncias MySQL open-source ou rds for MySQL que passaram por uma simulação de recuperação dentro do intervalo de tempo filtrado.

    Log backup drill coverage

    A porcentagem de backups de log de instâncias MySQL open-source ou rds for MySQL que passaram por uma simulação de recuperação dentro do intervalo de tempo filtrado.

    Linha do tempo da simulação de recuperação

    A linha do tempo exibe detalhes das simulações de recuperação. Clique em um ponto na linha do tempo para visualizar informações daquele momento específico.

    Detalhes da simulação de recuperação para dados de backup

    Clique em Data Backup para ver os detalhes da simulação de recuperação para backups de dados. Clique no id da instância na coluna Drill Result para acessar a página Basic Information da instância rds restaurada.

    Clique em Log Backup para visualizar a lista de detalhes da simulação de recuperação para backups de log.

Carregar dados de backup do usuário

Antes de começar

  • Configure uma fonte de dados e obtenha seu id. Para mais informações, consulte Add a data source.

  • Crie um usuário RAM, conceda a ele permissões para gerenciar o service da Alibaba Cloud necessário e obtenha um AccessKey id e um AccessKey secret. Para mais informações, consulte Create a RAM user e Manage RAM user permissions.

Dependências

  • Ferramentas de linha de comando: bash e Python 3.

  • Bibliotecas Python: oss2, alibabacloud_openapi_util, alibabacloud_tea_openapi e alibabacloud_tea_util.

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

Scripts completos de upload

Os scripts de upload de dados de backup consistem em duas partes:

Script bash

Este é o ponto de entrada para a execução do script. Substitua os parâmetros de espaço reservado pelos seus valores reais conforme necessário.

boot_backup.sh: Este script simula a criação de um backup completo local usando Xtrabackup.

#!/bin/bash
## The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations is a high-risk practice. We recommend that you create and use a RAM user for API access or routine O&M.
## For security reasons, do not hardcode your AccessKey ID and AccessKey secret in your code. This can lead to credential leaks. Instead, store them in a configuration file or use environment variables.
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>
## Get the current path of the script.
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
## Run the Xtrabackup command and redirect error logs to the xtrabackup.log file.
~/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
## Get the current Xtrabackup backup directory.
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
## Package the directory into a .tar.gz file.
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
## Call the Python script to upload the backup file and register its metadata.
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

Scripts Python

  • upload_and_register_backup_set.py: Este script carrega dados de backup completo e de log, analisa os metadados correspondentes e registra os metadados do conjunto de backup no Database Backup service (DBS).

    # -*- coding: utf-8 -*-
    # This file is auto-generated, don't edit it. Thanks.
    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="Your Alibaba Cloud AccessKey ID.")
        parser.add_argument("--access_key_secret", help="Your Alibaba Cloud AccessKey secret.")
        parser.add_argument("--endpoint", help="The API endpoint for your service.")
        parser.add_argument("--region_code", help="The region code of your data source.")
        parser.add_argument("--datasource_id", help="The ID of your data source.")
        parser.add_argument("--data_type", help="The type of the backup set: FullBackup or LogBackup.")
        parser.add_argument("--file_path", help="The file path of the backup set.")
        parser.add_argument("--xtrabackup_info_path", help="The path to the xtrabackup_info file.")
        parser.add_argument("--xtrabackup_log_path", help="The path to the xtrabackup.log file.")
        parser.add_argument("--begin_time", help="The start time of the binlog.")
        parser.add_argument("--end_time", help="The end time of the 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):
        # Converts a date string to a Unix timestamp in milliseconds.
        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):
        # Authentication details for Alibaba Cloud OSS.
        access_key_id = params['AccessKeyId']
        access_key_secret = params['AccessKeySecret']
        security_token = params['SecurityToken']
        bucket_name = params['BucketName']
        endpoint = params['OssEndpoint']
        # Initialize the OSS client.
        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):
        """
        Uploads a large file to OSS using multipart upload.
        :param oss_client: The OSS client instance.
        :param file_path: The path to the local file.
        :param object_key: The object key in OSS, which serves as the file name.
        """
        # Set the part size in bytes. Default is 5 MB.
        part_size = 1024 * 1024 * 5
        # Initiate the multipart upload.
        upload_id = oss_client.init_multipart_upload(object_key).upload_id
        # Open the file and read its content.
        with open(file_path, 'rb') as file_obj:
            parts = []
            while True:
                data = file_obj.read(part_size)
                if not data:
                    break
                # Upload a part.
                result = oss_client.upload_part(object_key, upload_id, len(parts) + 1, data)
                parts.append(oss2.models.PartInfo(len(parts) + 1, result.etag))
            # Complete the multipart upload.
            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)
            # For more information about endpoints, see https://api.alibabacloud.com/product/Dbs.
            config.endpoint = endpoint
            self.client = OpenApiClient(config)
        """
        Registers backup set metadata.
        """
        def configure_backup_set_info(self, req_param):
            params = open_api_models.Params(
                # The name of the API operation.
                action='ConfigureBackupSetInfo',
                # The version of the API operation.
                version='2021-01-01',
                # The protocol.
                protocol='HTTPS',
                # The HTTP method.
                method='POST',
                auth_type='AK',
                style='RPC',
                # The path of the API operation.
                pathname='/',
                # The format of the request body.
                req_body_type='json',
                # The format of the response body.
                body_type='json'
            )
            # Runtime options.
            runtime = util_models.RuntimeOptions()
            request = open_api_models.OpenApiRequest(
                query=OpenApiUtilClient.query(req_param)
            )
            # The response is a map that contains the response body, headers, and HTTP status code.
            print(f"ConfigureBackupSetInfo request: {req_param}")
            data = self.client.call_api(params, request, runtime)
            print(f"ConfigureBackupSetInfo response: {data}")
            return data['body']['Data']
        """
        Gets OSS upload information.
        """
        def describe_bak_datasource_storage_access_info(self, req_param):
            params = open_api_models.Params(
                # The name of the API operation.
                action='DescribeBakDataSourceStorageAccessInfo',
                # The version of the API operation.
                version='2021-01-01',
                # The protocol.
                protocol='HTTPS',
                # The HTTP method.
                method='POST',
                auth_type='AK',
                style='RPC',
                # The path of the API operation.
                pathname='/',
                # The format of the request body.
                req_body_type='json',
                # The format of the response body.
                body_type='json'
            )
            # Runtime options.
            runtime = util_models.RuntimeOptions()
            request = open_api_models.OpenApiRequest(
                query=OpenApiUtilClient.query(req_param)
            )
            # The response is a map that contains the response body, headers, and HTTP status code.
            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'}
            # Register the backup set for the first time to obtain a backup set ID.
            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")
            # Upload the file to 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")
            # Mark the backup set as uploaded.
            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)
        # Construct extra_meta differently for full backups and log backups.
        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}")
        # Upload the data and register the backup set metadata.
        uploader.upload_and_register_backup_set(file_path=args.file_path, data_type=args.data_type, extra_meta=extra_meta)
  • xtrabackup_info_parser.py: Este script analisa metadados do arquivo xtrabackup_info.

    # -*- coding: utf-8 -*-
    # This file is auto-generated, don't edit it. Thanks.
    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: Este script analisa metadados do arquivo xtrabackup.log gerado durante o processo de backup.

    #!/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):
        """
        Parses and returns a full datetime string from the given date and time parts.
        """
        # Get the first two digits of the current year (the century).
        current_century = datetime.now().strftime("%Y")[:2]
        year_short = date_part[:2]
        # Construct the full year.
        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:
                    # Extract the date and time parts.
                    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)
    

Fluxo de trabalho do script bash

  1. Configure seu AccessKey id e AccessKey secret, o endpoint da OpenAPI do Database Backup service (DBS) e o id da fonte de dados.

    #!/bin/bash
    ## The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations is a high-risk practice. We recommend that you create and use a RAM user for API access or routine O&M.
    ## For security reasons, do not hardcode your AccessKey ID and AccessKey secret in your code. This can lead to credential leaks. Instead, store them in a configuration file or use environment variables.
    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. Execute o comando Xtrabackup para salvar os dados de backup em um diretório especificado e redirecione o log de erros para o arquivo xtrabackup.log.

    ## Get the current path of the script.
    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
    ## Run the Xtrabackup command and redirect error logs to the xtrabackup.log file.
    ~/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
    • Posteriormente, o script analisa o arquivo xtrabackup.log para obter metadados do conjunto de backup completo. Os metadados incluem o horário de início e término do backup, o ponto de consistência e o nome do arquivo binlog correspondente.

    • Limitação:

      Atualmente, o comando Xtrabackup não suporta os parâmetros de compressão e criptografia (--compress, --compress-threads, --encrypt, --encrypt-key-file e --encrypt-threads). Remova esses parâmetros antes de executar o comando.

  3. Compacte e empacote o diretório de dados de backup completo em um arquivo .tar.gz.

    ## Get the current Xtrabackup backup directory.
    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
    ## Package the directory into a .tar.gz file.
    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
    • Limitação: O DBS aceita dados de backup apenas nos seguintes formatos de arquivo:

      • tar: O diretório é empacotado em um arquivo .tar.

      • tar.gz: O diretório é empacotado em um arquivo .tar e depois compactado usando Gzip.

    • Observações de uso:

      • Antes de executar o comando tar, execute o comando chmod 755 para definir as permissões do diretório.

      • Antes de executar o comando tar, navegue até a raiz do diretório que deseja empacotar.

  4. Execute o script upload_and_register_backup_set.py para carregar os dados de backup e registrar seus metadados.

    ## Call the Python script to upload the backup file and register its metadata.
    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

    Parâmetro

    Descrição

    --access_key_id

    Seu AccessKey id da Alibaba Cloud.

    --access_key_secret

    Seu AccessKey secret da Alibaba Cloud.

    --endpoint

    O endpoint da API para o Database Backup service (DBS).

    --datasource_id

    O id da fonte de dados no DBS.

    --region_code

    O id da região onde a fonte de dados reside.

    --data_type

    O tipo de dados de backup. Valores válidos: FullBackup para backup completo e LogBackup para backup de log.

    --file_path

    O caminho para o arquivo de dados de backup completo.

    --xtrabackup_log_path

    O caminho para o arquivo xtrabackup.log gerado durante o backup completo.

  5. Fluxo de trabalho do script Python

    1. A função main é o ponto de entrada.

      Dependendo do parâmetro data_type (FullBackup ou LogBackup), o script constrói as informações extra_meta necessárias para o registro de metadados.

      Nota
      • BINLOG_FILE: O nome do arquivo binlog.

      • dataBegin: O horário de início do backup, como um timestamp Unix em milissegundos.

      • dataEnd: O horário de término do backup, como um timestamp Unix em milissegundos.

      • consistentTime: O ponto de consistência, como um timestamp Unix em segundos.

      • Formato de extra_meta para um backup completo:

        {
          'BINLOG_FILE':'mysql-bin.001',
          'version':'5.5',
          'dataBegin':17274********,
          'dataEnd':17274********,
          'consistentTime':17274********
        }
      • Formato de extra_meta para um backup de log:

        {
          'dataBegin':17274********,
          'dataEnd':17274********
        }
    2. Chame o método OssUploader.upload_and_register_backup_set para carregar os dados de backup e registrar seus metadados.

      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)
          # Construct extra_meta differently for full backups and log backups.
          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}")
          # Upload the data and register the backup set metadata.
          uploader.upload_and_register_backup_set(file_path=args.file_path, data_type=args.data_type, extra_meta=extra_meta)
    3. O processo de upload dentro do método 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)
              # For more information about endpoints, see https://api.alibabacloud.com/product/Dbs.
              config.endpoint = endpoint
              self.client = OpenApiClient(config)
          """
          Registers backup set metadata.
          """
          def configure_backup_set_info(self, req_param):
              params = open_api_models.Params(
                  # The name of the API operation.
                  action='ConfigureBackupSetInfo',
                  # The version of the API operation.
                  version='2021-01-01',
                  # The protocol.
                  protocol='HTTPS',
                  # The HTTP method.
                  method='POST',
                  auth_type='AK',
                  style='RPC',
                  # The path of the API operation.
                  pathname='/',
                  # The format of the request body.
                  req_body_type='json',
                  # The format of the response body.
                  body_type='json'
              )
              # Runtime options.
              runtime = util_models.RuntimeOptions()
              request = open_api_models.OpenApiRequest(
                  query=OpenApiUtilClient.query(req_param)
              )
              # The response is a map that contains the response body, headers, and HTTP status code.
              print(f"ConfigureBackupSetInfo request: {req_param}")
              data = self.client.call_api(params, request, runtime)
              print(f"ConfigureBackupSetInfo response: {data}")
              return data['body']['Data']
          """
          Gets OSS upload information.
          """
          def describe_bak_datasource_storage_access_info(self, req_param):
              params = open_api_models.Params(
                  # The name of the API operation.
                  action='DescribeBakDataSourceStorageAccessInfo',
                  # The version of the API operation.
                  version='2021-01-01',
                  # The protocol.
                  protocol='HTTPS',
                  # The HTTP method.
                  method='POST',
                  auth_type='AK',
                  style='RPC',
                  # The path of the API operation.
                  pathname='/',
                  # The format of the request body.
                  req_body_type='json',
                  # The format of the response body.
                  body_type='json'
              )
              # Runtime options.
              runtime = util_models.RuntimeOptions()
              request = open_api_models.OpenApiRequest(
                  query=OpenApiUtilClient.query(req_param)
              )
              # The response is a map that contains the response body, headers, and HTTP status code.
              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'}
              # Register the backup set for the first time to obtain a backup set ID.
              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")
              # Upload the file to 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")
              # Mark the backup set as uploaded.
              params['UploadStatus'] = 'UploadSuccess'
              self.configure_backup_set_info(params)
              print(f"------ configure_backup_set_info success: {file_path}, {data_type}, {params['BackupSetId']}, UploadSuccess\n")