解决Redis报错:MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist

本文解决Redis在尝试进行RDB快照时出现的内存分配错误问题,包括调整系统配置、设置正确的文件权限以及执行SAVE命令来验证解决方案。

解决Redis报错:MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

如果你想查看redis的log文件,一般存放在/var/log/redis/redis-server.log
里:

tail /var/log/redis/redis-server.log -n 100

发现报错:

25848:M 07 Apr 18:43:24.098 # Can't save in background: fork: Cannot allocate memory
25848:M 07 Apr 18:43:30.015 * 1 changes in 900 seconds. Saving...
25848:M 07 Apr 18:43:30.015 # Can't save in background: fork: Cannot allocate memory
25848:M 07 Apr 18:43:36.028 * 1 changes in 900 seconds. Saving...
25848:M 07 Apr 18:43:36.029 # Can't save in background: fork: Cannot allocate memory
25848:M 07 Apr 18:43:42.046 * 1 changes in 900 seconds. Saving...
25848:M 07 Apr 18:43:42.047 * Background saving started by pid 10605
10605:C 07 Apr 18:43:42.615 * DB saved on disk
10605:C 07 Apr 18:43:42.620 * RDB: 0 MB of memory used by copy-on-write

网上的解决方法大都是关闭报错:

127.0.0.1:6379> config set stop-writes-on-bgsave-error no

这个方案只是治标不治本的,毕竟如果关闭持久化,服务器关机后,redis的数据会被全部清空。


运行命令:

sudo echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sudo sysctl -p

造成这个问题的另一个可能原因是Redis没有权限保存文件。

Redis保存的文件名默认为dump.rdb,查看文件的位置:

-> # locate dump.rdb              
/var/lib/redis/dump.rdb

查看是否拥有文件权限:

-> # ls -al /var/lib/redis/
total 2376
drwxr-x---  2 redis redis    4096 Mar 30 08:54 .
drwxr-xr-x 50 root  root     4096 Nov 22 16:33 ..
-rw-rw----  1 redis redis 2418060 Mar 30 08:54 dump.rdb

根据他人的建议,目录的权限最好为755,文件的权限为644
注意:我直接使用777权限,请不要在生产环境中使用

chown 777 /var/lib/redis 
chown 777 /var/lib/redis/dump.rdb 

然后在Redis中运行命令:

SAVE

如果没有报错就问题解决了。


### Ubuntu系统中Redis无法持久化到磁盘的报错问题解决方案 在Ubuntu系统中,当遇到`MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.`错误时,通常是因为Redis尝试保存RDB快照失败,从而触发了保护机制,禁用了可能修改数据集的命令。以下是详细的分析与解决方法: #### 错误原因 此错误的核心原因是Redis配置文件中的`stop-writes-on-bgsave-error yes`选项被启用。这意味着如果后台保存操作(BGSAVE)失败,则Redis会停止接受写入请求[^1]。 具体表现为: - Redis试图执行RDB快照保存操作。 - 如果由于权限不足、磁盘空间耗尽或其他I/O异常导致保存失败,Redis将记录错误日志并拒绝后续的写入操作。 - 用户会在客户端收到`(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.`提示[^2]。 --- #### 解决方案 ##### 方法一:调整Redis配置以忽略BGSAVE错误 通过修改Redis配置文件来允许即使BGSAVE失败也继续接收写入请求。 1. **编辑Redis配置文件** 打开Redis配置文件`/etc/redis/redis.conf`: ```bash sudo nano /etc/redis/redis.conf ``` 2. **查找并修改`stop-writes-on-bgsave-error`参数** 将其设置为`no`: ```conf stop-writes-on-bgsave-error no ``` 3. **保存更改并重启Redis服务** 使用以下命令重启Redis服务以应用新配置: ```bash sudo systemctl restart redis ``` 完成以上步骤后,即使BGSAVE失败,Redis也不会阻止写入操作[^5]。 --- ##### 方法二:排查并修复RDB持久化失败的根本原因 虽然可以通过关闭`stop-writes-on-bgsave-error`暂时解决问题,但更推荐从根本上解决RDB持久化的失败原因。 1. **检查Redis日志** 查看Redis的日志文件以定位具体的错误信息。默认情况下,日志路径位于`/var/log/redis/redis.log`或标准输出流中: ```bash tail -f /var/log/redis/redis.log ``` 2. **常见问题及其解决办法** - **磁盘空间不足** 检查可用磁盘空间: ```bash df -h ``` 清理不必要的文件或扩展存储容量。 - **目标目录不可写** 确认Redis进程是否有权访问指定的RDB文件夹。例如,默认路径通常是`/var/lib/redis`: ```bash ls -ld /var/lib/redis chown redis:redis /var/lib/redis chmod 700 /var/lib/redis ``` - **文件系统只读模式** 验证文件系统是否处于只读状态: ```bash mount | grep '^/dev' ``` 如有需要,重新挂载为可写模式: ```bash sudo mount -o remount,rw / ``` 3. **验证修复效果** 在客户端测试写入功能是否恢复正常: ```bash redis-cli set testkey "testvalue" get testkey ``` --- ##### 方法三:切换至AOF持久化方式 如果频繁遭遇RDB持久化失败,可以考虑改用Append Only File(AOF)作为主要持久化策略。 1. 编辑`redis.conf`文件: ```bash sudo nano /etc/redis/redis.conf ``` 2. 启用AOF并禁用RDB: ```conf appendonly yes save "" ``` 3. 重启Redis服务: ```bash sudo systemctl restart redis ``` 注意:AOF相比RDB占用更多磁盘空间,但在某些场景下能提供更高的可靠性[^4]。 --- ### 总结 针对`MISCONF Redis is configured to save RDB snapshots...`错误,在Ubuntu环境下可通过调整`stop-writes-on-bgsave-error`参数快速恢复写入能力;同时建议深入调查RDB持久化失败的原因,并采取相应措施彻底消除隐患。对于高可靠性的需求,还可以评估采用AOF替代RDB的方式。 ```python # 示例Python脚本用于连接Redis并测试写入功能 import redis r = redis.StrictRedis(host='localhost', port=6379, decode_responses=True) try: r.set('test_key', 'success') print(f"Write successful: {r.get('test_key')}") except Exception as e: print(f"Error during write operation: {e}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值