

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# MySQL 資料庫執行個體的常用 DBA 任務
<a name="Appendix.MySQL.CommonDBATasks"></a>

您可以在以下內容中找到某些一般 DBA 任務的 Amazon RDS 特定實作說明，這些實作方法皆適用於執行 MySQL 資料庫引擎的資料庫執行個體。為了提供受管理的服務體驗，Amazon RDS 並不會提供資料庫執行個體的殼層存取權。此外，其也會將存取權限制在某些需要進階權限的系統程序和資料表。

如需在 Amazon RDS 上使用 MySQL 日誌檔案的詳細資訊，請參閱 [ MySQL資料庫日誌檔案](USER_LogAccess.Concepts.MySQL.md)

## 了解預先定義的使用者
<a name="Appendix.MySQL.CommonDBATasks.users"></a>

Amazon RDS 會使用新的 RDS for MySQL 資料庫執行個體自動建立多個預先定義的使用者。預先定義的使用者及其權限無法進行變更。您無法為這些預先定義的使用者停止、重新命名或修改權限。嘗試這麼做會造成錯誤。
+ **rdsadmin** – 為處理具有 `superuser` 權限的管理員將在獨立 MySQL 資料庫上執行的許多管理任務而建立的使用者。RDS for MySQL 在內部將此使用者用於許多管理任務。
+ **rdsrepladmin** – Amazon RDS 在內部用來支援 RDS for MySQL 資料庫執行個體和叢集上複寫活動的使用者。

如需其他一般 DBA 任務的詳細資訊，請參閱下列主題：

