このエラーが発生する状況
dump.rdbファイルを新しいサーバーに移動して起動した直後、データが読み込まれる代わりにサービスが即座にクラッシュすることがあります。ログを確認すると、RDBバージョンに関する不満げなメッセージが表示されているはずです。これは通常、新しいRedisインスタンス(Redis 7.0など)から古いインスタンス(Redis 5.0など)へデータを移行しようとしたときに発生します。
Can't handle RDB format version 10 (or higher); Short read or OOM loading DB
問題は単純です。新しいサーバーが、古いバックアップファイルと同じ言語を話せないのです。
原因
RedisのRDBファイルは特定のバージョニングシステムを使用しています。Redisは前方互換性(新しいバージョンが常に古いファイルを読み取れること)には非常に優れていますが、後方互換性はサポートしていません。古いバージョンのRedisは、新しいRDBフォーマットに含まれる新しい圧縮ロジックやデータ構造を理解できないのです。
- RDB Version 9: Redis 5.0 および 6.0 で使用。
- RDB Version 10: Redis 6.2 で導入。
- RDB Version 11: Redis 7.0 で導入。
RDB Version 11のファイルをRedis 6.0エンジンに読み込もうとすると、プロセスは即座に失敗します。エンジンは自身の制限よりも高いバージョン番号を検出し、データの破損を防ぐために停止します。
最善の解決策:移行先のRedisをアップグレードする
移行先サーバーをアップグレードするのが最も確実な解決策です。移行元が7.0を実行しているなら、移行先も7.0以上にする必要があります。Dockerユーザーの場合、これはdocker-compose.ymlファイルを修正するだけで済む簡単な作業です。
# 6.0から7.2へアップグレード
docker pull redis:7.2
docker stop my-redis-container
docker run --name my-redis-container -v /path/to/dump.rdb:/data/dump.rdb -d redis:7.2
Linuxサーバーでは、デフォルトのリポジトリにある古いパッケージを避け、公式のRedisリポジトリを使用して最新の安定版ビルドを取得してください。
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
回避策:ネットワーク経由の移行(Over the Wire)
最新のRedisをサポートしていない古いOSを使い続けなければならない場合もあります。この状況では、dump.rdbファイルを直接使用することはできません。両方のインスタンスを起動した状態でデータを移動する必要があります。こうすることで、Redisは転送中にデータを互換性のある形式に変換します。
方法1:redis-cli --pipe を使用する
この方法は、両方のバージョンが理解できる形式にキーをシリアライズすることで、RDBのバージョニングを回避します。小規模から中規模のデータセットに適しています。
# 特定のキーを転送するために移行元サーバーで実行
redis-cli --raw SERIALIZE mykey | redis-cli -h target-host -x RESTORE mykey 0
方法2:Using Redis-Shake
1GBを超えるデータベースの場合は、redis-shakeのような専用ツールを使用してください。これはブリッジとして機能し、移行元から移行先へリアルタイムでデータを同期します。
redis-shakeのバイナリをダウンロードします。sync設定を編集し、移行元と移行先のIPを指定します。- ツールを起動します。移行先のディスク上のRDBファイルに触れることなく、すべてのキーがストリーミングされます。
AOFによる代替案
バージョン間で頻繁にデータを移動する必要がある場合は、Append Only File (AOF) に切り替えてください。バイナリ形式のRDBとは異なり、AOFはコマンドのテキストベースのログです。Redis 7.0で生成されたAOFファイルは、基本的なSETやHSETコマンドが変わっていないため、Redis 6.0でも読み取れる可能性が非常に高いです。
- 移行元でAOFを有効にする:
CONFIG SET appendonly yes - 生成された
appendonly.aofを移行先サーバーに転送する。 - 移行先の
redis.confでappendonly yesが設定されていることを確認する。 - 移行先サービスを再起動する。
移行の検証
移行後、単に成功したと思い込まないでください。キースペースとログを確認し、すべてが安定しているかチェックしましょう。
# サービスの応答を確認
redis-cli ping
# 移行元とキーの数を比較
redis-cli info keyspace
# ログに特定のメッセージがあるか確認
tail -n 50 /var/log/redis/redis-server.log
# 次のメッセージを探す: "DB loaded from disk: 1.234 seconds"
読み込み完了のメッセージが表示され、フォーマットエラーがなければ、データは安全で利用可能な状態です。

