

# MySQL 数据库日志文件
<a name="USER_LogAccess.Concepts.MySQL"></a>

您可直接通过 Amazon RDS 控制台、Amazon RDS API、AWS CLI 或 AWS 开发工具包监控 MySQL 日志。您还可通过将 MySQL 日志引向主数据库中的数据库表并查询该表，访问这些日志。可使用 mysqlbinlog 实用程序下载二进制日志。

有关查看、下载和监视基于文件的数据库日志的更多信息，请参阅 [监控 Amazon RDS 日志文件](USER_LogAccess.md)。

**Topics**
+ [RDS for MySQL 数据库日志概览](USER_LogAccess.MySQL.LogFileSize.md)
+ [将 MySQL 日志发布到 Amazon CloudWatch Logs](USER_LogAccess.MySQLDB.PublishtoCloudWatchLogs.md)
+ [将 MySQL 日志输出发送到表](Appendix.MySQL.CommonDBATasks.Logs.md)
+ [为单可用区数据库配置 RDS for MySQL 二进制日志记录](USER_LogAccess.MySQL.BinaryFormat.md)
+ [为多可用区数据库集群配置 MySQL 二进制日志记录](USER_Binlog.MultiAZ.md)
+ [访问 MySQL 二进制日志](USER_LogAccess.MySQL.Binarylog.md)

# RDS for MySQL 数据库日志概览
<a name="USER_LogAccess.MySQL.LogFileSize"></a>

您可以监控以下类型的 RDS for MySQL 日志文件：
+ 错误日志
+ 慢速查询日志
+ 常规日志
+ 审核日志
+ 实例日志
+ IAM 数据库身份验证错误日志

默认情况下，系统会生成 RDS for MySQL 错误日志。您可以通过在数据库参数组中设置参数来生成慢速查询日志和一般日志。

