RedisのSELECT使用時に発生する「ERR DB index is out of range」を修正する

beginner🔴 Redis2026-04-21| Linux、macOS、Docker上のRedis 5.x / 6.x / 7.x — SELECTコマンドを使用するすべての環境

Error Message

ERR DB index is out of range
#redis#select#データベース#設定#databases

エラーの内容

アプリコード、クライアントライブラリ、または 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.confdatabases 設定を変更します。

ステップ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:123app2: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. アプリを再起動して、ログからエラーが消えたことを確認する

Related Error Notes