云数据库RDS中数据的备份与恢复操作
引导式阅读
Java
云数据库RDS中数据的备份与恢复操作
作者
C***
上架时间
2021-07-02 07:52:18

版本说明

本示例基于华为云SDK V3.0版本开发。

功能介绍

云数据库RDS服务支持数据库实例的备份和恢复,以保证数据可靠性。云数据库支持自动备份、手动备份。创建云数据库RDS实例时,系统默认开启自动备份策略,安全考虑,实例创建成功后不可关闭。您可根据业务需要设置自动备份策略,云数据库RDS服务按照您设置的自动备份策略对数据库进行备份。云数据库RDS服务的备份操作是实例级的,而不是数据库级的。当数据库故障或数据损坏时,可以通过备份恢复数据库,从而保证数据可靠性。当您新建数据库实例时,可以将已有的备份恢复到新实例。
云数据库RDS支持以下引擎:
1.MySQL
2.PostgreSQL
3.SQL Server
4.GaussDB(openGauss)
下面您可以通过示例了解具体的操作。

准备工作

  • 1、华为云 Java SDK 支持两种认证方式:token认证和AK/SK认证
  • 2、华为云 Java SDK 支持 Java JDK 1.8 及其以上版本。

数据的备份与恢复

初始化客户端

参数获取可参照准备工作中华为云SDK认证方式。

// endpoint url String authUrl = "****************/"; String user = "****************"; String password = "****************"; String projectId = "****************"; String userDomianId = "****************"; // initial Openstack4j Client OSFactory.enableHttpLoggingFilter(true); // create connection OSClient.OSClientV3 osClient = OSFactory.builderV3().endpoint(authUrl) .credentials(user, password, Identifier.byId(userDomianId)) .scopeToProject(Identifier.byId(projectId)).authenticate();

设置自动备份策略

设置自动备份策略所需部分参数

名称 类型 描述
keepDays integer 指定已生成的备份文件可以保存的天数。取值范围:0~732。取0值,表示关闭自动备份策略。如果需要延长保留时间请联系客服人员申请,自动备份最长可以保留2562天。
startTime string 备份时间段。自动备份将在该时间段内触发。取值范围:格式必须为hh:mm-HH:MM且有效,当前时间指UTC时间。HH取值必须比hh大1。mm和MM取值必须相同,且取值必须为00、15、30或45。
period string 备份周期配置。自动备份将在每星期指定的天进行。取值范围:格式为逗号隔开的数字,数字代表星期。
instanceId string 实例ID。

代码展示

String instanceId = "****************"; // Setting an Automated Backup Policy BackupPolicy backupPolicy = BackupPolicy.builder().keepDays(7) .startTime("19:00-20:00") .period("1,2").build(); SetBackupsPolicyRequest request = SetBackupsPolicyRequest.builder().backupPolicy(backupPolicy).build(); ActionResponse actionResponse = osClient.rds().backupRestore().setBackupsPolicy(request, instanceId); if (actionResponse.isSuccess()) { System.out.println("set backup policy success"); } else { System.out.println("set backup policy failed"); }

说明

  • 1、所涉及具体参数及其他参数请参考API Explorer
  • 2、关闭备份策略后,备份任务将立即停止,所有增量备份任务将立即删除,使用增量备份的相关操作可能失败,相关操作不限于下载、复制、恢复、重建等,请谨慎操作。

查询自动备份策略

根据实例ID查询自动备份策略

// Obtaining an Automated Backup Policy BackupPolicy respBackupPolicy = osClient.rds().backupRestore().getBackupsPolicy(instanceId); if (null != respBackupPolicy) { System.out.println("obtain backup policy success"); } else { System.out.println("obtain backup policy failed"); }

说明:更多信息请参考API Explorer

创建手动备份

创建所需部分参数

名称 类型 描述
instanceId string 实例ID。
name string 备份名称,4~64个字符,必须以英文字母开头,区分大小写,可以包含英文字母、数字、中划线或者下划线,不能包含其他特殊字符。
description string 备份描述,不能包含>!<"&'=特殊字符,不大于256个字符。

代码展示

// Creating a Manual Backup ManualBackupRequest manualBackupRequest = ManualBackupRequest.builder().instanceId(instanceId) .name("backup") .description("manual backup").build(); ManualBackupResponse result = osClient.rds().backupRestore().create(manualBackupRequest); System.out.println(result.toString()); if (result != null) { System.out.println("create manual backup success"); } else { System.out.println("create manual backup failed"); }

