データーベース管理

HOME > Linuxtips > データーベース管理

データーベース管理:記事リスト

データーベース管理のカテゴリーには以下の記事がリストされています。

PostgreSQL vacuumdbを使ったフルバキューム実行とデータベース一括クリーンアップ手順

「大量のバッチ処理の後、テーブルサイズが全然戻らない。autovacuumは動いているはずなのに、ディスク使用量がじわじわ増えていく。」
PostgreSQLを本番で自前運用していると、こういう状況に直面することがあります。autovacuumの自動処理だけでは追いつかないタイミングで、手動による強制クリーンアップが必要になる場面です。

この記事では、PostgreSQLに同梱されているコマンドラインツール vacuumdb の実践的な使い方を解説します。単一データベースへの通常VACUUMからFULL VACUUMによる物理領域の回収、全データベース一括クリーンアップ、cronを使った定期実行の設計まで、RHEL 9.4 / Ubuntu 24.04 LTS(PostgreSQL 16)で動作確認した手順をそのままお届けします。

この記事のポイント

・vacuumdbはVACUUM SQLをCLIから実行するPostgreSQL付属のコマンド
・--fullオプションでテーブルを書き直し、OS側にディスク領域を返却できる
・--allで全データベースを一括クリーンアップし、メンテナンスを効率化できる
・--jobs=Nで複数テーブルを並列処理し、大規模DBの処理時間を短縮できる

続きを読む "PostgreSQL vacuumdbを使ったフルバキューム実行とデータベース一括クリーンアップ手順"

PostgreSQL・MySQLのストレージエンジンとロック機構の違い|Linuxセルフホスト選定の実践基準

「MySQLとPostgreSQLの違いって、機能一覧を比べてもいまいちピンとこない。実際にLinuxサーバーで運用してみると、ロック競合の調査コマンドも違うし、PostgreSQLはVACUUMを定期的に走らせないといけないって話は聞いていたけど、採用前にそれがどれほど運用コストに影響するかが読めない。」

この記事では、LinuxサーバーへのセルフホストでMySQLとPostgreSQLを選ぶ際に必ず理解しておくべき、ストレージエンジンの仕組みとロック機構の違いを解説します。InnoDBのクラスタードインデックスとPostgreSQLのヒープストレージがどう異なるか、MVCCの実装差がなぜ運用コストに直結するのかを、実際の調査コマンドと出力例とともに見ていきます。
実行環境: Rocky Linux 9.4 / MySQL 8.0.36・PostgreSQL 16.4 で動作確認済み。

この記事のポイント

・MySQLのInnoDBはPK順にデータを物理配置するクラスタードインデックス構造
・PostgreSQLはヒープ構造でdead tupleが蓄積するためVACUUMが運用上の必須コスト
・ロック競合の調査はMySQL: SHOW ENGINE INNODB STATUS / PostgreSQL: pg_locksで行う
・書き込み多め・PK検索中心→MySQL、複雑クエリ・整合性重視→PostgreSQLが実務の目安

続きを読む "PostgreSQL・MySQLのストレージエンジンとロック機構の違い|Linuxセルフホスト選定の実践基準"

MySQL差分バックアップをxtrabackupで実装する手順|フル取得との組み合わせ設計

MySQL のバックアップ設計で「フルバックアップだけでは毎回時間がかかりすぎる」「差分だけでは復元手順が複雑になる」と悩んだことはないでしょうか。
業務DBが大きくなるほど、mysqldump だけでは運用が回らなくなります。

この記事では、Percona XtraBackup を使って MySQL の差分バックアップ(incremental backup)を実装する手順を解説します。フルバックアップとの組み合わせ設計・世代ローテーション・リストア手順まで、実際のコマンド出力例を交えて一通り説明します。

この記事のポイント

・xtrabackup --incremental でフル取得後の差分だけを効率よく取得できる
・差分は LSN(ログシーケンス番号)を基点に取得するので整合性が保証される
・リストアは「フル適用 → 差分順に適用 → prepare → コピーバック」の4ステップ
・週1フル+日次差分の組み合わせがバックアップ時間と復元容易性のバランスが取れる

続きを読む "MySQL差分バックアップをxtrabackupで実装する手順|フル取得との組み合わせ設計"

MariaDB dumpで確実にバックアップする方法|mysqldumpとmariadb-dumpコマンド比較

「mariadb-dump と mysqldump のどちらを使えばいいか分からない」
「MariaDB 11 にアップグレードしたら、いつ mysqldump のエイリアスが廃止になるか不安だ」

MariaDB 11 系からコマンド体系が整理され、バックアップコマンドの正式名称は mysqldump から mariadb-dump に変わりました。後方互換のため mysqldump コマンドはシンボリックリンクとして残っていますが、スクリプトや cron を長期運用するなら正式名称に統一しておくのが安全です。

この記事では、Rocky Linux 9 / Ubuntu 22.04 上の MariaDB 10.11 LTS・11.x を対象に、mariadb-dump による論理バックアップの実践的な手順を解説します。ダンプ取得からリストア・圧縮保存・実務でよく使うオプションまで、実機の出力例付きで説明します。

この記事のポイント

・mariadb-dump は MariaDB 11 の正式名称で、mysqldump はシンボリックリンクに格下げされた
・InnoDB テーブルは --single-transaction を付けることで無停止バックアップが取れる
・--events --routines を忘れるとストアドプロシージャとイベントがダンプに含まれない
・リストアは mariadb コマンドにダンプファイルをリダイレクトするだけで完了する

続きを読む "MariaDB dumpで確実にバックアップする方法|mysqldumpとmariadb-dumpコマンド比較"

MariaDB最新バージョンをLinuxに手動インストールする|公式tarballを使ったバージョン固定の運用方法

「MariaDBの最新バージョンを本番環境に入れたい。でもAPT/DNFのリポジトリ経由だとバージョンが古かったり、パッケージが急にアップデートされて動作が変わったりして困る」
「本番環境と検証環境で完全に同じバージョンを固定したい」

こういった要件には、MariaDB公式が提供するBinary Distribution(tarball形式)を使った手動インストールが最も確実な方法です。パッケージマネージャーを一切使わないため、任意のバージョンを完全にコントロールできます。

この記事では、MariaDB最新バージョンの公式tarballをLinuxサーバーへ手動インストールする手順を、ディレクトリ設計・systemdサービス登録・初期セキュリティ設定・バージョン切り替え運用まで解説します。APT/DNFリポジトリ経由のインストール手順は別記事で解説しているため、本記事ではtarball手動インストールに絞ります。

この記事のポイント

・公式tarballを /usr/local/mariadb-XX.X.X/ に展開しシンボリックリンクで切り替える設計
・mariadb-install-db でデータディレクトリを初期化し、systemd Unit ファイルで起動管理する
・バージョン更新はシンボリックリンクの張り替えだけ、ロールバックも同様に即座にできる
・パッケージマネージャー不使用なので複数バージョン共存・厳密なバージョン固定が可能

続きを読む "MariaDB最新バージョンをLinuxに手動インストールする|公式tarballを使ったバージョン固定の運用方法"

LinuxサーバーのMariaDBバージョン確認手順|mysql -Vとステータス変数で詳細情報を取得する

MariaDBが動いているはずなのに「バージョンを聞かれても答えられない」「アップデート前後でバージョンが正しく変わったか確認したい」という場面は、Linuxサーバー管理では日常的に起こります。
MariaDBはMySQL互換の設計を持つため、バージョン確認コマンドもMySQLとほぼ共通ですが、出力に「MariaDB」という文字列が付く点や、ステータス変数の種類が微妙に異なる点を把握しておく必要があります。

この記事では、Rocky Linux 9.4 / Ubuntu 22.04 LTSで動作確認した7つのMariaDBバージョン確認方法を、実際のコマンド出力付きで解説します。ログイン不要のコマンドラインから確認する方法、SQLクライアントから確認する方法、パッケージ管理コマンドから確認する方法まで網羅しています。

