Database Management

更新和迁移数据库

Glance 默认的元数据驱动程序使用 SQLAlchemy,这意味着存在一个需要管理的后端数据库。 glance-manage 二进制文件提供了一组命令来简化此操作。

这些命令应作为 ‘db’ 子命令执行

glance-manage db <cmd> <args>

注意

在 Ocata 版本 (14.0.0) 中,数据库迁移引擎从 SQLAlchemy Migrate 更改为 Alembic。 这需要在 glance-manage 工具中进行一些更改。 虽然用户界面尽可能保持相似,但 Ocata 及更高版本中包含的 glance-manage 工具与“遗留”工具不兼容。 如果您查阅这些文档以获取有关 Newton 或更早版本中 glance-manage 工具的信息,请参阅 遗留数据库管理 页面。

迁移脚本

迁移脚本存储在目录中:glance/db/sqlalchemy/alembic_migrations/versions

如上所述,这些脚本使用 Alembic 迁移引擎,该引擎首次在 Ocata 版本中推出。 所有数据库迁移,直到 Liberty 版本,都合并到一个名为 liberty_initial 的 Alembic 迁移脚本中。 Mitaka 迁移已保留,但已为 Alembic 重写并使用新的命名约定命名。

新的 Glance 安装将应用以下迁移

  • liberty-initial

  • mitaka01

  • mitaka02

  • ocata01

注意

“旧式”迁移脚本已在 Ocata 版本的 当前目录 中保留,以便感兴趣的操作员可以将其与新的迁移相关联。 此目录将在未来的版本中删除。

特别是,Ocata 迁移的“旧式”脚本 045_add_visibility.py 已保留,供熟悉 SQLAlchemy Migrate 并希望将其与“新型”Alembic 迁移脚本进行比较的操作员使用。 Alembic 脚本,即实际用于升级到 Ocata 的脚本,是 ocata01_add_visibility_remove_is_public.py

同步数据库

glance-manage db sync [VERSION]

将现有数据库置于迁移控制之下,并将其升级到指定的 VERSION,或者如果未指定 VERSION,则升级到最新的迁移级别。

注意

在 Ocata 版本之前,数据库版本是一个数值。 例如:对于 Newton 版本,最新的迁移级别是 44。 从 Ocata 开始,数据库版本是与发布中包含的最新迁移相对应的修订名称。 对于 Ocata 版本,只有一个数据库迁移,其标识符为修订 ocata01。 因此,Ocata 版本的数据库版本是 ocata01

随着零停机升级的引入,此命名约定将略有变化,该升级在 Ocata 中是 EXPERIMENTAL 的,但预计从 Pike 版本开始将成为官方升级方法。 有关更多信息,请参阅 零停机数据库升级

确定数据库版本

glance-manage db version

这将打印 Glance 数据库的当前迁移级别。

升级现有数据库

glance-manage db upgrade [VERSION]

这将获取现有的数据库并将其升级到指定的 VERSION。

降级现有数据库

降级现有数据库不受支持

升级涉及复杂的操作并且可能失败。 在尝试任何升级之前,您应该备份生产数据的完整数据库。 从 OpenStack Kilo 版本(2013 年 4 月)开始,数据库降级不受支持,并且恢复到先前数据库版本的唯一方法是从备份恢复。

数据库维护

与大多数 OpenStack 系统一样,Glance 在从其数据库中删除记录时执行删除。 根据您云中的使用模式,您可能偶尔想要实际删除这些软删除的表行。 此操作称为清除数据库,您可以使用 glance-manage 工具来执行此操作。

高级数据库架构

大致来说,Glance 数据库中包含一个 images 表,该表存储图像 id 和其他一些核心图像属性。 关于图像的所有其他信息(例如:图像数据存储在后端的位置、图像已共享给哪些项目、图像标签、自定义图像属性)都存储在其他表中,其中 image id 是外键。

由于 images 表跟踪已颁发哪些图像标识符,因此在清除数据库方面,必须对其进行与其他表不同的处理。

注意

在 Rocky 版本(17.0.0)之前,images没有被区别对待,这使 Glance 容易受到 OSSN-0075,“已删除的 Glance 图像 ID 可能会被重新分配”的影响。 请阅读 OpenStack Security Note 以了解问题的性质。

此外,Glance 规范 Mitigate OSSN-0075 包含对该问题的讨论,并解释了对 Rocky 版本 glance-manage 工具所做的更改。 Gerrit 规范审查 包含对几种替代方法的广泛讨论,并让您了解为什么 Glance 团队提供了一个“缓解”措施而不是修复方案。

清除数据库

您可以使用 glance-manage 工具清除所有表( images 表)中的软删除行

glance-manage db purge

此命令接受两个可选参数

--age_in_days NUM

仅清除已删除超过 NUM 天的行。 默认值为 30 天。

--max_rows NUM

从每个表中清除最多 NUM 行。 默认值为 100。 如果等于 -1,则清除所有已删除的行

清除 Images 表

请记住,其他需要访问图像的 OpenStack 服务使用图像标识符。 这些服务期望当通过 ID 请求图像时,每次都会收到相同的数据。 当 images 表清除其软删除行时,Glance 会失去对这些图像 ID 曾经映射到特定负载的记忆。 因此,在清除 images 表时必须小心。 我们建议比“常规”清除操作更少地进行此操作。

使用以下命令清除 images 表

glance-manage db purge_images_table

请确保您已阅读并理解 OSSN-0075 的含义,然后再使用此命令,该命令清除 images 表中的软删除行。

它接受两个可选参数

--age_in_days NUM

仅清除已删除超过 NUM 天的行。 默认值为 180 天。

--max_rows NUM

清除 images 表中的最多 NUM 行。 默认值为 100。 如果等于 -1,则清除所有已删除的行

如果尝试从 images 表中清除记录,而其他表中的相关记录尚未清除,则此命令可能会因 IntegrityError 而失败,并显示类似“无法删除或更新父行:外键约束失败”的消息。 purge_images_table 命令应仅在已使用“常规”purge 命令清除所有相关信息后才发出。