说明

  • 1、其他参数使用请参考API Explorer
  • 2、SQL Server数据库引擎对单库创建手动备份时,支持批量执行。
  • 3、只读实例不支持创建手动备份。
  • 4、备份名称不能和已有备份重名。

获取备份下载链接

根据备份ID获取备份下载链接

// Obtaining the Link for Downloading a Backup File String backupId = "****************"; BackupFileResponse backupFileResponse = osClient.rds().backupRestore().listFile(backupId); if (null != backupFileResponse) { System.out.println("obtain the link for downloading a backup file success"); } else { System.out.println("obtain the link for downloading a backup file failed"); }

说明

  • 1、更多信息请参考API Explorer
  • 2、支持查询MySQL、PostgreSQL、Microsoft SQL Server的全量备份,以及MySQL和PostgreSQL的增量备份。

删除手动备份

根据备份ID删除手动备份

// Deleting a Manual Backup ActionResponse deleteResponse = osClient.rds().backupRestore().delete(backupId); if (deleteResponse.isSuccess()) { System.out.println("delete a manual backup success"); } else { System.out.println("delete a manual backup failed"); }

说明:更多信息请参考API Explorer

查询可恢复时间段

根据实例ID查询可恢复时间段,如果您备份策略中的保存天数设置较长,建议您传入查询日期“date”

// Querying the Restoration Time Range RestoreTimeResponse restoreTimeResponse = osClient.rds().backupRestore().getRestoreTime(instanceId); if (null != restoreTimeResponse) { System.out.println("query the restoration time range success"); } else { System.out.println("query the restoration time range failed"); }

说明:更多信息请参考API Explorer

恢复到新实例

从备份恢复到新实例

// Restoring Data to a New DB Instance Ha createHa = Ha.builder().mode("ha").replicationMode("async").build(); DataStore createDatastore = DataStore.builder().type("MySQL").version("5.6").build(); Volume createVolume = Volume.builder().size(100).type("ULTRAHIGH").build(); BackupStrategy createBackupStrategy = BackupStrategy.builder().keepDays(7) .startTime("06:15-07:15").build(); RestorePoint restorePoint = RestorePoint.builder().instanceId(instanceId) .type("timestamp").restoreTime(1532001446987L).build(); CreateInstanceRequest createInstanceRequest = CreateInstanceRequest.builder().name("targetInst") .availabilityZone("****************").region("****************") .ha(createHa).datastore(createDatastore).port("3306") .flavorRef("****************").volume(createVolume) .vpcId("****************").subnetId("****************") .securityGroupId("****************").backupStrategy(createBackupStrategy) .password("*********").restorePoint(restorePoint).build(); CreateInstanceResponse createInstanceResponse = osClient.rds().backupRestore().restoreNewInstance(createInstanceRequest); if (null != createInstanceResponse) { System.out.println("restore data to a new DB instance success"); } else { System.out.println("restore data to a new DB instance failed"); }

说明

  • 1、所涉及具体参数请参考API Explorer
  • 2、源实例和目标实例的数据库类型必须一致,如都是MySQL。
  • 3、RDS所有引擎的源实例和目标实例的数据库版本必须一致。
  • 4、目标实例的数据卷总大小,大于或等于源实例的数据卷总大小。

恢复到已有实例

将数据库恢复到已有实例

// Restoring Data to an Existing DB Instance Source source = Source.builder().instanceId(sourceInstanceId).build(); Target target = Target.builder().instanceId(targetInstanceId).build(); RestoreExistInsRequest restoreExistInsRequest = RestoreExistInsRequest.builder().source(source) .target(target).build(); RestoreExistInsResponse restoreExistInsResponse = osClient.rds().backupRestore().retoreExistInstance(restoreExistInsRequest); if (null != restoreExistInsResponse) { System.out.println("restore data to an existing DB instance success"); } else { System.out.println("restore data to an existing DB instance failed"); }

说明

  • 1、更多参数使用请参考API Explorer
  • 2、恢复SQL Server单个数据库到已有实例时,支持批量执行。
  • 3、不支持PostgreSQL数据库实例。
  • 4、恢复到已有实例时,存在如下约束:
    源实例和目标实例的数据库类型必须一致,如都是MySQL。
    目标实例数据库版本必须高于或等于源实例的数据库版本,如MySQL 5.7.25->5.7.27,SQL Server版本约束
    目标实例的存储空间大于或等于源实例的存储空间总大小。
    不支持跨区域恢复操作。
  • 5、恢复到当前实例时,存在如下约束:
    仅支持实例的数据库引擎Microsoft SQL Server。

参考

更多信息请参考云数据库 RDS