管理 RDS 代理 - Amazon Relational Database Service

管理 RDS 代理

本节提供有关如何管理 RDS 代理操作和配置的信息。这些过程可帮助您的应用程序最有效地利用数据库连接,并实现最大程度的连接重用。您越多地利用连接重用,就可以节省越多的 CPU 和内存开销。这进而减少了应用程序的延迟,使数据库能够将更多资源用于处理应用程序请求。

修改 RDS 代理

您可以在创建代理后更改与代理关联的特定设置。可通过修改代理本身和/或其关联的目标组来执行此操作。每个代理都有一个关联的目标组。

重要

Client authentication type(客户端身份验证类型)和 IAM authentication(IAM 身份验证)字段中的值适用于与此代理关联的所有 Secrets Manager 密钥。要为每个密钥指定不同的值,请使用 AWS CLI 或改用 API 来修改代理。

修改代理的设置
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在导航窗格中,选择 Proxies (代理)

  3. 在代理列表中,选择要修改其设置的代理或转到其详细信息页面。

  4. 对于 Actions (操作),选择 Modify (修改)

  5. 输入或选择要修改的属性。您可以指定如下内容:

    • 代理标识符 – 通过输入新标识符来重命名代理。

    • 空闲客户端连接超时 - 输入空闲客户端连接超时的时间段。

    • IAM 角色 – 更改用于从 Secrets Manager 中检索密钥的 IAM 角色。

    • Secrets Manager 密钥 - 添加或删除 SSecrets Manager 密钥。这些密钥对应于数据库用户名和密码。

    • Client authentication type(客户端身份验证类型)-(仅限 PostgreSQL)更改客户端与代理的连接的身份验证类型。

    • IAM authentication(IAM 身份验证)– 要求或禁止对与代理的连接进行 IAM 身份验证。

    • 需要传输层安全性 - 打开或关闭传输层安全性 (TLS) 的要求。

    • VPC 安全组 - 添加或删除供代理使用的 VPC 安全组。

    • 启用增强型日志记录 - 启用或禁用增强型日志记录。

  6. 选择修改

如果您找不到要更改的列出设置,请使用以下过程更新代理的目标组。与代理关联的目标组控制与物理数据库连接相关的设置。每个代理都有一个名为 default 的关联目标组,该目标组与代理一起自动创建。

您只能从代理详细信息页面修改目标组,而不能从 Proxies (代理) 页面上的列表中进行修改。

修改代理目标组的设置
  1. Proxies (代理) 页面上,转到代理的详细信息页面。

  2. 对于 Target groups (目标组),选择 default 链接。目前,所有代理都有一个名为 default 的目标组。

  3. 默认目标组的详细信息页面上,选择 Modify (修改)

  4. 为您可以修改的属性选择新设置:

    • 数据库 – 选择不同的 RDS 数据库实例或集群

    • 连接池最大连接数 – 调整代理可使用的最大可用连接的百分比。

    • 会话固定筛选条件 -(可选)选择会话固定筛选条件。这绕过了跨客户端多路复用数据库连接的默认安全措施。目前,PostgreSQL 不支持该设置。唯一的选择是 EXCLUDE_VARIABLE_SETS

      启用此设置可能会导致一个连接的会话变量影响其它连接。如果您的查询依赖于在当前事务之外设置的会话变量值,则可能会导致错误或正确性问题。在确认您的应用程序可以安全地跨客户端连接共享数据库连接之后,请考虑使用此选项。

      可以认为以下模式是安全的:

      • SET 语句,其中有效会话变量值没有更改,即没有更改会话变量。

      • 您可以更改会话变量值并在同一个事务中执行一条语句。

      有关更多信息,请参阅 避免固定

    • 连接借用超时 - 调整连接借用超时间隔。当最大连接数已用于代理时,此设置适用。该设置确定在返回超时错误之前代理等待连接可用的时间。

    • 初始化查询 - (可选)添加初始化查询或修改当前查询。您可以为代理指定一个或多个 SQL 语句,以便在打开每个新数据库连接时运行。设置通常与 SET 语句一起使用,以确保每个连接具有相同的设置,如时区和字符集。对于多个语句,请使用分号作为分隔符。您还可以在单个 SET 语句中包含多个变量,例如 SET x=1, y=2

    不能更改某些属性,例如,目标组标识符和数据库引擎。

  5. 选择 Modify target group (修改目标组)

