Todos los productos
Search
Centro de documentos

Data Management:Copias de seguridad de bases de datos locales y en nubes de terceros

Última actualización: Sep 03, 2026

Recuperación ante desastres de datos es compatible con bases de datos de Alibaba Cloud, bases de datos autogestionadas en instancias ECS, bases de datos locales y bases de datos en plataformas de nube de terceros.

Notas de uso

Si la base de datos de origen contiene tablas con esquemas mal diseñados, tablas grandes o campos de gran tamaño, una instancia de copia de seguridad con especificaciones bajas podría agotar sus recursos y provocar excepciones en el proceso. Para evitar estos problemas, seleccione una instancia de copia de seguridad con especificaciones superiores.

Procedimiento

Product automatic backup

Adquirir un plan de copia de seguridad (copia lógica)

  1. Inicie sesión en DMS 5.0.

  2. En la barra de navegación superior, vaya a Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

    Nota

    Si utiliza la consola DMS en modo simple, coloque el puntero sobre el icono 2023-01-28_15-57-17.png en la esquina superior izquierda de la consola DMS y seleccione All Features > Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

  3. Seleccione una región en la parte superior de la página. En la pestaña On-premises and third-party cloud databases, haga clic en Product Automatic Backup y luego haga clic en el ID del origen de datos deseado para abrir su página de detalles.

  4. En la página Backup Policy, haga clic en Configure Backup Policy.

  5. En la página Select Backup Schedule, haga clic en Purchase Backup Schedule para abrir la página de compra de Database Backup Service (DBS).

  6. Configure los siguientes parámetros y haga clic en Buy Now en la esquina inferior derecha.

    Parámetro

    Descripción

    Product type

    Seleccione Backup Schedule (Subscription).

    Backup schedule region

    Seleccione la región donde desea almacenar los datos de la copia de seguridad.

    Nota

    Asegúrese de que el plan de copia de seguridad y la instancia ECS se encuentren en la misma región.

    Data source type

    Actualmente, solo se admite MySQL.

    Specification

    Las especificaciones del plan de copia de seguridad que desea utilizar. Las especificaciones más altas ofrecen un mejor rendimiento de copia de seguridad y restauración. DBS admite las siguientes especificaciones de plan de copia de seguridad: micro, small, medium, large y xlarge. El tipo de especificación xlarge proporciona especificaciones extra grandes sin límite superior en la cantidad de datos de copia de seguridad.

    Nota
    • Si su instancia de base de datos, como una base de datos de producción, requiere un plan de copia de seguridad de alto rendimiento para tareas rápidas de respaldo y restauración, se recomienda seleccionar la especificación xlarge o large.

    • Si el alto rendimiento de copia de seguridad y restauración no es prioritario, puede calcular sus requisitos para elegir la especificación de plan de copia de seguridad más rentable. Para obtener más información, consulte How to select a backup schedule specification.

    • Si las bases de datos y tablas que desea respaldar presentan problemas como esquemas inadecuados, tablas grandes o campos extensos, los recursos de una instancia de copia de seguridad con especificaciones inferiores podrían ser insuficientes para completar el proceso. Esto provocaría un error en la copia de seguridad. Se recomienda adquirir una instancia de copia de seguridad con especificaciones superiores para prevenir estos errores.

    Backup method

    Seleccione logical backup.

    Storage space

    No es necesario especificar una capacidad de almacenamiento al adquirir el plan de copia de seguridad. Se le cobrará según la cantidad de datos almacenados en el almacenamiento integrado de DBS. Para obtener más información sobre la facturación, consulte Storage fees.

    Resource group

    Seleccione el resource group predeterminado o uno personalizado para facilitar la gestión de los planes de copia de seguridad.

    Quantity

    Seleccione la cantidad deseada. Se requiere un plan de copia de seguridad independiente para cada instancia de base de datos. Por ejemplo, para respaldar la instancia de base de datos A y la instancia de base de datos B, debe adquirir dos planes de copia de seguridad.

    Subscription duration

    Seleccione la duración de la suscripción para el plan de copia de seguridad.

  7. En la página Confirm Order, revise los detalles del pedido, lea y acepte los Terms of Service y, a continuación, haga clic en Pay.

    Una vez completado el pago, regrese a la página Select Backup Schedule del paso 5 y haga clic en Paid. El nuevo plan de copia de seguridad adquirido aparecerá en la lista.

