还原早期版本 - Amazon Simple Storage Service

还原早期版本

您可以使用版本控制来检索对象的早期版本。有两种方法可执行该操作:

  • 将对象的早期版本复制到同一存储桶中。

    复制的对象将成为该对象的当前版本,且所有对象版本都保留。

  • 永久删除对象的当前版本。

    当您删除当前对象版本时,实际上会将先前版本转换为该对象的当前版本。

由于所有对象版本都保留,所以您可以通过将对象的特定版本复制到同一存储桶,使任何较早版本成为当前版本。在下图中,源对象(ID = 111111)已复制到同一存储桶中。Amazon S3 将提供一个新 ID (88778877),且它将成为该对象的当前版本。因此,该存储桶同时具有原始对象版本(111111)及其副本(88778877)。有关获取先前版本,然后将其上传以使其成为当前版本的更多信息,请参阅从启用了版本控制的存储桶中检索对象版本上传对象

图中显示了将对象的特定版本复制到同一个存储桶中以使其成为当前版本。

随后,GET 将检索版本 88778877。

下图显示了如何删除对象的当前版本 (121212),该操作保留早期版本 (111111) 作为当前版本。有关删除对象的更多信息,请参阅删除单个对象

图中显示了删除对象的当前版本会将早期版本保留为当前版本。

随后,GET 将检索版本 111111。

注意

要批量还原对象版本,可以使用 CopyObject 操作CopyObject 操作会复制清单中指定的每个对象。但请注意,不必以对象在清单中出现的相同顺序复制这些对象。对于受版本控制的存储桶,如果保留当前/非当前版本顺序很重要,您应首先复制所有非当前版本。然后,在第一个任务完成后,在后续任务中复制当前版本。

还原以前的对象版本

  1. 登录到 AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 存储桶列表中,请选择包含对象的存储桶的名称。

  3. Objects(对象)列表中,请选择对象的名称。

  4. 请选择 Versions(版本)。

    Amazon S3 显示了对象的所有版本。

  5. 选中要检索的版本的 Version ID(版本 ID)旁的复选框。

  6. 依次选择 Actions(操作)、Download(下载),然后保存对象。

您也可以在对象概述面板中查看、下载和删除对象版本。有关更多信息,请参阅 在 Amazon S3 控制台中查看对象属性

重要

仅当对象已作为最新 (当前) 版本删除时,您才能取消删除它。您无法取消删除已删除对象的早期版本。有关更多信息,请参阅 使用 S3 版本控制保留对象的多个版本

有关使用其他 AWS SDK 的信息,请参阅 AWS 开发人员中心

Python

以下 Python 代码示例通过删除指定回滚版本之后的所有版本,来还原版本控制对象的以前版本。

def rollback_object(bucket, object_key, version_id): """ Rolls back an object to an earlier version by deleting all versions that occurred after the specified rollback version. Usage is shown in the usage_demo_single_object function at the end of this module. :param bucket: The bucket that holds the object to roll back. :param object_key: The object to roll back. :param version_id: The version ID to roll back to. """ # Versions must be sorted by last_modified date because delete markers are # at the end of the list even when they are interspersed in time. versions = sorted( bucket.object_versions.filter(Prefix=object_key), key=attrgetter("last_modified"), reverse=True, ) logger.debug( "Got versions:\n%s", "\n".join( [ f"\t{version.version_id}, last modified {version.last_modified}" for version in versions ] ), ) if version_id in [ver.version_id for ver in versions]: print(f"Rolling back to version {version_id}") for version in versions: if version.version_id != version_id: version.delete() print(f"Deleted version {version.version_id}") else: break print(f"Active version is now {bucket.Object(object_key).version_id}") else: raise KeyError( f"{version_id} was not found in the list of versions for " f"{object_key}." )