この記事のポイント

・mysql -V はサービス停止中でもMariaDBバージョンを即確認できる
・mysqladmin version はバージョン+サーバー稼働時間も同時に取得できる
・SHOW VARIABLES LIKE 'version%'; でSSLライブラリ等のコンパイル詳細も確認できる
・rpm -q または dpkg -l でOSパッケージ管理側のバージョンも確認できる

続きを読む "LinuxサーバーのMariaDBバージョン確認手順|mysql -Vとステータス変数で詳細情報を取得する"

PostgreSQLバージョン確認を自動化する|cronとシェルスクリプトで複数サーバーを一括管理

「PostgreSQLのバージョンを調べたいのに、どのコマンドで確認すればいいか分からない」「複数台のDBサーバーがあって、全部のバージョンを一括で把握したい」——こういった声は、管理対象のサーバー台数が増えてきたLinux管理者からよく聞かれます。

バージョン確認は一見シンプルな作業ですが、確認方法が複数あり、パッケージバージョンとPostgreSQL自身が報告するバージョンが微妙に異なることもあります。また、複数サーバーを手作業で一台ずつ確認していると、バージョン違いやアップデート漏れを見落とすリスクが高まります。

この記事では、psqlコマンドによる基本的なバージョン確認から、シェルスクリプトとcronを使った複数サーバーの定期的な一括管理まで、RHEL 9.4 / Rocky Linux 9 / Ubuntu 24.04 LTSの実環境で動作確認した手順を解説します。

この記事のポイント

・psql --versionとSELECT version()でpostgresqlバージョン確認が即座にできる
・rpm -qとdpkg -lでパッケージレベルのバージョンも把握できる
・SSHループスクリプトで複数サーバーを一括取得してCSVに記録できる
・cronで定期実行しバージョン変化を自動検知してメール通知できる

続きを読む "PostgreSQLバージョン確認を自動化する|cronとシェルスクリプトで複数サーバーを一括管理"

PostgreSQLのpg_stat_statementsで遅いクエリを特定する方法|エクステンション設定から実行統計の分析まで

「DBが重くなった」という報告が来たのに、どのSQLが原因なのかを絞り込めない。
MySQLにはスロークエリログ(slow_query_log)がある。しかしPostgreSQLには同等の仕組みが標準では組み込まれておらず、log_min_duration_statementでログ出力はできても「同じパターンのSQLが合計で何秒かかっているか」がひと目でわかるビューは存在しない。

この記事では、PostgreSQLの公式エクステンション pg_stat_statements を使って、実行時間の長いクエリや頻繁に呼ばれているクエリを特定する方法を解説する。Rocky Linux 9 / Ubuntu 24.04 LTSのPostgreSQL 16で動作確認した実機ベースの手順だ。

この記事のポイント

・pg_stat_statementsはPostgreSQLの実行SQLを正規化して統計集計する公式エクステンション
・postgresql.confに1行追加して再起動するだけで有効化でき、追加パッケージは不要
・累積実行時間・平均実行時間・バッファキャッシュヒット率でクエリをランキングできる
・pg_stat_statements_reset()で統計をリセットし、任意のタイミングから計測をやり直せる

続きを読む "PostgreSQLのpg_stat_statementsで遅いクエリを特定する方法|エクステンション設定から実行統計の分析まで"

pgBouncerでPostgreSQLの接続プールを設定する手順|最大接続数の削減とpgbouncer.iniの書き方

「アプリサーバーを増やすたびにPostgreSQLへの接続が増えて、『FATAL: sorry, too many clients already』が頻発する…」
こんな状況に直面したことはないでしょうか。PostgreSQLのmax_connectionsを単純に増やすと、コネクション1本あたり数MB~数十MBのメモリを消費するため、サーバーが詰まる問題は根本的に解決しません。

そこで登場するのがpgBouncerです。アプリとPostgreSQLの間に入って接続をプールし、PostgreSQL本体への接続数を大幅に削減します。アプリ側は数百コネクションを持てるのに、PostgreSQL実体への接続は数十本に抑えるという、LinuxサーバーのDB運用では定番の構成です。

この記事では、pgBouncerのインストールからpgbouncer.iniの設定・動作確認・監視まで、Rocky Linux 9.4 / Ubuntu 24.04 LTSで動作確認した手順を解説します。

この記事のポイント

・pgBouncerをアプリとPostgreSQLの間に挟むことで、PostgreSQL本体の同時接続数を削減できる
・pgbouncer.iniの[databases]と[pgbouncer]セクションを設定し、userlist.txtでパスワードを登録する
・pool_modeはtransactionが最も効率的だが、prepared statementの扱いに注意が必要
・SHOW STATSとSHOW POOLSでリアルタイムに接続状況を監視できる

続きを読む "pgBouncerでPostgreSQLの接続プールを設定する手順|最大接続数の削減とpgbouncer.iniの書き方"

PostgreSQLのWALアーカイブとPITRで任意時点に復元する手順|archive_modeの設定からリカバリターゲット指定まで

「誤ってテーブルをDROPしてしまった」「バッチが暴走して数十万行を書き換えた」——そんなとき、論理バックアップ(pg_dump)では「バックアップ取得時点まで」しか戻せません。作業ミスが発生した直前の状態に正確に戻すには、WALアーカイブを活用したPITR(Point-In-Time Recovery)が必要です。

この記事では、Rocky Linux 9.4 / Ubuntu 24.04 LTS上でPostgreSQL 16を対象に、WALアーカイブの有効化からpg_basebackupによるベースバックアップの取得、recovery.signalを使ったPITR実行までを実機コマンドつきで解説します。pg_dumpとPITRをどう使い分けるかも整理しているので、バックアップ設計を見直したい方にも参考になります。

この記事のポイント

・WALアーカイブを有効にして変更ログを継続保存する
・pg_basebackupで定期的なベースバックアップを取得する
・recovery.signalを置き、recovery_target_timeで任意時点に復元
・pg_stat_archiverでアーカイブの失敗を常時監視する

続きを読む "PostgreSQLのWALアーカイブとPITRで任意時点に復元する手順|archive_modeの設定からリカバリターゲット指定まで"

MySQLのイベントスケジューラーを使ってデータ定期削除・集計を自動化する手順|CREATE EVENTの実践

「MySQLのデータが無限に溜まっていく。cronでshellを書くのも手間だし、DBの中で完結できないか」

Linuxサーバーで動かすMySQLには、こうした定期処理を自前で実装する場面があります。古いログの削除、日次の集計更新、月次のパーティション追加。これらをOSのcronから叩くにはシェルスクリプトとMySQLの認証情報の管理が必要で、意外と手間がかかります。

この記事では、MySQLに標準で用意されているイベントスケジューラー機能(CREATE EVENT)を使って、DBサーバーの中だけで定期処理を完結させる手順を解説します。有効化の方法、実際のEVENT作成例、監視・削除まで、RHEL 9.4 / Rocky Linux 9 + MySQL 8.4(LTS)で動作確認しています。

この記事のポイント

・MySQLイベントスケジューラーはcronを使わずDBの中で定期処理を自動化できる
・event_scheduler=ONをmy.cnfに設定して永続化することが前提
・CREATE EVENTでSQL文を定期実行し、SHOW EVENTSで状態を確認できる
・実行ログはperformance_schemaのevents_statements_historyで追うことができる

続きを読む "MySQLのイベントスケジューラーを使ってデータ定期削除・集計を自動化する手順|CREATE EVENTの実践"

MySQLの一般クエリログ(general_log)を有効化して全SQLを記録する方法|設定手順と運用上の注意点

MySQLで「どのプロセスがいつ、どんなSQLを発行したか」を調べたい場面があります。スロークエリログは指定時間を超えたクエリしか記録しないため、速いクエリを含めて全件記録したい場合や、開発環境でアプリが発行するSQLを可視化したい場合には、一般クエリログ(general_log)が役立ちます。