Configurar una directiva de copia de seguridad

  1. En la página Select Backup Schedule, seleccione el plan de copia de seguridad que desea configurar y haga clic en Next.

  2. En la página Select Databases and Tables, seleccione las bases de datos o tablas que desea respaldar, haga clic en image para moverlas al cuadro Selected Objects y, a continuación, haga clic en Submit.

  3. Después de enviar la configuración, vaya a la página Backup Policy. En la pestaña Logical Backup, haga clic en Start para iniciar la copia de seguridad.

    Al hacer clic en Start, el sistema inicia inmediatamente una tarea de copia de seguridad completa y una tarea de copia de seguridad incremental.

    Nota

    Si necesita realizar otras operaciones primero, como modificar la directiva de copia de seguridad, puede optar por no iniciar la copia de seguridad de inmediato. El sistema iniciará automáticamente la copia de seguridad a la hora especificada en la directiva.

User-provided automatic backup

Importante
  • Actualmente, solo se admiten orígenes de datos MySQL 5.5.

  • Actualmente, solo se admite la región China (Hangzhou).

Configurar el origen de la copia de seguridad y cargar archivos

  1. Inicie sesión en DMS 5.0.

  2. En la barra de navegación superior, vaya a Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

    Nota

    Si utiliza la consola DMS en modo simple, coloque el puntero sobre el icono 2023-01-28_15-57-17.png en la esquina superior izquierda de la consola DMS y seleccione All Features > Security and disaster recovery (DBS) > Data Disaster Recovery (DBS) > Disaster Recovery Data Source.

  3. Seleccione una región en la parte superior de la página. En la pestaña On-premises and third-party cloud databases, elija cómo agregar un origen de datos según su tipo.

  4. Haga clic en Add Data Source. En el cuadro de diálogo que aparece, configure los siguientes parámetros, seleccione el plan de copia de seguridad deseado y haga clic en Next.

    Parámetro

    Descripción

    Data source name

    Introduzca un nombre descriptivo.

    Engine type

    Tipo de motor de base de datos. Solo se admite MySQL.

    Engine version

    Seleccione la versión del motor de base de datos.

    Engine parameters

    {"lower_case_table_names":1}

    Si no hay ningún plan de copia de seguridad disponible, haga clic en Purchase Backup Schedule para ir a la página de compra de DBS y adquirir uno.

    Descripción

    Product type

    Seleccione Backup Schedule (Subscription). El método de facturación pay-as-you-go no es compatible.

    Backup schedule region

    Seleccione la región donde desea almacenar los datos de la copia de seguridad.

    Data source type

    Seleccione MySQL.

    Specification

    Seleccione xmicro. Para obtener información sobre la cuota de datos gratuita incluida en esta especificación, consulte Backup schedule specifications.

    Backup method

    Seleccione physical backup.

    Storage space

    No es necesario especificar una capacidad de almacenamiento al adquirir el plan de copia de seguridad. Se le cobrará según la cantidad de datos almacenados en el almacenamiento integrado de DBS. Para obtener más información sobre la facturación, consulte Storage fees.

    Resource group

    Seleccione el resource group predeterminado o uno personalizado para facilitar la gestión de los planes de copia de seguridad.

    Quantity

    Seleccione la cantidad deseada. Se requiere un plan de copia de seguridad independiente para cada instancia de base de datos. Por ejemplo, para respaldar la instancia de base de datos A y la instancia de base de datos B, debe adquirir dos planes de copia de seguridad.

    Subscription duration

    Seleccione la duración de la suscripción para el plan de copia de seguridad.

  5. Cargue el conjunto de copia de seguridad en el bucket especificado. Para obtener más detalles, consulte Upload data for user-provided automatic backups.

  6. Una vez completada la carga, haga clic en OK.

Consultar la información de la copia de seguridad

En la pestaña User-provided automatic backup, haga clic en el ID del origen de datos deseado.

En la página de detalles del origen de datos, el panel de navegación izquierdo ofrece opciones que incluyen Basic Information, Backup Policy, Backup Data, Recovery Drill y Task Management. De forma predeterminada, se muestra la pestaña Basic Information, donde puede consultar 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 y Port.

Configurar una directiva de copia de seguridad

  1. En la pestaña User-provided automatic backup, busque el origen de datos deseado y haga clic en View Backup Policy en la columna Actions.

    En el cuadro de diálogo Backup Policy, configure Full backup retention period (de 7 a 7,300 días, valor predeterminado: 30), Log backup retention period (de 7 a 7,300 días, valor predeterminado: 7) y Snapshot retention period (de 1 a 7,300 días, valor predeterminado: 7), y luego haga clic en OK.

  2. Después de completar la configuración, haga clic en OK.

