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 守护程序无法存储或检索
InnoDB
table 数据的问题,请在 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.containers
table 中配置错误,服务器也可能无法启动。
要为 MySQL 实例卸载 memcached 插件,请发出以下语句:
mysql> UNINSTALL PLUGIN daemon_memcached;
-
如果您在同一台机器上运行多个 MySQL 实例,并且每个实例都启用了
daemon_memcached
插件,请使用daemon_memcached_option配置参数为每个daemon_memcached
插件指定一个唯一的 memcached 端口。 -
如果 SQL 语句找不到
InnoDB
table 或在 table 中找不到数据,但是 memcached API 调用检索了预期的数据,则可能会丢失innodb_memcache.containers
table 中InnoDB
table 的条目,或者您可能没有通过使用@@table_id
table 示法发出get
或set
请求来切换到正确的InnoDB
table。如果您更改innodb_memcache.containers
table 中的现有条目而不随后重新启动 MySQL 服务器,也可能会出现此问题。自由格式存储机制足够灵活,即使守护程序使用的是test.demo_test
table(将值存储在单个列中),存储或检索诸如col1|col2|col3
之类的多列值的请求仍然可以正常工作。 -
定义自己的
InnoDB
table 以与daemon_memcached
插件一起使用时,并且 table 中的列定义为NOT NULL
,请确保在将 table 的记录插入innodb_memcache.containers
table 中时为NOT NULL
列提供值。如果innodb_memcache.containers
记录的INSERT语句包含的分隔值少于 Map 的列,则将未填充的列设置为NULL
。尝试在NOT NULL
列中插入NULL
值会导致INSERT失败,这只有在您重新初始化daemon_memcached
插件以将更改应用于innodb_memcache.containers
table 后才能显现。 -
如果
innodb_memcached.containers
table 的cas_column
和expire_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_column
和expire_time_column
列中拒绝使用NULL
。当未使用的列时,将这些列的值设置为0
。
-
随着 memcached 键的长度和值的增加,您可能会遇到大小和长度限制。
-
当密钥超过 250 个字节时, memcached 操作将返回错误。目前,这是 memcached 中的固定限制。
-
如果值超过 768 个字节,3072 个字节或innodb_page_size值的一半,则可能会遇到
InnoDB
table 限制。这些限制主要适用于打算在值列上创建索引以使用 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 连接无法访问服务器代码。