一方で、general_logは全クエリを記録するためディスクへの書き込みが大量に発生します。本番の高負荷DBサーバーで常時ONにするとI/Oがボトルネックになることがあるため、調査目的での一時的な利用が推奨です。

この記事では、RHEL 9.4 / Ubuntu 24.04 LTS上のMySQL 8.4を例に、general_logの有効化・ファイル出力とテーブル出力の切り替え・本番で負荷をかけずに使う手順・ログローテーションの設定まで、実機出力付きで解説します。

この記事のポイント

・SET GLOBAL general_log = ONで即時有効化・OFFで即時無効化できる
・出力先はファイルとテーブル(mysql.general_log)の2択で切り替え可能
・本番DBでは短時間だけグローバルONにし、調査後すぐOFFに戻すのが安全
・常時ONにする場合はlogrotateとFLUSH GENERAL LOGSでローテーション必須

続きを読む "MySQLの一般クエリログ(general_log)を有効化して全SQLを記録する方法|設定手順と運用上の注意点"

MySQLのデッドロックを調査する手順|SHOW ENGINE INNODB STATUSで原因を特定してロック競合を解消する

「アプリのログに Deadlock found when trying to get lock というエラーが出ている」「特定の時間帯になるとトランザクションが突然ロールバックされる」。MySQL/MariaDBを自前運用していると、避けて通れないのがデッドロック問題です。

デッドロックは2つのトランザクションが互いに相手のロック解放を待ち続け、どちらも先に進めなくなった状態で、InnoDBが自動的に片方をロールバックして解消します。しかし「なぜ起きたか」を調査して再発を防がないと、同じ問題が繰り返し発生します。

この記事では、MySQLで発生したデッドロックを SHOW ENGINE INNODB STATUS で調査する手順を、RHEL 9.4 / MySQL 8.0.38で動作確認した実出力をもとに解説します。エラーログの確認からLATEST DETECTED DEADLOCKセクションの読み方、典型的な発生パターンと再発防止の設計まで、実務で使える手順を網羅します。

この記事のポイント

・SHOW ENGINE INNODB STATUSのLATEST DETECTED DEADLOCKでデッドロックの詳細を確認できる
・innodb_print_all_deadlocks=ONでエラーログに全件を記録して調査履歴を残せる
・異なる順序でのロック取得・ギャップロック・外部キーがデッドロックの3大原因
・トランザクション内のロック順序を統一し短く保つことが根本的な再発防止策になる

続きを読む "MySQLのデッドロックを調査する手順|SHOW ENGINE INNODB STATUSで原因を特定してロック競合を解消する"

MySQLのバイナリログを管理する手順|binlog_expire_logs_secondsでの自動削除とPURGE BINARY LOGSの使い方

「MySQLを運用していたら /var/lib/mysql 配下がいつの間にかディスクをほぼ埋め尽くしている」「binlog.000xxx というファイルが大量に溜まって容量が足りなくなった」

そんな経験を持つLinuxサーバー管理者は少なくありません。バイナリログはMySQLのデータ変更履歴を記録する重要なファイルですが、適切に管理しないと数GB、場合によっては数十GBに膨れ上がり、最終的にはMySQLが書き込みを停止してしまいます。

この記事では、MySQLのバイナリログの仕組みから自動削除の設定(binlog_expire_logs_seconds)と手動削除(PURGE BINARY LOGS)の実践的な手順を、RHEL 9.4 / MySQL 8.0.36環境で動作確認しながら解説します。

この記事のポイント

・binlog_expire_logs_secondsで古いバイナリログを自動削除できる
・PURGE BINARY LOGSで今すぐ手動削除する方法も解説
・レプリケーション中は削除前にSHOW REPLICA STATUSで確認が必須
・SHOW BINARY LOGSでサイズと本数を把握してから操作する

続きを読む "MySQLのバイナリログを管理する手順|binlog_expire_logs_secondsでの自動削除とPURGE BINARY LOGSの使い方"

PostgreSQLのデータベース一覧とディスク使用量を調べる方法|pg_databaseとpg_database_sizeで容量を把握する

「ディスク使用率がじわじわと上昇している。でも、どのデータベースが容量を食っているのかわからない。」
複数のデータベースを1台のLinuxサーバーで運用していると、こうした状況に直面することがあります。PostgreSQLはディスクが満杯になると書き込みを受け付けなくなるため、容量の把握は後回しにできない運用タスクです。

この記事では、pg_database システムカタログと pg_database_size() 関数を使ってデータベース一覧とディスク使用量を確認する具体的な手順を解説します。psqlのメタコマンドによる素早い確認から、SQLで全データベースを一覧比較する方法、テーブル・インデックス単位の内訳確認まで、セルフホスト運用に必要な手順をまとめました。動作確認環境はRocky Linux 9.4 / PostgreSQL 16.4です。

この記事のポイント

・pg_database_size()関数でDBごとのサイズをバイト単位で取得できる
・psqlの\l+でSQL不要でデータベース一覧+サイズをまとめて確認できる
・pg_size_pretty()と組み合わせると「1547 MB」形式で読みやすくなる
・template0/template1はシステム用DBなので監視対象から除外してよい

続きを読む "PostgreSQLのデータベース一覧とディスク使用量を調べる方法|pg_databaseとpg_database_sizeで容量を把握する"

MariaDBへリモート接続できるようにする手順|bind-addressの見直しとポート開放・接続元の制限

「MariaDBをインストールして別のサーバーやPCから接続しようとしたら、接続を拒否された」
こうしたトラブルは、Linuxサーバーに MariaDB を構築した直後によく起きます。原因のほとんどは、MariaDB が初期状態でループバックアドレス(127.0.0.1)にしか待ち受けていないことです。ファイアウォールを開けても接続できないのは、MariaDB 側の bind-address 設定が残っているからです。

この記事では、bind-address の変更・ファイアウォールのポート開放・接続ユーザーへの権限付与・ポート番号を変更したい場合の追加手順まで、リモート接続を実現するために必要な設定を一通りカバーします。Rocky Linux 9.4 / Ubuntu 24.04 LTS で動作確認済みです。

この記事のポイント

・bind-address を 0.0.0.0 に変更するとリモート接続を受け付けるようになる
・firewalld/ufw でポート 3306 を開放しMariaDBを再起動する
・GRANT 文でリモートホストへのユーザー権限を付与する(接続元IP制限推奨)
・ポート番号を変更する場合はSELinuxのラベル追加が必要(RHEL系)

続きを読む "MariaDBへリモート接続できるようにする手順|bind-addressの見直しとポート開放・接続元の制限"

MySQLのバックアップをcronで自動化する運用設計|世代ローテーションと復元テストの組み立て

「バックアップは取っているけど、実際に戻したことはない」
こういうサーバーは意外に多い。障害が起きてはじめて「dumpファイルが壊れていた」「手順書がなかった」と気づいても、そのとき業務はすでに止まっている。

この記事では、MySQLバックアップをcronで完全自動化する運用設計を解説します。mysqldumpをラップしたスクリプトの作り方、日次7世代・週次4世代のローテーション実装、そして復元テストを定期的にcronで回す仕組みの組み立てまで、Rocky Linux 9.4 / RHEL 9環境で動作確認した構成例を紹介します。

この記事のポイント

・mysqldumpのラッパースクリプトをcronに登録して完全無人化できる
・日次7世代・週次4世代の3層ローテーションでディスク枯渇を防ぐ
・復元テストをcronに組み込むことで「戻せる」を定期的に証明できる
・スクリプト失敗時のメール通知設定でサイレント障害を防ぐ

続きを読む "MySQLのバックアップをcronで自動化する運用設計|世代ローテーションと復元テストの組み立て"

PostgreSQLでユーザー(ロール)を作成しデータベース単位で権限を絞る手順|CREATE ROLEとGRANTの実務

