对InnoDB memcached插件进行故障排除
本节介绍使用InnoDB
memcached插件时可能遇到的问题。
如果您在MySQL错误日志中遇到以下错误,则服务器可能无法启动:
无法为打开的文件设置rlimit。尝试以root身份运行或请求较小的maxconns值。
错误消息来自memcached守护程序。一种解决方案是提高操作系统对打开文件数的限制。用于检查和增加打开文件限制的命令因操作系统而异。此示例显示了针对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配置文件的配置参数中编码
-c
memcached选项daemon_memcached_option
。该-c
选项的默认值为1024。[mysqld] ... loose-daemon_memcached_option='-c 64'
要解决memcached守护程序无法存储或检索
InnoDB
表数据的问题,请在MySQL配置文件的配置参数中编码-vvv
memcached选项daemon_memcached_option
。检查MySQL错误日志中与memcached操作相关的调试输出。[mysqld] ... loose-daemon_memcached_option='-vvv'
- 如果指定用于保存memcached值的列是错误的数据类型,例如数字类型而不是字符串类型,则尝试存储键值对将失败,并且没有特定的错误代码或消息。
如果该
daemon_memcached
插件导致MySQL服务器启动问题,则可以daemon_memcached
在故障排除时暂时禁用该插件,方法[mysqld]
是在MySQL配置文件的组下添加此行:daemon_memcached=OFF
例如,如果
INSTALL PLUGIN
在运行innodb_memcached_config.sql
配置脚本之前运行该语句以设置必要的数据库和表,则服务器可能崩溃并无法启动。如果您在innodb_memcache.containers
表中配置错误,服务器也可能无法启动。要为MySQL实例卸载memcached插件,请发出以下语句:
mysql>
UNINSTALL PLUGIN daemon_memcached;- 如果您在同一台机器上运行多个MySQL
daemon_memcached
实例,并且每个实例都启用了插件,请使用daemon_memcached_option
配置参数为每个插件指定唯一的内存缓存端口daemon_memcached
。 - 如果SQL语句找不到
InnoDB
表或表中没有数据,但是memcached API调用检索了预期的数据,则可能缺少InnoDB
表中表的条目innodb_memcache.containers
,或者您可能没有InnoDB
通过发出切换到正确的表一个get
或set
请求使用表示法。如果您更改了表中的现有条目而未随后重新启动MySQL服务器,也可能会出现此问题。自由格式存储机制足够灵活,您的请求可以存储或检索多列值,例如@@table_id
innodb_memcache.containers
col1|col2|col3
即使守护程序正在使用test.demo_test
将值存储在单个列中的表,它仍然可以工作。 - 定义自己的
InnoDB
表以供daemon_memcached
插件使用时,并且表中的列定义为NOT NULL
,请确保NOT NULL
在将表的记录插入表中时为列提供值innodb_memcache.containers
。如果记录的INSERT
语句innodb_memcache.containers
包含的分隔值少于映射的列,则将未填充的列设置为NULL
。尝试将NULL
值插入到NOT NULL
列中会导致INSERT
失败,这只有在您重新初始化daemon_memcached
插件以将更改应用于innodb_memcache.containers
表后才会变得明显。 如果表的
cas_column
和expire_time_column
字段innodb_memcached.containers
设置为NULL
,则尝试加载memcached插件时会返回以下错误:InnoDB_Memcached: column 6 in the entry for config table 'containers' in database 'innodb_memcache' has an invalid NULL value.
该memcached的插件拒绝的使用
NULL
在cas_column
与expire_time_column
列。将这些列的值设置0
为未使用时的列。随着memcached键的长度和值的增加,您可能会遇到大小和长度限制。
- 当密钥超过250个字节时,memcached操作将返回错误。目前,这是memcached中的固定限制。
InnoDB
如果值超过768个字节,3072个字节或innodb_page_size
值的一半,可能会遇到表限制。这些限制主要适用于打算在值列上创建索引以使用SQL在该列上运行报表生成查询的情况。有关详细信息,请参见“ InnoDB限制”。- 键值组合的最大大小为1 MB。
- 如果您在不同版本的MySQL服务器之间共享配置文件,则使用该
daemon_memcached
插件的最新配置选项可能会导致旧版MySQL出现启动错误。为避免兼容性问题,请在loose
选项名称前使用前缀。例如,使用loose-daemon_memcached_option='-c 64'
代替daemon_memcached_option='-c 64'
。 - 没有验证字符集设置的限制或就位检查。memcached以字节为单位存储和检索键和值,因此对字符集不敏感。但是,必须确保memcached客户端和MySQL表使用相同的字符集。
- 内存缓存连接被阻止访问包含索引虚拟列的表。访问索引的虚拟列需要对服务器进行回调,但是内存缓存连接无法访问服务器代码。