跳至內容

如何對連線到 Amazon RDS 資料庫執行個體時發生的問題進行疑難排解?

5 分的閱讀內容
0

我想對無法連線到 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體的問題進行疑難排解。

簡短說明

以下是連線至您的 Amazon RDS 資料庫執行個體可能失敗的原因:

  • 您的來源在安全群組、網路存取控制清單 (ACL) 或本機防火牆中,沒有連線至資料庫執行個體的授權存取權。
  • 從用戶端應用程式到資料庫執行個體的網路路徑在路由表中遺失。
  • 您使用錯誤的 DNS 名稱或端點來連線至資料庫執行個體。
  • 您的資料庫執行個體不允許公開存取,而且您無法透過網際網路連線。
  • 多可用區域資料庫執行個體發生容錯移轉,而次要資料庫執行個體使用不允許傳入連線的子網路或路由表。
  • 使用者驗證不正確。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

若要疑難排解您的 Amazon RDS 資料庫執行個體連線問題,請完成以下任務:

使用自動診斷

先從自動化工具開始,快速識別連線問題。

請完成以下步驟:

  1. 若要執行自動診斷工具,請使用以下 start-automation-execution AWS Systems Manager 命令:
    aws ssm start-automation-execution \
        --document-name "AWSSupport-TroubleshootConnectivityToRDS" \
        --parameters "InstanceId=EC2-INSTANCE-ID,DBInstanceIdentifier=DB-INSTANCE-NAME"
    **注意:**將 EC2-INSTANCE-ID 替換為您的 EC2 執行個體 ID,並將 DB-INSTANCE-NAME 替換為您的 RDS 執行個體識別碼。
  2. 若要檢查自動化結果,請執行以下 get-automation-execution 命令:
    aws ssm get-automation-execution \
        --automation-execution-id EXECUTION-ID
    **注意:**將 EXECUTION-ID 替換為步驟 1 中的執行 ID。

如需如何執行執行手冊的說明,以及其檢查內容的詳細資訊,請參閱 AWSSupport-TroubleshootConnectivityToRDS

確認資料庫執行個體狀態

確認您的資料庫執行個體可用且已準備好接受連線。

請完成以下步驟:

  1. 若要檢查您的資料庫執行個體狀態,請執行以下 describe-db-instances 命令:
    aws rds describe-db-instances \
        --db-instance-identifier DB-INSTANCE-NAME \
        --query 'DBInstances[*].DBInstanceStatus'
    **注意:**將 DB-INSTANCE-NAME 替換為您的 Amazon RDS 執行個體識別碼。
  2. 請等待狀態顯示為 available (可用) 後再嘗試連線。新建立或重新啟動的執行個體可能需要長達 20 分鐘才能變為可用。

檢查安全群組規則

安全群組會控制對您 Amazon RDS 執行個體的網路存取。確認其允許來自您的來源的流量。

請完成以下步驟:

  1. 若要識別附加至您的 Amazon RDS 執行個體的安全群組,請執行以下 describe-db-instances 命令:|
    aws rds describe-db-instances \
        --db-instance-identifier DB-INSTANCE-NAME \
        --query 'DBInstances[*].VpcSecurityGroups[*].VpcSecurityGroupId'
    **注意:**將 DB-INSTANCE-NAME 替換為您的 RDS 執行個體識別碼。
  2. 若要檢查每個安全群組的傳入規則,請執行以下 describe-security-groups 命令:
    aws ec2 describe-security-groups \
        --group-ids SECURITY-GROUP-ID \
        --query 'SecurityGroups[*].IpPermissions'
    **注意:**將 SECURITY-GROUP-ID 替換為步驟 1 中的每個安全群組 ID。
  3. 若要新增允許您 IP 位址的規則,請執行以下 authorize-security-group-ingress 命令:
    aws ec2 authorize-security-group-ingress \
        --group-id SECURITY-GROUP-ID \
        --protocol tcp \
        --port DATABASE-PORT \
        --cidr YOUR-IP-ADDRESS/32
    **注意:**將 SECURITY-GROUP-ID 替換為您的安全群組 ID。將 DATABASE-PORT 替換為您的資料庫連接埠 (MySQL 為 3306,PostgreSQL 為 5432)。將 YOUR-IP-ADDRESS 替換為您的公共 IP 位址。

確認網路 ACL 規則

網路存取控制清單 (ACL) 提供子網路層級的安全性。檢查其是否允許資料庫流量。

請完成以下步驟:

  1. 若要識別您 Amazon RDS 子網路的網路存取控制清單 (ACL),請執行以下 describe-network-acls 命令:
    aws ec2 describe-network-acls \
        --filters "Name=association.subnet-id,Values=SUBNET-ID" \
        --query 'NetworkAcls[*].NetworkAclId'
    **注意:**將 SUBNET-ID 替換為您的 RDS 子網路 ID:
  2. 若要檢查網路存取控制清單 (ACL) 規則,請執行以下 describe-network-acls 命令:
    aws ec2 describe-network-acls \
        --network-acl-ids NETWORK-ACL-ID \
        --query 'NetworkAcls[*].Entries'
    **注意:**將 NETWORK-ACL-ID 替換為步驟 1 中的網路 ACL ID。
  3. 確認傳入規則允許您的資料庫連接埠流量,而傳出規則允許暫時連接埠 (1024-65535)。