「PostgreSQLに接続するアプリ専用のユーザーを作りたいが、CREATE USERとCREATE ROLEのどちらを使えばよいか分からない」
「GRANT SELECTを付与したのに、まだ permission denied for table になる。テーブルごとに設定が必要なのか、データベース単位で一括付与できるのか迷う」

PostgreSQLの権限管理は、MySQLとは設計が根本的に異なります。PostgreSQLには「ユーザー」という専用の概念がなく、すべての主体が「ロール(ROLE)」として統一されています。ログイン属性を与えれば一般ユーザーとして、与えなければグループロールとして機能します。

この記事では、PostgreSQL 16環境(RHEL 9.4 / Rocky Linux 9.4で動作確認済み)を前提に、CREATE ROLEでアプリ専用ユーザーを作成し、特定データベースだけに読み書き権限を絞る手順を解説します。読み取り専用・読み書き・管理者ロールの3パターンと、REVOKEによる権限剥奪、permission deniedのトラブルシュートまで、実務でそのまま使えるSQL例を中心にまとめます。

この記事のポイント

・CREATE ROLE 名前 LOGIN PASSWORD 'パスワード' でアプリ専用ユーザーを作成できる
・権限はDB接続→スキーマ使用→テーブル操作の3段階で付与する必要がある
・GRANT ON ALL TABLESで既存テーブルを一括付与、DEFAULT PRIVILEGESで新規テーブルに自動付与
・permission denied for tableはスキーマのUSAGE権限が抜けているケースが多い

続きを読む "PostgreSQLでユーザー(ロール)を作成しデータベース単位で権限を絞る手順|CREATE ROLEとGRANTの実務"

MySQLの最新バージョンとLTSリリースの選び方|8.0のサポート終了に備えた移行時期の見極めと確認コマンド

「いま稼働しているLinuxサーバーのMySQLが何バージョンか、確認する方法が分からない」
「MySQL 8.0 はサポートが終了したと聞いたが、8.4 LTS と 9.x イノベーションリリースのどちらを選べばいいのか」

こうした疑問を持つLinuxサーバー管理者は多いはずです。MySQLは2024年以降、リリーストラックがLTS(長期サポート版)とイノベーション版の2本立てに移行しました。これを知らないまま「最新版」を追うと、サポート期間が予想より短くなるリスクがあります。

この記事では、LinuxサーバーでMySQLの現在のバージョンを確認するコマンドと、LTSリリースとイノベーションリリースの選定基準を、Rocky Linux 9.4 / Ubuntu 24.04 LTS での実機出力例を交えて解説します。

この記事のポイント

・mysql --version はクライアント、mysqladmin version はサーバーのバージョンを示す
・MySQL 8.0 は 2026年4月にEOL済み。今から採用するなら 8.4 LTS が第一選択
・安定運用なら 8.4 LTS(2032年サポート)、最新機能なら 9.x イノベーションを選ぶ
・rpm -qa でパッケージ単位のバージョンも確認でき、複数パッケージの混在を検出できる

続きを読む "MySQLの最新バージョンとLTSリリースの選び方|8.0のサポート終了に備えた移行時期の見極めと確認コマンド"

PostgreSQLのANALYZEで実行計画のずれを直す方法|プランナ統計の更新とdefault_statistics_targetの調整

「クエリが遅いのにインデックスを張っているはずなのに使われていない」「EXPLAIN を見るたびに推定行数が実際と何十倍も違う」。そんな経験はないでしょうか。
PostgreSQL の実行計画はプランナが統計情報をもとに選択します。統計が古ければ、インデックスよりシーケンシャルスキャンの方が速いと誤判断し、遅いクエリが量産されます。

この記事では、統計情報を更新する ANALYZE コマンドの基本から、精度を制御する default_statistics_target の調整方法まで解説します。RHEL 9.4 / Ubuntu 24.04 LTS + PostgreSQL 16 で動作確認済みです。

この記事のポイント

・ANALYZE でプランナ統計を更新すればプラン選択ミスを直せる
・EXPLAIN ANALYZE の推定行数と実測行数のずれが診断の入口
・default_statistics_target を上げると統計精度が向上する
・列ごとに統計精度を個別調整する ALTER TABLE SET STATISTICS も有効

続きを読む "PostgreSQLのANALYZEで実行計画のずれを直す方法|プランナ統計の更新とdefault_statistics_targetの調整"

PostgreSQLとMySQLの違いを自前運用の視点で比較する|アーキテクチャとレプリケーション方式・向き不向きの見極め

「MySQLとPostgreSQL、うちのシステムにはどっちを入れればいいんですか?」
Linux管理者ならば一度は聞かれたことがあるはずだ。どちらも長年の実績を持つオープンソースRDBMSだが、アーキテクチャもレプリケーションの仕組みも根本から異なる。

「とりあえずMySQL」で問題ないケースは確かにある。だが、複雑な集計クエリや地理情報、JSONB型が要件に入った瞬間に、後から移行する羽目になる。この記事では、Linuxサーバーへのセルフホスト運用に絞り、選定判断に直結するアーキテクチャの差・レプリケーション方式の違い・向き不向きを実務目線で比較する。RHEL 9 / Ubuntu 24.04 LTSで動作確認済みだ。

この記事のポイント

・PostgreSQLはMVCC+プロセスモデル、MySQLはスレッドモデルで根本から別物
・ギャップロックの有無がデッドロック発生パターンを左右する
・複雑な集計・JSONB・地理情報ならPostgreSQL、高速CRUD・大量接続はMySQL
・VACUUM管理と移行コストがセルフホスト選定で見落とされやすい注意点

続きを読む "PostgreSQLとMySQLの違いを自前運用の視点で比較する|アーキテクチャとレプリケーション方式・向き不向きの見極め"

MariaDBをLinuxへインストールしてLTS版を固定する手順|APT/DNFリポジトリの追加とmariadb-secure-installation

「LinuxにMariaDBを入れようとしたら、apt install mariadb-serverで入ったのがOS標準の古いバージョンだった」「LTS版に固定したいが、どのリポジトリを追加すればいいのか分からない」

OS標準リポジトリのMariaDBは保守的なバージョンが収録されており、最新のLTS版(Long Term Support)とは大きく差がある。MariaDB公式が提供するリポジトリセットアップスクリプトを使えば、Ubuntu(APT)でもRHEL系(DNF)でも同じ手順でLTS版を固定できる。

この記事では、Ubuntu 24.04 LTSとRocky Linux 9.4を対象に、MariaDB 11.4 LTSをLinuxサーバーへ導入する手順を解説する。公式リポジトリの追加からmariadb-secure-installationによる初期セキュリティ設定、バージョン固定まで一気に進める。

この記事のポイント

・OS標準リポジトリを使わず公式スクリプトでMariaDB 11.4 LTSを固定する
・Ubuntu(APT)とRocky Linux(DNF)の両方に対応した手順を掲載している
・mariadb-secure-installationで匿名ユーザー・テストDBを除去する
・apt-mark hold / dnf versionlockでバージョン系列を固定して誤アップグレードを防ぐ

続きを読む "MariaDBをLinuxへインストールしてLTS版を固定する手順|APT/DNFリポジトリの追加とmariadb-secure-installation"

PostgreSQLの接続ユーザーをpg_rolesで棚卸しする方法|ログイン権限と有効期限・所属グループの確認

「PostgreSQLのロールが何人いるか、すぐに答えられますか?」
開発環境から持ち込んだテスト用アカウント、退職者のロール、目的不明のサービスユーザー——Linuxサーバーでセルフホスト運用しているPostgreSQLでは、気づかないうちにロールが積み上がります。

この記事では、pg_rolesシステムカタログを使ってPostgreSQLの接続ユーザーを一覧表示し、ログイン権限・パスワード有効期限・所属グループをまとめて棚卸しする方法を解説します。Rocky Linux 9.4(PostgreSQL 16)とUbuntu 24.04 LTSで動作確認済みです。

