Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

CentOS7に最新版のsqlite3を入れる

※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!

CentOS7で他サーバで取得したsqliteのファイルに対してSQLを実行したところ、エラー

Error: malformed database schema (インデックス名) - near "WHERE": syntax error

そのエラー、結論から言うと「データベースファイルが壊れている」わけではありませんので、まずは安心してください!

原因は、データベース(xxxxxx.sqlite)の内部で使われている高度なインデックス(索引)の構文に対して、今あなたがLinux(ターミナル)で叩いた sqlite3 コマンドのバージョンが古すぎるため、構文を理解できずに「スキーマがおかしい(構文エラー)」と拒絶してしまっている状態です。

エラーの背景と、データを安全に確認するための解決策を解説します。

スポンサーリンク
バッチ処理の自動化スキルは市場価値が高いです。今の自分の単価を調べてみませんか?
顧客常駐はもう嫌だ!社内SEへ転職するなら【社内SE転職ナビ】
Cursor・Claude Code・Codex AIスキルを学ぶなら
環境構築不要!AIエージェント開発を非エンジニアでも即実践【AI Agent Camp】

💡 エラーの原因: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

タイトルとURLをコピーしました