### 15.20.9 对 InnoDB memcached 插件进行故障排除

本节介绍您在使用`InnoDB` **内存缓存**插入。

-   如果您在 MySQL 错误日志中遇到以下错误，则服务器可能无法启动：

    未能为打开的文件设置 rlimit。尝试以 root 身份运行或请求更小的 maxconns 值。

    错误消息来自**内存缓存**守护进程。一种解决方案是提高打开文件数量的操作系统限制。检查和增加打开文件限制的命令因操作系统而异。此示例显示了适用于 Linux 和 macOS 的命令：

    ```
    # Linux
    $> ulimit -n
    1024
    $> ulimit -n 4096
    $> ulimit -n
    4096

    # macOS
    $> ulimit -n
    256
    $> ulimit -n 4096
    $> ulimit -n
    4096
    ```

    另一种解决方案是减少允许的并发连接数**内存缓存**守护进程。为此，编码`-c` **内存缓存**中的选项[`daemon_memcached_option`](innodb-parameters.html#sysvar_daemon_memcached_option)MySQL 配置文件中的配置参数。这`-c`选项的默认值为 1024。

    ```
    [mysqld]
    ...
    loose-daemon_memcached_option='-c 64'
    ```

-   解决问题**内存缓存**守护进程无法存储或检索`InnoDB`表数据，编码`-vvv` **内存缓存**中的选项[`daemon_memcached_option`](innodb-parameters.html#sysvar_daemon_memcached_option)MySQL 配置文件中的配置参数。检查 MySQL 错误日志以获取与相关的调试输出**内存缓存**操作。

    ```
    [mysqld]
    ...
    loose-daemon_memcached_option='-vvv'
    ```

-   如果指定要保存的列**内存缓存**values 是错误的数据类型，例如数字类型而不是字符串类型，尝试存储键值对失败，没有特定的错误代码或消息。

-   如果`daemon_memcached`插件导致 MySQL 服务器启动问题，您可以暂时禁用`daemon_memcached`故障排除时通过在`[mysqld]`MySQL 配置文件中的组：

    ```
    daemon_memcached=OFF
    ```

    例如，如果您运行[`安装插件`](install-plugin.html)运行前的声明`innodb_memcached_config.sql`配置脚本来设置必要的数据库和表，服务器可能会意外退出并无法启动。如果您在`innodb_memcache.containers`桌子。

    要卸载**内存缓存**MySQL 实例的插件，发出以下语句：

    ```
    mysql> UNINSTALL PLUGIN daemon_memcached;
    ```

-   如果您在同一台机器上运行多个 MySQL 实例`daemon_memcached`在每个实例中启用插件，使用[`daemon_memcached_option`](innodb-parameters.html#sysvar_daemon_memcached_option)指定唯一的配置参数**内存缓存**每个端口`daemon_memcached`插入。

-   如果 SQL 语句找不到`InnoDB`表或在表中找不到数据，但是**内存缓存**API 调用检索预期数据，您可能缺少`InnoDB`表中的`innodb_memcache.containers`表，或者您可能没有切换到正确的`InnoDB`通过发出一个表`得到`要么`放`请求使用`@@*`table_id`*`符号。如果您更改现有条目中的`innodb_memcache.containers`表而无需随后重新启动 MySQL 服务器。自由格式存储机制足够灵活，您可以请求存储或检索多列值，例如`col1|col2|col3`即使守护进程正在使用`test.demo_test`将值存储在单个列中的表。

-   定义自己的时候`InnoDB`表与使用`daemon_memcached`插件，表中的列定义为`非空`，确保为`非空`将表的记录插入到`innodb_memcache.containers`桌子。如果[`插入`](insert.html)的声明`innodb_memcache.containers`记录包含的分隔值少于映射列，未填充的列设置为`空值`.试图插入一个`空值`价值成`非空`列导致[`插入`](insert.html)失败，这可能只有在您重新初始化`daemon_memcached`插件将更改应用到`innodb_memcache.containers`桌子。

-   如果`cas_column`和`expire_time_column`的领域`innodb_memcached.containers`表设置为`空值`，尝试加载时返回以下错误**内存缓存**插入：

    ```
    InnoDB_Memcached: column 6 in the entry for config table 'containers' in
    database 'innodb_memcache' has an invalid NULL value.
    ```

    这**内存缓存**插件拒绝使用`空值`在里面`cas_column`和`expire_time_column`列。将这些列的值设置为`0`当列未使用时。

-   作为长度**内存缓存**键和值增加，您可能会遇到大小和长度限制。

    -   当密钥超过 250 字节时，**内存缓存**操作返回错误。这是目前的固定限制**内存缓存**.

    -   `InnoDB`如果值超过 768 字节、3072 字节或一半[`innodb_page_size`](innodb-parameters.html#sysvar_innodb_page_size)价值。如果您打算在值列上创建索引以使用 SQL 在该列上运行生成报告的查询，则这些限制主要适用。看[第 15.22 节，“InnoDB 限制”](innodb-limits.html)详情。

    -   键值组合的最大大小为 1 MB。

-   如果您在不同版本的 MySQL 服务器之间共享配置文件，请使用最新的配置选项`daemon_memcached`插件可能会导致旧 MySQL 版本的启动错误。为避免兼容性问题，请使用`松动的`带有选项名称的前缀。例如，使用`松散的daemon_memcached_option='-c 64'`代替`daemon_memcached_option='-c 64'`.

-   没有限制或检查来验证字符集设置。**内存缓存**以字节为单位存储和检索键和值，因此对字符集不敏感。但是，您必须确保**内存缓存**客户端和 MySQL 表使用相同的字符集。

-   **内存缓存**连接被阻止访问包含索引虚拟列的表。访问索引虚拟列需要回调服务器，但是**内存缓存**连接无权访问服务器代码。
