エラーの内容
アプリコード、クライアントライブラリ、または redis-cli で直接 SELECT コマンドを実行すると、次のエラーが表示されます:
127.0.0.1:6379> SELECT 16
(error) ERR DB index is out of range
またはアプリケーションログに:
ERR: Redis error: ERR DB index is out of range
このエラーは通常、設定変更後、新しいRedisサーバーへの移行後、またはサーバー側の設定を確認せずにコードベースでデータベースインデックスを変更した際に発生します。
発生原因
Redisは1つのインスタンス内で複数の論理データベースをサポートしています。デフォルトでは 16個のデータベースがあり、0 から 15 の番号が付けられています。SELECT コマンドでデータベースを切り替えます。
設定されているデータベース数以上のインデックスを指定した瞬間にエラーが発生します。デフォルトの16では、SELECT 16 は失敗します — 有効なインデックスは 15 までです。
主な原因として以下が挙げられます:
- コードでデータベースインデックス16以上を参照しているが、Redisのデフォルト上限はインデックス15まで
- 新しいRedisサーバーに低い
databases値が設定されている — 場合によってはdatabases 1のみ - Redis Cloud、ElastiCache、Upstashなどのマネージドサービスはデータベース
0のみを公開している - Redisがクラスターモードで動作しており、データベース
0のみに制限されている
クイックフィックス:選択しているインデックスを確認する
まず、使用中のインスタンスの上限を確認します:
redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> SELECT 0 # 成功
127.0.0.1:6379> SELECT 15 # 成功(デフォルト設定での最後の有効値)
127.0.0.1:6379> SELECT 16 # 失敗 → ERR DB index is out of range
次に、設定されているデータベース数を直接確認します:
127.0.0.1:6379> CONFIG GET databases
1) "databases"
2) "16"
1 が返ってきた場合はデータベース 0 のみが存在します。16 が返ってきた場合は有効なインデックスは 0 から 15 です。
クライアントライブラリを使用している場合は、db パラメーターが設定されている箇所を確認します:
# Python (redis-py)
import redis
r = redis.Redis(host='localhost', port=6379, db=16) # ← ここが失敗の原因
// Node.js (ioredis)
const redis = new Redis({ host: 'localhost', port: 6379, db: 16 }); // ← 同じ問題
db を有効な範囲内の値に変更してください — 通常は 0 から 15 の範囲です。
Redis設定の修正:データベース数を増やす
インデックス15より大きい値が必要な場合は、redis.conf の databases 設定を変更します。
ステップ1 — redis.confの場所を確認する
# 一般的な場所
/etc/redis/redis.conf
/etc/redis.conf
/usr/local/etc/redis.conf
# または実行中のプロセスから確認する
ps aux | grep redis
ステップ2 — databases ディレクティブを編集する
sudo nano /etc/redis/redis.conf
# この行を見つける:
databases 16
# 必要な数に変更する:
databases 32
ステップ3 — Redisを再起動する
# systemd
sudo systemctl restart redis
# 旧来のinit
sudo service redis-server restart
ステップ4 — 変更が反映されたか確認する
redis-cli CONFIG GET databases
# 期待される出力:
# 1) "databases"
# 2) "32"
# 以前失敗していたコマンドをテストする
redis-cli SELECT 16
# 期待される出力:OK
再起動なしでは変更できない設定
CONFIG SET で多くのRedis設定をライブ変更できますが、databases はその対象外です。試みても無駄です:
127.0.0.1:6379> CONFIG SET databases 32
(error) ERR Unknown option or number of arguments for CONFIG SET - 'databases'
再起動は避けられません。短いメンテナンスウィンドウをスケジュールするか、プライマリの再起動中もサービスを継続するためにレプリカを先に昇格させてください。
Docker:コマンド引数で設定を渡す
設定ファイルをマウントせずにDockerでRedisを実行している場合は、設定ファイルをスキップしてフラグを直接渡します:
docker run -d \
--name redis \
-p 6379:6379 \
redis:7 redis-server --databases 32
Composeの場合:
services:
redis:
image: redis:7
command: redis-server --databases 32
ports:
- "6379:6379"
マネージドRedis(ElastiCache、Upstash、Redis Cloud)
マネージドサービスはデータベース 0 のみに制限されています。これは絶対的な制約です。設定パネルで変更する方法はなく、これらのサービスのアーキテクチャに組み込まれたプラットフォームレベルの制約です。
実用的な回避策はキーの名前空間化です。データベースをまたいでデータを分割する代わりに、キーにプレフィックスを付けます:
# 旧アプローチ — マネージドRedisでは動作しない:
SELECT 2
SET user:123 "alice"
# マネージドRedis対応のアプローチ:
SET app2:user:123 "alice"
app1:user:123 と app2:user:123 のようなキーはデータベース 0 内で競合なく共存できます。設計の見直しではなく、命名規則の小さな調整で済みます。
Redisクラスター:SELECTは使用不可
クラスターモードは複数のデータベースをサポートしておらず、データベース 0 のみが使用できます。理由は、クラスターがハッシュスロットを使用してノード間でデータをシャーディングしており、複数のデータベースをサポートするとそのモデルが完全に崩れてしまうからです。0 以外のNを指定した SELECT N はすべてこのエラーをスローします。
クラスター環境では、すべての SELECT 呼び出しを削除し、キーの名前空間化に切り替えてください(マネージドRedisと同じパターン)。
確認手順
修正を適用したら、以下を素早く確認してください:
# 1. データベース数を確認する
redis-cli CONFIG GET databases
# 2. 失敗していたSELECTをテストする
redis-cli SELECT 16
# 返ってくるべき結果:OK
# 3. 新しいデータベースでキーの書き込みと読み取りをテストする
redis-cli -n 16 SET test_key "hello"
redis-cli -n 16 GET test_key
# 返ってくるべき結果:"hello"
# 4. アプリを再起動して、ログからエラーが消えたことを確認する

