

# Amazon RDS SQL 上的 MariaDB 参考
<a name="Appendix.MariaDB.SQLRef"></a>

在下文中，您可以找到对于运行 MariaDB 数据库引擎的 Amazon RDS 实例可用的系统存储过程的说明。

对于 MySQL 数据库实例和 MariaDB 数据库实例，您可以使用可用的系统存储过程。这些存储过程记录在[RDS for MySQL 存储过程参考](Appendix.MySQL.SQLRef.md)上。MariaDB 数据库实例支持除 `mysql.rds_start_replication_until` 和 `mysql.rds_start_replication_until_gtid` 以外的所有存储过程。

此外，只有运行 MariaDB 的 Amazon RDS 数据库实例支持以下系统存储过程：
+ [mysql.rds\$1replica\$1status](mysql_rds_replica_status.md)
+ [mysql.rds\$1set\$1external\$1master\$1gtid](mysql_rds_set_external_master_gtid.md)
+ [mysql.rds\$1kill\$1query\$1id](mysql_rds_kill_query_id.md)
+ [mysql.rds\$1execute\$1operation](mysql_rds_execute_operation.md)

# mysql.rds\$1replica\$1status
<a name="mysql_rds_replica_status"></a>

显示 MariaDB 只读副本的复制状态。

在只读副本上调用此过程可显示有关副本线程基本参数的状态信息。

## 语法
<a name="mysql_rds_replica_status-syntax"></a>

```
CALL mysql.rds_replica_status;
```

## 使用说明
<a name="mysql_rds_replica_status-usage-notes"></a>

只有运行 MariaDB 版本 10.5 及更高版本的 MariaDB 数据库实例才支持此过程。

此过程等同于 `SHOW REPLICA STATUS` 命令。MariaDB 10.5 及更高版本的数据库实例不支持此命令。

在以前版本的 MariaDB 中，同等的 `SHOW SLAVE STATUS` 命令需要 `REPLICATION SLAVE` 特权。在 MariaDB 版本 10.5 及更高版本中，其需要 `REPLICATION REPLICA ADMIN` 特权。为了保护 MariaDB 10.5 及更高版本数据库实例的 RDS 管理，未向 RDS 主用户授予此新权限。

## 示例
<a name="mysql_rds_replica_status-examples"></a>

以下示例显示了 MariaDB 只读副本的状态：

```
call mysql.rds_replica_status;
```

响应类似于以下内容：

```
*************************** 1. row ***************************
                Replica_IO_State: Waiting for master to send event
                     Source_Host: XX.XX.XX.XXX
                     Source_User: rdsrepladmin
                     Source_Port: 3306
                   Connect_Retry: 60
                 Source_Log_File: mysql-bin-changelog.003988
             Read_Source_Log_Pos: 405
                  Relay_Log_File: relaylog.011024
                   Relay_Log_Pos: 657
           Relay_Source_Log_File: mysql-bin-changelog.003988
              Replica_IO_Running: Yes
             Replica_SQL_Running: Yes
                 Replicate_Do_DB:
             Replicate_Ignore_DB:
              Replicate_Do_Table:
          Replicate_Ignore_Table: mysql.rds_sysinfo,mysql.rds_history,mysql.rds_replication_status
         Replicate_Wild_Do_Table:
     Replicate_Wild_Ignore_Table:
                      Last_Errno: 0
                      Last_Error:
                    Skip_Counter: 0
             Exec_Source_Log_Pos: 405
                 Relay_Log_Space: 1016
                 Until_Condition: None
                  Until_Log_File:
                   Until_Log_Pos: 0
              Source_SSL_Allowed: No
              Source_SSL_CA_File:
              Source_SSL_CA_Path:
                 Source_SSL_Cert:
               Source_SSL_Cipher:
                  Source_SSL_Key:
           Seconds_Behind_Master: 0
   Source_SSL_Verify_Server_Cert: No
                   Last_IO_Errno: 0
                   Last_IO_Error:
                  Last_SQL_Errno: 0
                  Last_SQL_Error:
     Replicate_Ignore_Server_Ids:
                Source_Server_Id: 807509301
                  Source_SSL_Crl:
              Source_SSL_Crlpath:
                      Using_Gtid: Slave_Pos
                     Gtid_IO_Pos: 0-807509301-3980
         Replicate_Do_Domain_Ids:
     Replicate_Ignore_Domain_Ids:
                   Parallel_Mode: optimistic
                       SQL_Delay: 0
             SQL_Remaining_Delay: NULL
       Replica_SQL_Running_State: Reading event from the relay log
              Replica_DDL_Groups: 15
Replica_Non_Transactional_Groups: 0
    Replica_Transactional_Groups: 3658
1 row in set (0.000 sec)

Query OK, 0 rows affected (0.000 sec)
```