**Topics**
+ [

## 了解預先定義的使用者
](#Appendix.MySQL.CommonDBATasks.users)
+ [

# RDS for MySQL 的角色型權限模型
](Appendix.MySQL.CommonDBATasks.privilege-model.md)
+ [

# RDS for MySQL 的動態權限
](Appendix.MySQL.CommonDBATasks.dynamic-privileges.md)
+ [

# 結束 RDS for MySQL 的工作階段或查詢
](Appendix.MySQL.CommonDBATasks.End.md)
+ [

# 略過 RDS for MySQL 目前的複寫錯誤
](Appendix.MySQL.CommonDBATasks.SkipError.md)
+ [

# 使用 InnoDB 資料表空間來改善 RDS for MySQL 的損毀復原時間
](Appendix.MySQL.CommonDBATasks.Tables.md)
+ [

# 管理 RDS for MySQL 的全域狀態歷史記錄
](Appendix.MySQL.CommonDBATasks.GoSH.md)
+ [

# 在 MySQL 8.4 中設定緩衝集區大小和重做日誌容量
](Appendix.MySQL.CommonDBATasks.Config.Size.8.4.md)

# RDS for MySQL 的角色型權限模型
<a name="Appendix.MySQL.CommonDBATasks.privilege-model"></a>

從 RDS for MySQL 8.0.36 版開始，您無法直接修改 `mysql` 資料庫中的資料表。特別是，您無法透過對 `grant` 資料表執行資料處理語言 (DML) 操作來建立資料庫使用者。相反地，您可以使用 MySQL 帳戶管理陳述式，例如 `CREATE USER`、`GRANT` 和 `REVOKE`，將角色型權限授予使用者。您也無法建立其他類型的物件，例如 `mysql` 資料庫中已存放的程序。您仍然可以查詢 `mysql` 資料表。如果您使用二進位日誌複寫，則直接對來源資料庫執行個體上 `mysql` 資料表所做的變更不會複寫至目標叢集。

在某些情況下，您的應用程式可能會使用捷徑來建立使用者或其他物件，方法是插入至 `mysql` 資料表。若是這樣，請變更您應用程式的程式碼來使用對應的陳述式，例如 `CREATE USER`。

若要在遷移期間從外部 MySQL 資料庫匯出資料庫使用者的中繼資料，請使用下列其中一個方法：
+ 使用 MySQL Shell 的執行個體傾印公用程式搭配篩選條件來排除使用者、角色和授權。以下範例顯示要使用的命令語法。請確定 `outputUrl` 是空的。

  ```
  mysqlsh user@host -- util.dumpInstance(outputUrl,{excludeSchemas:['mysql'],users: true})
  ```

  如需詳細資訊，請參閱《MySQL 參考手冊》中的[執行個體傾印公用程式、結構描述傾印公用程式和資料表傾印公用程式](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-dump-instance-schema.html)。
+ 使用 `mysqlpump` 用戶端公用程式。此範例包含 `mysql` 系統資料庫中資料表以外的所有資料表。它也包括 `CREATE USER` 和 `GRANT` 陳述式，來重新產生所遷移資料庫中的所有 MySQL 使用者。

  ```
  mysqlpump --exclude-databases=mysql --users
  ```

  MySQL 8.4 不再提供 `mysqlpump` 用戶端公用程式。請改用 `mysqldump`。

若要簡化許多使用者或應用程式的權限管理，您可以使用 `CREATE ROLE` 陳述式來建立具有一組權限的角色。然後，您可以使用 `GRANT` 和 `SET ROLE` 陳述式，以及 `current_role` 函數，將角色指派給使用者或應用程式、切換目前角色，並檢查哪些角色有效。如需 MySQL 8.0 中角色型權限系統的詳細資訊，請參閱《MySQL 參考手冊》中的[使用角色](https://dev.mysql.com/doc/refman/8.0/en/roles.html)。

**重要**  
我們強烈建議您不要直接在您的應用程式中使用主要使用者。而是遵循最佳實務，使用以應用程式所需的最低權限建立的資料庫使用者。

從 8.0.36 版開始，RDS for MySQL 包含具有下列所有權限的特殊角色。此角色已命名為 `rds_superuser_role`。每個資料庫執行個體的主要管理使用者已獲授予此角色。`rds_superuser_role` 角色包含所有資料庫物件的下列權限：
+  `ALTER` 
+  `APPLICATION_PASSWORD_ADMIN` 
+  `ALTER ROUTINE` 
+  `CREATE` 
+  `CREATE ROLE` 
+  `CREATE ROUTINE` 
+  `CREATE TEMPORARY TABLES` 
+  `CREATE USER` 
+  `CREATE VIEW` 
+  `DELETE` 
+  `DROP` 
+  `DROP ROLE` 
+  `EVENT` 
+  `EXECUTE` 
+  `INDEX` 
+  `INSERT` 
+  `LOCK TABLES` 
+  `PROCESS` 
+  `REFERENCES` 
+  `RELOAD` 
+  `REPLICATION CLIENT` 
+  `REPLICATION SLAVE` 
+  `ROLE_ADMIN` 
+  `SET_USER_ID` 
+  `SELECT` 
+  `SHOW DATABASES` 
+  `SHOW VIEW` 
+  `TRIGGER` 
+  `UPDATE` 
+  `XA_RECOVER_ADMIN`

 角色定義還包括 `WITH GRANT OPTION`，以便管理使用者可以將該角色授與其他使用者。尤其，管理員必須授與執行二進位日誌複寫所需的任何權限，以 MySQL 叢集做為目標。

**提示**  
 若要查看許可的完整詳細資訊，請使用下列陳述式。  

```
SHOW GRANTS FOR rds_superuser_role@'%';
```

 當使用 RDS for MySQL 8.0.36 版及更新版本中的角色授予存取權時，您也可以使用 `SET ROLE role_name` 或 `SET ROLE ALL` 陳述式啟用角色。下列範例會顯示作法。以適當的角色名稱替代 `CUSTOM_ROLE`。

```
# Grant role to user
mysql> GRANT CUSTOM_ROLE TO 'user'@'domain-or-ip-address'

# Check the current roles for your user. In this case, the CUSTOM_ROLE role has not been activated.
# Only the rds_superuser_role is currently in effect.
mysql> SELECT CURRENT_ROLE();
+--------------------------+
| CURRENT_ROLE()           |
+--------------------------+
| `rds_superuser_role`@`%` |
+--------------------------+
1 row in set (0.00 sec)

# Activate all roles associated with this user using SET ROLE.
# You can activate specific roles or all roles.
# In this case, the user only has 2 roles, so we specify ALL.
mysql> SET ROLE ALL;
Query OK, 0 rows affected (0.00 sec)

# Verify role is now active
mysql> SELECT CURRENT_ROLE();
+--------------------------------------------------+
| CURRENT_ROLE()                                   |
+--------------------------------------------------+
| `CUSTOM_ROLE`@`%`,`rds_superuser_role`@`%` |
+--------------------------------------------------+
```

# RDS for MySQL 的動態權限
<a name="Appendix.MySQL.CommonDBATasks.dynamic-privileges"></a>

動態權限是 MySQL 權限，您可以使用 `GRANT` 陳述式明確授予。根據您的 RDS for MySQL 版本，RDS 可讓您僅授予特定動態權限。RDS 不允許其中的某些權限，因為它們可能會干擾特定資料庫操作，例如複寫和備份。

下表顯示您可以為不同的 MySQL 版本授予哪些權限。如果您要從低於 8.0.36 的 MySQL 版本升級至 8.0.36 或更新版本，如果不再允許授予特定權限，則可能需要更新您應用程式的程式碼。


| 權限 | MySQL 8.0.35 及更低版本 | MySQL 8.0.36 和更高的次要版本 | MySQL 8.4.3 及更新版本 | 
| --- | --- | --- | --- | 
|  [ALLOW\$1NONEXISTENT\$1DEFINER](https://dev.mysql.com/doc/refman/8.4/en/privileges-provided.html#priv_allow-nonexistent-definer)   |  不適用  |  不適用  |  不允許  | 
|  [APPLICATION\$1PASSWORD\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_application-password-admin)  |  已允許  |  已允許  |  允許  | 
|  [AUDIT\$1ABORT\$1EXEMPT](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_audit-abort-exempt)  |  允許  |  不允許  |  不允許  | 
|  [AUDIT\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_audit-admin)  |  不允許  |  不允許  |  不允許  | 
|  [AUTHENTICATION\$1POLICY\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_authentication-policy-admin)  |  允許  |  不允許  | 不允許 | 
|  [BACKUP\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_backup-admin)  |  允許  |  不允許  |  不允許  | 
|  [BINLOG\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_binlog-admin)  |  允許  |  不允許  |  不允許  | 
|  [BINLOG\$1ENCRYPTION\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_binlog-encryption-admin)  |  不允許  |  不允許  |  不允許  | 
|  [CLONE\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_clone-admin)  |  不允許  |  不允許  |  不允許  | 
|  [CONNECTION\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_connection-admin)  |  允許  |  不允許  |  不允許  | 
|  [ENCRYPTION\$1KEY\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_encryption-key-admin)  |  不允許  |  不允許  |  不允許  | 
|  [FIREWALL\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_firewall-admin)  |  不允許  |  不允許  |  不允許  | 
|  [FIREWALL\$1EXEMPT](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_firewall-exempt)  |  允許  |  不允許  |  不允許  | 
|  [FIREWALL\$1USER](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_firewall-user)  |  不允許  |  不允許  |  不允許  | 
|  [FLUSH\$1OPTIMIZER\$1COSTS](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_flush-optimizer-costs)  |  已允許  |  已允許  |  允許  | 
|  [FLUSH\$1PRIVILEGES](https://dev.mysql.com/doc/refman/8.4/en/privileges-provided.html#priv_flush-privileges)  |  不適用  |  不適用  |  允許  | 
|  [FLUSH\$1STATUS](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_flush-status)  |  已允許  |  已允許  |  允許  | 
|  [FLUSH\$1TABLES](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_flush-tables)  |  已允許  |  已允許  |  允許  | 
|  [FLUSH\$1USER\$1RESOURCES](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_flush-user-resources)  |  已允許  |  已允許  |  允許  | 
|  [GROUP\$1REPLICATION\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_group-replication-admin)  |  不允許  |  不允許  |  不允許  | 
|  [GROUP\$1REPLICATION\$1STREAM](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_group-replication-stream)  |  不允許  |  不允許  |  不允許  | 
|  [INNODB\$1REDO\$1LOG\$1ARCHIVE](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_innodb-redo-log-archive)  |  不允許  |  不允許  |  不允許  | 
|  [INNODB\$1REDO\$1LOG\$1ENABLE](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_innodb-redo-log-enable)  |  不允許  |  不允許  |  不允許  | 
|  [MASKING\$1DICTIONARIES\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_masking-dictionaries-admin)  |  不允許  |  不允許  |  不允許  | 
|  [NDB\$1STORED\$1USER](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_ndb-stored-user)  |  不允許  |  不允許  |  不允許  | 
|  [OPTIMIZE\$1LOCAL\$1TABLE](https://dev.mysql.com/doc/refman/8.4/en/privileges-provided.html#priv_optimize-local-table)  |  不適用  |  不適用  |  不允許  | 
|  [PASSWORDLESS\$1USER\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_passwordless-user-admin)  |  不允許  |  不允許  |  不允許  | 
|  [PERSIST\$1RO\$1VARIABLES\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_persist-ro-variables-admin)  |  不允許  |  不允許  |  不允許  | 
|  [REPLICATION\$1APPLIER](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_replication-applier)  |  允許  |  不允許  |  不允許  | 
|  [REPLICATION\$1SLAVE\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_replication-slave-admin)  |  不允許  |  不允許  |  不允許  | 
|  [RESOURCE\$1GROUP\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_resource-group-admin)  |  允許  |  不允許  |  不允許  | 
|  [RESOURCE\$1GROUP\$1USER](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_resource-group-user)  |  允許  |  不允許  |  不允許  | 
|  [ROLE\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_role-admin)  |  已允許  |  已允許  |  允許  | 
|  [SENSITIVE\$1VARIABLES\$1OBSERVER](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_sensitive-variables-observer)  |  已允許  |  已允許  | 允許 | 
|  [SERVICE\$1CONNECTION\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_service-connection-admin)  |  允許  |  不允許  |  不允許  | 
|  [SESSION\$1VARIABLES\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_session-variables-admin)  |  已允許  |  已允許  |  允許  | 
|  [SET\$1ANY\$1DEFINER](https://dev.mysql.com/doc/refman/8.4/en/privileges-provided.html#priv_set-any-definer)  |  不適用  |  不適用  |  允許  | 
|  [SET\$1USER\$1ID](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_set-user-id)  |  已允許  |  允許  |  不適用  | 
|  [SHOW\$1ROUTINE](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_show-routine)  |  已允許  |  已允許  |  允許  | 
|  [SKIP\$1QUERY\$1REWRITE](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_skip-query-rewrite)  |  不允許  |  不允許  |  不允許  | 
|  [SYSTEM\$1USER](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_system-user)  |  不允許  |  不允許  |  不允許  | 
|  [SYSTEM\$1VARIABLES\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_system-variables-admin)  |  不允許  |  不允許  |  不允許  | 
|  [TABLE\$1ENCRYPTION\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_table-encryption-admin)  |  不允許  |  不允許  |  不允許  | 
|  [TELEMETRY\$1LOG\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_telemetry-log-admin)  |  允許  |  不允許  |  不允許  | 
|  [TP\$1CONNECTION\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_tp-connection-admin)  |  不允許  |  不允許  | 不允許 | 
|  [TRANSACTION\$1GTID\$1TAG](https://dev.mysql.com/doc/refman/8.4/en/privileges-provided.html#priv_transaction-gtid-tag)   |  不適用  |  不適用  | 不允許 | 
|  [VERSION\$1TOKEN\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_version-token-admin)  |  不允許  |  不允許  |  不允許  | 
|  [XA\$1RECOVER\$1ADMIN](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_xa-recover-admin)  |  已允許  |  已允許  |  允許  | 

# 結束 RDS for MySQL 的工作階段或查詢
<a name="Appendix.MySQL.CommonDBATasks.End"></a>

您可以使用 `rds_kill` 和 `rds_kill_query` 命令，結束資料庫執行個體上的使用者工作階段或查詢。首先連接到您的 MySQL 資料庫執行個體，然後發出適當的命令，如下所示。如需更多詳細資訊，請參閱 [連線至您的 MySQL 資料庫執行個體](USER_ConnectToInstance.md)。

```
CALL mysql.rds_kill(thread-ID)
CALL mysql.rds_kill_query(thread-ID)
```

例如，若要結束正在執行緒 99 上執行的工作階段，您將輸入下列命令：

```
CALL mysql.rds_kill(99); 
```

若要結束正在執行緒 99 上執行的查詢，您將輸入下列命令：

```
CALL mysql.rds_kill_query(99); 
```

# 略過 RDS for MySQL 目前的複寫錯誤
<a name="Appendix.MySQL.CommonDBATasks.SkipError"></a>

您可以略過僅供讀取複本上的錯誤，前提是此錯誤導致僅供讀取複本停止回應，而且此錯誤不會影響資料的完整性。

**注意**  
首先驗證是否可以安全地略過有問題的錯誤。在 MySQL 公用程式中，連線至僅供讀取複本並執行下列 MySQL 命令：  

```
SHOW REPLICA STATUS\G 
```
如需傳回值的相關資訊，請參閱 [MySQL 文件](https://dev.mysql.com/doc/refman/8.0/en/show-replica-status.html)。  
MySQL 以前的版本使用 `SHOW SLAVE STATUS` 而不是 `SHOW REPLICA STATUS`。如果您使用的 MySQL 是 8.0.23 之前的版本，請使用 `SHOW SLAVE STATUS`。

您可採用以下方式，略過僅供讀取複本上的錯誤。

**Topics**
+ [

## 呼叫 mysql.rds\$1skip\$1repl\$1error 程序
](#Appendix.MySQL.CommonDBATasks.SkipError.procedure)
+ [

## 設定 slave\$1skip\$1errors 參數
](#Appendix.MySQL.CommonDBATasks.SkipError.parameter)

## 呼叫 mysql.rds\$1skip\$1repl\$1error 程序
<a name="Appendix.MySQL.CommonDBATasks.SkipError.procedure"></a>

Amazon RDS 提供一種預存程序，您可以呼叫此程序，以略過僅供讀取複本上的錯誤。首先連接到您的僅供讀取複本，然後發出適當的命令，如下所示。如需詳細資訊，請參閱[連線至您的 MySQL 資料庫執行個體](USER_ConnectToInstance.md)。

 若要略過錯誤，請發出下列命令：

```
CALL mysql.rds_skip_repl_error; 
```

如果您在來源資料庫執行個體上，或在未發現複寫錯誤的僅供讀取複本上執行此命令，則此命令沒有效用。

如需詳細資訊，例如支援 `mysql.rds_skip_repl_error` 的 MySQL 版本，請參閱 [mysql.rds\$1skip\$1repl\$1error](mysql-stored-proc-replicating.md#mysql_rds_skip_repl_error)。

**重要**  
如果您嘗試呼叫 `mysql.rds_skip_repl_error` 並遇到下列錯誤：`ERROR 1305 (42000): PROCEDURE mysql.rds_skip_repl_error does not exist`，請將 MySQL 資料庫執行個體升級到最新次要版本，或 [mysql.rds\$1skip\$1repl\$1error](mysql-stored-proc-replicating.md#mysql_rds_skip_repl_error) 列出的其中一個最低的次要版本。

## 設定 slave\$1skip\$1errors 參數
<a name="Appendix.MySQL.CommonDBATasks.SkipError.parameter"></a>

若要略過一或多個錯誤，您可以在僅供讀取複本上設定 `slave_skip_errors` 靜態參數。您可以設定此參數，以略過一或多個特定的複寫錯誤碼。目前，您只能針對 RDS for MySQL 5.7 資料庫執行個體設定此參數。在變更此參數的設定之後，請務必重新啟動您的資料庫執行個體，新設定才會生效。如需設定此參數的相關資訊，請參閱 [MySQL 文件](https://dev.mysql.com/doc/refman/5.7/en/replication-options-replica.html#sysvar_slave_skip_errors)：

建議您在個別的資料庫參數群組中設定此參數。您只能將此資料庫參數群組與需要略過錯誤的僅供讀取複本建立關聯。遵循此最佳實務可減少對其他資料庫執行個體和僅供讀取複本的潛在影響。

**重要**  
針對此參數設定非預設值可能會導致複寫不一致。只有在您已用盡其他選項來解決問題，並確定對僅供讀取複本資料產生潛在影響時，才會將此參數設定為非預設值。

# 使用 InnoDB 資料表空間來改善 RDS for MySQL 的損毀復原時間
<a name="Appendix.MySQL.CommonDBATasks.Tables"></a>

MySQL 中的每個資料表都包含資料表定義、資枓和索引。MySQL 儲存引擎 InnoDB 會將資料表資料和索引儲存在*資料表空間*中。InnoDB 會建立全域共用的資料表空間，其中包含資料字典和其他相關中繼資料，而且它可以包含資料表資料和索引。InnoDB 也可以針對每個資料表和分割區建立個別的資料表空間。這些個別的資料表空間會儲存在副檔名為 .ibd 的檔案中，而且每個資料表空間的標題都包含一個專門識別它的數字。

Amazon RDS 會在 MySQL 參數群組中提供名為 `innodb_file_per_table` 的參數。此參數會控制 InnoDB 是否將新的資料表資料和索引加入至共用的資料表空間 (方法為將參數值設為 0) 或加入至個別的資料表空間 (方法為將參數值設為 1)。Amazon RDS 會將 `innodb_file_per_table` 參數的預設值設為 1，這允許您捨棄個別的 InnoDB 資料表，並回收那些資料表針對資料庫執行個體使用的儲存體。在大部分使用案例中，將 `innodb_file_per_table` 參數設為 1 是建議的設定。

當您有大量的資料表 (例如，當您使用標準 (磁性) 或一般用途 SSD 儲存體時超過 1000 個資料表，或當您使用佈建 IOPS 儲存體時超過 10,000 個資料表) 時，您應該將 `innodb_file_per_table` 參數設為 0。將此參數設為 0 時，不會建立個別資料表空間，而且這樣做可縮短資料庫損毀復原所需的時間。

MySQL 會在損毀復原週期處理每個中繼檔案。相較於有多個資料表時，處理數千個資料表檔案所需的時間，可以忽略 MySQL 在共用的資料表空間中處理中繼資訊所需的時間。因為資料表空間號碼會儲存在每個檔案的標題內，所以讀取所有資料表空間檔案的合計時間可能高達七小時。例如，標準儲存體上的一百萬個 InnoDB 資料表空間在損毀復原週期可能需要五到八小時的處理時間。在某些情況下，InnoDB 可以判斷在損毀復原週期之後是否需要額外清除，以便它將開始另一個損毀復原週期，這將延長復原時間。請記住，除了處理資料表空間資訊外，損毀復原週期也會包含轉返交易、修正中斷的頁面，以及其他操作。

因為 `innodb_file_per_table` 參數位於常數群組中，所以您可以變更參數值，方法為編輯資料庫執行個體所使用的參數群組，而不必重新啟動資料庫執行個體。例如，在將設定從 1 (建立個別資料表) 變更為 0 (使用共用的資料表空間) 之後，當現有的資料表繼續具有個別資料表空間時，新的 InnoDB 資料表將新增至共用的資料表空間。若要將 InnoDB 資料表移至共用的資料表空間，您必須使用 `ALTER TABLE` 命令。

## 將多個資料表空間遷移至共用的資料表空間
<a name="Appendix.MySQL.CommonDBATasks.MigrateMultiTbs"></a>

您可以將 InnoDB 資料表的中繼資料移至它自己的資料表空間，這將根據 `innodb_file_per_table` 參數設定，重建資料表中繼資料。首先連接到您的 MySQL 資料庫執行個體，然後發出適當的命令，如下所示。如需更多詳細資訊，請參閱 [連線至您的 MySQL 資料庫執行個體](USER_ConnectToInstance.md)。

```
ALTER TABLE table_name ENGINE = InnoDB, ALGORITHM=COPY; 
```

例如，以下查詢會針對不在共用的資料表空間中的每一個 InnoDB 資料表傳回 `ALTER TABLE` 陳述式。

**若為 MySQL 5.7 資料庫執行個體：**

```
SELECT CONCAT('ALTER TABLE `', 
REPLACE(LEFT(NAME , INSTR((NAME), '/') - 1), '`', '``'), '`.`', 
REPLACE(SUBSTR(NAME FROM INSTR(NAME, '/') + 1), '`', '``'), '` ENGINE=InnoDB, ALGORITHM=COPY;') AS Query 
FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES 
WHERE SPACE <> 0 AND LEFT(NAME, INSTR((NAME), '/') - 1) NOT IN ('mysql','');
```

**適用於 MySQL 8.4 和 8.0 資料庫執行個體：**

```
SELECT CONCAT('ALTER TABLE `', 
REPLACE(LEFT(NAME , INSTR((NAME), '/') - 1), '`', '``'), '`.`', 
REPLACE(SUBSTR(NAME FROM INSTR(NAME, '/') + 1), '`', '``'), '` ENGINE=InnoDB, ALGORITHM=COPY;') AS Query 
FROM INFORMATION_SCHEMA.INNODB_TABLES 
WHERE SPACE <> 0 AND LEFT(NAME, INSTR((NAME), '/') - 1) NOT IN ('mysql','');
```

重建 MySQL 資料表將資料表的中繼資料移至共用的資料表空間，暫時需要額外的儲存空間來重建資料表，所以資料庫執行個體必須具有可用的儲存空間。重建期間，會鎖定資料表，而且查詢無法存取它。對於不經常存取的小型表格或表格，可能不需要擔心此問題。對於在大量並行環境中經常存取的大型表格或表格，您可以在僅供讀取複本上重建資料表。

您可以建立僅供讀取複本，並將資料表中繼資料遷移至僅供讀取複本上共用的資料表空間。當 ALTER TABLE 陳述式封鎖僅供讀取複本上的存取權時，來源資料庫執行個體不會受到影響。在資料表重建過程中，當僅供讀取複本延遲時，來源資料庫執行個體將繼續產生其二進位記錄。由於重建需要額外的儲存空間，重播日誌檔案可能因此變大，所以您應該建立其配置的儲存體大於來源資料庫執行個體的僅供讀取複本。

若要建立僅供讀取複本並重建 InnoDB 資料表，以使用共用的資料表空間，請採取以下步驟：

1. 確保已在來源資料庫執行個體上啟用備份保留，以便啟用二進位記錄。

1. 使用 AWS 管理主控台 或 AWS CLI 為來源資料庫執行個體建立僅供讀取複本。因為建立僅供讀取複本涉及許多與損毀復原相同的程序，所以如果有大量 InnoDB 資料表空間，則建立程序可能需要一些時間。在僅供讀取複本上配置更多的儲存空間，超過目前在來源資料庫執行個體上使用的儲存空間。

1. 建立僅供讀取複本後，請使用參數設定 `read_only = 0` 和 `innodb_file_per_table = 0` 建立參數群組。接著請將參數群組與僅供讀取複本產生關聯。

1. 針對您要在複本上遷移的所有資料表，發出下列 SQL 陳述式：

   ```
   ALTER TABLE name ENGINE = InnoDB
   ```

1. 在僅供讀取複本上完成了所有 `ALTER TABLE` 陳述式時，請驗證僅供讀取複本是否連線至來源資料庫執行個體，以及這兩個執行個體是否同步。

1. 使用主控台或 CLI 將僅供讀取複本升級為執行個體。確定用於新獨立資料庫執行個體的參數群組已將 `innodb_file_per_table` 參數設為 0。變更新獨立資料庫執行個體的名稱，並將任何應用程式指向新的獨立資料庫執行個體。

# 管理 RDS for MySQL 的全域狀態歷史記錄
<a name="Appendix.MySQL.CommonDBATasks.GoSH"></a>

**提示**  
若要分析資料庫效能，您也可以使用 Amazon RDS 上的 Performance Insights。如需詳細資訊，請參閱[在 Amazon RDS 上使用績效詳情監控資料庫負載](USER_PerfInsights.md)。

MySQL 會維護許多提供其操作相關資訊的狀態變數。此值可協助您偵測資料庫執行個體上的鎖定或記憶體問題。這些狀態變數的值是從上次啟動資料庫執行個體以來累積的。您可以使用 `FLUSH STATUS` 命令，將大部分狀態變數重設為 0。

為了允許在一段时間內監控這些值，Amazon RDS 提供一組程序，將在一段時間內快照這些狀態變數的值，並將它們以及自從上次快照後的任何變更寫入至資料表。此基礎設施 (稱為全域狀態歷史記錄 (GoSH)) 安裝在所有從版本 5.5.23 開始的 MySQL 資料庫執行個體。GoSH 預設為停用。

若要啟用 GoSH，首先從資料庫參數群組啟用事件排程器，方法是將參數 `event_scheduler` 設為 `ON`。對於執行 MySQL 5.7 的 MySQL 資料庫執行個體，同樣將參數 `show_compatibility_56` 設為 `1`。如需建立和修改資料庫參數群組的詳細資訊，請參閱[Amazon RDS 的參數群組](USER_WorkingWithParamGroups.md)。如需啟用此參數的副作用相關資訊，請參閱《MySQL 5.7 參考手冊》**中的 [show\$1compatibility\$156](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_show_compatibility_56)。

然後，您可以使用下表中的程序，來啟用和設定 GoSH。首先連接到您的 MySQL 資料庫執行個體，然後發出適當的命令，如下所示。如需詳細資訊，請參閱[連線至您的 MySQL 資料庫執行個體](USER_ConnectToInstance.md)。針對每個程序，執行下列命令並取代 **procedure-name**：

```
CALL procedure-name; 
```

下表列出您可以在上一個命令中用於 **procedure-name** 的所有程序。


| 程序 | 描述 | 
| --- | --- | 
| `mysql.rds_enable_gsh_collector` |  啟用 GoSH 來依據 `rds_set_gsh_collector` 指定的間隔建立預設快照。  | 
| `mysql.rds_set_gsh_collector` |  指定快照之間的間隔 (以分鐘為單位)。預設值為 5。  | 
| `mysql.rds_disable_gsh_collector` |  停用快照。  | 
| `mysql.rds_collect_global_status_history` |  隨需建立快照。  | 
| `mysql.rds_enable_gsh_rotation` |  啟用依 `mysql.rds_global_status_history` 指定的間隔將 `mysql.rds_global_status_history_old` 資料表的內容輪換至 `rds_set_gsh_rotation`。  | 
| `mysql.rds_set_gsh_rotation` |  指定資料表輪換之間的間隔 (以天為單位)。預設值為 7。  | 
| `mysql.rds_disable_gsh_rotation` |  停用資料表輪換。  | 
| `mysql.rds_rotate_global_status_history` |  隨需將 `mysql.rds_global_status_history` 資料表的內容輪換至 `mysql.rds_global_status_history_old`。  | 

當 GoSH 執行中時，您可以查詢寫入它的資料表。例如，若要查詢 Innodb 緩衝集區的命中率，您將發出下列查詢：

```
select a.collection_end, a.collection_start, (( a.variable_Delta-b.variable_delta)/a.variable_delta)*100 as "HitRatio" 
    from mysql.rds_global_status_history as a join mysql.rds_global_status_history as b on a.collection_end = b.collection_end
    where a. variable_name = 'Innodb_buffer_pool_read_requests' and b.variable_name = 'Innodb_buffer_pool_reads'
```

# 在 MySQL 8.4 中設定緩衝集區大小和重做日誌容量
<a name="Appendix.MySQL.CommonDBATasks.Config.Size.8.4"></a>

在 MySQL 8.4 中，Amazon RDS 預設會啟用 `innodb_dedicated_server` 參數。使用 `innodb_dedicated_server` 參數，資料庫引擎會計算 `innodb_buffer_pool_size` 和 `innodb_redo_log_capacity` 參數。如需如何計算這些參數的資訊，請參閱 MySQL 文件中的[設定 InnoDB 緩衝集區大小](https://dev.mysql.com/doc/refman/8.4/en/innodb-buffer-pool-resize.html)和[重做日誌](https://dev.mysql.com/doc/refman/8.4/en/innodb-redo-log.html)。

`innodb_dedicated_server` 啟用後，`innodb_buffer_pool_size` 參數會根據資料庫執行個體類別記憶體計算。下表顯示偵測到的伺服器記憶體和對應的緩衝集區大小。


| 偵測到的伺服器記憶體 | 緩衝集區大小 | 
| --- | --- | 
|  < 1 GB  |  預設值為 128 MB  | 
|  1 GB 到 4 GB  |  *偵測到的伺服器記憶體* \$1 0.5  | 
|  > 4 GB  |  *偵測到的伺服器記憶體* \$1 0.75  | 

`innodb_redo_log_capacity` 參數會隨著執行個體類別自動擴展至 (vCPU 數量 / 2) GB，上限為 16 GB。較大的執行個體類別具有較大的重做日誌容量，可改善寫入密集型工作負載的效能和彈性。

從 MySQL 8.0 升級到 MySQL 8.4 之前，請務必增加儲存空間，以因應升級完成後可能發生的重做日誌大小增加的潛在情況。如需詳細資訊，請參閱[增加資料庫執行個體的儲存容量](USER_PIOPS.ModifyingExisting.md)。

如果您不希望 `innodb_dedicated_server` 參數計算 `innodb_buffer_pool_size` 和 `innodb_redo_log_capacity` 參數的值，您可以透過在自訂參數群組中為其設定特定值來覆寫這些值。或者，您可以停用 `innodb_dedicated_server` 參數，並設定自訂參數群組中 `innodb_buffer_pool_size` 和 `innodb_redo_log_capacity` 參數的值。如需詳細資訊，請參閱[預設和自訂參數群組](parameter-groups-overview.md#parameter-groups-overview.custom)。

如果您透過將 `innodb_dedicated_server` 參數設定為 `0` 來停用參數，且未針對 `innodb_buffer_pool_size` 和 `innodb_redo_log_capacity` 參數設定值，則 Amazon RDS 會將後兩個參數分別設定為 128 MB 和 100 MB。這些預設值會導致較大的執行個體類別效能不佳。