要使用 AWS CLI 修改代理,请使用 modify-db-proxymodify-db-proxy-target-groupderegister-db-proxy-targetsregister-db-proxy-targets 命令。

使用 modify-db-proxy 命令,您可以更改以下属性:

  • 代理使用的一组 Secrets Manager 密钥。

  • 是否需要 TLS。

  • 空闲客户端超时。

  • 是否记录 SQL 语句中的其他信息以进行调试。

  • 用于检索 Secrets Manager 密钥的 IAM 角色。

  • 代理使用的安全组。

以下示例演示了如何重命名现有代理。

aws rds modify-db-proxy --db-proxy-name the-proxy --new-db-proxy-name the_new_name

要修改与连接相关的设置或重命名目标组,请使用 modify-db-proxy-target-group 命令。目前,所有代理都有一个名为 default 的目标组。使用此目标组时,请指定代理的名称,并指定 default 作为目标组的名称。

以下示例演示了如何首先检查代理的 MaxIdleConnectionsPercent 设置,然后使用目标组对其进行更改。

aws rds describe-db-proxy-target-groups --db-proxy-name the-proxy { "TargetGroups": [ { "Status": "available", "UpdatedDate": "2019-11-30T16:49:30.342Z", "ConnectionPoolConfig": { "MaxIdleConnectionsPercent": 50, "ConnectionBorrowTimeout": 120, "MaxConnectionsPercent": 100, "SessionPinningFilters": [] }, "TargetGroupName": "default", "CreatedDate": "2019-11-30T16:49:27.940Z", "DBProxyName": "the-proxy", "IsDefault": true } ] } aws rds modify-db-proxy-target-group --db-proxy-name the-proxy --target-group-name default --connection-pool-config ' { "MaxIdleConnectionsPercent": 75 }' { "DBProxyTargetGroup": { "Status": "available", "UpdatedDate": "2019-12-02T04:09:50.420Z", "ConnectionPoolConfig": { "MaxIdleConnectionsPercent": 75, "ConnectionBorrowTimeout": 120, "MaxConnectionsPercent": 100, "SessionPinningFilters": [] }, "TargetGroupName": "default", "CreatedDate": "2019-11-30T16:49:27.940Z", "DBProxyName": "the-proxy", "IsDefault": true } }

使用 deregister-db-proxy-targetsregister-db-proxy-targets 命令,您可以通过相应的目标组来更改代理关联的 RDS 数据库实例。目前,每个代理都可以连接到一个 RDS 数据库实例。目标组可跟踪多可用区配置中所有 RDS 数据库实例的连接详细信息。

以下示例首先介绍了与名为 cluster-56-2020-02-25-1399 的 Aurora MySQL 集群关联的代理。该示例演示了如何更改代理,以便连接到名为 provisioned-cluster 的不同集群。

使用 RDS 数据库实例时,请指定 --db-instance-identifier 选项。

以下示例修改 Aurora MySQL 代理。Aurora PostgreSQL 代理具有端口 5432。

aws rds describe-db-proxy-targets --db-proxy-name the-proxy { "Targets": [ { "Endpoint": "instance-9814.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-9814" }, { "Endpoint": "instance-8898.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-8898" }, { "Endpoint": "instance-1018.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-1018" }, { "Type": "TRACKED_CLUSTER", "Port": 0, "RdsResourceId": "cluster-56-2020-02-25-1399" }, { "Endpoint": "instance-4330.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-4330" } ] } aws rds deregister-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier cluster-56-2020-02-25-1399 aws rds describe-db-proxy-targets --db-proxy-name the-proxy { "Targets": [] } aws rds register-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier provisioned-cluster { "DBProxyTargets": [ { "Type": "TRACKED_CLUSTER", "Port": 0, "RdsResourceId": "provisioned-cluster" }, { "Endpoint": "gkldje.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "gkldje" }, { "Endpoint": "provisioned-1.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "provisioned-1" } ] }

