1 分で読了 #devops
このページの目次

データベース操作マニュアル

SQLite

sqlite3 /path/to/db.sqlite

# メタデータ
.tables                                    # すべてのテーブルをリスト表示
.schema <table>                            # テーブル作成文を表示
.indexes <table>                           # インデックスをリスト表示
.mode column                               # 列揃え出力 (デフォルトの区切り文字より可読性が高い)
.headers on

# クエリ
SELECT * FROM <table> LIMIT 10;
SELECT name, kind FROM resource ORDER BY kind;
SELECT COUNT(*) FROM resource WHERE kind='dashboard';
.exit

# バックアップ (オンライン実行、読み書きをブロックしない)
sqlite3 db.sqlite ".backup backup.sqlite"
# または: sqlite3 db.sqlite ".dump" > dump.sql   # SQLテキストエクスポート
# リストア: sqlite3 new.sqlite < dump.sql

# 最適化
sqlite3 db.sqlite "PRAGMA integrity_check"    # 整合性チェック
sqlite3 db.sqlite "VACUUM"                    # 削除済み領域の回収 (DBを再構築するため、追加のディスク容量が必要)
sqlite3 db.sqlite "PRAGMA wal_checkpoint(TRUNCATE)"  # WAL → メインファイル

Grafana DB メンテナンス (SQLite, unified storage)

systemctl stop grafana
cp /var/lib/grafana/grafana.db grafana.db.bak    # 必ず事前にバックアップ

sqlite3 /var/lib/grafana/grafana.db <<SQL
-- すべてのダッシュボード/フォルダを表示 (名前 + 種別)
SELECT name, kind FROM resource WHERE kind IN ('dashboard', 'folder') ORDER BY kind;

-- UIで作成されたダッシュボードを削除 (プロビジョニングされたものはファイル管理のため、ここには含まれない)
DELETE FROM resource WHERE name = 'old-dashboard' AND kind = 'dashboard';

-- resource_history にはすべてのバージョン変更が記録されており、サイズが大きくなる可能性がある。安全にクリーンアップ可能
SELECT COUNT(*) FROM resource_history;
DELETE FROM resource_history;

-- 領域の回収
VACUUM;
SQL

systemctl start grafana

PostgreSQL

psql -U postgres -d dbname

# メタデータ
\l                                          # データベースをリスト表示
\dt                                         # テーブルをリスト表示
\d <table>                                  # テーブル構造 (列 + インデックス + 制約)
\du                                         # ユーザー/ロール
\dx                                         # インストール済み拡張機能

# バックアップ (pg_dump、psql内ではない)
pg_dump -U postgres dbname > backup.sql     # 単一データベース
pg_dumpall -U postgres > all.sql            # すべてのデータベース + ロール
pg_dump -U postgres -Fc dbname > backup.dump  # カスタム形式 (並列復元可能)

# リストア
psql -U postgres dbname < backup.sql
pg_restore -U postgres -d dbname backup.dump

# 接続数
SELECT count(*) FROM pg_stat_activity;
SELECT pid, state, query FROM pg_stat_activity WHERE state != 'idle';

MySQL/MariaDB

mysql -u root -p

# メタデータ
SHOW DATABASES;
SHOW TABLES;
DESCRIBE <table>;

# バックアップ
mysqldump -u root -p dbname > backup.sql
mysqldump -u root -p --all-databases > all.sql
mysqldump -u root -p --no-data dbname > schema.sql   # スキーマのみエクスポート

# リストア
mysql -u root -p dbname < backup.sql

バックアップの自動化 (systemd timer)

cat > /etc/systemd/system/db-backup.service <<'EOF'
[Service]
Type=oneshot
ExecStart=/usr/local/bin/db-backup.sh
User=root
EOF

cat > /etc/systemd/system/db-backup.timer <<'EOF'
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
EOF

cat > /usr/local/bin/db-backup.sh <<'EOF'
#!/bin/bash
set -e
BACKUP_DIR=/backup/db
mkdir -p "$BACKUP_DIR"
DATE=$(date +%Y%m%d)
sqlite3 /var/lib/grafana/grafana.db ".backup $BACKUP_DIR/grafana-$DATE.db"
find "$BACKUP_DIR" -name 'grafana-*.db' -mtime +30 -delete
EOF
chmod +x /usr/local/bin/db-backup.sh
systemctl enable --now db-backup.timer