CentOS7で他サーバで取得したsqliteのファイルに対してSQLを実行したところ、エラー
Error: malformed database schema (インデックス名) - near "WHERE": syntax error
そのエラー、結論から言うと「データベースファイルが壊れている」わけではありませんので、まずは安心してください!
原因は、データベース(xxxxxx.sqlite)の内部で使われている高度なインデックス(索引)の構文に対して、今あなたがLinux(ターミナル)で叩いた sqlite3 コマンドのバージョンが古すぎるため、構文を理解できずに「スキーマがおかしい(構文エラー)」と拒絶してしまっている状態です。
エラーの背景と、データを安全に確認するための解決策を解説します。
💡 エラーの原因:SQLiteの「世代ギャップ」
高速処理するために、インデックスの作成時に WHERE句(部分インデックス:Partial Indexes) というモダンなSQL構文を使用している場合、古いバージョンのsqlite3を使うと、部分インデックス(WHERE)を解釈できないため、テーブルを覗こうとした瞬間に「こんなところに WHERE があるのはおかしい!」とエラー(near "WHERE": syntax error)を出してしまいます。
システムのツールが古いことによる不整合が起きています。
🛠️ 解決策
データベース自体は生きていますので、以下のいずれかの方法で安全に中身を確認・操作できます。
対策A:Linuxの sqlite3 コマンドを最新にする(最もおすすめ)
システム全体のSQLite3ツールを、アップデートします。
CentOS 7の標準リポジトリ(yum)に含まれている sqlite3 のバージョンは 3.7.17 と非常に古く、これが今回のエラー(部分インデックス WHERE 構文の未対応)の原因です。SQLiteが WHERE 構文(Partial Indexes)に対応したのはバージョン 3.8.0 以降だからです。
CentOS 7に最新の sqlite3 を導入することは可能です。
CentOS 7の延命環境でも安全に導入できる、確実な2つの方法を解説します。
方法1:最新のバイナリを直接ダウンロードして配置する(一番簡単・安全)
SQLite公式が配布している、ビルド済みのLinux用バイナリを上書きする方法です。ソースコードからのコンパイルが不要なため、1分で終わります。
1. ディレクトリを作成して最新バイナリをダウンロード
Bash
mkdir -p ~/sqlite3_update && cd ~/sqlite3_update
# 2026年現在の最新安定版(Version 3.46.x〜など)のプリコンパイル版を取得
wget https://www.sqlite.org/2024/sqlite-tools-linux-x64-3460100.zip
# unzipが入っていない場合は先にインストール: sudo yum install -y unzip
unzip sqlite-tools-linux-x64-3460100.zip
cd sqlite-tools-linux-x64-3460100/
2. システムの古いsqlite3を置き換える
既存の古いファイルをバックアップし、新しいバイナリを /usr/bin に上書きします。
Bash
# 古いsqlite3を念のためバックアップ
sudo mv /usr/bin/sqlite3 /usr/bin/sqlite3.old
# 新しいバイナリをコピー
sudo cp sqlite3 /usr/bin/
sudo chmod +x /usr/bin/sqlite3
3. バージョンの確認
Bash
sqlite3 --version
ここで 3.46.1 などの新しいバージョンが表示されれば大成功です!OSのライブラリに影響を与えず、sqlite3 コマンドだけが最新化されます。
方法2:ソースコードからビルドする(確実性重視)
もし上記のプリコンパイル版バイナリがCentOS 7の古いGLIBC(C言語のライブラリ)のせいで動かなかった場合は、現在の環境に合わせてソースコードから自分でビルド(コンパイル)します。
1. 開発ツールのインストール
Bash
sudo yum groupinstall -y "Development Tools"
2. ソースコードのダウンロードと解凍
Bash
mkdir -p ~/sqlite_build && cd ~/sqlite_build
wget https://www.sqlite.org/2024/sqlite-autoconf-3460100.tar.gz
tar -zxvf sqlite-autoconf-3460100.tar.gz
cd sqlite-autoconf-3460100
3. コンパイルとインストール
標準のパス(/usr/local)にインストールします。
Bash
./configure --prefix=/usr/local
make
sudo make install
4. パスの優先度変更(またはシンボリックリンク)
CentOS 7標準の /usr/bin/sqlite3 より、今入れた /usr/local/bin/sqlite3 が優先して呼ばれるようにします。
Bash
# 古い方をリネーム
sudo mv /usr/bin/sqlite3 /usr/bin/sqlite3.bak
# 新しい方へのリンクを貼る
sudo ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
# 確認
sqlite3 --version
※コマンドメモ
.mode column
.headers on
pragma table_info(“テーブル名”);
.schema
.exit
.quit