要使用 RDS API 修改代理,请使用 ModifyDBProxyModifyDBProxyTargetGroupDeregisterDBProxyTargetsRegisterDBProxyTargets 操作。

使用 ModifyDBProxy,您可以更改以下属性:

  • 代理使用的一组 Secrets Manager 密钥。

  • 是否需要 TLS。

  • 空闲客户端超时。

  • 是否记录 SQL 语句中的其他信息以进行调试。

  • 用于检索 Secrets Manager 密钥的 IAM 角色。

  • 代理使用的安全组。

使用 ModifyDBProxyTargetGroup,您可以修改与连接相关的设置或重命名目标组。目前,所有代理都有一个名为 default 的目标组。使用此目标组时,请指定代理的名称,并指定 default 作为目标组的名称。

使用 DeregisterDBProxyTargetsRegisterDBProxyTargets,您可以通过相应的目标组来更改代理关联的 RDS 数据库实例。目前,每个代理都可以连接到一个 RDS 数据库实例。目标组可跟踪多可用区配置中的所有 RDS 数据库实例的连接详细信息。

添加新数据库用户

在某些情况下,您可能会将新数据库用户添加到与代理关联的 RDS 数据库实例或集群。如果是这样,请添加 Secrets Manager 密钥或调整其用途,以存储该用户的凭证。为此,请选择以下选项之一:

  1. 使用 在 AWS Secrets Manager 中设置数据库凭证 中描述的过程创建新 Secrets Manager 密钥。

  2. 更新 IAM 角色以授予 RDS Proxy 对新 Secrets Manager 密钥的访问权限。为此,请更新 IAM 角色策略的资源部分。

  3. 修改 RDS 代理,以在 Secrets Manager 密钥下添加新的 Secrets Manager 密钥。

  4. 如果新用户取代了现有用户,请更新存储在代理的 Secrets Manager 密钥中的现有用户的凭证。

向 PostgreSQL 数据库添加新数据库用户

将新用户添加到 PostgreSQL 数据库时,如果有,请运行以下命令:

REVOKE CONNECT ON DATABASE postgres FROM PUBLIC;

rdsproxyadmin 用户授予 CONNECT 权限,以便用户可以监控目标数据库上的连接。

GRANT CONNECT ON DATABASE postgres TO rdsproxyadmin;

还可以通过将上述命令中的 rdsproxyadmin 更改为其他目标数据库用户,来允许该数据库用户执行运行状况检查。

更改数据库用户的密码

在某些情况下,您可能会更改与代理关联的 RDS 数据库实例中的数据库用户的密码。如果是这样,请使用新密码更新相应的 Secrets Manager 密钥。

客户端和数据库连接

从您的应用程序到 RDS 代理的连接称为客户端连接。从代理到数据库的连接则称为数据库连接。使用 RDS 代理时,客户端连接在代理处终止,而数据库连接则在 RDS 代理中进行管理。

应用程序端连接池可以减少在应用程序与 RDS 代理之间重复建立连接。

在实现应用程序端连接池之前,请考虑以下配置方面:

  • 客户端连接最长期限:RDS 代理强制规定客户端连接的最长期限为 24 小时。此值不可配置。将池配置为最长连接期限小于 24 小时,以免客户端连接意外中断。

  • 客户端连接空闲超时:RDS 代理强制规定客户端连接的最长空闲时间。为池配置的空闲连接超时值要小于 RDS 代理的客户端连接空闲超时设置,以免连接意外中断。

在应用程序端连接池中配置的最大客户端连接数不必限制为 RDS 代理的 max_connections 设置。

客户端连接池可延长客户端连接期限。如果您的连接遇到固定问题,则池化客户端连接可能会降低多路复用效率。已固定但在应用程序端连接池中处于空闲状态的客户端连接会继续保持数据库连接,并防止数据库连接被其它客户端连接重复使用。查看您的代理日志,以检查您的连接是否遇到固定问题。

