【解决方法】redis 容器报错 Background saving error

问题记录

1:M 19 Jun 2025 11:05:08.076 * 100 changes in 300 seconds. Saving... 
1:M 19 Jun 2025 11:05:08.077 * Background saving started by pid 195 
195:C 19 Jun 2025 11:05:08.078 # Failed opening the temp RDB file temp-195.rdb (in server root dir /home/xxxx/redis) for saving: Permission denied 
1:M 19 Jun 2025 11:05:08.178 # Background saving error

问题解决

# 找到运行Redis的Docker容器的ID or name
docker ps

# 进入对应的Redis容器
docker exec -it xxxx-redis /bin/bash

# 检查 /home/xxxx/redis 目录的权限
ls -ld /home/xxxx/redis

这一步会显示目录的权限和所有者

# 如果目录权限不足,可以使用下面的命令修改权限,设置为rwxr-xr-x
chmod 755 /home/xxxx/redis

# 查看Redis进程运行的用户
ps aux | grep redis-server

# 如果报错ps command not found,可以安装procps包
apt-get update && apt-get install -y procps

# 更改目录所有者
chown redis:redis /home/xxxx/redis

# 容器内部重新启动Redis服务
redis-cli shutdown
# 重新启动容器
docker restart redis_container

### Redis 分片数据迁移的方法解决方案 #### 方法概述 Redis分片数据迁移通常涉及多个方面,包括但不限于硬件更换、版本升级以及跨不同架构的集群间数据传输。以下是几种常见的方法及其适用场景: 1. **RDB 文件备份与恢复** 使用 RDB(Redis Database File)文件是一种简单而有效的方式来进行数据迁移。此方式适用于单机实例到另一台机器上的迁移或者作为初始导入的一部分。可以通过 `SAVE` 或者更高效的 `BGSAVE` 命令创建持久化快照[^1]。 2. **使用 redis-cli --rdb 和 --pipe 功能** 对于大规模在线环境下的热迁移操作,推荐利用内置工具如 `redis-cli` 提供的相关选项来执行高效的数据复制过程。例如,借助管道技术减少网络延迟影响从而加快整个流程速度: ```bash cat dump.rdb | ./redis-cli --pipe ``` 3. **第三方中间件支持** 部分成熟的开源项目提供了针对复杂场景下更加灵活可控的选择。比如提到过的 codis 的组件之一——**redis-port**, 它能够解析标准 rdb 格式的二进制镜像并将其转换为目标格式再写入新的目标地址上;还有其他类似的库也可以考虑采用以满足特定需求[^2]. 4. **基于哨兵模式或集群拓扑调整** 如果源目的两端均部署有完整的 sentinel/cluster 架构,则可以直接修改配置参数让两者形成主从关系进而触发自动同步机制完成转移工作流。需要注意的是,在实际切换过程中可能还需要额外注意一些细节问题以免造成服务中断风险增加[^3]. 5. **增量同步策略** 当面对超大数据集无法一次性全部搬移完毕时可采取这种方式先建立初步连接随后持续捕获后续变更直至最终达到一致状态为止。这种方法特别适合那些不允许长时间停服的应用场合。 --- ### 示例代码片段展示如何通过脚本自动化部分步骤: ```python import subprocess def migrate_redis(source_host, source_port, dest_host, dest_port): try: # Step 1: Export data from the source Redis instance using bgsave. export_command = f'redis-cli -h {source_host} -p {source_port} BGSAVE' result = subprocess.run(export_command.split(), stdout=subprocess.PIPE) if 'Background saving started' not in str(result.stdout): raise Exception('Failed to initiate background save on source.') # Assuming default location of RDB file is /var/lib/redis/dump.rdb copy_rdb_to_dest = ( f'scp /var/lib/redis/dump.rdb user@{dest_host}:~/dump.rdb') import_result = subprocess.run( ['ssh', f'user@{dest_host}', './redis-cli', '--host', dest_host, '--port', str(dest_port), '--pipe'], stdin=open('/home/user/dump.rdb'), check=True) except Exception as e: print(f'Migration failed due to error:{e}') ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值