この記事のポイント

・ pg_roles で全ロールを一覧表示し、rolcanlogin でログイン可否を確認できる
・ rolvaliduntil でパスワード有効期限の切れそうなアカウントを事前に検知できる
・ pg_auth_members を JOIN すれば所属グループもまとめて確認できる
・ 棚卸し用の総合クエリ1本で「誰が・いつまで・どのグループか」を把握できる

続きを読む "PostgreSQLの接続ユーザーをpg_rolesで棚卸しする方法|ログイン権限と有効期限・所属グループの確認"

MySQLのテーブル一覧を出してデータベースを棚卸しする方法|SHOW TABLESでサイズ・行数・ストレージエンジンを確認する

「MySQLに接続したはいいが、このDBにどんなテーブルが入っているのか分からない。」
「運用を引き継いだデータベースの構成を把握するところから始めたい。」

そういった場面で使うのが SHOW TABLES です。テーブル名の一覧を取得するだけでなく、SHOW TABLE STATUS を組み合わせれば、各テーブルのデータサイズ・推定行数・ストレージエンジンをまとめて確認できます。

この記事では、RHEL 9.4(MySQL 8.0.36)で動作確認した手順をベースに、日常的なDB棚卸しの流れを解説します。

この記事のポイント

・SHOW TABLES でデータベース内のテーブル名を一覧表示できる
・SHOW TABLE STATUS でサイズ・行数・ストレージエンジンを一括確認できる
・information_schema.TABLES のSQLで複数DBを横断・ソートして棚卸しできる
・mysql -e オプションでシェルスクリプトから非対話的に実行できる

続きを読む "MySQLのテーブル一覧を出してデータベースを棚卸しする方法|SHOW TABLESでサイズ・行数・ストレージエンジンを確認する"

PostgreSQLのメジャーバージョンアップを計画する|最新バージョンとサポート終了日の確認から切り戻し手段の用意まで

「PostgreSQL 13のサポートが終わってしまった。でも本番DBのメジャーバージョンアップ、手順を間違えたらデータが消えそうで怖い」

Linuxサーバーを自前で運用していると、こういう状況に直面する瞬間があります。PostgreSQLはメジャーバージョンごとにデータディレクトリの内部形式が変わるため、yum updateやapt upgradeを実行するだけでは移行できません。マイナーアップデートとはまったく異なる専用の手順が必要です。

この記事では、PostgreSQLのメジャーバージョンアップを安全に実施するための計画手順を解説します。最新バージョンとサポート終了日の確認方法、インプレースアップグレードツールpg_upgradeの実行手順、そして万一に備えた切り戻し手段の設計まで、実務で判断が必要なポイントをひとつずつカバーします。

実行環境: RHEL 9.4 / Rocky Linux 9.4(PGDG RPM)、Ubuntu 24.04 LTS(PGDG APT)で動作確認済み

この記事のポイント

・pg_upgrade --checkで事前に互換性問題を洗い出してから本番作業に入る
・pg_dumpallで論理バックアップを取得しておけば確実な切り戻しができる
・PostgreSQL 14は2026年11月でEOL。早めの移行計画が必要
・pg_upgradeはインプレース移行のため、pg_dump/restoreより大幅に速い

続きを読む "PostgreSQLのメジャーバージョンアップを計画する|最新バージョンとサポート終了日の確認から切り戻し手段の用意まで"

MariaDBとMySQLはどこまで互換か|Linuxサーバーでの乗り換え判断とレプリケーション・my.cnfの非互換ポイント

===== 「MySQLからMariaDBに切り替えたら動かないクエリが出てきた」「my.cnfの設定値がエラーになって起動しない」——どちらの方向でも、移行時には必ずいくつかの非互換ポイントに直面します。

MariaDBは2009年にMySQLからフォークされた後、独自の進化を続けており、「ほぼ互換」と言われながらも細部では確実に差が生じています。特にMySQL 8.0以降とMariaDB 10.x以降では、認証プラグイン・GTIDの形式・クエリキャッシュの扱いなど、互換を前提にすると痛い目を見るポイントが増えています。

この記事では、Rocky Linux 9 / Ubuntu 22.04 LTS上でのセルフホスト運用を前提に、MariaDBとMySQLの互換性の実態と、乗り換え判断の根拠になる非互換ポイントを整理します。

この記事のポイント

・MariaDB 10.x と MySQL 5.7 は高互換だが、MySQL 8.0 との差異は認証・GTID・JSONで大きい
・GTIDの形式が異なるため MySQL↔MariaDB 間の混在レプリケーションは設定に注意が必要
・my.cnfで MySQL 8.0 廃止のオプションが MariaDB では継続使用できるケースが多い
・mysqldump を使えばデータ移行自体は単純だが、文字セットと SQLモードを事前確認すること

=====

続きを読む "MariaDBとMySQLはどこまで互換か|Linuxサーバーでの乗り換え判断とレプリケーション・my.cnfの非互換ポイント"

PostgreSQLのテーブル一覧をpsqlで確認する手順|スキーマごとの洗い出しと行数・サイズの把握

「PostgreSQLに接続したものの、どこに何のテーブルがあるか全体像を把握できていない」
「スキーマが複数ある環境で、目的のテーブルがどのスキーマにいるのか分からない」

Linuxサーバーでセルフホストしているときに、こういった状況によく遭遇します。psqlには \dt をはじめ、スキーマ横断検索・行数・サイズまで一括で把握できるコマンドやシステムビューが揃っています。

この記事では、PostgreSQLのテーブル一覧をpsqlで確認する手順を、スキーマごとの洗い出しから行数・テーブルサイズの把握まで体系的に解説します。RHEL 9.4 / Rocky Linux 9 / Ubuntu 24.04 LTS(PostgreSQL 16)で動作確認済みです。

この記事のポイント

・\dt でテーブル一覧、\dt *.* で全スキーマを一括表示できる
・\dn でスキーマ一覧を確認してから絞り込むのが現場の基本手順
・pg_stat_user_tables と pg_total_relation_size で行数とサイズを把握できる
・information_schema.tables で複数スキーマをSQL一発で洗い出せる

続きを読む "PostgreSQLのテーブル一覧をpsqlで確認する手順|スキーマごとの洗い出しと行数・サイズの把握"

MariaDBをmariabackupでホットバックアップする手順|フルバックアップ・増分バックアップ・リストアの実務

「mysqldumpでバックアップを取っているが、大きなテーブルでロックがかかってアプリの応答が止まる」「ダンプの完了まで3時間かかってバックアップウィンドウがなくなってきた」——そんな状況に直面したとき、MariaDB公式の物理バックアップツール「mariabackup」が選択肢になります。

mysqldumpは論理バックアップ(SQL形式の書き出し)なのでどこへでも持ち運べますが、大規模テーブルではロック待ちや転送速度がネックです。mariabackupはデータファイルをそのままコピーする物理バックアップであり、InnoDBをサービス無停止(ホットバックアップ)で取得できます。

この記事では、Rocky Linux 9 / RHEL 9 + MariaDB 10.11環境を前提に、mariabackupのインストールからフルバックアップ・増分バックアップ・リストアまでの実際の手順を解説します。

この記事のポイント

・mariabackupはInnoDBをロックなしでホットバックアップできるMariaDB公式ツール
・mariadb-backupパッケージをdnfで導入し、専用バックアップユーザーで実行する
・リストアは--prepare(前処理)→ --copy-back(データ戻し)の2ステップで完結する
・増分バックアップを組み合わせると毎日の差分だけ保存でき、バックアップ容量を削減できる

続きを読む "MariaDBをmariabackupでホットバックアップする手順|フルバックアップ・増分バックアップ・リストアの実務"

MySQLのユーザー作成とGRANT権限付与の実務手順|SHOW GRANTSで確認・REVOKEで剥奪まで