注意

当数据库连接不再使用时,RDS 代理会在 24 小时后的某个时间关闭数据库连接。无论最大空闲连接设置的值如何,代理都会执行此操作。

配置连接设置

若要调整 RDS Proxy 的连接池,您可以修改以下设置:

IdleClientTimeout

您可以指定在代理关闭客户端连接之前,客户端连接可以处于空闲状态的时长。默认值为 1800 秒(30 分钟)。

如果应用程序未在上一请求完成后的指定时间内提交新请求,则将客户端连接视为空闲。底层数据库连接保持打开状态并返回到连接池。因此,它可以重复用于新的客户端连接。如果希望代理主动删除过时的连接,则降低空闲客户端连接超时。如果工作负载与代理建立频繁连接,则增加空闲客户端连接超时,以便节省建立连接的成本。

此设置由 RDS 控制台中的 Idle client connection timeout(空闲客户端连接超时)字段以及 AWS CLI 和 API 中的 IdleClientTimeout 设置表示。要了解如何在 RDS 控制台中更改 Idle client connection timeout(空闲客户端连接超时)字段的值,请参阅 AWS Management Console。要了解如何更改 IdleClientTimeout 设置的值,请参阅 CLI 命令 modify-db-proxy 或 API 操作 ModifyDBProxy

MaxConnectionsPercent

您可以限制 RDS 代理可与目标数据库建立的连接数。请将限制指定为数据库可用的最大连接数的百分比。此设置由 RDS 控制台中的 Connection pool maximum connections(连接池最大连接数)字段以及 AWS CLI 和 API 中的 MaxConnectionsPercent 设置表示。

对于目标组使用的 RDS 数据库实例MaxConnectionsPercent 值以 max_connections 设置的百分比表示。代理不会提前创建所有连接。此设置允许代理在工作负载需要时建立这些连接。

例如,对于 max_connections 设置为 1000 且 MaxConnectionsPercent 设置为 95 的注册数据库目标,RDS 代理将 950 个连接设置为与该数据库目标的并行连接的上限。

工作负载达到允许的最大数据库连接数的一个常见副作用是总体查询延迟增加,同时 DatabaseConnectionsBorrowLatency 指标也会增加。您可以通过比较 DatabaseConnectionsMaxDatabaseConnectionsAllowed 指标来监控当前使用的数据库连接数和允许的数据库连接总数。

设置此参数时,请注意以下最佳实践:

  • 为工作负载模式的变化留出足够的连接余量。建议将该参数设置为比最近监控的最大使用量高出至少 30%。由于 RDS 代理在多个节点之间重新分配数据库连接限额,因此,内部容量更改可能需要至少 30% 的余量来增加连接,以避免增加借用延迟。

  • RDS 代理保留一定数量的连接用于主动监控,以支持快速失效转移、流量路由和内部操作。MaxDatabaseConnectionsAllowed 指标不包括这些预留连接。该指标表示可用于为工作负载提供服务的连接数,可以低于从 MaxConnectionsPercent 设置得出的值。

    推荐的最低 MaxConnectionsPercent

    • db.t3.small:30

    • db.t3.medium 或更大:20

要了解如何在 RDS 控制台中更改 Connection pool maximum connections(连接池最大连接数)字段的值,请参阅 AWS Management Console。要了解如何更改 MaxConnectionsPercent 设置的值,请参阅 CLI 命令 modify-db-proxy-target-group 或 API 操作 ModifyDBProxyTargetGroup

有关数据库连接限制的更多信息,请参阅数据库最大连接数

MaxIdleConnectionsPercent

您可以控制 RDS Proxy 可在连接池中保留的空闲数据库连接数。默认情况下,如果连接五分钟内没有活动,RDS 代理会将其池中的数据库连接视为空闲