Consultar y descargar datos de copia de seguridad

  1. En la pestaña User-provided automatic backup, haga clic en el ID del origen de datos deseado.

  2. En el panel de navegación izquierdo, haga clic en Backup Data.

    Nota

    Después de ejecutar el script de carga de datos y crear el origen de datos, el sistema de gestión de copias de seguridad sincroniza cualquier conjunto de copia de seguridad recién generado con la página Backup Data.

  3. Busque el conjunto de copia de seguridad deseado y haga clic en Download en la columna Actions para descargarlo en su computadora local.

Crear una tarea de restauración

Nota

Para crear una tarea de restauración, debe existir un conjunto de copia de seguridad generado en la página Backup Data y su estado debe ser Completed.

  1. En la pestaña User-provided automatic backup, haga clic en el ID del origen de datos deseado.

  2. En el panel de navegación izquierdo, haga clic en Backup Data y, a continuación, haga clic en Create Restore Task para configurar los parámetros de restauración.

    Parámetro

    Descripción

    Restore task name

    Introduzca un nombre descriptivo para la tarea de restauración.

    Restore to

    Seleccione el destino para la instancia restaurada. De forma predeterminada, los datos se restauran en una nueva instancia RDS.

    Database location

    Seleccione la ubicación de la base de datos. El valor predeterminado es RDS.

    Instance region

    Seleccione la región donde reside la instancia. Actualmente, solo se admite China (Hangzhou).

    VPC

    Seleccione la VPC.

    vSwitch

    Seleccione el vSwitch.

    Instance series

    Seleccione la serie de instancia para la instancia restaurada.

    Instance specification

    Seleccione la especificación de instancia para la instancia restaurada.

    Storage space

    Seleccione el espacio de almacenamiento requerido.

    Restore mode

    Seleccione un modo de restauración. Actualmente, solo se admite la restauración a un punto en el tiempo.

    Restore time

    Seleccione un punto en el tiempo. Para conocer el rango de tiempo disponible, consulte la información junto al parámetro Restore mode.

  3. Después de configurar la tarea, haga clic en Submit. Se crea una tarea de restauración para el punto en el tiempo seleccionado y sus detalles aparecen en la página de tareas de restauración.

Consultar tareas de restauración

  1. En la pestaña User-provided automatic backup, haga clic en el ID del origen de datos deseado.

  2. En el panel de navegación izquierdo, vaya a Task Management > Restore Tasks.

  3. Haga clic en el ID de la instancia en la columna Restore Result para ir a la página Basic Information de la instancia RDS restaurada.

Consultar simulacros de recuperación

  1. En la pestaña User-provided automatic backup, haga clic en el ID del origen de datos deseado.

  2. En el panel de navegación izquierdo, haga clic en Recovery Drill.

    Recovery drill overview

    Consulte el resumen del simulacro de recuperación, que incluye Restore task success rate, Average restore duration, Data backup drill coverage y Log backup drill coverage.

    Parámetro

    Descripción

    Restore task success rate

    La tasa de éxito de las tareas de restauración iniciadas dentro del rango de tiempo filtrado.

    Average restore duration

    El tiempo promedio que toman las tareas de restauración exitosas dentro del rango de tiempo filtrado.

    Data backup drill coverage

    El porcentaje de copias de seguridad de datos de instancias MySQL de código abierto o RDS for MySQL que han pasado por un simulacro de recuperación dentro del rango de tiempo filtrado.

    Log backup drill coverage

    El porcentaje de copias de seguridad de registros de instancias MySQL de código abierto o RDS for MySQL que han pasado por un simulacro de recuperación dentro del rango de tiempo filtrado.

    Línea de tiempo del simulacro de recuperación

    La línea de tiempo muestra los detalles del simulacro de recuperación. Puede hacer clic en un punto de la línea de tiempo para ver la información correspondiente a ese momento específico.

    Detalles del simulacro de recuperación para datos de copia de seguridad

    Haga clic en Data Backup para ver los detalles del simulacro de recuperación correspondientes a las copias de seguridad de datos. Haga clic en el ID de la instancia en la columna Drill Result para ir a la página Basic Information de la instancia RDS restaurada.

    Haga clic en Log Backup para ver la lista de detalles del simulacro de recuperación correspondientes a las copias de seguridad de registros.

Upload user backup data