「MySQLをインストールしたがアプリ用のユーザーをどう作ればいい?」「rootで直接接続しているが、これはまずいのか?」
この疑問はLinuxサーバーにMySQLを自前で導入した直後に必ずぶつかります。

rootで直接アプリを接続するのはセキュリティ上の大きなリスクです。アプリのSQL脆弱性がそのままDB全体の破壊につながる可能性があります。適切なユーザーを作成してデータベース単位で権限を絞る設計が現場の基本です。

この記事では、MySQLのユーザー作成(CREATE USER)・権限付与(GRANT)・確認(SHOW GRANTS)・剥奪(REVOKE)の一連の手順を、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した実機の出力例を交えて解説します。

この記事のポイント

・ CREATE USER ~ GRANT ~ FLUSH PRIVILEGES 不要(MySQL 8.0)の正しい流れ
・ '%' と 'localhost' の違いを誤ると接続できない現象が起きる
・ SHOW GRANTS で付与済み権限を即確認、REVOKE で即剥奪できる
・ 最小権限(SELECT/INSERT/UPDATE/DELETE のみ)設計が本番の基本

続きを読む "MySQLのユーザー作成とGRANT権限付与の実務手順|SHOW GRANTSで確認・REVOKEで剥奪まで"

MySQLにインデックスを追加・削除する手順|CREATE INDEXの書き方とSHOW INDEX・EXPLAINで効果を確認する方法

「SELECT文を発行するたびにMySQLが重い。テーブルを見てみたらインデックスが全然張られていなかった」というケースは、現場でよく見かけます。インデックスを適切に設計するだけで、クエリの速度が数十倍改善することも珍しくありません。

この記事では、MySQLでインデックスを追加・削除する手順を、CREATE INDEX・ALTER TABLE ADD INDEX・DROP INDEX・SHOW INDEX・EXPLAINまで実機(Rocky Linux 9 / MySQL 8.0)で動作確認しながら解説します。「どのカラムにインデックスを張るべきか」「逆に張ってはいけないケース」まで含めてカバーします。

この記事のポイント

・CREATE INDEX文でカラムへのインデックスを追加できる
・SHOW INDEX FROMで既存インデックスの構造を確認する
・EXPLAINのtypeがALLからrefに変わればインデックスが使われている
・更新頻度が高いカラムや選択性が低いカラムへの追加は逆効果になる

続きを読む "MySQLにインデックスを追加・削除する手順|CREATE INDEXの書き方とSHOW INDEX・EXPLAINで効果を確認する方法"

MySQLのEXPLAIN出力を読む方法|type・rows・Extraフィールドでインデックスが効いているか診断する手順

「MySQLが遅い原因が分からない」「スロークエリログに出てきたSQLに何をすれば良いのか見当がつかない」

MySQLの性能問題を調査するとき、まず使うのがEXPLAINコマンドです。ところがEXPLAINの出力はフィールドが多く、とくにtype・rows・Extraの3つをどう読めばよいか迷うケースが多いです。

この記事では、MySQLのEXPLAIN出力を読む方法を解説します。各フィールドの意味と確認ポイント、type別のスキャン方式の比較、Extraフィールドで分かる性能問題のパターン、EXPLAIN結果をもとにインデックスを追加する実践手順、そしてMySQL 8.0で使えるEXPLAIN ANALYZEまで、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した手順をお伝えします。

この記事のポイント

・type列が「ALL」ならフルテーブルスキャン——まず疑う
・possible_keysにあってkeyがNULLなら候補があっても使われていない
・Extraに「Using filesort」「Using temporary」が出たら要注意
・EXPLAIN ANALYZEで推定コストと実行コストの乖離を実測できる

続きを読む "MySQLのEXPLAIN出力を読む方法|type・rows・Extraフィールドでインデックスが効いているか診断する手順"

postgresql.confのメモリ設定を決める方法|shared_buffersとwork_memの見積もりと反映手順

「PostgreSQLをLinuxにインストールしたのに、クエリが遅い。設定を確認すると shared_buffers が 128MB のまま。適切な値はどう決めればいいのか?」

インストール直後の postgresql.conf は、古い低スペック環境でも起動できるよう極めて保守的なデフォルト値になっています。実務のLinuxサーバーでそのまま使うと、DBが必要なページをディスクから毎回読み込む状態が続き、クエリのたびにI/Oが走ってパフォーマンスが頭打ちになります。

この記事では、postgresql.conf で調整すべき主要なメモリパラメータ(shared_buffers・work_mem・effective_cache_size・maintenance_work_mem)の見積もり計算式と、設定を反映する手順を実機の出力例とあわせて解説します。
動作確認環境:RHEL 9.4 / Ubuntu 24.04 LTS(PostgreSQL 16)

この記事のポイント

・shared_buffers は「搭載RAM ÷ 4」が実務の出発点(デフォルト128MBは小さすぎる)
・work_mem は接続数とクエリの複雑さで倍増するため、計算式で保守的に見積もる
・shared_buffers の変更には再起動が必要、work_mem はリロードだけで反映できる
・設定後は SHOW 文または pg_settings ビューで反映を必ず確認する

続きを読む "postgresql.confのメモリ設定を決める方法|shared_buffersとwork_memの見積もりと反映手順"

PostgreSQLのストリーミングレプリケーションを構築する手順|pg_basebackupからスタンバイ昇格まで

「pg_basebackupは正常終了したのに、プライマリ側のpg_stat_replicationに何も表示されない」「PostgreSQL 12以降でrecovery.confが廃止されたと聞いたが、代わりに何を設定すればよいのか分からない」——こうした疑問をそのままにしていると、本番環境のレプリケーション構築で同じ場所で詰まることになります。

PostgreSQLのストリーミングレプリケーションは、WAL(Write-Ahead Log)をプライマリからスタンバイへリアルタイムで転送し続け、データの複製を維持する仕組みです。バックアップがある時点のデータを別メディアに保存する仕組みであるのに対し、レプリケーションはスタンバイを「いつでも昇格できる状態」に保ち続けます。プライマリが障害を起こしても数十秒以内に運用を再開できるため、RPO(目標復旧時点)をほぼゼロに近づけられます。RDS・Aurora・Cloud SQLのようなマネージドサービスがボタン1つでリードレプリカを作れるのに対し、Linuxサーバーを自前で運用する環境では、設定の意味を理解していないと障害時に即座に対処できません。

この記事では、Rocky Linux 9 / PostgreSQL 16 の2台構成(プライマリ1台・スタンバイ1台)を例に、ストリーミングレプリケーションの全手順を実際のコマンド出力とともに解説します。pg_basebackupでのベースバックアップ取得、standby.signalによる自動レプリケーション開始、pg_stat_replicationでの同期確認、そして障害時のスタンバイ昇格(フェイルオーバー)まで一気通貫でカバーします。

この記事のポイント

・pg_basebackup -R でstandby.signalとprimary_conninfoが自動生成される
・プライマリ側はwal_level・max_wal_senders・listen_addresses・pg_hba.confの4か所を設定する
・pg_stat_replicationのstateが「streaming」になれば同期成立の合図
・sent_lsn・flush_lsn・replay_lsnの3列が一致していれば遅延なし、write_lag/replay_lagで秒単位確認も可能
・スタンバイ昇格はpg_ctl promoteまたはSELECT pg_promote()で実行できる

続きを読む "PostgreSQLのストリーミングレプリケーションを構築する手順|pg_basebackupからスタンバイ昇格まで"

PostgreSQLのVACUUMとautovacuum運用設計|テーブル肥大化とXID周回を防ぐ設定の考え方

「autovacuumを有効にしているのに、テーブルがどんどん肥大化していく」「VACUUM FULLをかけたら本番テーブルがロックされてサービスが止まった」「XID周回という言葉を聞いたが、自分のサーバーは大丈夫なのか不安だ」