请将限制指定为数据库可用的最大连接数的百分比。原定设置值为 MaxConnectionsPercent 的 50%,上限为 MaxConnectionsPercent 的值。对于高值,代理会将较高百分比的空闲数据库连接保持在打开状态。对于低值,代理会关闭较高百分比的空闲数据库连接。如果您的工作负载不可预测,请考虑为 MaxIdleConnectionsPercent 设置较高的值。这样做意味着 RDS 代理可以在不打开大量新数据库连接的情况下适应活动的突增。

此设置由 AWS CLI 和 API 中 DBProxyTargetGroupMaxIdleConnectionsPercent 设置表示。要了解如何更改 MaxIdleConnectionsPercent 设置的值,请参阅 CLI 命令 modify-db-proxy-target-group 或 API 操作 ModifyDBProxyTargetGroup

有关数据库连接限制的更多信息,请参阅数据库最大连接数

ConnectionBorrowTimeout

您可以选择 RDS Proxy 在返回超时错误之前等待连接池中数据库连接可用的时间。默认值为 120 秒。此设置适用于连接数达到最大而导致连接池中没有可用连接的情况。当没有适当的数据库实例可用于处理请求时,例如当失效转移操作正在进行时,它也适用。通过使用此设置,您可以为应用程序设置最佳等待期,而无需更改应用程序代码中的查询超时。

此设置由 RDS Proxy 控制台中的 Connection borrow timeout(连接借用超时)字段、ConnectionBorrowTimeoutDBProxyTargetGroup 的 AWS CLI 设置或 API 表示。要了解如何在 RDS 控制台中更改 Connection borrow timeout(连接借用超时)字段的值,请参阅 AWS Management Console。要了解如何更改 ConnectionBorrowTimeout 设置的值,请参阅 CLI 命令 modify-db-proxy-target-group 或 API 操作 ModifyDBProxyTargetGroup

避免固定

当数据库请求不依赖于先前请求的状态信息时,多路复用效率更高。在这种情况下,RDS Proxy 可以在每个事务结束时重用连接。此类状态信息的示例包括可通过 SETSELECT 语句更改的大多数变量和配置参数。默认情况下,客户端连接上的 SQL 事务可以在底层数据库连接之间多路复用。

与代理的连接可以进入一种称为固定的状态。固定连接后,每个后续事务将使用相同的底层数据库连接,直到会话结束。在会话结束之前,其他客户端连接也不能重用该数据库连接。客户端连接断开时,会话结束。

当 RDS Proxy 检测到不适合其他会话的会话状态更改时,它会自动将客户端连接固定到特定的数据库连接。固定降低了连接重用的有效性。如果您的所有连接或几乎所有连接都遇到固定,请考虑修改应用程序代码或工作负载,以减少导致固定的条件。

例如,您的应用程序更改了会话变量或配置参数。在这种情况下,后面的语句可能依赖于新变量或参数来生效。因此,当 RDS 代理处理更改会话变量或配置设置的请求时,它会将该会话固定到数据库连接。这样,会话状态对于同一会话中的所有后续事务仍然有效。

对于某些数据库引擎,此规则并不适用于您可以设置的全部参数。RDS 代理会跟踪某些语句和变量。因此,在您修改这些内容时,RDS 代理不会固定会话。在这种情况下,RDS 代理仅将连接重用于具有相同设置值的其他会话。有关 RDS 代理针对数据库引擎跟踪的内容的详细信息,请参阅以下内容:

RDS 代理针对 RDS for SQL Server 数据库跟踪的内容

以下是 RDS 代理跟踪的 SQL Server 语句:

  • USE

  • SET ANSI_NULLS

  • SET ANSI_PADDING

  • SET ANSI_WARNINGS

  • SET ARITHABORT

  • SET CONCAT_NULL_YIELDS_NULL

  • SET CURSOR_CLOSE_ON_COMMIT

  • SET DATEFIRST

  • SET DATEFORMAT

  • SET LANGUAGE

  • SET LOCK_TIMEOUT

  • SET NUMERIC_ROUNDABORT

  • SET QUOTED_IDENTIFIER

  • SET TEXTSIZE

  • SET TRANSACTION ISOLATION LEVEL

RDS 代理针对 RDS for MariaDB 数据库和 RDS for MySQL 数据库跟踪的内容

