14.21.8 对 InnoDB memcached 插件进行故障排除

本节介绍使用InnoDB memcached 插件时可能遇到的问题。

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

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

错误消息来自 memcached 守护程序。一种解决方案是提高 os 对打开文件数的限制。用于检查和增加打开文件限制的命令因 os 而异。此示例显示了 Linux 和 macOS 的命令:

# Linux
shell> ulimit -n
1024
shell> ulimit -n 4096
shell> ulimit -n
4096

# macOS
shell> ulimit -n
256
shell> ulimit -n 4096
shell> ulimit -n
4096

另一种解决方案是减少 memcached 守护程序允许的并发连接数。为此,请在 MySQL 配置文件中的daemon_memcached_option配置参数中对-c memcached 选项进行编码。 -c选项的默认值为 1024.

[mysqld]
...
loose-daemon_memcached_option='-c 64'
  • 要解决 memcached 守护程序无法存储或检索InnoDBtable 数据的问题,请在 MySQL 配置文件的daemon_memcached_option配置参数中对-vvv memcached 选项进行编码。检查 MySQL 错误日志中与 memcached 操作相关的调试输出。
[mysqld]
...
loose-daemon_memcached_option='-vvv'
  • 如果指定用于保存 memcached 值的列是错误的数据类型,例如数字类型而不是字符串类型,则尝试存储键值对失败,并且没有特定的错误代码或消息。

  • 如果daemon_memcached插件引起 MySQL 服务器启动问题,则可以在故障排除时暂时禁用daemon_memcached插件,方法是在 MySQL 配置文件的[mysqld]组下面添加以下行:

daemon_memcached=OFF

例如,如果在运行innodb_memcached_config.sql配置脚本之前运行INSTALL PLUGIN语句以设置必要的数据库和 table,则服务器可能崩溃并无法启动。如果您在innodb_memcache.containerstable 中配置错误,服务器也可能无法启动。

要为 MySQL 实例卸载 memcached 插件,请发出以下语句:

mysql> UNINSTALL PLUGIN daemon_memcached;
  • 如果您在同一台机器上运行多个 MySQL 实例,并且每个实例都启用了daemon_memcached插件,请使用daemon_memcached_option配置参数为每个daemon_memcached插件指定一个唯一的 memcached 端口。

  • 如果 SQL 语句找不到InnoDBtable 或在 table 中找不到数据,但是 memcached API 调用检索了预期的数据,则可能会丢失innodb_memcache.containerstable 中InnoDBtable 的条目,或者您可能没有通过使用@@table_idtable 示法发出getset请求来切换到正确的InnoDBtable。如果您更改innodb_memcache.containerstable 中的现有条目而不随后重新启动 MySQL 服务器,也可能会出现此问题。自由格式存储机制足够灵活,即使守护程序使用的是test.demo_testtable(将值存储在单个列中),存储或检索诸如col1|col2|col3之类的多列值的请求仍然可以正常工作。

  • 定义自己的InnoDBtable 以与daemon_memcached插件一起使用时,并且 table 中的列定义为NOT NULL,请确保在将 table 的记录插入innodb_memcache.containerstable 中时为NOT NULL列提供值。如果innodb_memcache.containers记录的INSERT语句包含的分隔值少于 Map 的列,则将未填充的列设置为NULL。尝试在NOT NULL列中插入NULL值会导致INSERT失败,这只有在您重新初始化daemon_memcached插件以将更改应用于innodb_memcache.containerstable 后才能显现。

  • 如果innodb_memcached.containerstable 的cas_columnexpire_time_column字段设置为NULL,则在尝试加载 memcached 插件时会返回以下错误:

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

memcached 插件在cas_columnexpire_time_column列中拒绝使用NULL。当未使用的列时,将这些列的值设置为0

  • 随着 memcached 键的长度和值的增加,您可能会遇到大小和长度限制。

  • 当密钥超过 250 个字节时, memcached 操作将返回错误。目前,这是 memcached 中的固定限制。

    • 如果值超过 768 个字节,3072 个字节或innodb_page_size值的一半,则可能会遇到InnoDBtable 限制。这些限制主要适用于打算在值列上创建索引以使用 SQL 在该列上运行报 table 生成查询的情况。有关详情,请参见第 14.23 节“ InnoDB 限制”

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

  • 如果您在不同版本的 MySQL 服务器之间共享配置文件,则对daemon_memcached插件使用最新的配置选项可能会导致旧版 MySQL 出现启动错误。为避免兼容性问题,请在选项名称中使用loose前缀。例如,使用loose-daemon_memcached_option='-c 64'而不是daemon_memcached_option='-c 64'

  • 没有验证字符集设置的限制或就位检查。 memcached 以字节为单位存储和检索键和值,因此对字符集不敏感。但是,您必须确保 memcached Client 端和 MySQLtable 使用相同的字符集。

  • memcached 连接被阻止访问包含索引虚拟列的 table。访问索引的虚拟列需要对服务器进行回调,但是 memcached 连接无法访问服务器代码。