你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure Database for PostgreSQL 灵活服务器中的 PostgreSQL 扩展
适用于: Azure Database for PostgreSQL 灵活服务器
Azure Database for PostgreSQL 灵活服务器提供了使用扩展来扩展数据库功能的能力。 扩展在单个包中捆绑多个相关 SQL 对象,可以使用命令在数据库中加载或删除该包。 将包加载到数据库中后,扩展会如同内置功能一样运行。
如何使用 PostgreSQL 扩展
在 Azure Database for PostgreSQL 灵活服务器中安装扩展之前,需要将这些扩展添加到允许列表以供使用。
使用 Azure 门户:
- 选择 Azure Database for PostgreSQL 灵活服务器实例。
使用 Azure CLI:
可以通过 CLI 参数集命令将扩展添加到允许列表。
az postgres flexible-server parameter set --resource-group <resource_group> --server-name <server> --subscription <subscription_id> --name azure.extensions --value <extension_name>,<extension_name>
使用 ARM 模板:以下示例在名为 postgres-test-server
的服务器上将扩展 dblink
、dict_xsyn
、pg_buffercache
添加到允许列表:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"flexibleServers_name": {
"defaultValue": "postgres-test-server",
"type": "String"
},
"azure_extensions_set_value": {
"defaultValue": " dblink,dict_xsyn,pg_buffercache",
"type": "String"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.DBforPostgreSQL/flexibleServers/configurations",
"apiVersion": "2021-06-01",
"name": "[concat(parameters('flexibleServers_name'), '/azure.extensions')]",
"properties": {
"value": "[parameters('azure_extensions_set_value')]",
"source": "user-override"
}
}
]
}
shared_preload_libraries
是一个服务器配置参数,用于确定 Azure Database for PostgreSQL 灵活服务器启动时必须加载哪些库。 必须通过此参数加载使用共享内存的所有库。 如果需要将扩展添加到共享预加载库,请执行以下步骤:
使用 Azure 门户:
- 选择 Azure Database for PostgreSQL 灵活服务器实例。
- 从资源菜单的“设置”部分下,选择“服务器参数”。
- 搜索
shared_preload_libraries
参数。 - 选择要添加的库。
:::image type="content" source="./media/concepts-extensions/shared-libraries.png" alt-text="Screenshot showing Azure Database for PostgreSQL -setting shared preload libraries parameter setting for extensions installation." lightbox="./media/concepts-extensions/shared-libraries.png":::
```Using [Azure CLI](/cli/azure/):
You can set `shared_preload_libraries` via CLI [parameter set](/cli/azure/postgres/flexible-server/parameter?view=azure-cli-latest&preserve-view=true) command.
```azurecli
az postgres flexible-server parameter set --resource-group <resource_group> --server-name <server> --subscription <subscription_id> --name shared_preload_libraries --value <extension_name>,<extension_name>
创建扩展
将扩展添加到允许列表并加载它们后,必须在计划使用它们的每个数据库中安装它们。
- 用户必须是
azure_pg_admin
角色的成员才能创建扩展。azure_pg_admin
角色的成员可以向其他用户授予创建扩展的权限。 - 若要安装特定扩展,应运行 CREATE EXTENSION 命令。 此命令将打包的对象加载到数据库中。
注意
Azure Database for PostgreSQL 灵活服务器中提供的第三方扩展是开源许可代码。 目前,我们不提供任何具有高级或专有许可模型的第三方扩展或扩展版本。
Azure Database for PostgreSQL 灵活服务器实例支持一部分重要 PostgreSQL 扩展,如下表中所列。 还可以通过运行 SHOW azure.extensions;
获取此信息。 Azure Database for PostgreSQL 灵活服务器不支持本文档中未列出的扩展。 不能在 Azure Database for PostgreSQL 灵活服务器中创建或加载自己的扩展。
扩展版本
以下扩展在 Azure Database for PostgreSQL 灵活服务器中提供:
注意
下表中带有 ✔️ 标记的扩展要求在 shared_preload_libraries
服务器参数中启用相应的库。
扩展名称 | 描述 | PostgreSQL 17 | PostgreSQL 16 | PostgreSQL 15 | PostgreSQL 14 | PostgreSQL 13 | PostgreSQL 12 | PostgreSQL 11 |
---|---|---|---|---|---|---|---|---|
address_standardizer | 用于将地址分析成构成元素。 通常用于支持地理编码地址规范化步骤。 | 3.5.0 | 3.3.3 | 3.3.1 | 3.2.3 | 3.2.3 | 3.2.3 | 3.2.3 |
address_standardizer_data_us | Address Standardizer US 数据集示例 | 3.5.0 | 3.3.3 | 3.3.1 | 3.2.3 | 3.2.3 | 3.2.3 | 3.2.3 |
年龄(预览版) | 提供图形数据库功能 | 空值 | 1.5.0 ✔️ | 1.5.0 ✔️ | 1.5.0 ✔️ | 1.5.0 ✔️ | 空值 | 空值 |
amcheck | 用于验证关系完整性的函数 | 1.4 | 1.3 | 1.3 | 1.3 | 1.2 | 1.2 | 1.1 |
anon(预览版) | 数据匿名化工具 | 1.3.2 ✔️ | 1.3.2 ✔️ | 1.3.2 ✔️ | 1.3.2 ✔️ | 1.3.2 ✔️ | 1.3.2 ✔️ | 1.3.2 ✔️ |
azure_ai | 适用于 PostgreSQL 的 Azure AI 和 ML 服务集成 | 空值 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | 1.1.0 | 空值 |
azure_storage | 适用于 PostgreSQL 的 Azure 集成 | 空值 | 1.5 ✔️ | 1.5 ✔️ | 1.5 ✔️ | 1.5 ✔️ | 1.5 ✔️ | 空值 |
bloom | Bloom 访问方法 - 基于签名文件的索引 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
btree_gin | 支持在 GIN 中为通用数据类型编制索引 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 |
btree_gist | 支持在 GiST 中为通用数据类型编制索引 | 1.7 | 1.7 | 1.7 | 1.6 | 1.5 | 1.5 | 1.5 |
citext | 不区分大小写的字符串的数据类型 | 1.6 | 1.6 | 1.6 | 1.6 | 1.6 | 1.6 | 1.5 |
cube | 用于多维数据集的数据类型 | 1.5 | 1.5 | 1.5 | 1.5 | 1.4 | 1.4 | 1.4 |
dblink | 从数据库中连接到其他 PostgreSQL 数据库 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
dict_int | 用于整数的文本搜索字典模板 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
dict_xsyn | 用于扩展同义词处理的文本搜索字典模板 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
earthdistance | 计算地球表面上的大圆距离 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
fuzzystrmatch | 确定字符串间的相似性和差异 | 1.2 | 1.2 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
hstore | 用于存储(键/值)对集的数据类型 | 1.8 | 1.8 | 1.8 | 1.8 | 1.7 | 1.6 | 1.5 |
hypopg | 用于 PostgreSQL 的假设索引 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 | 1.4.0 |
intagg | 整数聚合器和枚举器(已过时) | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
intarray | 针对 1-D 整数数组的函数、运算符和索引支持 | 1.5 | 1.5 | 1.5 | 1.5 | 1.3 | 1.2 | 1.2 |
isn | 用于国际产品编号标准的数据类型 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
lo | 大型对象维护 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
login_hook | Login_hook - 用于在登录时执行 login_hook.login() 的挂钩 | 1.5 | 1.5 | 1.4 | 1.4 | 1.4 | 1.4 | 1.4 |
ltree | 用于分层树形结构的数据类型 | 1.3 | 1.2 | 1.2 | 1.2 | 1.2 | 1.1 | 1.1 |
oracle_fdw | 用于 Oracle 数据库的外部数据包装器 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 空值 |
orafce | 函数和运算符,用于模拟 Oracle RDBMS 提供的部分函数和包 | 4.9 | 4.4 | 3.24 | 3.18 | 3.18 | 3.18 | 3.7 |
pageinspect | 在较低级别检查数据库页的内容 | 1.12 | 1.12 | 1.11 | 1.9 | 1.8 | 1.7 | 1.7 |
pgaudit | 提供审核功能 | 16.0 ✔️ | 16.0 ✔️ | 1.7 ✔️ | 1.6.2 ✔️ | 1.5 ✔️ | 1.4.3 ✔️ | 1.3.2 ✔️ |
pg_buffercache | 检查共享缓冲区缓存 | 1.5 | 1.4 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 |
pg_cron | PostgreSQL 的作业计划程序 | 1.6 ✔️ | 1.6 ✔️ | 1.6 ✔️ | 1.6 ✔️ | 1.6 ✔️ | 1.6 ✔️ | 1.4-1 ✔️ |
pgcrypto | 加密函数 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 |
pg_freespacemap | 检查可用空间映射 (FSM) | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
pg_hint_plan | 使得在 SQL 注释中使用所谓的提示微调 PostgreSQL 执行计划成为可能。 | 1.7.0 ✔️ | 1.6.0 ✔️ | 1.5 ✔️ | 1.4 ✔️ | 1.3.7 ✔️ | 1.3.7 ✔️ | 1.3.7 ✔️ |
pglogical | PostgreSQL 逻辑复制 | 2.4.5 ✔️ | 2.4.4 ✔️ | 2.4.2 ✔️ | 2.4.1 ✔️ | 2.4.1 ✔️ | 2.4.1 ✔️ | 2.4.1 ✔️ |
pg_partman | 一种扩展,用于按时间或 ID 管理已分区表 | 5.0.1 ✔️ | 5.0.1 ✔️ | 4.7.1 ✔️ | 4.6.1 ✔️ | 4.5.0 ✔️ | 4.5.0 ✔️ | 4.5.0 ✔️ |
pg_prewarm | Prewarm 关系数据 | 1.2 ✔️ | 1.2 ✔️ | 1.2 ✔️ | 1.2 ✔️ | 1.2 ✔️ | 1.2 ✔️ | 1.2 ✔️ |
pg_repack | 通过极少量的锁重新组织 PostgreSQL 数据库中的表 | 1.4.7 | 1.4.7 | 1.4.7 | 1.4.7 | 1.4.7 | 1.4.7 | 1.4.7 |
pgrouting | PgRouting 扩展 | 空值 | 空值 | 3.5.0 | 3.3.0 | 3.3.0 | 3.3.0 | 3.3.0 |
pgrowlocks | 显示行级别锁定信息 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
pg_squeeze | 用于从关系中移除未使用空间的工具。 | 1.7 ✔️ | 1.6 ✔️ | 1.6 ✔️ | 1.5 ✔️ | 1.5 ✔️ | 1.5 ✔️ | 1.5 ✔️ |
pg_stat_statements | 跟踪已执行的所有 SQL 语句的执行统计信息 | 1.11 ✔️ | 1.10 ✔️ | 1.10 ✔️ | 1.9 ✔️ | 1.8 ✔️ | 1.7 ✔️ | 1.6 ✔️ |
pgstattuple | 显示元组级别统计信息 | 1.5 | 1.5 | 1.5 | 1.5 | 1.5 | 1.5 | 1.5 |
pg_trgm | 基于三元匹配的文本相似度度量和索引搜索 | 1.6 | 1.6 | 1.6 | 1.6 | 1.5 | 1.4 | 1.4 |
pg_visibility | 检查可见性映射 (VM) 和页面级别的可见性信息 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
plpgsql | PL/pgSQL 过程语言 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
plv8 | PL/JavaScript (v8) 信任的过程语言 | 3.1.7 | 3.1.7 | 3.1.7 | 3.0.0 | 3.0.0 | 3.0.0 | 3.0.0 |
postgis | PostGIS 几何与地理空间类型和函数 | 3.5.0 | 3.3.3 | 3.3.1 | 3.2.3 | 3.2.3 | 3.2.3 | 3.2.3 |
postgis_raster | PostGIS 光栅类型和函数 | 3.5.0 | 3.3.3 | 3.3.1 | 3.2.3 | 3.2.3 | 3.2.3 | 3.2.3 |
postgis_sfcgal | PostGIS SFCGAL 函数 | 3.5.0 | 3.3.3 | 3.3.1 | 3.2.3 | 3.2.3 | 3.2.3 | 3.2.3 |
postgis_tiger_geocoder | PostGIS tiger 地理编码器和逆向地理编码器 | 3.5.0 | 3.3.3 | 3.3.1 | 3.2.3 | 3.2.3 | 3.2.3 | 3.2.3 |
postgis_topology | PostGIS 拓扑空间类型和函数 | 3.5.0 | 3.3.3 | 3.3.1 | 3.2.3 | 3.2.3 | 3.2.3 | 3.2.3 |
postgres_fdw | 外部数据包装器,用于远程 PostgreSQL 服务器 | 1.1 | 1.1 | 1.1 | 1.1 | 1.0 | 1.0 | 1.0 |
postgres_protobuf | PostgreSQL 的协议缓冲区 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 空值 |
semver | 语义版本数据类型 | 0.32.1 | 0.32.1 | 0.32.0 | 0.32.0 | 0.32.0 | 0.32.0 | 0.32.0 |
session_variable | Session_variable - 会话变量和常量的注册与操作 | 3.3 | 3.3 | 3.3 | 3.3 | 3.3 | 3.3 | 3.3 |
sslinfo | 有关 SSL 证书的信息 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
tablefunc | 可操作整个表(包括交叉表)的函数 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
tds_fdw | 用于查询 TDS 数据库(Sybase 或 Microsoft SQL Server)的外部数据包装器 | 2.0.3 | 2.0.3 | 2.0.3 | 2.0.3 | 2.0.3 | 2.0.3 | 2.0.3 |
timescaledb | 允许对时序数据进行可缩放的插入和复杂查询 | 空值 | 2.13.0 ✔️ | 2.10.0 ✔️ | 2.10.0 ✔️ | 2.10.0 ✔️ | 2.10.0 ✔️ | 1.7.4 ✔️ |
tsm_system_rows | TABLESAMPLE 方法,接受行数作为限制 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
tsm_system_time | TABLESAMPLE 方法,接受以毫秒为时间单位的限制 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
unaccent | 移除了重音的文本搜索字典 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
uuid ossp | 生成全局唯一标识符 (UUID) | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
vector | 矢量数据类型以及 ivfflat 和 hnsw 访问方法 | 0.7.0 | 0.7.0 | 0.7.0 | 0.7.0 | 0.7.0 | 0.7.0 | 0.5.1 |
升级 PostgreSQL 扩展
通过一个简单的命令就可以就地升级数据库扩展。 此功能使客户能够自动将其第三方扩展更新到最新版本,无需手动操作即可让系统始终是最新的和安全的。
更新扩展
若要将已安装的扩展更新到 Azure 支持的最新发布版本,请使用以下 SQL 命令:
ALTER EXTENSION <extension_name> UPDATE;
此命令允许用户手动升级到 Azure 批准的最新版本,简化了数据库扩展的管理,增强了兼容性和安全性。
限制
虽然更新扩展很简单,但也存在一定的限制:
- 特定版本选择:此命令不支持更新到扩展的中间版本。 它始终会更新到最新可用版本。
- 降级:不支持将扩展降级到以前的版本。 如果需要降级,则可能需要支持部门的帮助,具体取决于以前的版本的可用性。
已安装的扩展
若要列出当前安装在数据库上的扩展,请使用以下 SQL 命令:
SELECT * FROM pg_extension;
可用的扩展及其版本
若要检查哪些版本的扩展可用于当前数据库安装,请查询 pg_available_extensions
系统目录视图。 例如,若要确定可用于 azure_ai
扩展的版本,请执行:
SELECT * FROM pg_available_extensions WHERE name = 'azure_ai';
这些命令可用于对数据库的扩展配置进行必要的了解,有助于高效且安全地维护系统。 由于可以轻松地更新到最新扩展版本,因此 Azure Database for PostgreSQL 用户可以继续对数据库应用程序进行稳健、安全且高效的管理。
特定于 Azure Database for PostgreSQL 灵活服务器的注意事项
下面是在 Azure Database for PostgreSQL 灵活服务器服务中使用时具有特定注意事项的受支持扩展的列表。 此列表按字母顺序排序。
dblink
dblink 允许你从一个 Azure Database for PostgreSQL 灵活服务器实例连接到另一个服务器,或者连接到同一服务器中的另一个数据库。 Azure Database for PostgreSQL 灵活服务器支持任何 PostgreSQL 服务器的传入和传出连接。 发送服务器需要允许到接收服务器的出站连接。 同样,接收服务器需要允许来自发送服务器的连接。
如果计划使用此扩展,建议使用虚拟网络集成部署服务器。 默认情况下,虚拟网络集成支持在虚拟网络中的服务器之间建立连接。 还可以选择使用虚拟网络网络安全组来自定义访问权限。
pg_buffercache
pg_buffercache
可用于研究 shared_buffers 的内容。 使用此扩展,可以判断特定关系是否已缓存(在 shared_buffers
中)。 此扩展可帮助解决性能问题(缓存相关的性能问题)。
此扩展与 PostgreSQL 的核心安装集成,易于安装。
CREATE EXTENSION pg_buffercache;
pg_cron
pg_cron 是一项简单的、基于 cron 的 PostgreSQL 作业计划程序,作为扩展在数据库内运行。 pg_cron
扩展可用于在 PostgreSQL 数据库中运行计划性维护任务。 例如,可以定期运行表清空作业或删除旧的数据作业。
pg_cron
可以并行运行多个作业,但是一次最多只能运行一个作业实例。 如果第二次运行应在第一次运行完成之前开始,则第二次运行将排队,并在第一次运行完成后立即开始。 这样,可以确保作业完全按计划的次数运行,并且不会与自己并发运行。
下面是一些示例:
在星期六凌晨 3:30 (GMT) 删除旧数据。
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
每天上午 10:00 (GMT) 在默认数据库 postgres
中运行清空作业。
SELECT cron.schedule('0 10 * * *', 'VACUUM');
取消 pg_cron
中计划的所有任务。
SELECT cron.unschedule(jobid) FROM cron.job;
查看当前使用 pg_cron
计划的所有作业。
SELECT * FROM cron.job;
每天上午 10:00 (GMT) 在 azure_pg_admin 角色帐户下的数据库“testcron”中运行清空作业。
SELECT cron.schedule_in_database('VACUUM','0 10 * * * ','VACUUM','testcron',null,TRUE);
注意
在 postgres 数据库内的每个 Azure Database for PostgreSQL 灵活服务器的 shared_preload_libraries
中预加载了 pg_cron 扩展,你可以使用它将作业计划为在 Azure Database for PostgreSQL 灵活服务器 DB 实例内的其他数据库中运行,而不会影响安全性。 但是,出于安全原因,仍必须允许列出 pg_cron
扩展并使用 CREATE EXTENSION 命令安装它。
从 pg_cron
版本 1.4 开始,可以使用 cron.schedule_in_database
和 cron.alter_job
函数在特定数据库中安排作业并分别更新现有计划。
以下是一些示例:
在星期六凌晨 3:30 (GMT) 删除数据库 DBName 的旧数据。
SELECT cron.schedule_in_database('JobName', '30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$,'DBName');
注意
cron_schedule_in_database
函数允许将用户名作为可选参数。 将用户名设置为非 null 值需要 PostgreSQL 超级用户特权,并且在 Azure Database for PostgreSQL 灵活服务器中不受支持。 前面的示例显示了运行此函数(可选用户名参数被忽略或设置为 null),该参数在用户计划作业的上下文中运行作业,该作业应具有 azure_pg_admin 角色特权。
更新或更改现有计划的数据库名称
SELECT cron.alter_job(job_id:=MyJobID,database:='NewDBName');
pg_failover_slots
使用启用了逻辑复制和高可用性的服务器运行时,PG 故障转移槽扩展可增强 Azure Database for PostgreSQL 灵活服务器的功能。 这样可有效解决在故障转移后不保留逻辑复制槽的标准 PostgreSQL 引擎中的难题。 维护这些槽对于防止复制在主服务器角色更改期间暂停或数据不匹配至关重要,这样能确保操作连续性和数据完整性。
该扩展通过管理复制槽所需的传输、清理和同步来简化故障转移过程,从而在服务器角色更改期间实现无缝转换。 PostgreSQL 版本 11 到 16 支持该扩展。
可以在其 GitHub 页上找到详细信息以及 PG 故障转移槽扩展的使用方法。
启用 pg_failover_slots
若要为 Azure Database for PostgreSQL 灵活服务器实例启用 PG 故障转移槽扩展,需要通过在服务器的共享预加载库中包含扩展并调整特定服务器参数来修改服务器的配置。 下面介绍了该过程:
- 通过更新
shared_preload_libraries
参数,将pg_failover_slots
添加到服务器的共享预加载库。 - 将服务器参数
hot_standby_feedback
更改为on
。
对 shared_preload_libraries
参数所做的任何更改都需要重启服务器才能生效。
使用 Azure 门户:
- 选择 Azure Database for PostgreSQL 灵活服务器实例。
- 从资源菜单的“设置”部分下,选择“服务器参数”。
- 搜索
shared_preload_libraries
参数并编辑其值以包括pg_failover_slots
。 - 搜索
hot_standby_feedback
参数并将其值设置为on
。 - 选择“保存”以保留所做的更改。 现在可以选择“保存并重启”选项。 选择此选项可确保更改生效,因为修改
shared_preload_libraries
需要重启服务器。
通过选择“保存并重启”,服务器将自动重新启动并应用刚才所做的更改。 服务器重新联机后,PG 故障转移槽扩展在主要 Azure Database for PostgreSQL 灵活服务器实例上会处于已启用且可运行状态,可用于处理故障转移期间的逻辑复制槽。
pg_hint_plan
pg_hint_plan
使得在 SQL 注释中使用所谓的“提示”微调 PostgreSQL 执行计划成为可能,例如:
/*+ SeqScan(a) */
pg_hint_plan
读取随目标 SQL 语句提供的特殊形式的注释中的提示短语。 特殊形式以字符序列“/*+”开头,以“*/”结尾。 提示短语由提示名称和以下参数组成,用括号括起来,用空格分隔。 每个提示短语可以由新行分隔,以便于阅读。
示例:
/*+
HashJoin(a b)
SeqScan(a)
*/
SELECT *
FROM pgbench_branches b
JOIN pgbench_accounts an ON b.bid = a.bid
ORDER BY a.aid;
上面的示例会导致计划工具将表 a 上 seq scan
的结果与表 b 组合为 hash join
。
如如何使用 PostgreSQL 扩展中所示,若要安装 pg_hint_plan,除了将其添加到允许列表之外,还需将其包括在服务器的共享预加载库中。 更改 Postgres 的 shared_preload_libraries
参数需要服务器重启才能生效。 可以使用 Azure 门户或 Azure CLI 更改参数。
使用 Azure 门户:
- 选择 Azure Database for PostgreSQL 灵活服务器实例。
- 从资源菜单的“设置”部分下,选择“服务器参数”。
- 搜索
shared_preload_libraries
参数并编辑其值以包括pg_hint_plan
。 - 选择“保存”以保留所做的更改。 现在可以选择“保存并重启”选项。 选择此选项可确保更改生效,因为修改
shared_preload_libraries
需要重启服务器。 你现在可以在 Azure Database for PostgreSQL 灵活服务器数据库中启用 pg_hint_plan。 连接到数据库并发出以下命令:
CREATE EXTENSION pg_hint_plan;
pg_prewarm
pg_prewarm
扩展可将关系数据加载到缓存中。 预热缓存意味着查询在重启后第一次运行时响应时间更短。 自动预热功能当前在 Azure Database for PostgreSQL 灵活服务器中不可用。
pg_repack
当人们第一次尝试使用这个扩展时,他们会问一个典型的问题:pg_repack 是一个扩展还是像 psql 或 pg_dump 这样的客户端可执行文件?
答案是它实际上两者都是。 pg_repack/lib 保存着扩展的代码,包括它创建的架构和 SQL 项目,以及实现其中几个函数的代码的 C 库。 另一方面,pg_repack/bin 保存着客户端应用程序的代码,该应用程序知道如何与扩展创建的可编程性项目进行交互。 此客户端应用程序通过向用户提供一些更易于理解的命令行选项,尽量减轻与服务器端扩展所呈现的不同界面进行交互的复杂性。 如果不在客户端应用程序的目标数据库上创建该扩展,则客户端应用程序没有用处。 服务器端扩展本身具有完整功能,但需要用户理解复杂的交互模式,该模式包括执行查询来检索数据以用作扩展实现的函数的输入。
架构重新打包权限被拒绝
目前,受限于我们向此扩展创建的重新打包模式授予权限的方式,仅支持从 azure_pg_admin
的上下文运行 pg_repack 功能。
你可能会注意到,如果表的所有者(不是 azure_pg_admin
)尝试运行 pg_repack,则最终会收到如下所示的错误:
NOTICE: Setting up workers.conns
ERROR: pg_repack failed with error: ERROR: permission denied for schema repack
LINE 1: select repack.version(), repack.version_sql()
若要避免该错误,请确保从 azure_pg_admin
的上下文运行 pg_repack。
pg_stat_statements
pg_stat_statements 扩展提供已在数据库上运行的所有查询的视图。 这对于了解查询工作负载在生产系统上的性能很有用。
pg_stat_statements 扩展已预加载到每个 Azure Database for PostgreSQL 灵活服务器实例上的 shared_preload_libraries
中,以便为你提供跟踪 SQL 语句执行统计信息的方法。
但是,出于安全原因,你仍然必须将 允许列表 pg_stat_statements 扩展添加到并使用 CREATE EXTENSION 命令安装它。
设置 pg_stat_statements.track
,它可以控制哪些语句由扩展计数,默认为 top
,这意味着跟踪所有由客户端直接发布的语句。 另外两个跟踪级别为 none
和 all
。 此设置可作为服务器参数配置。
pg_stat_statements
提供的查询执行信息与记录每个 SQL 语句时对服务器性能的影响之间存在权衡。 如果不经常使用 pg_stat_statements
扩展,建议将 pg_stat_statements.track
设置为 none
。 某些第三方监视服务可能依赖 pg_stat_statements
来提供查询性能见解,因此,请确认这是否适合你。
postgres_fdw
postgres_fdw 允许你从一个 Azure Database for PostgreSQL 灵活服务器实例连接到另一个服务器,或者连接到同一服务器中的另一个数据库。 Azure Database for PostgreSQL 灵活服务器支持任何 PostgreSQL 服务器的传入和传出连接。 发送服务器需要允许到接收服务器的出站连接。 同样,接收服务器需要允许来自发送服务器的连接。
如果计划使用此扩展,建议使用虚拟网络集成部署服务器。 默认情况下,虚拟网络集成支持在虚拟网络中的服务器之间建立连接。 还可以选择使用虚拟网络网络安全组来自定义访问权限。
pgstattuple
使用“pgstattuple”扩展尝试从 Postgres 11 至 13 版本中保留的 pg_toast
架构中的对象获取元组统计信息时,将收到“架构 pg_toast 权限被拒绝”错误。
架构 pg_toast 权限被拒绝
在适用于灵活服务器的 Azure Database 上使用 PostgreSQL 版本 11 到 13 的客户不能对 pg_toast
架构中的对象使用 pgstattuple
扩展。
在 PostgreSQL 16 和 17 中,pg_read_all_data
角色会自动授予 azure_pg_admin
,从而允许 pgstattuple
正常运行。 在 PostgreSQL 14 和 15 中,客户可以手动授予 azure_pg_admin
pg_read_all_data
角色以实现相同的结果。 但是,在 PostgreSQL 11 到 13 中,pg_read_all_data
角色不存在。
客户无法直接授予所需的权限。 如果需要能够运行 pgstattuple
以访问 pg_toast
架构下的对象,请继续创建 Azure 支持请求。
TimescaleDB
TimescaleDB 是一个时序数据库,已作为 PostgreSQL 的扩展打包。 TimescaleDB 提供以时间为导向的分析功能、优化,并根据时序工作负荷来缩放 Postgres。 详细了解 TimescaleDB,它是 Timescale Inc. 的注册商标。Azure Database for PostgreSQL 灵活服务器提供 TimescaleDB Apache-2 版本。
安装 TimescaleDB
若要安装 TimescaleDB,除了允许列出它之外(如上所示),还需将其包括在服务器的共享预加载库中。 更改 Postgres 的 shared_preload_libraries
参数需要shared_preload_libraries
才能生效。 可以使用 Azure 门户或 Azure CLI 更改参数。
使用 Azure 门户:
- 选择 Azure Database for PostgreSQL 灵活服务器实例。
- 从资源菜单的“设置”部分下,选择“服务器参数”。
- 搜索
shared_preload_libraries
参数并编辑其值以包括TimescaleDB
。 - 选择“保存”以保留所做的更改。 现在可以选择“保存并重启”选项。 选择此选项可确保更改生效,因为修改
shared_preload_libraries
需要重启服务器。 你现在可以在 Azure Database for PostgreSQL 灵活服务器数据库中启用 TimescaleDB。 连接到数据库并发出以下命令:
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
提示
如果看到错误,请确认是否已在保存 shared_preload_libraries 后重启服务器。
现在可以从头开始创建 TimescaleDB hypertable,也可以迁移 PostgreSQL 中的现有时序数据。
使用 pg_dump 和 pg_restore 还原 Timescale 数据库
若要使用 pg_dump 和 pg_restore 还原 Timescale 数据库,必须在目标数据库中运行两个帮助程序过程:timescaledb_pre_restore()
和 timescaledb_post restore()
。
首先,准备目标数据库:
--create the new database where you want to perform the restore
CREATE DATABASE tutorial;
\c tutorial --connect to the database
CREATE EXTENSION timescaledb;
SELECT timescaledb_pre_restore();
现在,你可在原始数据库上运行 pg_dump,然后执行 pg_restore。 还原后,请确保在还原的数据库中运行以下命令:
SELECT timescaledb_post_restore();
有关已启用时间刻度的数据库的还原方法的更多详细信息,请参阅时间刻度文档。
使用 timescaledb-backup 还原 Timescale 数据库
运行上面列出的 SELECT timescaledb_post_restore()
过程时,可能会在更新 timescaledb.restoring 标记时出现权限被拒绝错误。 这是因为 Cloud PaaS 数据库服务中的 ALTER DATABASE 权限有限。 在这种情况下,可以使用 timescaledb-backup
工具来备份和还原 Timescale 数据库,以执行替代方法。 timescaledb-backup 程序使转储和还原 TimescaleDB 数据库的过程更简单、更不易出错且更高效。
为此,应执行以下操作
- 安装工具,详细信息见此处
- 创建目标 Azure Database for PostgreSQL 灵活服务器实例和数据库
- 按如上所述启用 Timescale 扩展
- 向使用 ts-restore 的用户授予
azure_pg_admin
角色 - 运行 ts-restore 还原数据库
有关这些实用工具的更多详细信息,请参阅此处。
扩展和主版本升级
Azure Database for PostgreSQL 灵活服务器引入了主版本就地升级功能,它让你只需单击一下就可对 Azure Database for PostgreSQL 灵活服务器实例执行就地升级。 主版本就地升级简化了 Azure Database for PostgreSQL 灵活服务器升级过程,这最大限度地减少了访问服务器的用户和应用程序遭遇中断的次数。 主版本就地升级不支持特定扩展,并且在升级某些扩展时存在一些限制。 使用主版本就地更新功能时,所有 Azure Database for PostgreSQL 灵活服务器版本都不支持 anon、Apache AGE、dblink、orafce、pgaudit、postgres_fdw 和 Timescaledb 扩展。