以下是 RDS 代理跟踪的 MariaDB 和 MySQL 语句:

  • DROP DATABASE

  • DROP SCHEMA

  • USE

以下是 RDS 代理跟踪的 MySQL 和 MariaDB 变量:

  • AUTOCOMMIT

  • AUTO_INCREMENT_INCREMENT

  • CHARACTER SET (or CHAR SET)

  • CHARACTER_SET_CLIENT

  • CHARACTER_SET_DATABASE

  • CHARACTER_SET_FILESYSTEM

  • CHARACTER_SET_CONNECTION

  • CHARACTER_SET_RESULTS

  • CHARACTER_SET_SERVER

  • COLLATION_CONNECTION

  • COLLATION_DATABASE

  • COLLATION_SERVER

  • INTERACTIVE_TIMEOUT

  • NAMES

  • NET_WRITE_TIMEOUT

  • QUERY_CACHE_TYPE

  • SESSION_TRACK_SCHEMA

  • SQL_MODE

  • TIME_ZONE

  • TRANSACTION_ISOLATION (or TX_ISOLATION)

  • TRANSACTION_READ_ONLY (or TX_READ_ONLY)

  • WAIT_TIMEOUT

最大限度地减少固定

RDS 代理的性能优化包括尝试通过最小化固定来最大化事务级别连接重用(多路复用)。

您可以执行以下步骤以最大限度地减少固定:

  • 避免可能导致固定的不必要的数据库请求。

  • 在所有连接中一致地设置变量和配置设置。这样,后续会话更有可能重用具有这些特定设置的连接。

    但是,对于 PostgreSQL 设置,变量会导致会话固定。

  • 对于 MySQL 引擎系列数据库,可将会话固定筛选条件应用于代理。您可以免除某些类型的操作,使其不固定会话(如果您知道这样做不会影响应用程序的正确操作)。

  • 通过监控 Amazon CloudWatch 指标 DatabaseConnectionsCurrentlySessionPinned 来查看固定的发生频率。有关该指标和其他 CloudWatch 指标的信息,请参阅 使用 Amazon CloudWatch 监控 RDS Proxy 指标

  • 如果您使用 SET 语句为每个客户端连接执行相同的初始化,则可以在保留事务级别多路复用的同时执行此操作。在这种情况下,您将设置初始会话状态的语句移动到由代理使用的初始化查询中。该属性是一个字符串,包含一个或多个 SQL 语句(用分号分隔)。

    例如,您可以为设置特定配置参数的代理定义初始化查询。然后,每当为该代理设置新连接时,RDS Proxy 都会应用这些设置。您可以从应用程序代码中删除相应的 SET 语句,这样,它们就不会干扰事务级别多路复用。

    有关代理的固定发生频率的指标,请参阅 使用 Amazon CloudWatch 监控 RDS Proxy 指标

导致对所有引擎系列进行固定的条件

对于以下情况(其中多路复用可能会导致意外行为),代理将会话固定到当前连接:

  • 文本大小大于 16 KB 的任何语句都会导致代理固定会话。

导致对 RDS for Microsoft SQL Server 进行固定的条件

对于 RDS for SQL Server,以下交互也会导致固定:

  • 使用多个活动的结果集(MARS)。有关 MARS 的信息,请参阅 SQL Server 文档。

  • 使用分布式事务协调器(DTC)通信。

  • 创建临时表、事务、游标或预准备语句。

  • 使用以下 SET 语句:

    • SET ANSI_DEFAULTS

    • SET ANSI_NULL_DFLT

    • SET ARITHIGNORE

    • SET DEADLOCK_PRIORITY

    • SET FIPS_FLAGGER

    • SET FMTONLY

    • SET FORCEPLAN

    • SET IDENTITY_INSERT

    • SET NOCOUNT

    • SET NOEXEC

    • SET OFFSETS

    • SET PARSEONLY

    • SET QUERY_GOVERNOR_COST_LIMIT

    • SET REMOTE_PROC_TRANSACTIONS

    • SET ROWCOUNT

    • SET SHOWPLAN_ALLSHOWPLAN_TEXTSHOWPLAN_XML

    • SET STATISTICS

    • SET XACT_ABORT