PostgreSQLを本番環境で運用し始めると、こうした問題に直面します。原因のほとんどは、PostgreSQLのMVCC(マルチバージョン並行性制御)の仕組みとVACUUMの役割を体系的に理解していないことです。

この記事では、VACUUMとautovacuumの動作原理を基礎から解説し、テーブル肥大化とXID周回(Wraparound)障害を防ぐ実践的な設定方法を紹介します。Rocky Linux 9 / Ubuntu 24.04上のPostgreSQL 16で動作確認しています。

この記事のポイント

・VACUUMはデッドタプルを再利用可能にし、VACUUM FULLは物理圧縮するが排他ロックが必要
・autovacuumの起動条件はthreshold + scale_factor × 行数で決まる
・XID周回障害を防ぐにはage(relfrozenxid)を定期監視してFreeze VACUUMを計画的に実行
・大量更新テーブルはALTER TABLEでautovacuumパラメータをテーブル単位で上書きする

続きを読む "PostgreSQLのVACUUMとautovacuum運用設計|テーブル肥大化とXID周回を防ぐ設定の考え方"

PostgreSQLをpg_dumpとpg_restoreでバックアップする手順|論理バックアップの取得と復元の実務

「pg_dumpでバックアップを取っているはずなのに、復元できなかった」「カスタム形式とプレーンSQL、どちらを使えばいいのか迷う」——PostgreSQLのバックアップ・リストア手順で悩む現場エンジニアは少なくないはずです。

PostgreSQLには標準で pg_dump と pg_restore というツールが付属しています。MySQLの mysqldump に相当する論理バックアップツールですが、カスタム形式(-Fc)・ディレクトリ形式(-Fd)・並列バックアップ(-j N)・並列リストアなど、より柔軟な運用オプションを備えています。

この記事では、pg_dump / pg_restore の実践的な使い方をRHEL 9.4 / Ubuntu 24.04 LTS(PostgreSQL 16)の実環境出力例を交えて解説します。単一DBのダンプから全DB一括バックアップ(pg_dumpall)・cronによる自動化・別サーバーへの移行・リストア失敗時の対処まで網羅します。

この記事のポイント

・pg_dump -Fc(カスタム形式)が本番運用での推奨フォーマット
・pg_dump -Fd -j N でディレクトリ形式の並列バックアップも可能(大規模DB向け)
・pg_restore -j N で並列リストアするとリストア時間を大幅短縮できる
・全DBを一括バックアップするにはpg_dumpallを使う
・cronで自動化する際は.pgpassファイルでパスワードを安全に管理する

続きを読む "PostgreSQLをpg_dumpとpg_restoreでバックアップする手順|論理バックアップの取得と復元の実務"

pg_hba.confで接続認証を設計する方法|PostgreSQLに接続できない原因の切り分けとscram-sha-256設定

「FATAL: no pg_hba.conf entry for host "192.168.1.100", user "appuser", database "mydb"」というエラーが出てPostgreSQLへの接続が通らない。そんなトラブルに直面したことがあるエンジニアは少なくないはずです。

PostgreSQLはすべての接続を pg_hba.conf(Host-Based Authentication)というファイルで管理しています。このファイルに一致するルールが存在しない限り、どれだけ正しいパスワードを入力しても接続は拒否されます。

この記事では、pg_hba.confの構造・認証方式の種類・scram-sha-256の設定手順を、RHEL 9.4 / Ubuntu 24.04 LTSの実環境出力例を交えて解説します。接続できない原因をFATALエラーメッセージ別に切り分けるフローも紹介します。

この記事のポイント

・pg_hba.confのエントリが一致しない限り接続は即拒否される
・PostgreSQL 10以降の推奨認証はscram-sha-256(md5は非推奨)
・接続FATALエラーはメッセージ文言で原因をすぐ特定できる
・設定変更後は再起動不要。pg_ctl reloadで即時反映できる

続きを読む "pg_hba.confで接続認証を設計する方法|PostgreSQLに接続できない原因の切り分けとscram-sha-256設定"

psqlでロールとデータベースを管理する方法|postgresユーザーへの切り替えと権限付与の基本

「PostgreSQLにアプリ用のユーザーを作ったのに、テーブルを操作しようとするとpermission deniedになる」
「psqlで\duコマンドを打っても、どのロールに何の権限があるのかよく分からない」

PostgreSQLのロール管理は、MySQLのユーザー管理とは設計思想が違うため、初めて触ると戸惑いやすいポイントが多いです。

この記事では、Linux上のPostgreSQLサーバーでpostgresユーザーへの切り替え・psqlへの接続・ロール作成・権限付与・権限確認・よくあるエラー対処を一通り解説します。RHEL 9系 / Rocky Linux 9 / Ubuntu 24.04 LTSで動作確認した手順です。

この記事のポイント

・psql接続は「su - postgres → psql」の2ステップが基本
・CREATE ROLE 名前 WITH LOGIN PASSWORD でアプリ用ロールを作る
・権限付与はCONNECT→USAGE→テーブル権限の3段階で行う
・PostgreSQL 15以降はpublicスキーマのデフォルトCREATE権限が変わった

続きを読む "psqlでロールとデータベースを管理する方法|postgresユーザーへの切り替えと権限付与の基本"

MySQLのデータディレクトリを別ディスクへ移設する手順|datadir変更とSELinuxラベルの再設定

「MySQLのデータディレクトリを別ディスクへ移設したら、起動しなくなった」

このトラブルの原因として最も多いのが、SELinuxのファイルコンテキスト(ラベル)の設定漏れです。RHEL 9・Rocky Linux 9 など SELinux が Enforcing モードで動作している環境では、新しいパスに正しいラベルがなければ mysqld はアクセスを拒否されて起動できません。単純にファイルをコピーするだけでは不十分なのです。

この記事では、Linux サーバー上の MySQL 8.0 を対象に、datadir を別ディスクへ移設する全手順を解説します。動作確認環境は Rocky Linux 9.4(MySQL 8.0.36)です。

この記事のポイント

・datadir 変更後に SELinux ラベルを付け直さないと mysqld は起動しない
・semanage fcontext -a -t mysqld_db_t でラベル登録、restorecon -Rv で実際に適用する
・データコピーは rsync -av /var/lib/mysql/ /data/mysql/ で実施(末尾スラッシュ必須)
・作業前に mysqldump で全データのバックアップを取ってから進めること

続きを読む "MySQLのデータディレクトリを別ディスクへ移設する手順|datadir変更とSELinuxラベルの再設定"

mysqlbinlogでMySQLをポイントインタイムリカバリする方法|誤操作直前まで戻す復旧手順

「昨夜のバッチがWHERE句なしでDELETE文を実行してしまった」「開発者がうっかりDROP TABLEを本番で実行した」——こんな連絡が深夜に来たとき、手元にバイナリログとフルバックアップがあれば、誤操作の直前まで巻き戻すことができます。

この記事では、mysqlbinlogコマンドを使ったMySQLのポイントインタイムリカバリ(PITR)の手順を、実際のコマンド出力とともに解説します。フルバックアップのリストアを基点に、バイナリログから誤操作直前のポジションを特定し、差分を再適用するまでの一連の流れを網羅します。

実行環境:MySQL 8.0.36 / Rocky Linux 9.4 で動作確認済み。MySQL 5.7でも基本手順は同じです。

この記事のポイント

・mysqlbinlog + フルバックアップで誤操作直前まで復旧できる
・--stop-position でDROP/DELETE文だけをスキップして再適用できる
・バイナリログが期限切れで削除されると復旧不可能になる
・ROW形式のバイナリログ確認には --base64-output=DECODE-ROWS が必要

続きを読む "mysqlbinlogでMySQLをポイントインタイムリカバリする方法|誤操作直前まで戻す復旧手順"

MySQLのレプリケーションをLinuxサーバー2台で構築する手順|binlogとGTIDによるソース・レプリカ設定