**Topics**
+ [RDS for MySQL 错误日志](#USER_LogAccess.MySQL.Errorlog)
+ [RDS for MySQL 慢速查询日志和一般日志](#USER_LogAccess.MySQL.Generallog)
+ [MySQL 审计日志](#USER_LogAccess.MySQL.Auditlog)
+ [RDS for MySQL 的日志轮换和保留](#USER_LogAccess.MySQL.LogFileSize.retention)
+ [重做日志的大小限制](#USER_LogAccess.MySQL.LogFileSize.RedoLogs)

## RDS for MySQL 错误日志
<a name="USER_LogAccess.MySQL.Errorlog"></a>

RDS for MySQL 在 `mysql-error.log` 文件中写入错误。每个日志文件的名称上都会附有生成时间的信息 (以 UTC 时间标记)。日志文件还会拥有时间戳，帮助您确定日志项的写入时间。

RDS for MySQL 仅在启动、关闭和遇到错误时才向错误日志写入内容。数据库实例可以运行数小时或者数天，而不向错误日志中写入新项。如果看不到最近的条目，则原因是服务器未遇到导致生成日志条目的错误。

根据设计，将筛选错误日志，以便仅显示错误等意外事件。但是，错误日志还包含一些未显示的其他数据库信息，例如查询进度。因此，即使没有任何实际错误，由于持续进行的数据库活动，错误日志的大小也可能会增加。虽然您可能会在 AWS 管理控制台 中看到错误日志有一定大小（以字节或千字节为单位），但当您下载它们时，它们可能为 0 字节。

RDS for MySQL 每 5 分钟将 `mysql-error.log` 写入磁盘。它会将日志的内容附加到 `mysql-error-running.log` 中。

RDS for MySQL 每小时轮换一次 `mysql-error-running.log` 文件。它会保留过去两周生成的日志。

**注意**  
Amazon RDS 和 Aurora 之间的日志保留期不同。

## RDS for MySQL 慢速查询日志和一般日志
<a name="USER_LogAccess.MySQL.Generallog"></a>

可以将 RDS for MySQL 慢速查询日志和一般日志写入文件或数据库表中。为此，请设置数据库参数组中的参数。有关创建和修改数据库参数组的信息，请参阅 [Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。您必须先设置这些参数，然后才能在 Amazon RDS 控制台中或使用 Amazon RDS API、Amazon RDS CLI 或AWS软件开发工具包查看慢速查询日志或一般日志。

可通过使用下面列表中的参数来控制 RDS for MySQL 日志记录：
+ `slow_query_log`：要创建慢速查询日志，请设置为 1。默认值为 0。
+ `general_log`：要创建一般日志，请设置为 1。默认值是 0。
+ `long_query_time`：要防止在慢速查询日志中记录快速运行的查询，请指定需要记录的最短查询运行时间值，以秒为单位。默认值为 10 秒；最小值为 0。如果 log\$1output = FILE，则可以指定精确到微秒的浮点值。如果 log\$1output = TABLE，则必须指定精确到秒的整数值。系统只记录运行时间超过 `long_query_time` 值的查询。例如，将 `long_query_time` 设置为 0.1 可防止记录任何运行时间少于 100 毫秒的查询。
+ `log_queries_not_using_indexes`：要将所有不使用索引的查询记录到慢速查询日志，请设置为 1。将记录不使用索引的查询，即使它们的运行时间小于 `long_query_time` 参数的值。默认值是 0。
+ `log_output option`：您可为 `log_output` 参数指定下列选项之一。
  + **TABLE** （默认）— 将一般查询写入 `mysql.general_log` 表，将慢速查询写入 `mysql.slow_log` 表。
  + **FILE**– 将一般查询日志和慢速查询日志写入文件系统。
  + **NONE**– 禁用日志记录。

要使慢速查询数据出现在 Amazon CloudWatch Logs 中，必须满足以下条件：
+ 必须将 CloudWatch Logs 配置为包含慢速查询日志。
+ 必须启用 `slow_query_log`。
+ `log_output`必须将 / 设置为 `FILE`。
+ 查询花费的时间必须比为 `long_query_time` 配置的时间长。

有关慢速查询日志和一般日志的更多信息，请参阅 MySQL 文档中的以下主题：
+ [慢速查询日志](https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html)
+ [一般查询日志](https://dev.mysql.com/doc/refman/8.0/en/query-log.html)

## MySQL 审计日志
<a name="USER_LogAccess.MySQL.Auditlog"></a>

若要访问审计日志，数据库实例必须使用具有 `MARIADB_AUDIT_PLUGIN` 选项的自定义选项组。有关更多信息，请参阅 [MySQL 的 MariaDB 审计插件支持](Appendix.MySQL.Options.AuditPlugin.md)。

## RDS for MySQL 的日志轮换和保留
<a name="USER_LogAccess.MySQL.LogFileSize.retention"></a>

启用了日志记录时，Amazon RDS 会定期轮换表日志或删除日志文件。这是一种预防措施，用于降低大型日志文件阻止数据库使用或影响性能的可能性。RDS for MySQL 按如下方式处理轮换和删除：
+ MySQL 慢速查询日志、错误日志和一般日志文件的大小限制为不超过为数据库实例分配的存储空间的 2%。为了维护此阈值，日志每小时自动轮换一次。MySQL 会删除超过两周的日志文件。如果在删除旧日志文件后，日志文件的总体大小超出此阈值，则将删除最早的日志文件，直到日志文件大小不再超出此阈值。
+ 启用了 `FILE` 日志记录时，系统会每小时检查一次日志文件，并删除超过两周的日志文件。在一些情况下，删除之后的剩余日志文件的总体大小可能超过了数据库实例的分配空间的 2% 阈值。在这些情况下，将删除最旧的日志文件，直到日志文件大小不再超过此阈值。
+ 启用了 `TABLE` 日志记录时，在某些情况下，日志表每 24 小时轮换一次。如果表日志使用的空间大于所分配存储空间的 20%，则会执行此轮换。如果所有日志的总体大小超过 10GB，也会执行此轮换。如果用于数据库实例的空间量大于数据库实例的分配存储空间的 90%，则减小日志轮换的阈值。如果表日志使用的空间大于分配存储空间的 10%，则轮换日志表。如果所有日志的总体大小超过 5GB，也会轮换这些日志表。您可以订阅 `low storage` 事件类别，在轮换日志表以释放空间时，会发送相关通知。有关更多信息，请参阅 [使用 Amazon RDS 事件通知](USER_Events.md)。

  轮换日志表时，首先将当前日志表复制到备份日志表。然后，删除当前日志表中的条目。如果备份日志表已存在，则先将其删除，然后将当前日志表复制到备份。如果需要，您可以查询备份日志表。`mysql.general_log` 表的备份日志表名为 `mysql.general_log_backup`。`mysql.slow_log` 表的备份日志表名为 `mysql.slow_log_backup`。

  您可以通过调用 `mysql.general_log` 过程来轮换 `mysql.rds_rotate_general_log` 表。您可以通过调用 `mysql.slow_log` 过程来轮换 `mysql.rds_rotate_slow_log` 表。

  表日志在数据库版本升级期间会进行轮换。

要通过 Amazon RDS 控制台、Amazon RDS API、Amazon RDS CLI 或 AWS 开发工具包使用日志，请将 `log_output` 参数设置为 FILE。就像 MySQL 错误日志一样，这些日志文件也每小时轮换一次。将保留过去两周内生成的日志文件。请注意，Amazon RDS 和 Aurora 之间的保留期不同。

## 重做日志的大小限制
<a name="USER_LogAccess.MySQL.LogFileSize.RedoLogs"></a>

对于 RDS for MySQL 版本 8.0.32 及更低版本，此参数的默认值为 256MB。该数量是通过将 `innodb_log_file_size` 参数的默认值（128MB）乘以 `innodb_log_files_in_group` 参数的默认值（2）得出的。有关更多信息，请参阅[为 Amazon RDS for MySQL 配置参数的最佳实践，第 1 部分：与性能相关的参数](https://aws.amazon.com/blogs/database/best-practices-for-configuring-parameters-for-amazon-rds-for-mysql-part-1-parameters-related-to-performance/)。

对于 RDS for MySQL 版本 8.0.33 及更高的次要版本，Amazon RDS 使用 `innodb_redo_log_capacity` 参数而不是 `innodb_log_file_size` 参数。`innodb_redo_log_capacity` 参数的 Amazon RDS 默认值为 2GB。有关更多信息，请参阅 MySQL 文档中的 [MySQL 8.0.30 中的更改](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-30.html)。

从 MySQL 8.4 开始，Amazon RDS 默认启用 `innodb_dedicated_server` 参数。使用 `innodb_dedicated_server` 参数，数据库引擎可计算 `innodb_buffer_pool_size` 和 `innodb_redo_log_capacity` 参数。有关更多信息，请参阅 [在 MySQL 8.4 中配置缓冲池大小和重做日志容量](Appendix.MySQL.CommonDBATasks.Config.Size.8.4.md)。

# 将 MySQL 日志发布到 Amazon CloudWatch Logs
<a name="USER_LogAccess.MySQLDB.PublishtoCloudWatchLogs"></a>

您可以配置 MySQL 数据库实例以将日志数据发布到 Amazon CloudWatch Logs 中的日志组。利用 CloudWatch Logs，可以对日志数据进行实时分析并使用 CloudWatch 创建警报和查看指标。您可以使用 CloudWatch Logs 在高持久性存储中存储日志记录。

Amazon RDS 将每个 MySQL 数据库日志作为日志组中的单独数据库流进行发布。例如，如果您将导出功能配置为包括慢速查询日志，则慢速查询数据将存储在 `/aws/rds/instance/my_instance/slowquery` 日志组中的慢速查询日志流中。

默认情况下，启用错误日志。下表总结了其他 MySQL 日志的要求。


| 日志 | 要求 | 
| --- | --- | 
|  审核日志  |  数据库实例必须使用具有 `MARIADB_AUDIT_PLUGIN` 选项的自定义选项组。  | 
|  常规日志  |  数据库实例必须使用具有参数设置 `general_log = 1` 的自定义参数组才能启用常规日志。  | 
|  慢速查询日志  |  数据库实例必须使用具有参数设置 `slow_query_log = 1` 的自定义参数组才能启用慢速查询日志。  | 
|  IAM 数据库身份验证错误日志  |  您必须通过创建或修改数据库实例来启用数据库实例的日志类型 `iam-db-auth-error`。  | 
|  日志输出  |  数据库实例必须使用具有参数设置 `log_output = FILE` 的自定义参数组，才能将日志写入文件系统并将日志发布到 CloudWatch Logs。  | 

## 控制台
<a name="USER_LogAccess.MySQL.PublishtoCloudWatchLogs.CON"></a>

**使用控制台将 MySQL 日志发布到 CloudWatch Logs**

1. 通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择 **Databases (数据库)**，然后选择要修改的数据库实例。

1. 选择**修改**。

1. 在 **Log exports (日志导出)** 部分中，选择要开始发布到 CloudWatch Logs 的日志。

1. 选择**继续**，然后选择摘要页面上的**修改数据库实例**。

## AWS CLI
<a name="USER_LogAccess.MySQL.PublishtoCloudWatchLogs.CLI"></a>

 您可以使用 AWS CLI 来发布 MySQL 日志。您可以调用带以下参数的 [https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) 命令：
+ `--db-instance-identifier`
+ `--cloudwatch-logs-export-configuration`

**注意**  
对 `--cloudwatch-logs-export-configuration` 选项进行的更改始终立即应用于数据库实例。因此，`--apply-immediately` 和 `--no-apply-immediately` 选项没有影响。

您还可以通过调用以下 AWS CLI 命令来发布 MySQL 日志：
+ [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-s3.html](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-s3.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html)

通过以下选项运行上述 AWS CLI 命令之一：
+ `--db-instance-identifier`
+ `--enable-cloudwatch-logs-exports`
+ `--db-instance-class`
+ `--engine`

根据您运行的 AWS CLI 命令，可能需要其他选项。

**Example**  
以下示例修改现有的 MySQL 数据库实例以将日志文件发布到 CloudWatch Logs。`--cloudwatch-logs-export-configuration` 值是 JSON 对象。此对象的键是 `EnableLogTypes`，其值是具有 `audit`、`error`、`general` 和 `slowquery` 的任意组合的字符串的数组。  
对于 Linux、macOS 或 Unix：  

```
1. aws rds modify-db-instance \
2.     --db-instance-identifier mydbinstance \
3.     --cloudwatch-logs-export-configuration '{"EnableLogTypes":["audit","error","general","slowquery"]}'
```
对于 Windows：  

```
1. aws rds modify-db-instance ^
2.     --db-instance-identifier mydbinstance ^
3.     --cloudwatch-logs-export-configuration '{"EnableLogTypes":["audit","error","general","slowquery"]}'
```

**Example**  
以下示例将创建一个 MySQL 数据库实例并将日志文件发布到 CloudWatch Logs。`--enable-cloudwatch-logs-exports` 值是 JSON 字符串数组。这些字符串可以是 `audit`、`error`、`general` 和 `slowquery` 的任意组合。  
对于 Linux、macOS 或 Unix：  

```
1. aws rds create-db-instance \
2.     --db-instance-identifier mydbinstance \
3.     --enable-cloudwatch-logs-exports '["audit","error","general","slowquery"]' \
4.     --db-instance-class db.m4.large \
5.     --engine MySQL
```
对于 Windows：  

```
1. aws rds create-db-instance ^
2.     --db-instance-identifier mydbinstance ^
3.     --enable-cloudwatch-logs-exports '["audit","error","general","slowquery"]' ^
4.     --db-instance-class db.m4.large ^
5.     --engine MySQL
```

## RDS API
<a name="USER_LogAccess.MySQL.PublishtoCloudWatchLogs.API"></a>

您可以使用 RDS API 来发布 MySQL 日志。您可以使用以下参数调用 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) 操作：
+ `DBInstanceIdentifier`
+ `CloudwatchLogsExportConfiguration`

**注意**  
对 `CloudwatchLogsExportConfiguration` 参数进行的更改始终立即应用于数据库实例。因此，`ApplyImmediately` 参数没有影响。

您还可以通过调用以下 RDS API 操作来发布 MySQL 日志：
+ [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html)
+ [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromDBSnapshot.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromDBSnapshot.html)
+ [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromS3.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromS3.html)
+ [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html)

使用以下参数运行这些 RDS API 操作之一：
+ `DBInstanceIdentifier`
+ `EnableCloudwatchLogsExports`
+ `Engine`
+ `DBInstanceClass`

根据您运行的 AWS CLI 命令，可能需要其他参数。

# 将 MySQL 日志输出发送到表
<a name="Appendix.MySQL.CommonDBATasks.Logs"></a>

可通过创建数据库参数组并将 `log_output` 服务器参数设置为 `TABLE`，将一般日志和慢速查询日志引向数据库实例上的表。系统随后会将一般查询记录到 `mysql.general_log` 表，并将慢速查询记录到 `mysql.slow_log` 表。可以查询表来访问日志信息。启用此日志记录功能会增加写入数据库的数据量，导致性能降低。

默认情况下，一般日志和慢速查询日志处于禁用状态。要启用将日志记录到表的功能，必须将 `general_log` 和 `slow_query_log` 服务器参数设置为 `1`。

日志表将不断增大，直至通过将相应的参数重置为 `0` 来关闭相应的日志记录活动。随着时间的推移，通常会累积大量的数据，这些数据会占用相当大比例的分配存储空间。Amazon RDS 不允许截断日志表，但可以移动其中的内容。表的交替会将表的内容保存到备份表，然后创建一个新的空日志表。可用以下命令行过程手动轮换日志表，其中 `PROMPT>` 表示命令提示符：

```
PROMPT> CALL mysql.rds_rotate_slow_log;
PROMPT> CALL mysql.rds_rotate_general_log;
```

要完全移除旧数据并回收磁盘空间，请连续两次调用相应的程序。

# 为单可用区数据库配置 RDS for MySQL 二进制日志记录
<a name="USER_LogAccess.MySQL.BinaryFormat"></a>

*二进制日志*是一组日志文件，其中包含对 MySQL 服务器实例所做的数据修改的信息。二进制日志包含以下信息：
+ 描述数据库更改的事件，例如表创建或行修改
+ 有关更新数据的各语句的持续时间的信息
+ 本应更新但未更新数据的语句的事件

复制过程中发送的二进制日志记录语句。一些恢复操作也需要用到这些语句。有关更多信息，请参阅 MySQL 文档中的[二进制日志](https://dev.mysql.com/doc/refman/8.0/en/binary-log.html)。

自动备份功能会判断是否为 MySQL 开启或关闭二进制日志记录。您有以下选项：

打开二进制日志记录  
将备份保留期设置为非零正值。

关闭二进制日志记录  
将备份保留期设置为 0。

有关更多信息，请参阅 [启用自动备份](USER_WorkingWithAutomatedBackups.Enabling.md)。

Amazon RDS 上的 MySQL 支持*基于行*、*基于语句*和*混合*的二进制日志记录格式。我们建议混合使用，除非您需要特定的二进制日志格式。有关不同的 MySQL 二进制日志格式的详细信息，请参阅 MySQL 文档中的 [Binary Logging Formats](https://dev.mysql.com/doc/refman/8.0/en/binary-log-formats.html)。

如果您计划使用复制，则二进制日志记录格式很重要，因为它确定了在源中记录和发送到复制目标的数据更改记录。有关用于复制的不同二进制日志记录格式的优缺点的信息，请参阅 MySQL 文档中的[基于语句和基于行的复制的优点和缺点](https://dev.mysql.com/doc/refman/8.0/en/replication-sbr-rbr.html)。

**重要**  
在 MySQL 8.0.34 中，MySQL 弃用了 `binlog_format` 参数。在更高版本的 MySQL 中，MySQL 计划删除该参数，并且仅支持基于行的复制。因此，我们建议对新的 MySQL 复制设置使用基于行的日志记录。有关更多信息，请参阅 MySQL 文档中的 [binlog\$1format](https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html#sysvar_binlog_format)。  
MySQL 版本 8.0 和 8.4 接受参数 `binlog_format`。使用此参数时，MySQL 会发出弃用警告。在将来的主要版本中，MySQL 将移除参数 `binlog_format`。  
基于语句的复制可能在源数据库实例和只读副本之间导致不一致。有关详细信息，请参阅 MySQL 文档中的[确定二进制日志记录中的安全和不安全语句](https://dev.mysql.com/doc/refman/8.0/en/replication-rbr-safe-unsafe.html)。  
启用二进制日志记录会增加数据库实例的写入磁盘 I/O 操作数。您可以使用 `WriteIOPS``` CloudWatch 指标监控 IOPS 使用情况。

**设置 MySQL 二进制日志记录格式**

1. 通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**参数组**。

1. 选择要修改的与数据库实例关联的数据库参数组。

   您无法修改默认参数组。如果数据库实例使用默认参数组，则创建新的参数组并将其与数据库实例关联。

   有关参数组的更多信息，请参阅[Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。

1. 从**操作**中，选择**编辑**。

1. 将 `binlog_format` 参数设置为您选择的二进制日志记录格式（`ROW`、`STATEMENT` 或 `MIXED`）

   您可以通过将数据库实例的备份保留期设置为零来关闭二进制日志记录，但这会禁用每日自动备份。禁用自动备份会关闭或禁用 `log_bin` 会话变量。这将禁用 RDS for MySQL 数据库实例上的二进制日志记录，这反过来又会将数据库中的 `binlog_format` 会话变量重置为默认值 `ROW`。我们建议您不要禁用备份。有关设置**备份保留期**的更多信息，请参阅[数据库实例的设置](USER_ModifyInstance.Settings.md)。

1. 选择**保存更改**以保存对数据库参数组的更新。

由于 `binlog_format` 参数在 RDS for MySQL 中是动态的，因此您无需重启数据库实例即可应用更改。（请注意，在 Aurora MySQL 中，此参数是静态的。有关更多信息，请参阅[配置 Aurora MySQL 二进制日志记录](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.MySQL.BinaryFormat.html)。）

**重要**  
更改数据库参数组会影响使用该参数组的所有数据库实例。如果要为 AWS 区域中的不同 MySQL 数据库实例指定不同的二进制日志记录格式，数据库实例必须使用不同的数据库参数组。这些参数组标识不同的日志记录格式。为每个数据库实例分配相应的数据库参数组。

# 为多可用区数据库集群配置 MySQL 二进制日志记录
<a name="USER_Binlog.MultiAZ"></a>

Amazon RDS for MySQL 多可用区数据库集群中的二进制日志记录会记录所有数据库更改，以支持复制、时间点故障恢复和审计。在多可用区数据库集群中，二进制日志将辅助节点与主节点同步，从而确保跨可用区的数据一致性并实现无缝失效转移。

为了优化二进制日志记录，Amazon RDS 支持二进制日志事务压缩，这样可以降低二进制日志的存储要求并提高复制效率。

**Topics**
+ [多可用区数据库集群的二进制日志事务压缩](#USER_Binlog.MultiAZ.compression)
+ [为多可用区数据库集群配置二进制日志事务压缩](#USER_Binlog.MultiAZ.configuring)

## 多可用区数据库集群的二进制日志事务压缩
<a name="USER_Binlog.MultiAZ.compression"></a>

二进制日志事务压缩使用 zstd 算法来减小存储在二进制日志中的事务数据的大小。启用后，MySQL 数据库引擎会将事务有效载荷压缩为单个事件，从而显著减少 I/O 和存储开销。此功能可提高数据库性能，减小二进制日志的大小，并优化在多可用区数据库集群中管理和复制日志的资源使用。

Amazon RDS 通过以下参数为 RDS for MySQL 多可用区数据库集群提供二进制日志事务压缩：
+ `binlog_transaction_compression` – 启用 (`1`) 后，数据库引擎会压缩事务有效载荷，并将其作为单个事件写入二进制日志。这样可减少存储空间使用量并降低 I/O 开销。默认情况下，将禁用此参数。
+ `binlog_transaction_compression_level_zstd` – 为二进制日志事务配置 zstd 压缩级别。较高的值会提高压缩比，从而进一步降低存储要求，但会增加压缩的 CPU 和内存使用量。默认值为 3，范围为 1-22。

这些参数允许您根据工作负载特征和资源可用性来微调二进制日志压缩。有关更多信息，请参阅 MySQL 文档中的 [Binary Log Transaction Compression](https://dev.mysql.com/doc/refman/8.4/en/binary-log-transaction-compression.html)。

二进制日志事务压缩具有以下主要优势：
+ 压缩会减小二进制日志的大小，对于大型事务或写入量大的工作负载尤其如此。
+ 较小的二进制日志可减少网络和 I/O 开销，提高复制性能。
+ `binlog_transaction_compression_level_zstd` 参数提供对在压缩比和资源消耗之间权衡的控制。

## 为多可用区数据库集群配置二进制日志事务压缩
<a name="USER_Binlog.MultiAZ.configuring"></a>

要为 RDS for MySQL 多可用区数据库集群配置二进制日志事务压缩，请修改相关的集群参数设置以满足您的工作负载要求。

### 控制台
<a name="USER_Binlog.MultiAZ.configuring-console"></a>

**启用二进制日志事务压缩**

1. 修改数据库集群参数组，以将 `binlog_transaction_compression` 参数设置为 `1`。

1. （可选）根据您的工作负载要求和资源可用性调整 `binlog_transaction_compression_level_zstd` 参数的值。

有关更多信息，请参阅 [修改数据库集群参数组中的参数](USER_WorkingWithParamGroups.ModifyingCluster.md)。

### AWS CLI
<a name="USER_Binlog.MultiAZ.configuring-cli"></a>

要使用 AWS CLI 配置二进制日志事务压缩，请执行 [modify-db-cluster-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster-parameter-group.html) 命令。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name your-cluster-parameter-group \
  --parameters "ParameterName=binlog_transaction_compression,ParameterValue=1,ApplyMethod=pending-reboot"
```
对于：Windows  

```
aws rds modify-db-cluster-parameter-group ^
  --db-cluster-parameter-group-name your-cluster-parameter-group ^
  --parameters "ParameterName=binlog_transaction_compression,ParameterValue=1,ApplyMethod=pending-reboot"
```

### RDS API
<a name="USER_Binlog.MultiAZ.configuring-api"></a>

要使用 Amazon RDS API 配置二进制日志事务压缩，请执行 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBClusterParameterGroup.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBClusterParameterGroup.html) 操作。

# 访问 MySQL 二进制日志
<a name="USER_LogAccess.MySQL.Binarylog"></a>

可使用 mysqlbinlog 实用程序从 RDS for MySQL 数据库实例下载或流式传输二进制日志。二进制日志下载到本地计算机，可以执行一些操作，例如使用 mysql 实用程序执行重放日志。有关使用 mysqlbinlog 实用程序的更多信息，请参阅 MySQL 文档中的[使用 mysqlbinlog 备份二进制日志文件](https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog-backup.html)。

要针对 Amazon RDS 实例运行 mysqlbinlog 实用工具，请使用下列选项：
+ `--read-from-remote-server` – 必需。
+ `--host` – 来自实例的端点的 DNS 名称。
+ `--port` – 实例使用的端口。
+ `--user` – 已获得 `REPLICATION SLAVE` 权限的 MySQL 用户。
+ `--password` – MySQL 用户的密码，或忽略密码值以让实用程序提示您输入密码。
+ `--raw` – 以二进制格式下载文件。
+ `--result-file` – 用于接收原始输出的本地文件。
+ `--stop-never` – 流式传输二进制日志文件。
+ `--verbose` – 使用 `ROW` 二进制日志格式时，包括此选项以将行事件视为伪 SQL 语句。有关 `--verbose` 选项的更多信息，请参阅 MySQL 文档中的 [mysqlbinlog 行事件显示](https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog-row-events.html)。
+ 指定一个或多个二进制日志文件的名称。要获取可用日志的列表，请使用 SQL 命令 `SHOW BINARY LOGS`。

有关 mysqlbinlog 选项的更多信息，请参阅 MySQL 文档中的 [mysqlbinlog - 处理二进制日志文件的实用程序](https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html)。

以下示例显示如何使用 mysqlbinlog 实用程序。

对于 Linux、macOS 或 Unix：

```
mysqlbinlog \
    --read-from-remote-server \
    --host=MySQLInstance1.cg034hpkmmjt.region.rds.amazonaws.com \
    --port=3306  \
    --user ReplUser \
    --password \
    --raw \
    --verbose \
    --result-file=/tmp/ \
    binlog.00098
```

对于 Windows：

```
mysqlbinlog ^
    --read-from-remote-server ^
    --host=MySQLInstance1.cg034hpkmmjt.region.rds.amazonaws.com ^
    --port=3306  ^
    --user ReplUser ^
    --password ^
    --raw ^
    --verbose ^
    --result-file=/tmp/ ^
    binlog.00098
```

数据库实例上的二进制日志必须保持可用，以备 mysqlbinlog 实用程序访问。要确保这些日志的可用性，请使用 [mysql.rds\$1set\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_set_configuration) 存储过程并指定一个时段，以便您有足够的时间来下载日志。如果未设置此配置，Amazon RDS 会尽可能快地清除二进制日志，导致 mysqlbinlog 实用程序检索的二进制日志出现空白。

以下示例将保留期设置为 1 天。

```
call mysql.rds_set_configuration('binlog retention hours', 24);
```

要显示当前设置，请使用 [mysql.rds\$1show\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_show_configuration) 存储过程。

```
call mysql.rds_show_configuration;
```