檢查路由表組態

路由表會引導網路流量。確認其為您的 Amazon RDS 執行個體提供適當的路由。

請完成以下步驟:

  1. 若要檢查您 Amazon RDS 子網路的路由表,請執行以下 describe-route-tables 命令:
    CMD
    **注意:**將 SUBNET-ID 替換為您的 RDS 子網路 ID。
  2. 若要進行公共存取,請確認存在通往網際網路閘道 ([IP_ADDRESS]) 的路由。
  3. 若要進行私有存取,請依情況確認存在通往 NAT 閘道、VPC 對等互連或 VPN 閘道的路由。

如需更多資訊,請參閱如何對 Amazon RDS 資料庫執行個體的 IP 位址問題進行疑難排解?

檢查 DNS 解析失敗

確認您的 Amazon RDS 端點解析為正確的 IP 位址。

請完成以下步驟:

  1. 若要從您的用戶端測試 DNS 解析,請執行以下命令:

    nslookup RDS-ENDPOINT

    **注意:**將 RDS-ENDPOINT 替換為您的 RDS 執行個體端點。

  2. 若要使用 dig 命令測試,請執行以下命令:

    dig RDS-ENDPOINT
  3. 如果 DNS 解析失敗,請檢查您的 Amazon VPC DNS 設定,或使用不同的 DNS 伺服器。

測試網路連線能力

在測試資料庫驗證之前,請先確認與您 RDS 執行個體的網路連線能力。

請完成以下步驟:

  1. 若要測試到 Amazon RDS 執行個體的連線能力,請執行以下 telnet 命令:

    telnet RDS-ENDPOINT DATABASE-PORT

    **注意:**將 RDS-ENDPOINT 替換為您的 RDS 端點,並將 DATABASE-PORT 替換為您的資料庫連接埠。

  2. 若要使用 netcat 測試,請執行以下命令:

    nc -zv RDS-ENDPOINT DATABASE-PORT
  3. 如果連線成功,則問題很可能與驗證有關。如果失敗,則問題與網路有關。

如需更多資訊,請參閱使用 VPC Reachability Analyzer 對 Amazon RDS 資料庫的網路連線問題進行疑難排解

檢查資料庫驗證

確認您的資料庫憑證和驗證方法。

請完成以下步驟:

  1. 若要測試 MySQL 的密碼驗證,請執行以下命令:
    mysql -h RDS-ENDPOINT -P DATABASE-PORT -u USERNAME -p
    **注意:**將 RDS-ENDPOINT 替換為您的端點,將 DATABASE-PORT 替換為您的連接埠,並將 USERNAME 替換為您的資料庫使用者名稱。
  2. 若要測試 PostgreSQL 的密碼驗證,請執行以下命令:
    psql -h RDS-ENDPOINT -p DATABASE-PORT -U USERNAME -d DATABASE-NAME
    **注意:**將 RDS-ENDPOINTDATABASE-PORTUSERNAMEDATABASE-NAME 替換為您的值。
  3. 若需要重設主密碼,請執行以下 modify-db-instance 命令:
    aws rds modify-db-instance \
        --db-instance-identifier DB-INSTANCE-NAME \
        --master-user-password NEW-PASSWORD \
        --apply-immediately
    **注意:**將 DB-INSTANCE-NAME 替換為您的執行個體識別碼,並將 NEW-PASSWORD 替換為您的新密碼。

檢查連線限制

確認您的 Amazon RDS 執行個體尚未達到連線限制。

請完成以下步驟:

  1. 若要檢查 MySQL 的目前連線數,請連線至您的資料庫並執行以下查詢:

    SHOW STATUS LIKE 'Threads_connected';
    SHOW VARIABLES LIKE 'max_connections';
  2. 若要檢查 PostgreSQL 的目前連線數,請執行以下查詢:

    SELECT count(*) FROM pg_stat_activity;
    SHOW max_connections;
  3. 若要檢查 MySQL 中的連線錯誤,請執行以下查詢:

    SHOW STATUS LIKE 'Connection_errors%';
    SHOW STATUS LIKE 'Max_used_connections';