「MySQLのレプリケーションを設定しようとしたら、binlogポジションとGTIDのどちらを使えばよいか迷っている」「CHANGE MASTER TOとCHANGE REPLICATION SOURCE TOのどちらが正しいのかわからない」——こういった質問をセミナー受講生からよく受けます。

MySQLのレプリケーションは、ソースサーバーのデータをリアルタイムでレプリカサーバーへ自動同期する機能です。読み取り負荷の分散や、障害発生時のフェイルオーバー準備として、Linuxで自前運用する現場では定番の構成です。

この記事では、Rocky Linux 9(RHEL 9互換)上のMySQL 8.4を対象に、binlogポジション方式とGTID方式、2パターンのレプリケーション構築手順を実機コマンドの出力例とともに解説します。my.cnfの設定・レプリケーション専用ユーザーの作成・CHANGE REPLICATION SOURCEの実行・SHOW REPLICA STATUSによる確認まで、一通りカバーします。

この記事のポイント

・MySQLレプリケーションはbinlogを介してソースからレプリカへ更新を自動同期する仕組み
・binlogポジション方式はFile名+位置で同期、GTID方式は一意IDで自動追跡する
・MySQL 8.4ではCHANGE MASTER TO等の旧構文が廃止。新コマンドへの対応が必須
・SHOW REPLICA STATUSでIO/SQLスレッド両方がYesなら正常動作している

続きを読む "MySQLのレプリケーションをLinuxサーバー2台で構築する手順|binlogとGTIDによるソース・レプリカ設定"

「Too many connections」でMySQLに接続できないときの対処|接続上限の見直しとコネクション滞留の調査

「MySQLに接続しようとしたら、突然つながらなくなった」
「アプリのエラーログに Too many connections と出て、サービスが止まった」

本番稼働中に ERROR 1040 (HY000): Too many connections が発生すると、原因の特定と対処を素早くやらなければなりません。MySQLサーバーが受け入れられる同時接続数の上限に達すると、新しい接続はすべて拒否されます。アプリケーションのユーザーには「503エラー」や「接続タイムアウト」として見えているはずです。

この記事では、too many connections mysql エラーの原因と対処法を順を追って解説します。接続数の確認コマンド(SHOW VARIABLES / SHOW STATUS)、即時の上限引き上げ(SET GLOBAL)、my.cnfへの恒久設定、ゾンビ接続の調査と強制切断(SHOW PROCESSLIST / KILL)、アプリ側のコネクション管理改善まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した内容をもとに説明します。

この記事のポイント

・「Too many connections」は max_connections 上限到達で発生する
・SET GLOBAL max_connections = 値; で再起動なしに即時変更できる
・ゾンビ接続は SHOW PROCESSLIST で特定し KILL コマンドで切断する
・恒久対処は my.cnf の max_connections と wait_timeout のセット設定が基本

続きを読む "「Too many connections」でMySQLに接続できないときの対処|接続上限の見直しとコネクション滞留の調査"

my.cnfのチューニング設計|innodb_buffer_pool_sizeとmax_connectionsを実メモリから決める

「MySQLが重い。でもmy.cnfをどこから触ればいいかわからない」
そう感じていませんか。MySQLのパフォーマンス問題の多くは、インストール直後のデフォルト設定のままmy.cnfが放置されていることが原因です。デフォルト値は非常に保守的な設定になっており、現代のサーバーのメモリを全く活かしきれていません。

この記事では、my.cnfチューニングの核心であるinnodb_buffer_pool_sizeとmax_connectionsの正しい設定方法を、RAM 4GB・8GB・16GB・32GBの4パターンで具体的な数値を交えて解説します。チューニング後の効果検証方法(SHOW STATUS)、よくある設定ミスと対処法も合わせて解説しますので、MySQL/MariaDB両方の実務に対応できます。

この記事のポイント

・innodb_buffer_pool_sizeは「空きRAMの70~80%」が実務のセオリー
・max_connectionsはper-threadバッファで上限メモリを試算してから決める
・mysqld --validate-configで再起動前に構文エラーを事前確認できる
・SHOW STATUSのヒット率でバッファプールの効果を定量的に確認できる
・MySQL 5.7.5以降はSET GLOBALで再起動なしにinnodb_buffer_pool_sizeを動的変更できる

続きを読む "my.cnfのチューニング設計|innodb_buffer_pool_sizeとmax_connectionsを実メモリから決める"

PostgreSQLをPGDGリポジトリからLinuxへ導入する手順|initdbとサービス起動・初期ロール設定まで

「LinuxサーバーにPostgreSQLを導入しようとしたら、OSのデフォルトリポジトリにある版が古くて困っている」
RHEL9のAppStreamに収録されているのはPostgreSQL 13系、Ubuntu 22.04には14系と、現時点では2世代~3世代古いバージョンがデフォルトです。かといって、ソースからビルドするのは運用コストが高すぎる。

この記事では、postgresql インストール linux pgdg の正攻法として、PostgreSQL公式のPGDGリポジトリを使ってRHEL9/Rocky Linux 9とUbuntu 24.04 LTSに最新版を導入する手順を解説します。initdbによるデータベースクラスタの初期化、systemctlでのサービス起動・自動起動設定、そして初回接続に欠かせない初期ロール設定(pg_hba.conf)まで、「繋がる状態」まで一気に持っていきます。

この記事のポイント

・PGDGリポジトリを使えばLinuxに最新版PostgreSQLを導入できる
・RHEL9系はdnf module disable postgresqlの実行が必須
・Ubuntu 24.04 LTSはインストール後に自動でクラスタ初期化される
・pg_hba.confを編集してパスワード認証を有効化する

続きを読む "PostgreSQLをPGDGリポジトリからLinuxへ導入する手順|initdbとサービス起動・初期ロール設定まで"

MySQLで指定したカラム名を持つテーブルを検索する|information_schemaを使ったDB横断検索

「特定のカラム名を持つテーブルが、どのDBのどこに存在するかわからない」
「テーブル定義を直接見ても、目的のカラムが見つからない」
DBA経験のあるエンジニアなら一度は遭遇する場面です。

この記事では、MySQLで指定したカラム名を持つテーブルを検索する方法を、information_schemaを使った実コマンド付きで解説します。MySQL 5.7 / MySQL 8.0 / MariaDB 10.x で動作確認済みのSQLです。

この記事のポイント

・information_schema.columnsをSELECTすればMySQL内のカラム検索が一発でできる
・table_schemaを条件に加えると、特定データベースに絞った検索が可能
・LIKE演算子で部分一致検索(user_%・%_idなど)にも対応
・MariaDB / MySQL 8.0 でも同じSQLがそのまま動く(標準化済みのスキーマ)

続きを読む "MySQLで指定したカラム名を持つテーブルを検索する|information_schemaを使ったDB横断検索"

MySQLのrootパスワードを忘れた場合の対処について

MySQLはオープンソースのデータベースソフトになります。 無料で利用できるデータベースソフトとしてPostgreSQLがありますが、 それと人気を二分するデータベースソフトです。 人気の理由は高性能且つ高速で、しかも操作が比較的簡単な上、 Movable TypeやXoopsなど多くのウェブサイト構築ソフトウェアが サポートしているためです。またMySQLを利用する事でLAMP環境が 構築出来ます。 ※LAMPとはLinux、Apache、 MySQL、 PHPの略称 今回はそのMySQL専用のrootパスワードを忘れてしまった場合の 対処方法をご紹介します。
【この記事でわかること】
・MySQL を --skip-grant-tables オプションで起動することで認証をバイパスできる
・ALTER USER または UPDATE mysql.user でパスワードを変更し、flush privileges を実行する
・5.7 以降は authentication_plugin が caching_sha2_password に変わった点に注意が必要
・パスワード変更後は必ず通常モードで再起動して接続確認を行う

続きを読む "MySQLのrootパスワードを忘れた場合の対処について"

Linux無料マニュアル(図解60P) 名前とメールで30秒登録