Antes de empezar

  • Configure un origen de datos y obtenga su ID. Para obtener más información, consulte Add a data source.

  • Cree un usuario RAM, otórguele permisos para gestionar el servicio de Alibaba Cloud requerido y obtenga un AccessKey ID y un AccessKey secret. Para obtener más información, consulte Create a RAM user y Manage RAM user permissions.

Dependencias

  • Herramientas de línea de comandos: Bash y Python 3.

  • Bibliotecas de Python: oss2, alibabacloud_openapi_util, alibabacloud_tea_openapi y 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 carga

Los scripts de carga de datos de copia de seguridad constan de dos partes:

Bash script

Este es el punto de entrada para la ejecución del script. Reemplace los parámetros de marcador de posición con sus valores reales según sea necesario.

boot_backup.sh: Este script simula la creación de una copia de seguridad completa local mediante 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

Python scripts

  • upload_and_register_backup_set.py: Este script carga datos de copia de seguridad completa y de registros, analiza los metadatos correspondientes y registra los metadatos del conjunto de copia de seguridad en 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 analiza los metadatos del archivo 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 analiza los metadatos del archivo xtrabackup.log generado durante el proceso de copia de seguridad.

    #!/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)
    

Flujo de trabajo del script de Bash

  1. Configure su AccessKey ID y AccessKey secret, el endpoint de OpenAPI de Database Backup Service (DBS) y el ID del origen de datos.

    #!/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. Ejecute el comando Xtrabackup para guardar los datos de la copia de seguridad en un directorio específico y redirija el registro de errores al archivo 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, el script analiza el archivo xtrabackup.log para obtener los metadatos del conjunto de copia de seguridad completa. Estos metadatos incluyen la hora de inicio y fin de la copia, el punto de consistencia y el nombre del archivo binlog correspondiente.

    • Limitación:

      Actualmente, el comando Xtrabackup no admite los parámetros de compresión y cifrado (--compress, --compress-threads, --encrypt, --encrypt-key-file y --encrypt-threads). Elimine estos parámetros antes de ejecutar el comando.

  3. Comprima y empaquete el directorio de datos de la copia de seguridad completa en un archivo .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
    • Limitación: DBS solo acepta datos de copia de seguridad en los siguientes formatos de archivo:

      • tar: El directorio se empaqueta en un archivo .tar.

      • tar.gz: El directorio se empaqueta en un archivo .tar y luego se comprime con Gzip.

    • Notas de uso:

      • Antes de ejecutar el comando tar, ejecute el comando chmod 755 para establecer los permisos del directorio.

      • Antes de ejecutar el comando tar, vaya al directorio raíz que desea empaquetar.

  4. Ejecute el script upload_and_register_backup_set.py para cargar los datos de la copia de seguridad y registrar sus metadatos.

    ## 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

    Descripción

    --access_key_id

    Su AccessKey ID de Alibaba Cloud.

    --access_key_secret

    Su AccessKey secret de Alibaba Cloud.

    --endpoint

    El endpoint de API para Database Backup Service (DBS).

    --datasource_id

    El ID del origen de datos en DBS.

    --region_code

    El ID de la región donde reside el origen de datos.

    --data_type

    El tipo de datos de la copia de seguridad. Valores válidos: FullBackup para una copia de seguridad completa y LogBackup para una copia de seguridad de registros.

    --file_path

    La ruta al archivo de datos de la copia de seguridad completa.

    --xtrabackup_log_path

    La ruta al archivo xtrabackup.log generado durante la copia de seguridad completa.

Flujo de trabajo del script de Python

  1. La función main es el punto de entrada.

    Según el parámetro data_type (FullBackup o LogBackup), el script construye la información extra_meta necesaria para el registro de metadatos.

    Nota
    • BINLOG_FILE: El nombre del archivo binlog.

    • dataBegin: La hora de inicio de la copia de seguridad, como marca de tiempo Unix en milisegundos.

    • dataEnd: La hora de fin de la copia de seguridad, como marca de tiempo Unix en milisegundos.

    • consistentTime: El punto de consistencia, como marca de tiempo Unix en segundos.

    • Formato de extra_meta para una copia de seguridad completa:

      {
        'BINLOG_FILE':'mysql-bin.001',
        'version':'5.5',
        'dataBegin':17274********,
        'dataEnd':17274********,
        'consistentTime':17274********
      }
    • Formato de extra_meta para una copia de seguridad de registros:

      {
        'dataBegin':17274********,
        'dataEnd':17274********
      }
  2. Llame al método OssUploader.upload_and_register_backup_set para cargar los datos de la copia de seguridad y registrar sus metadatos.

    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. El proceso de carga dentro del 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")