# mysql.rds\$1set\$1external\$1master\$1gtid
<a name="mysql_rds_set_external_master_gtid"></a>

配置从在 Amazon RDS 外部运行的 MariaDB 实例到 MariaDB 数据库实例的基于 GTID 的复制。仅当外部 MariaDB 实例的版本为 10.0.24 或更高版本时，才支持此存储过程。在设置复制时，如果其中的一个或两个实例不支持 MariaDB 全局事务标识符 (GTID)，请使用 [mysql.rds\$1set\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](mysql-stored-proc-replicating.md#mysql_rds_set_external_master)。

使用 GTID 进行复制提供了二进制日志复制无法提供的崩溃安全功能，因此，我们建议在复制实例支持 GTID 的情况下使用它。

## 语法
<a name="mysql_rds_set_external_master_gtid-syntax"></a>

 

```
CALL mysql.rds_set_external_master_gtid(
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , gtid
  , ssl_encryption
);
```

## 参数
<a name="mysql_rds_set_external_master_gtid-parameters"></a>

 *host\$1name*   
字符串。在 Amazon RDS 外部运行并将变为源实例的 MariaDB 实例的主机名或 IP 地址。

 *host\$1port*   
整数。在 Amazon RDS 外部运行的要配置为源实例的 MariaDB 实例使用的端口。如果网络配置包括转换端口号的 SSH 端口复制，则指定由 SSH 公开的端口号。

 *replication\$1user\$1name*   
字符串。在要配置为只读副本的 MariaDB 数据库实例中具有 `REPLICATION SLAVE` 权限的用户的 ID。

 *replication\$1user\$1password*   
字符串。在 `replication_user_name` 中指定的用户 ID 的密码。

 *gtid*   
字符串。应作为复制的起始点的源实例上的全局事务 ID。  
如果源实例在您配置复制时已被锁定，则可以使用 `@@gtid_current_pos` 获取当前 GTID，以便让二进制日志在您获得 GTID 和复制开始之间的这一段时间内不会改变。  
否则，如果您使用 `mysqldump` 版本 10.0.13 或更高版本在开始复制前填充副本实例，则可以使用 `--master-data` 或 `--dump-slave` 选项获取输出中的 GTID 位置。如果您不使用 `mysqldump` 10.0.13 版或更高版本，则可以运行 `SHOW MASTER STATUS` 或使用这些相同的 `mysqldump` 选项来获取二进制日志文件名称和位置，然后通过对外部 MariaDB 实例运行 `BINLOG_GTID_POS` 来将这些名称和位置转换为 GTID：  

```
SELECT BINLOG_GTID_POS('<binary log file name>', <binary log file position>);
```
有关 GTID 的 MariaDB 实施的更多信息，请参阅 MariaDB 文档中的[全局事务 ID](http://mariadb.com/kb/en/mariadb/global-transaction-id/)。

 *ssl\$1encryption*   
指定是否在复制连接中使用安全套接字层（SSL）加密的值。1 表示使用 SSL 加密，0 表示不使用加密。默认值为 0。  
不支持 `MASTER_SSL_VERIFY_SERVER_CERT` 选项。此选项设置为 0，这意味着连接已加密，但未验证证书。

## 使用说明
<a name="mysql_rds_set_external_master_gtid-usage-notes"></a>

`mysql.rds_set_external_master_gtid` 过程必须由主用户运行。它必须在 MariaDB 数据库实例（由您配置为在 Amazon RDS 外部运行的 MariaDB 实例的副本）上运行。在运行 `mysql.rds_set_external_master_gtid` 之前，必须将在 Amazon RDS 外部运行的 MariaDB 实例配置为源实例。有关更多信息，请参阅“[将数据导入到 Amazon RDS for MariaDB 数据库实例](MariaDB.Procedural.Importing.md)”。

**警告**  
请勿使用 `mysql.rds_set_external_master_gtid` 管理两个 Amazon RDS 数据库实例之间的复制。仅当使用在 RDS 外部运行的 MariaDB 实例进行复制时，才能使用它。有关管理 Amazon RDS 数据库实例之间的复制的信息，请参阅[使用数据库实例只读副本](USER_ReadRepl.md)。

在调用 `mysql.rds_set_external_master_gtid` 将 Amazon RDS 数据库实例配置为只读副本后，可对该副本调用 [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) 开始复制过程。您可以调用 [mysql.rds\$1reset\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](mysql-stored-proc-replicating.md#mysql_rds_reset_external_master) 删除只读副本配置。

调用 `mysql.rds_set_external_master_gtid` 时，Amazon RDS 将时间、用户和“设置主体”的操作记录在 `mysql.rds_history` 和 `mysql.rds_replication_status` 表中。

## 示例
<a name="mysql_rds_set_external_master_gtid-examples"></a>

在 MariaDB 数据库实例上运行时，以下示例将该数据库实例配置为在 Amazon RDS 外部运行的某个 MariaDB 实例的副本。

```
call mysql.rds_set_external_master_gtid ('Sourcedb.some.com',3306,'ReplicationUser','SomePassW0rd','0-123-456',0); 
```

# mysql.rds\$1kill\$1query\$1id
<a name="mysql_rds_kill_query_id"></a>

结束针对 MariaDB 服务器运行的查询，以终止长时间运行的查询或有问题的查询。您可以识别查询 ID 并有效地停止特定查询，以解决性能问题并保持理想的数据库操作。

## 语法
<a name="mysql_rds_kill_query_id-syntax"></a>

```
CALL mysql.rds_kill_query_id(queryID);
```

## 参数
<a name="mysql_rds_kill_query_id-parameters"></a>

 *queryID*   
整数。将结束的查询的标识。

## 使用说明
<a name="mysql_rds_kill_query_id-usage-notes"></a>

要停止针对 MariaDB 服务器运行的查询，请使用 `mysql.rds_kill_query_id` 过程并传入该查询的 ID。要获取查询 ID，请查询 MariaDB [信息架构 PROCESSLIST 架构表](http://mariadb.com/kb/en/mariadb/information-schema-processlist-table/)，如下所示：

```
SELECT USER, HOST, COMMAND, TIME, STATE, INFO, QUERY_ID FROM 
                INFORMATION_SCHEMA.PROCESSLIST WHERE USER = '<user name>';
```

与 MariaDB 服务器的连接将会保留。

## 示例
<a name="mysql_rds_kill_query_id-examples"></a>

以下示例结束查询 ID 为 230040 的查询：

```
call mysql.rds_kill_query_id(230040); 
```

# mysql.rds\$1execute\$1operation
<a name="mysql_rds_execute_operation"></a>

执行 InnoDB 操作以管理缓冲池状态和临时表空间。此过程可用于动态控制 InnoDB 操作，例如转储和加载缓冲池状态或截断临时表空间。

## 语法
<a name="mysql_rds_execute_operation-syntax"></a>

```
CALL mysql.rds_execute_operation(operation);
```

## 参数
<a name="mysql_rds_execute_operation-parameters"></a>

 *operation*   
字符串。要执行的 InnoDB 操作。有效值为：  
+ *innodb\$1buffer\$1pool\$1dump\$1now* - 转储缓冲池当前状态的操作。
+ *innodb\$1buffer\$1pool\$1load\$1now* - 加载已保存的缓冲池状态的操作。
+ *innodb\$1buffer\$1pool\$1load\$1abort* - 中止缓冲池加载操作的操作。
+ *innodb\$1truncate\$1temporary\$1tablespace\$1now* - 截断临时表空间的操作。

## 使用说明
<a name="mysql_rds_execute_operation-usage-notes"></a>

只有运行 MariaDB 版本 11.8 及更高版本的 MariaDB 数据库实例才支持此过程。

在执行过程中，会暂时禁用二进制日志记录，以防止复制这些管理命令。

该过程通过记录 [https://mariadb.com/docs/server/security/securing-mariadb/securing-mariadb-encryption/data-in-transit-encryption/securing-connections-for-client-and-server#requiring-tls](https://mariadb.com/docs/server/security/securing-mariadb/securing-mariadb-encryption/data-in-transit-encryption/securing-connections-for-client-and-server#requiring-tls) 表中的所有操作来维护审计跟踪记录。

## 示例
<a name="mysql_rds_execute_operation-examples"></a>

以下示例演示了使用 `mysql.rds_execute_operation` 缩减临时表空间：

要检查当前临时表空间大小，请运行以下查询：

```
      
SELECT FILE_SIZE FROM information_schema.innodb_sys_tablespaces WHERE name LIKE 'innodb_temporary';
+------------+
| FILE_SIZE  |
+------------+
| 6723469312 |  -- 6.3 GB
+------------+
```

删除临时表时，不会减少全局表空间中的存储使用量。要减小全局表空间的大小，请运行 `mysql.rds_execute_operation` 命令来缩小临时表空间。

```
 
CALL mysql.rds_execute_operation('innodb_truncate_temporary_tablespace_now');
Query OK, 2 rows affected (0.004 sec)
```

运行该过程后，请验证空间是否已回收。

```
SELECT FILE_SIZE FROM information_schema.innodb_sys_tablespaces WHERE name LIKE 'innodb_temporary';
+-----------+
| FILE_SIZE |
+-----------+
|  12582912 |  -- 12 MB
+-----------+
```

**注意**  
 收缩操作可能需要一些时间，具体取决于临时表空间大小和当前工作负载。

**重要**  
只有当所有影响临时表空间大小的临时表都不再使用时，临时表空间才会缩小。我们建议您在实例上没有任何活动的临时表空间时运行此过程。