import logging from celery import shared_task from django.utils import timezone from labs.site_settings import SiteSettings from labs.tidb_serverless.api_client import TiDBCloudServerlessClient logger = logging.getLogger(__name__) @shared_task def backup_database(): tidbcloud_cluster_id = SiteSettings.db_backup_tidbcloud_cluster_id tidbcloud_public_key = SiteSettings.db_backup_tidbcloud_public_key tidbcloud_private_key = SiteSettings.db_backup_tidbcloud_private_key oss_bucket_name = SiteSettings.db_backup_alicloud_oss_bucket_name oss_access_key_id = SiteSettings.db_backup_alicloud_access_key_id oss_access_key_secret = SiteSettings.db_backup_alicloud_access_key_secret if not ( tidbcloud_cluster_id and tidbcloud_public_key and tidbcloud_private_key and oss_bucket_name and oss_access_key_id and oss_access_key_secret ): logger.error("Missing required settings for database backup") return client = TiDBCloudServerlessClient( public_key=tidbcloud_public_key, private_key=tidbcloud_private_key, ) oss_backup_dir = ( f"oss://{oss_bucket_name}/db/{timezone.now().strftime('%Y%m%d%H%M%S')}/" ) export_task = client.create_export_task( cluster_id=tidbcloud_cluster_id, task_detail={ "exportOptions": { "compression": "ZSTD", "fileType": "SQL", "filter": {"table": {"patterns": ["*.*"], "where": ""}}, }, "target": { "oss": { "accessKey": { "id": oss_access_key_id, "secret": oss_access_key_secret, }, "authType": "ACCESS_KEY", "uri": oss_backup_dir, }, "type": "OSS", }, }, ) export_task_id = export_task["exportId"] logger.info(f"Created export task for database backup: {export_task_id}")