如果您的 Amazon RDS 執行個體達到連線限制,請完成以下步驟:

  1. 若要識別可終止的閒置連線,請為 MySQL 執行以下查詢:

    SELECT id, user, host, db, command, time, state, info
    FROM information_schema.processlist
    WHERE command = 'Sleep' AND time > 300
    ORDER BY time DESC;
  2. 若要終止 MySQL 中的閒置連線,請執行以下命令:

    CALL mysql.rds_kill(CONNECTION-ID);

    **注意:**將 CONNECTION-ID 替換為步驟 1 中的連線 ID。

  3. 若要增加 max_connections 參數,請執行以下 modify-db-parameter-group 命令:

    aws rds modify-db-parameter-group \
        --db-parameter-group-name PARAMETER-GROUP-NAME \
        --parameters "ParameterName=max_connections,ParameterValue=NEW-VALUE,ApplyMethod=pending-reboot"

    **注意:**將 PARAMETER-GROUP-NAME 替換為您的參數群組名稱,並將 NEW-VALUE 替換為您想要的連線限制。變更 max_connections 後,必須重新開機。

  4. 若要套用參數變更,請重新啟動您的 Amazon RDS 執行個體。執行以下 reboot-db-instance 命令:

    aws rds reboot-db-instance \
        --db-instance-identifier DB-INSTANCE-NAME

    **注意:**將 DB-INSTANCE-NAME 替換為您的 Amazon RDS 執行個體識別碼。

  5. 若要使用 RDS Proxy 實作連線集區,請執行以下 create-db-proxy 命令:

    aws rds create-db-proxy \
        --db-proxy-name PROXY-NAME \
        --engine-family mysql \
        --target-group-config DBInstanceIdentifiers=DB-INSTANCE-NAME \
        --vpc-subnet-ids SUBNET-ID-1,SUBNET-ID-2 \
        --auth AuthScheme=SECRETS,SecretArn=SECRET-ARN

    **注意:**將 PROXY-NAMEDB-INSTANCE-NAMESUBNET-ID-1SUBNET-ID-2SECRET-ARN 替換為您的值。

檢查特定使用者的連線限制

請完成以下步驟:

  1. 若要檢查目前的 max_user_connections,請執行以下查詢:

    SHOW VARIABLES LIKE 'max_user_connections';
  2. 若要檢查每個使用者的目前連線數,請執行以下查詢:

    SELECT user, COUNT(*) as connection_count
    FROM information_schema.processlist
    GROUP BY user
    ORDER BY connection_count DESC;
  3. 若要檢查特定使用者是否已達到其連線限制,請執行以下查詢:

    SELECT user, max_user_connections
    FROM mysql.user
    WHERE user = 'USERNAME';

    **注意:**將 USERNAME 替換為發生連線問題的特定使用者名稱。

即使尚未達到整體連線限制,max_user_connections 參數仍可能阻止特定使用者進行連線。

如果您的 Amazon RDS 執行個體達到最大使用者連線數,請完成以下步驟:

  1. 若要全域增加 max_user_connections 參數,請執行以下 modify-db-parameter-group 命令:
    aws rds modify-db-parameter-group \
        --db-parameter-group-name PARAMETER-GROUP-NAME \
        --parameters "ParameterName=max_user_connections,ParameterValue=NEW-VALUE,ApplyMethod=immediate"
    **注意:**將 PARAMETER-GROUP-NAME 替換為您的參數群組名稱,並將 NEW-VALUE 替換為您想要的每位使用者連線限制。
  2. 若要修改特定使用者帳戶的連線限制,請執行以下查詢:
    ALTER USER 'USERNAME'@'%' WITH MAX_USER_CONNECTIONS NEW-LIMIT;
    **注意:**將 USERNAME 替換為使用者名稱,並將 NEW-LIMIT 替換為該使用者想要的連線限制。

如需更多資訊,請參閱 MySQL 網站上的設定帳戶資源限制

檢查連線錯誤限制

請完成以下步驟:

  1. 若要檢查 Amazon RDS for MySQL 目前的 max_connect_errors,請執行以下查詢:

    SHOW VARIABLES LIKE 'max_connect_errors';
  2. 若要檢查目前是否有任何主機遭到封鎖,請執行以下查詢:

    SELECT * FROM performance_schema.host_cache
    WHERE SUM_CONNECT_ERRORS > 0;
  3. 若要檢查您主機目前的連線錯誤計數,請執行以下查詢:

    SELECT HOST, SUM_CONNECT_ERRORS, COUNT_HANDSHAKE_ERRORS, COUNT_AUTHENTICATION_ERRORS
    FROM performance_schema.host_cache
    WHERE HOST = 'YOUR-CLIENT-IP';

    **注意:**將 YOUR-CLIENT-IP 替換為您的實際用戶端 IP 位址。

  4. 若要清除主機快取並解除封鎖所有主機,請執行以下查詢:

    FLUSH HOSTS;
  5. 若要增加 max_connect_errors 參數以防止未來再次遭到封鎖,請執行以下 modify-db-parameter-group 命令:

    aws rds modify-db-parameter-group \
        --db-parameter-group-name PARAMETER-GROUP-NAME \
        --parameters "ParameterName=max_connect_errors,ParameterValue=NEW-VALUE,ApplyMethod=immediate"

    **注意:**將 PARAMETER-GROUP-NAME 替換為您的參數群組名稱,並將 NEW-VALUE 替換為較高的限制,例如 1000000。

  6. 若要確認參數變更已套用,請再次執行步驟 1 的查詢,並確認新值。

如需更多資訊,請參閱如何解決 Amazon RDS for MySQL 中的「Host is blocked because of many connections errors」錯誤?

相關資訊

無法連線至 Amazon RDS 資料庫執行個體

使用 SSL/TLS 加密與資料庫執行個體或叢集的連線

如何連線至使用 Amazon VPC 公共或私有子網路的 Amazon RDS 資料庫執行個體?