MariaDB講座 / サーバー設定・SQLモード・時間帯・ログを調べる
MariaDB設定は、起動時のファイル、全体の実行時値、現在接続のSESSIONを分けて確認します。SQLモードと時間帯は接続間で違い、エラーログとスロークエリーログにも別の役割・記録条件があります。
ファイル・GLOBAL・SESSIONを区別する
ファイルは起動時の設定で、場所、グループ、読込順とサービス引数を確認します。GLOBALは全体値や新接続の既定、SESSIONは現在接続の値です。全体値を変えても既存接続へ必ず反映するわけでなく、SESSION変更は再起動後の永続性を意味しません。
まず読取だけを実行します。
SELECT VERSION(), @@GLOBAL.sql_mode, @@SESSION.sql_mode,
@@GLOBAL.time_zone, @@SESSION.time_zone, @@system_time_zone;
SHOW GLOBAL VARIABLES WHERE Variable_name IN
('datadir', 'log_error', 'log_output', 'log_slow_query',
'log_slow_query_file', 'log_slow_query_time');
検証環境はMariaDB 12.3.3で、以下のスローログ名は10.11以降を対象とします。管理サービスの制限や実際の変数名を調べ、他環境の想定を持ち込みません。日付型、予約処理、実行計画にも関係します。
サービスが実際に読むファイルを確認する
Unix系はmy.cnf、Windowsはmy.iniやmy.cnfなどですが、実導入と引数で変わります。端末で対象バイナリーを指定します。
mariadbd --help --verbose
既定ファイル・グループ欄とサービスの--defaults-fileを照合し、後のファイルが上書きする場合も確認します。機密の設定値が含まれ得るため、出力を丸ごと公開しません。専用実習サーバーで元ファイルを保存した場合だけ、実際の[mariadbd]へ例を適用します。
[mariadbd] sql-mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION default-time-zone=+00:00 log-output=FILE log-slow-query=ON log-slow-query-time=1 log-slow-query-file=appops-slow.log
ファイルの名前に--は付けません。相対スローログ名の実パスを起動後に調べます。通常のサービス手順で対象だけを再起動し、失敗ならエラーログを読み元ファイルへ戻します。共有本番再起動をこの実習へ含めません。
SQLモードを一つだけ比較する
未使用の表名を確認し、appops_labで作成します。
CREATE DATABASE IF NOT EXISTS appops_lab CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE appops_lab; CREATE TABLE mode_items ( item_id INT PRIMARY KEY, category_name VARCHAR(20), price INT ) ENGINE=InnoDB; INSERT INTO mode_items VALUES (1, 'Books', 10), (2, 'Books', 20), (3, 'Tools', 30);
元のモードを保存してONLY_FULL_GROUP_BYを加えます。
SET @saved_mode = @@SESSION.sql_mode;
SET SESSION sql_mode = CONCAT_WS(',', NULLIF(@saved_mode, ''), 'ONLY_FULL_GROUP_BY');
SELECT category_name, SUM(price) AS total FROM mode_items GROUP BY category_name;
正しい集計はBooks30、Tools30です。次の失敗例は別に実行します。
SELECT category_name, price FROM mode_items GROUP BY category_name;
グループで定まらないpriceが拒否されます。期待した失敗の後も、復元文を明示して実行します。
SET SESSION sql_mode = @saved_mode; SELECT @@SESSION.sql_mode;
全モードを空にして任意の値を許すのでなく、必要な結果へ集計・GROUP BYを直します。保存プログラムの作成時モードも関係するため、ファイル値だけですべてを説明しません。
時間帯だけを変えて二型を比較する
zone_exampleが未使用か確認して、同じ接続で全体を実行します。
SET @saved_time_zone = @@SESSION.time_zone; SET SESSION time_zone = '+09:00'; CREATE TABLE zone_example (id INT PRIMARY KEY, ts TIMESTAMP, dt DATETIME); INSERT INTO zone_example VALUES (1, '2026-01-01 09:00:00', '2026-01-01 09:00:00'); SELECT ts, dt FROM zone_example; SET SESSION time_zone = '+00:00'; SELECT ts, dt FROM zone_example; SET SESSION time_zone = @saved_time_zone;
最初は両方2026-01-01 09:00:00、+00:00ではTIMESTAMPが00時、DATETIMEは09時です。最後に元のSESSIONへ戻します。名前付き地域はタイムゾーン表の導入・更新に依存し、固定オフセットと夏時間規則が同じとは限りません。保存と表示の方針もアプリケーションで統一します。
質問に合ったログを読む
エラーログは起動・停止・サーバーエラーや警告、スローログは条件に合う問い合わせの診断です。general logは広い接続・SQLの記録で、性能と機密への影響があるため常時有効を既定と考えません。
スローログは有効か、閾値、出力先FILE/TABLE、フィルター、最低走査行数と新接続のSESSION値を確認します。利用者が遅いと感じたSQLがすべて記録されるとは限りません。個人情報を含むSQLも考え、閲覧、ローテーションと保持を管理します。
新接続の専用環境で一秒閾値と適切なフィルターなら、SELECT SLEEP(1.2);で記録先を試せます。業務SQLを遅くせず確認する例です。見つからなければ待ちを繰り返し伸ばす前に条件を調べます。
変更範囲を記録して戻す
両範囲の値と影響する接続・ジョブを記録し、SESSION一条件で観察します。永続性が必要な場合だけバックアップ済みファイルを変更して通常手順で再起動し、新接続の実値を読みます。必要なら元値やファイルに戻し、ログと動作を再確認します。
不要な実習表だけはDROP TABLE appops_lab.mode_items, appops_lab.zone_example;で削除できます。表の削除、SESSION復元とファイル復元は別操作で、表を消してもサーバー設定は戻りません。