导致对 RDS for MariaDB 和 RDS for MySQL 进行固定的条件

对于 MariaDB 和 MySQL,以下交互也会导致固定:

  • 显式表锁定语句 LOCK TABLELOCK TABLESFLUSH TABLES WITH READ LOCK 会导致代理固定会话。

  • 通过使用 GET_LOCK 创建命名锁会导致代理固定会话。

  • 设置用户变量或系统变量(有些例外)会导致代理固定会话。如果这种情况过多地减少了连接重用,则选择让 SET 操作不导致固定。有关如何通过设置会话固定筛选条件属性来执行此操作的信息,请参阅创建 RDS 代理修改 RDS 代理

  • 创建临时表会导致代理固定会话。这样,无论事务边界如何,临时表的内容都会在整个会话期间保留。

  • 调用函数 ROW_COUNTFOUND_ROWSLAST_INSERT_ID 有时会导致固定。

  • 预编译语句会导致代理固定会话。无论预编译语句使用 SQL 文本还是二进制协议,这项规则都适用。

  • 使用 SET LOCAL 时,RDS 代理无法固定连接。

  • 调用存储过程和存储函数不会导致固定。RDS 代理不会检测此类调用导致的任何会话状态更改。如果您希望跨事务持久保持存储例程中的会话状态,请确保您的应用程序不会更改该状态。例如,RDS 代理目前与创建跨所有事务持久存在的临时表的存储过程不兼容。

如果您拥有关于应用程序行为的专业知识,则可以跳过某些应用程序语句的固定行为。为此,请在创建代理时选择会话固定筛选条件选项。当前,您可以选择退出会话固定,以设置会话变量和配置设置。

导致对 RDS for PostgreSQL 进行固定的条件

对于 PostgreSQL,以下交互也会导致固定:

  • 使用 SET 命令。

  • 使用 PREPAREDISCARDDEALLOCATE、或 EXECUTE 命令管理准备好的语句。

  • 创建临时序列、表或视图。

  • 声明游标。

  • 丢弃会话状态。

  • 监听通知频道。

  • 加载库模块,如 auto_explain

  • 使用函数操作序列,例如 nextvalsetval

  • 使用函数与锁定交互,例如 pg_advisory_lockpg_try_advisory_lock

    注意

    RDS 代理未锁定事务级咨询锁,特别是 pg_advisory_xact_lockpg_advisory_xact_lock_sharedpg_try_advisory_xact_lockpg_try_advisory_xact_lock_shared

  • 设置参数或将参数重置为其默认值。具体而言,就是使用 SETset_config 命令为会话变量分配默认值。

  • 调用存储过程和存储函数不会导致固定。RDS 代理不会检测此类调用导致的任何会话状态更改。如果您希望跨事务持久保持存储例程中的会话状态,请确保您的应用程序不会更改该状态。例如,RDS 代理目前与创建跨所有事务持久存在的临时表的存储过程不兼容。

删除 RDS 代理

如果您不再需要某个代理,可以将其删除。或者,如果您停止使用数据库实例或与其关联的集群,则可以删除代理。

删除代理
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在导航窗格中,选择 Proxies (代理)

  3. 从列表中选择要删除的代理。

  4. 选择 Delete Proxy (删除代理)

要删除数据库代理,请使用 AWS CLI 命令 delete-db-proxy。要删除相关的关联,还可以使用 deregister-db-proxy-targets 命令。

aws rds delete-db-proxy --name proxy_name
aws rds deregister-db-proxy-targets --db-proxy-name proxy_name [--target-group-name target_group_name] [--target-ids comma_separated_list] # or [--db-instance-identifiers instance_id] # or [--db-cluster-identifiers cluster_id]

要删除数据库代理,请调用 Amazon RDS API 函数 DeleteDBProxy。要删除相关的项目和关联,您还可以调用函数 DeleteDBProxyTargetGroupDeregisterDBProxyTargets