如何對連線到 Amazon RDS 資料庫執行個體時發生的問題進行疑難排解?
我想對無法連線到 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體的問題進行疑難排解。
簡短說明
以下是連線至您的 Amazon RDS 資料庫執行個體可能失敗的原因:
- 您的來源在安全群組、網路存取控制清單 (ACL) 或本機防火牆中,沒有連線至資料庫執行個體的授權存取權。
- 從用戶端應用程式到資料庫執行個體的網路路徑在路由表中遺失。
- 您使用錯誤的 DNS 名稱或端點來連線至資料庫執行個體。
- 您的資料庫執行個體不允許公開存取,而且您無法透過網際網路連線。
- 多可用區域資料庫執行個體發生容錯移轉,而次要資料庫執行個體使用不允許傳入連線的子網路或路由表。
- 使用者驗證不正確。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
若要疑難排解您的 Amazon RDS 資料庫執行個體連線問題,請完成以下任務:
使用自動診斷
先從自動化工具開始,快速識別連線問題。
請完成以下步驟:
- 若要執行自動診斷工具,請使用以下 start-automation-execution AWS Systems Manager 命令:
**注意:**將 EC2-INSTANCE-ID 替換為您的 EC2 執行個體 ID,並將 DB-INSTANCE-NAME 替換為您的 RDS 執行個體識別碼。aws ssm start-automation-execution \ --document-name "AWSSupport-TroubleshootConnectivityToRDS" \ --parameters "InstanceId=EC2-INSTANCE-ID,DBInstanceIdentifier=DB-INSTANCE-NAME" - 若要檢查自動化結果,請執行以下 get-automation-execution 命令:
**注意:**將 EXECUTION-ID 替換為步驟 1 中的執行 ID。aws ssm get-automation-execution \ --automation-execution-id EXECUTION-ID
如需如何執行執行手冊的說明,以及其檢查內容的詳細資訊,請參閱 AWSSupport-TroubleshootConnectivityToRDS。
確認資料庫執行個體狀態
確認您的資料庫執行個體可用且已準備好接受連線。
請完成以下步驟:
- 若要檢查您的資料庫執行個體狀態,請執行以下 describe-db-instances 命令:
**注意:**將 DB-INSTANCE-NAME 替換為您的 Amazon RDS 執行個體識別碼。aws rds describe-db-instances \ --db-instance-identifier DB-INSTANCE-NAME \ --query 'DBInstances[*].DBInstanceStatus' - 請等待狀態顯示為 available (可用) 後再嘗試連線。新建立或重新啟動的執行個體可能需要長達 20 分鐘才能變為可用。
檢查安全群組規則
安全群組會控制對您 Amazon RDS 執行個體的網路存取。確認其允許來自您的來源的流量。
請完成以下步驟:
- 若要識別附加至您的 Amazon RDS 執行個體的安全群組,請執行以下 describe-db-instances 命令:|
**注意:**將 DB-INSTANCE-NAME 替換為您的 RDS 執行個體識別碼。aws rds describe-db-instances \ --db-instance-identifier DB-INSTANCE-NAME \ --query 'DBInstances[*].VpcSecurityGroups[*].VpcSecurityGroupId' - 若要檢查每個安全群組的傳入規則,請執行以下 describe-security-groups 命令:
**注意:**將 SECURITY-GROUP-ID 替換為步驟 1 中的每個安全群組 ID。aws ec2 describe-security-groups \ --group-ids SECURITY-GROUP-ID \ --query 'SecurityGroups[*].IpPermissions' - 若要新增允許您 IP 位址的規則,請執行以下 authorize-security-group-ingress 命令:
**注意:**將 SECURITY-GROUP-ID 替換為您的安全群組 ID。將 DATABASE-PORT 替換為您的資料庫連接埠 (MySQL 為 3306,PostgreSQL 為 5432)。將 YOUR-IP-ADDRESS 替換為您的公共 IP 位址。aws ec2 authorize-security-group-ingress \ --group-id SECURITY-GROUP-ID \ --protocol tcp \ --port DATABASE-PORT \ --cidr YOUR-IP-ADDRESS/32
確認網路 ACL 規則
網路存取控制清單 (ACL) 提供子網路層級的安全性。檢查其是否允許資料庫流量。
請完成以下步驟:
- 若要識別您 Amazon RDS 子網路的網路存取控制清單 (ACL),請執行以下 describe-network-acls 命令:
**注意:**將 SUBNET-ID 替換為您的 RDS 子網路 ID:aws ec2 describe-network-acls \ --filters "Name=association.subnet-id,Values=SUBNET-ID" \ --query 'NetworkAcls[*].NetworkAclId' - 若要檢查網路存取控制清單 (ACL) 規則,請執行以下 describe-network-acls 命令:
**注意:**將 NETWORK-ACL-ID 替換為步驟 1 中的網路 ACL ID。aws ec2 describe-network-acls \ --network-acl-ids NETWORK-ACL-ID \ --query 'NetworkAcls[*].Entries' - 確認傳入規則允許您的資料庫連接埠流量,而傳出規則允許暫時連接埠 (1024-65535)。
檢查路由表組態
路由表會引導網路流量。確認其為您的 Amazon RDS 執行個體提供適當的路由。
請完成以下步驟:
- 若要檢查您 Amazon RDS 子網路的路由表,請執行以下 describe-route-tables 命令:
CMD
**注意:**將 SUBNET-ID 替換為您的 RDS 子網路 ID。 - 若要進行公共存取,請確認存在通往網際網路閘道 ([IP_ADDRESS]) 的路由。
- 若要進行私有存取,請依情況確認存在通往 NAT 閘道、VPC 對等互連或 VPN 閘道的路由。
如需更多資訊,請參閱如何對 Amazon RDS 資料庫執行個體的 IP 位址問題進行疑難排解?
檢查 DNS 解析失敗
確認您的 Amazon RDS 端點解析為正確的 IP 位址。
請完成以下步驟:
-
若要從您的用戶端測試 DNS 解析,請執行以下命令:
nslookup RDS-ENDPOINT**注意:**將 RDS-ENDPOINT 替換為您的 RDS 執行個體端點。
-
若要使用 dig 命令測試,請執行以下命令:
dig RDS-ENDPOINT -
如果 DNS 解析失敗,請檢查您的 Amazon VPC DNS 設定,或使用不同的 DNS 伺服器。
測試網路連線能力
在測試資料庫驗證之前,請先確認與您 RDS 執行個體的網路連線能力。
請完成以下步驟:
-
若要測試到 Amazon RDS 執行個體的連線能力,請執行以下 telnet 命令:
telnet RDS-ENDPOINT DATABASE-PORT**注意:**將 RDS-ENDPOINT 替換為您的 RDS 端點,並將 DATABASE-PORT 替換為您的資料庫連接埠。
-
若要使用 netcat 測試,請執行以下命令:
nc -zv RDS-ENDPOINT DATABASE-PORT -
如果連線成功,則問題很可能與驗證有關。如果失敗,則問題與網路有關。
如需更多資訊,請參閱使用 VPC Reachability Analyzer 對 Amazon RDS 資料庫的網路連線問題進行疑難排解。
檢查資料庫驗證
確認您的資料庫憑證和驗證方法。
請完成以下步驟:
- 若要測試 MySQL 的密碼驗證,請執行以下命令:
**注意:**將 RDS-ENDPOINT 替換為您的端點,將 DATABASE-PORT 替換為您的連接埠,並將 USERNAME 替換為您的資料庫使用者名稱。mysql -h RDS-ENDPOINT -P DATABASE-PORT -u USERNAME -p - 若要測試 PostgreSQL 的密碼驗證,請執行以下命令:
**注意:**將 RDS-ENDPOINT、DATABASE-PORT、USERNAME 和 DATABASE-NAME 替換為您的值。psql -h RDS-ENDPOINT -p DATABASE-PORT -U USERNAME -d DATABASE-NAME - 若需要重設主密碼,請執行以下 modify-db-instance 命令:
**注意:**將 DB-INSTANCE-NAME 替換為您的執行個體識別碼,並將 NEW-PASSWORD 替換為您的新密碼。aws rds modify-db-instance \ --db-instance-identifier DB-INSTANCE-NAME \ --master-user-password NEW-PASSWORD \ --apply-immediately
檢查連線限制
確認您的 Amazon RDS 執行個體尚未達到連線限制。
請完成以下步驟:
-
若要檢查 MySQL 的目前連線數,請連線至您的資料庫並執行以下查詢:
SHOW STATUS LIKE 'Threads_connected'; SHOW VARIABLES LIKE 'max_connections'; -
若要檢查 PostgreSQL 的目前連線數,請執行以下查詢:
SELECT count(*) FROM pg_stat_activity; SHOW max_connections; -
若要檢查 MySQL 中的連線錯誤,請執行以下查詢:
SHOW STATUS LIKE 'Connection_errors%'; SHOW STATUS LIKE 'Max_used_connections';
如果您的 Amazon RDS 執行個體達到連線限制,請完成以下步驟:
-
若要識別可終止的閒置連線,請為 MySQL 執行以下查詢:
SELECT id, user, host, db, command, time, state, info FROM information_schema.processlist WHERE command = 'Sleep' AND time > 300 ORDER BY time DESC; -
若要終止 MySQL 中的閒置連線,請執行以下命令:
CALL mysql.rds_kill(CONNECTION-ID);**注意:**將 CONNECTION-ID 替換為步驟 1 中的連線 ID。
-
若要增加 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 後,必須重新開機。
-
若要套用參數變更,請重新啟動您的 Amazon RDS 執行個體。執行以下 reboot-db-instance 命令:
aws rds reboot-db-instance \ --db-instance-identifier DB-INSTANCE-NAME**注意:**將 DB-INSTANCE-NAME 替換為您的 Amazon RDS 執行個體識別碼。
-
若要使用 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-NAME、DB-INSTANCE-NAME、SUBNET-ID-1、SUBNET-ID-2 和 SECRET-ARN 替換為您的值。
檢查特定使用者的連線限制
請完成以下步驟:
-
若要檢查目前的 max_user_connections,請執行以下查詢:
SHOW VARIABLES LIKE 'max_user_connections'; -
若要檢查每個使用者的目前連線數,請執行以下查詢:
SELECT user, COUNT(*) as connection_count FROM information_schema.processlist GROUP BY user ORDER BY connection_count DESC; -
若要檢查特定使用者是否已達到其連線限制,請執行以下查詢:
SELECT user, max_user_connections FROM mysql.user WHERE user = 'USERNAME';**注意:**將 USERNAME 替換為發生連線問題的特定使用者名稱。
即使尚未達到整體連線限制,max_user_connections 參數仍可能阻止特定使用者進行連線。
如果您的 Amazon RDS 執行個體達到最大使用者連線數,請完成以下步驟:
- 若要全域增加 max_user_connections 參數,請執行以下 modify-db-parameter-group 命令:
**注意:**將 PARAMETER-GROUP-NAME 替換為您的參數群組名稱,並將 NEW-VALUE 替換為您想要的每位使用者連線限制。aws rds modify-db-parameter-group \ --db-parameter-group-name PARAMETER-GROUP-NAME \ --parameters "ParameterName=max_user_connections,ParameterValue=NEW-VALUE,ApplyMethod=immediate" - 若要修改特定使用者帳戶的連線限制,請執行以下查詢:
**注意:**將 USERNAME 替換為使用者名稱,並將 NEW-LIMIT 替換為該使用者想要的連線限制。ALTER USER 'USERNAME'@'%' WITH MAX_USER_CONNECTIONS NEW-LIMIT;
如需更多資訊,請參閱 MySQL 網站上的設定帳戶資源限制。
檢查連線錯誤限制
請完成以下步驟:
-
若要檢查 Amazon RDS for MySQL 目前的 max_connect_errors,請執行以下查詢:
SHOW VARIABLES LIKE 'max_connect_errors'; -
若要檢查目前是否有任何主機遭到封鎖,請執行以下查詢:
SELECT * FROM performance_schema.host_cache WHERE SUM_CONNECT_ERRORS > 0; -
若要檢查您主機目前的連線錯誤計數,請執行以下查詢:
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 位址。
-
若要清除主機快取並解除封鎖所有主機,請執行以下查詢:
FLUSH HOSTS; -
若要增加 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。
-
若要確認參數變更已套用,請再次執行步驟 1 的查詢,並確認新值。
如需更多資訊,請參閱如何解決 Amazon RDS for MySQL 中的「Host is blocked because of many connections errors」錯誤?
相關資訊
相關內容
已提問 2 年前

