amegonの雑なブログ

日常的なものから技術的なものまでメモの雑記

Zabbix で MariaDB を使用してテーブルを月単位の RANGE パーティションにするお役立ち目標のスクリプト

作ってみました。
手順は README をご参照くださいませ。
これで自分自身の検証環境作るの楽になる(笑

github.com

追記

一度パーティション環境を作成したあとに手動でパーティションの追加・削除を行う場合には以下のコマンドで実行。

パーティションの追加

ALTER TABLE `テーブル名` ADD PARTITION (PARTITION パーティション名 VALUES LESS THAN (RANGEで設定する期間の最終時間));

ALTER TABLE `history` ADD PARTITION (PARTITION p2023_12 VALUES LESS THAN (UNIX_TIMESTAMP("2024-01-01 00:00:00")));

パーティションの削除

ALTER TABLE `テーブル名` DROP PARTITION パーティション名;

ALTER TABLE `history` DROP PARTITION p2023_12;

MariaDB イベントスケジューラ関連

MariaDB でイベントを使用したいときに使う設定コマンドのメモ。

状態確認

show variables like '%event%';
MariaDB [zabbix]> show variables like '%event%';
+--------------------------------------------------------+-----------+
| Variable_name                                          | Value     |
+--------------------------------------------------------+-----------+
| binlog_annotate_row_events                             | OFF       |
| event_scheduler                                        | OFF       |
| performance_schema_events_stages_history_long_size     | -1        |
| performance_schema_events_stages_history_size          | -1        |
| performance_schema_events_statements_history_long_size | -1        |
| performance_schema_events_statements_history_size      | -1        |
| performance_schema_events_waits_history_long_size      | -1        |
| performance_schema_events_waits_history_size           | -1        |
| replicate_annotate_row_events                          | OFF       |
| replicate_events_marked_for_skip                       | REPLICATE |
+--------------------------------------------------------+-----------+
10 rows in set (0.00 sec)

MariaDB [zabbix]>

設定変更

一時的な設定変更

DB にログインして実行

set GLOBAL event_scheduler=ON;
MariaDB [zabbix]> set GLOBAL event_scheduler=ON;
MariaDB [zabbix]> show variables like '%event%';
+--------------------------------------------------------+-----------+
| Variable_name                                          | Value     |
+--------------------------------------------------------+-----------+
| binlog_annotate_row_events                             | OFF       |
| event_scheduler                                        | ON        |
| performance_schema_events_stages_history_long_size     | -1        |
| performance_schema_events_stages_history_size          | -1        |
| performance_schema_events_statements_history_long_size | -1        |
| performance_schema_events_statements_history_size      | -1        |
| performance_schema_events_waits_history_long_size      | -1        |
| performance_schema_events_waits_history_size           | -1        |
| replicate_annotate_row_events                          | OFF       |
| replicate_events_marked_for_skip                       | REPLICATE |
+--------------------------------------------------------+-----------+
10 rows in set (0.00 sec)

MariaDB [zabbix]>

永続的な設定変更

my.cnf に記載して event 設定を永続的に有効化

my.cnfファイルの [mysqld] セクションに以下を記載する。

event_scheduler = on

イベントの作り方

実行間隔は1日単位だけではなく、月だったり年だっだと色々設定可能。
以下の例では1日おきの設定で記載。

delimiter $$
create event <イベント名>
on schedule every 1 day
starts 'YYYY-MM-DD hh:mm:ss'
do
begin
     <実行するクエリ>
end$$
delimiter ;

イベント一覧の見方

show events\G

イベントの編集

delimiter $$
alter event <イベント名>
on schedule every 1 day
starts 'YYYY-MM-DD hh:mm:ss'
do
begin
     <実行するクエリ>
end$$
delimiter ;

イベントの削除

drop event <イベント名>;

Zabbix のパーティショニングを RANGE で設定

Zabbix 4.0.x で動作確認。

手順

  • Zabbix をインストールする
  • 以下の文字列をファイルに書いて、シェルで以下のコマンドを実行。
mysql -u [ユーザ名] -p zabbix < '以下のSQL文群を保存したファイル名'

SQL文群

パーティションは月単位。RANGEを変える場合は適当にお願いします。

# プライマリキーの作成
# history
DROP INDEX `history_1` ON `history`;
ALTER TABLE `history` ADD PRIMARY KEY (`itemid`, `clock`, `ns`);
# history_uint
DROP INDEX `history_uint_1` ON `history_uint`;
ALTER TABLE `history_uint` ADD PRIMARY KEY (`itemid`, `clock`, `ns`);
# history_str
ALTER TABLE `history_str` ADD PRIMARY KEY (`itemid`, `clock`, `ns`);
# history_text
ALTER TABLE `history_text` ADD PRIMARY KEY (`itemid`, `clock`, `ns`);
# history_log
ALTER TABLE `history_log` ADD PRIMARY KEY (`itemid`, `clock`, `ns`);

# パーティションの作成
ALTER TABLE `history` PARTITION BY RANGE (clock) (
PARTITION p2021_06 VALUES LESS THAN (UNIX_TIMESTAMP("2021-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_07 VALUES LESS THAN (UNIX_TIMESTAMP("2021-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_08 VALUES LESS THAN (UNIX_TIMESTAMP("2021-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_09 VALUES LESS THAN (UNIX_TIMESTAMP("2021-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_10 VALUES LESS THAN (UNIX_TIMESTAMP("2021-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_11 VALUES LESS THAN (UNIX_TIMESTAMP("2021-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_12 VALUES LESS THAN (UNIX_TIMESTAMP("2022-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_01 VALUES LESS THAN (UNIX_TIMESTAMP("2022-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_02 VALUES LESS THAN (UNIX_TIMESTAMP("2022-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_03 VALUES LESS THAN (UNIX_TIMESTAMP("2022-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_04 VALUES LESS THAN (UNIX_TIMESTAMP("2022-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_05 VALUES LESS THAN (UNIX_TIMESTAMP("2022-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_06 VALUES LESS THAN (UNIX_TIMESTAMP("2022-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_07 VALUES LESS THAN (UNIX_TIMESTAMP("2022-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_08 VALUES LESS THAN (UNIX_TIMESTAMP("2022-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_09 VALUES LESS THAN (UNIX_TIMESTAMP("2022-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_10 VALUES LESS THAN (UNIX_TIMESTAMP("2022-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_11 VALUES LESS THAN (UNIX_TIMESTAMP("2022-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_12 VALUES LESS THAN (UNIX_TIMESTAMP("2023-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_01 VALUES LESS THAN (UNIX_TIMESTAMP("2023-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_02 VALUES LESS THAN (UNIX_TIMESTAMP("2023-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_03 VALUES LESS THAN (UNIX_TIMESTAMP("2023-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_04 VALUES LESS THAN (UNIX_TIMESTAMP("2023-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_05 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_06 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_07 VALUES LESS THAN (UNIX_TIMESTAMP("2023-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_08 VALUES LESS THAN (UNIX_TIMESTAMP("2023-09-01 00:00:00")) ENGINE = InnoDB
);

ALTER TABLE `history_uint` PARTITION BY RANGE (clock) (
PARTITION p2021_06 VALUES LESS THAN (UNIX_TIMESTAMP("2021-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_07 VALUES LESS THAN (UNIX_TIMESTAMP("2021-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_08 VALUES LESS THAN (UNIX_TIMESTAMP("2021-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_09 VALUES LESS THAN (UNIX_TIMESTAMP("2021-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_10 VALUES LESS THAN (UNIX_TIMESTAMP("2021-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_11 VALUES LESS THAN (UNIX_TIMESTAMP("2021-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_12 VALUES LESS THAN (UNIX_TIMESTAMP("2022-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_01 VALUES LESS THAN (UNIX_TIMESTAMP("2022-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_02 VALUES LESS THAN (UNIX_TIMESTAMP("2022-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_03 VALUES LESS THAN (UNIX_TIMESTAMP("2022-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_04 VALUES LESS THAN (UNIX_TIMESTAMP("2022-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_05 VALUES LESS THAN (UNIX_TIMESTAMP("2022-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_06 VALUES LESS THAN (UNIX_TIMESTAMP("2022-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_07 VALUES LESS THAN (UNIX_TIMESTAMP("2022-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_08 VALUES LESS THAN (UNIX_TIMESTAMP("2022-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_09 VALUES LESS THAN (UNIX_TIMESTAMP("2022-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_10 VALUES LESS THAN (UNIX_TIMESTAMP("2022-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_11 VALUES LESS THAN (UNIX_TIMESTAMP("2022-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_12 VALUES LESS THAN (UNIX_TIMESTAMP("2023-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_01 VALUES LESS THAN (UNIX_TIMESTAMP("2023-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_02 VALUES LESS THAN (UNIX_TIMESTAMP("2023-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_03 VALUES LESS THAN (UNIX_TIMESTAMP("2023-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_04 VALUES LESS THAN (UNIX_TIMESTAMP("2023-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_05 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_06 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_07 VALUES LESS THAN (UNIX_TIMESTAMP("2023-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_08 VALUES LESS THAN (UNIX_TIMESTAMP("2023-09-01 00:00:00")) ENGINE = InnoDB
);

ALTER TABLE `history_str` PARTITION BY RANGE (clock) (
PARTITION p2021_06 VALUES LESS THAN (UNIX_TIMESTAMP("2021-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_07 VALUES LESS THAN (UNIX_TIMESTAMP("2021-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_08 VALUES LESS THAN (UNIX_TIMESTAMP("2021-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_09 VALUES LESS THAN (UNIX_TIMESTAMP("2021-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_10 VALUES LESS THAN (UNIX_TIMESTAMP("2021-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_11 VALUES LESS THAN (UNIX_TIMESTAMP("2021-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_12 VALUES LESS THAN (UNIX_TIMESTAMP("2022-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_01 VALUES LESS THAN (UNIX_TIMESTAMP("2022-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_02 VALUES LESS THAN (UNIX_TIMESTAMP("2022-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_03 VALUES LESS THAN (UNIX_TIMESTAMP("2022-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_04 VALUES LESS THAN (UNIX_TIMESTAMP("2022-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_05 VALUES LESS THAN (UNIX_TIMESTAMP("2022-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_06 VALUES LESS THAN (UNIX_TIMESTAMP("2022-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_07 VALUES LESS THAN (UNIX_TIMESTAMP("2022-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_08 VALUES LESS THAN (UNIX_TIMESTAMP("2022-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_09 VALUES LESS THAN (UNIX_TIMESTAMP("2022-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_10 VALUES LESS THAN (UNIX_TIMESTAMP("2022-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_11 VALUES LESS THAN (UNIX_TIMESTAMP("2022-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_12 VALUES LESS THAN (UNIX_TIMESTAMP("2023-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_01 VALUES LESS THAN (UNIX_TIMESTAMP("2023-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_02 VALUES LESS THAN (UNIX_TIMESTAMP("2023-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_03 VALUES LESS THAN (UNIX_TIMESTAMP("2023-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_04 VALUES LESS THAN (UNIX_TIMESTAMP("2023-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_05 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_06 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_07 VALUES LESS THAN (UNIX_TIMESTAMP("2023-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_08 VALUES LESS THAN (UNIX_TIMESTAMP("2023-09-01 00:00:00")) ENGINE = InnoDB
);

ALTER TABLE `history_text` PARTITION BY RANGE (clock) (
PARTITION p2021_06 VALUES LESS THAN (UNIX_TIMESTAMP("2021-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_07 VALUES LESS THAN (UNIX_TIMESTAMP("2021-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_08 VALUES LESS THAN (UNIX_TIMESTAMP("2021-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_09 VALUES LESS THAN (UNIX_TIMESTAMP("2021-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_10 VALUES LESS THAN (UNIX_TIMESTAMP("2021-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_11 VALUES LESS THAN (UNIX_TIMESTAMP("2021-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_12 VALUES LESS THAN (UNIX_TIMESTAMP("2022-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_01 VALUES LESS THAN (UNIX_TIMESTAMP("2022-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_02 VALUES LESS THAN (UNIX_TIMESTAMP("2022-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_03 VALUES LESS THAN (UNIX_TIMESTAMP("2022-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_04 VALUES LESS THAN (UNIX_TIMESTAMP("2022-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_05 VALUES LESS THAN (UNIX_TIMESTAMP("2022-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_06 VALUES LESS THAN (UNIX_TIMESTAMP("2022-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_07 VALUES LESS THAN (UNIX_TIMESTAMP("2022-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_08 VALUES LESS THAN (UNIX_TIMESTAMP("2022-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_09 VALUES LESS THAN (UNIX_TIMESTAMP("2022-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_10 VALUES LESS THAN (UNIX_TIMESTAMP("2022-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_11 VALUES LESS THAN (UNIX_TIMESTAMP("2022-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_12 VALUES LESS THAN (UNIX_TIMESTAMP("2023-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_01 VALUES LESS THAN (UNIX_TIMESTAMP("2023-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_02 VALUES LESS THAN (UNIX_TIMESTAMP("2023-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_03 VALUES LESS THAN (UNIX_TIMESTAMP("2023-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_04 VALUES LESS THAN (UNIX_TIMESTAMP("2023-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_05 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_06 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_07 VALUES LESS THAN (UNIX_TIMESTAMP("2023-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_08 VALUES LESS THAN (UNIX_TIMESTAMP("2023-09-01 00:00:00")) ENGINE = InnoDB
);

ALTER TABLE `history_log` PARTITION BY RANGE (clock) (
PARTITION p2021_06 VALUES LESS THAN (UNIX_TIMESTAMP("2021-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_07 VALUES LESS THAN (UNIX_TIMESTAMP("2021-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_08 VALUES LESS THAN (UNIX_TIMESTAMP("2021-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_09 VALUES LESS THAN (UNIX_TIMESTAMP("2021-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_10 VALUES LESS THAN (UNIX_TIMESTAMP("2021-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_11 VALUES LESS THAN (UNIX_TIMESTAMP("2021-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_12 VALUES LESS THAN (UNIX_TIMESTAMP("2022-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_01 VALUES LESS THAN (UNIX_TIMESTAMP("2022-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_02 VALUES LESS THAN (UNIX_TIMESTAMP("2022-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_03 VALUES LESS THAN (UNIX_TIMESTAMP("2022-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_04 VALUES LESS THAN (UNIX_TIMESTAMP("2022-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_05 VALUES LESS THAN (UNIX_TIMESTAMP("2022-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_06 VALUES LESS THAN (UNIX_TIMESTAMP("2022-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_07 VALUES LESS THAN (UNIX_TIMESTAMP("2022-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_08 VALUES LESS THAN (UNIX_TIMESTAMP("2022-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_09 VALUES LESS THAN (UNIX_TIMESTAMP("2022-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_10 VALUES LESS THAN (UNIX_TIMESTAMP("2022-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_11 VALUES LESS THAN (UNIX_TIMESTAMP("2022-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_12 VALUES LESS THAN (UNIX_TIMESTAMP("2023-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_01 VALUES LESS THAN (UNIX_TIMESTAMP("2023-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_02 VALUES LESS THAN (UNIX_TIMESTAMP("2023-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_03 VALUES LESS THAN (UNIX_TIMESTAMP("2023-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_04 VALUES LESS THAN (UNIX_TIMESTAMP("2023-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_05 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_06 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_07 VALUES LESS THAN (UNIX_TIMESTAMP("2023-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_08 VALUES LESS THAN (UNIX_TIMESTAMP("2023-09-01 00:00:00")) ENGINE = InnoDB
);

ALTER TABLE `trends` PARTITION BY RANGE (clock) (
PARTITION p2021_06 VALUES LESS THAN (UNIX_TIMESTAMP("2021-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_07 VALUES LESS THAN (UNIX_TIMESTAMP("2021-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_08 VALUES LESS THAN (UNIX_TIMESTAMP("2021-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_09 VALUES LESS THAN (UNIX_TIMESTAMP("2021-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_10 VALUES LESS THAN (UNIX_TIMESTAMP("2021-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_11 VALUES LESS THAN (UNIX_TIMESTAMP("2021-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_12 VALUES LESS THAN (UNIX_TIMESTAMP("2022-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_01 VALUES LESS THAN (UNIX_TIMESTAMP("2022-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_02 VALUES LESS THAN (UNIX_TIMESTAMP("2022-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_03 VALUES LESS THAN (UNIX_TIMESTAMP("2022-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_04 VALUES LESS THAN (UNIX_TIMESTAMP("2022-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_05 VALUES LESS THAN (UNIX_TIMESTAMP("2022-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_06 VALUES LESS THAN (UNIX_TIMESTAMP("2022-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_07 VALUES LESS THAN (UNIX_TIMESTAMP("2022-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_08 VALUES LESS THAN (UNIX_TIMESTAMP("2022-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_09 VALUES LESS THAN (UNIX_TIMESTAMP("2022-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_10 VALUES LESS THAN (UNIX_TIMESTAMP("2022-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_11 VALUES LESS THAN (UNIX_TIMESTAMP("2022-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_12 VALUES LESS THAN (UNIX_TIMESTAMP("2023-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_01 VALUES LESS THAN (UNIX_TIMESTAMP("2023-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_02 VALUES LESS THAN (UNIX_TIMESTAMP("2023-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_03 VALUES LESS THAN (UNIX_TIMESTAMP("2023-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_04 VALUES LESS THAN (UNIX_TIMESTAMP("2023-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_05 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_06 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_07 VALUES LESS THAN (UNIX_TIMESTAMP("2023-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_08 VALUES LESS THAN (UNIX_TIMESTAMP("2023-09-01 00:00:00")) ENGINE = InnoDB
);

ALTER TABLE `trends_uint` PARTITION BY RANGE (clock) (
PARTITION p2021_06 VALUES LESS THAN (UNIX_TIMESTAMP("2021-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_07 VALUES LESS THAN (UNIX_TIMESTAMP("2021-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_08 VALUES LESS THAN (UNIX_TIMESTAMP("2021-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_09 VALUES LESS THAN (UNIX_TIMESTAMP("2021-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_10 VALUES LESS THAN (UNIX_TIMESTAMP("2021-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_11 VALUES LESS THAN (UNIX_TIMESTAMP("2021-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2021_12 VALUES LESS THAN (UNIX_TIMESTAMP("2022-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_01 VALUES LESS THAN (UNIX_TIMESTAMP("2022-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_02 VALUES LESS THAN (UNIX_TIMESTAMP("2022-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_03 VALUES LESS THAN (UNIX_TIMESTAMP("2022-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_04 VALUES LESS THAN (UNIX_TIMESTAMP("2022-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_05 VALUES LESS THAN (UNIX_TIMESTAMP("2022-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_06 VALUES LESS THAN (UNIX_TIMESTAMP("2022-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_07 VALUES LESS THAN (UNIX_TIMESTAMP("2022-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_08 VALUES LESS THAN (UNIX_TIMESTAMP("2022-09-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_09 VALUES LESS THAN (UNIX_TIMESTAMP("2022-10-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_10 VALUES LESS THAN (UNIX_TIMESTAMP("2022-11-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_11 VALUES LESS THAN (UNIX_TIMESTAMP("2022-12-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2022_12 VALUES LESS THAN (UNIX_TIMESTAMP("2023-01-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_01 VALUES LESS THAN (UNIX_TIMESTAMP("2023-02-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_02 VALUES LESS THAN (UNIX_TIMESTAMP("2023-03-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_03 VALUES LESS THAN (UNIX_TIMESTAMP("2023-04-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_04 VALUES LESS THAN (UNIX_TIMESTAMP("2023-05-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_05 VALUES LESS THAN (UNIX_TIMESTAMP("2023-06-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_06 VALUES LESS THAN (UNIX_TIMESTAMP("2023-07-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_07 VALUES LESS THAN (UNIX_TIMESTAMP("2023-08-01 00:00:00")) ENGINE = InnoDB,
PARTITION p2023_08 VALUES LESS THAN (UNIX_TIMESTAMP("2023-09-01 00:00:00")) ENGINE = InnoDB
);

SnmpB 使い方

目的

SNMP 機器の監視を行うための項目を作成するにあたり、MIB ファイルを確認してあーだこーだとやっていました。
しかし、MIB ファイルというのは製品によって固有の MIB (Private MIB)が提供されていたり、そもそも数が多い上にファイルとファイルがリンクしていて、この情報を取得するためにはこのMIBファイルが必要で、、、なんてことをテキストベースのファイルだけでやっていくのは非常に面倒です。
そこで、もっと視覚的に理解を助けてくれるツールがあったらなー、というところで出会ったのがこの SnmpB というツールです。
一部使い方がわかっていない機能もありますが、自分自身の使用メモとして残しておきたい思いで記載しています。
他の方の役にも立てば幸いです。

SnmpB とは

SnmpB はメインの機能を一言でいうと MIBブラウザです。
SNMP(Simple Network Management Protocol)を用いて、対象となる機器の情報を MIB(Management Information Base)を元に取得、設定することができます。

個人的に重宝するのが、MIB ファイルがあれば対象の機器がなくとも MIB のツリーを表示することができるところです。
対象機器によっては複数の Private MIB が提供されていて、構成を把握するのに四苦八苦しますが、SnmpB の機能を使用して MIB ファイルからツリーを作成すれば MIB の構造を理解しやすくなります。(と思っている。)

後述しますが、MIB ブラウザの基本的な機能だけではなく、SNMP Trap の受信など多くの機能を有しており、対象機器の SNMP 動作確認だけではなく監視ツールとしても利用できる可能性があると思います。

できること

基本的な機能と応用的な機能(個人的見解)に分けて、以下のことが実現されています。

基本的な機能

  • MIB の定義内容の確認
    • MIB をツリーで描画し、MIB 内に定義されている内容を GUI で確認できる
  • MIB ブラウザ機能
    • 特定の機器に対して、指定した MIB の情報を SNMP を使用して情報取得することができる
    • MIB の指定は前述の MIB ツリーで行う
  • MIB ファイルの追加
    • 新たに取得した MIB ファイルを SnmpB に追加することで、ツリーの描画に加えることができる

応用的な機能

  • MIB の編集
  • ディスカバリ
  • SNMP Trap の受信
  • グラフ
  • ログ

今回紹介するバージョンと使用環境

SnmpB とそれを動作させる環境は以下で試しました。

  • SnmpB
    • Version 0.8
  • 使用環境
    • PC
    • ネットワーク機器

ダウンロードとインストール

ダウンロードサイト

以下の URL からダウンロードしてください。
執筆時点での最新版は 0.8 でした。

https://sourceforge.net/projects/snmpb/

※ サイトの Files を確認すると、0.9 というフォルダはあるのですが、中身がなく、、、今後できるのかな?

インストール

ダウンロードした snmpb-0.8.exe をダブルクリックなりしてインストールしてください。
インストール時に特に設定変更する必要はないと思いますので、サクサクっとインストールしてみましょう。
今回はすべてデフォルト設定でインストールしました。

ちなみに、アンインストールはメニューの中にありました。
(設定のアプリ内には SnmpB が表示されておらず、アンインストールはメニューからのみ実行できるようです。)

ざっくりやってみる

対象のネットワーク機器を追加して SNMP で情報取得

以下順に操作していきます。

  • Options の Manager Agent Profiles... を選択
  • 表示されたダイアログの左側の四角内で 右クリック → New agent profile を選択
  • 左側の四角内に newagent が表示され、右側のパラメータが入力された状態が表示される
  • 必要なパラメータを入力
    • ここでは以下のパラメータを入力してOKを押す。
      • Name:AR260SV2
      • Agent Address/Name:192.168.1.254
  • メインダイアログに戻り、Remote SNMP Agent に AR260SV2 が表示された状態になる
  • MIB Tree> MIB Tree 上で 右クリック → Walk を選択する
  • ダイアログ右側の Query Results に Walk の実行結果が表示される

今回のケースでは、SNMP で情報が取得することができた。

対象のネットワーク機器の Private MIB を登録

次に、AR260SV2 の Private MIB を登録してみる。
登録した結果が反映されていることを確認するために、まず現在の状態で Walk を実施し、Private MIB を登録したのち再度 Walk を実施して結果の違いを確認する。

事前確認

  • Remote SNMP Agent に AR260SV2 が選択されている状態で MIB Tree を展開し、system を 右クリック → Walk を実行する
    • MIB Tree → iso → org → dod → internet → mgmt → mib-2 → system
  • Query Results に表示された内容で、2. sysObjectID.0enterprise.207.1.23.1.1 と表示されていることを確認する

Private MIB の登録

  • AR260SV2 の Private MIB である ateatos.mib を C:\work\snmp\add_mib というフォルダを作成して保存しておく。
    • Private MIB を保存するフォルダの場所は任意
  • Options → Preferences を選択する
  • 左側四角内の Modules を選択した状態で右下の Add ボタンを押し、type new path here と表示されたところに C:\work\snmp\add_mib を入力してOKボタンを押す。
  • メイン画面で Modules を選択し、Available MIB modules に ateatos.mib が追加されていることを確認する
  • ateatos.mib を選択した状態で、画面中央の -> を選択し、Load MIB modules に EATOS-SMI が追加されたことを確認する
    • EATOS-SMI は ateatos.mib に定義されている モジュール名(DEFINITIONS) である。MIB ファイル名が表示されるわけではないことに注意。
    • このとき RFC-1215 も Loaded MIB modules に移動する。関連するモジュールがある場合には一緒に実施してくれるようである。

結果確認

  • Tree に戻って system を 右クリック → Walk を実行する
  • Query Results に表示された内容で、2. sysObjectID.0ar260sv2 と表示されていることを確認する
    • ここで表示された ar260sv2 は、ateatos.mib に定義されている製品名であり、Private MIB を登録したことで表示が変わったことがこれで確認できた。
    • ateatos.mib 内の記載
        --
        -- sysObjectID of AR260 Series
        --
           ar260sv2      OBJECT IDENTIFIER ::= { ar260series 1 }
      

ちなみに

Private MIB を追加したことで、MIB Tree に以下のツリーが追加で描画されている。

追加する Private MIB によって、Tree のどこに情報が追加されるのかは変わるので、確認場所は注意すること。

各部の名称と役割

全部の機能を把握しているわけではないので、個人的に有用なところから紹介していきます。
また、機能的にも ??? のところがあるかもしれませんが、ご容赦ください。

メニュー

File

このメニューは、SnmpB の Editor 機能で MIB ファイルの作成、編集を行う際に使用する。
そのため、他の機能の使用時にはメニューが有効にならない。

  • New MIB
    • 新しい MIB を作成する。編集していたファイルの情報はクリアされる。
  • Open MIB...
    • 既存の MIB ファイルを開き、その内容を表示する。
  • Save MIB
    • 編集した MIB を上書き保存する。
  • Save MIB As...
    • 編集した MIB をファイル名を変えて保存する。

Tools

このメニューは、SnmpB の Tree 機能と Editor 機能で使用するメニューがある。

  • GoTo Line...
    • 指定した行数にカーソルを移動する
  • Find...
    • 指定した文字が含まれる(表示される)箇所に移動する
  • Replace...
    • 文字の置換を行う
  • Find next
    • Find で指定した文字が次に一致する箇所に移動する
  • Multiple Varbinds...
    • Tree で MIB のノードを選択した際に使用可能。
    • (使い方がわかっていない)
  • Stop Walk
    • 開始した walk の停止 (たぶん)
  • Verify MIB syntax
    • Editor 機能で編集している MIB の構造を検証する。結果は Verification log に表示される。
  • Extract MIB from RFC...
    • (使い方がわかっていない)

Options

  • Manage Agent Profiles...
    • SnmpB がアクセスする対象の設定
  • Manage SNMPv3 USM Profiles...
    • SNMPv3 の設定をす場所。ここで設定しておいた Profile を Manage Agent Profiles 内の Agent に設定して使用する。
  • Preferences...
    • Tree の表示形式や MIB ファイルの保存場所パスの設定、SNMP Trap の受信ポート番号の設定などができる。

Help

  • About SnmpB
    • バージョン情報等の AboutBox

メイン画面

主な機能を以下に記載します。

  • Tree
    • 対象となる機器の設定
    • MIB Tree の表示
    • MIB Tree で選択した Node の情報表示
    • 取得した結果の表示
  • Modules
    • SnmpB に登録する MIB モジュールの設定
  • Editor
    • MIB の作成、編集に使用
    • MIB の構文チェック結果を表示
  • Discovery
    • 指定した情報でネットワーク内を探索して情報が取得できた機器の情報を表示する
  • Traps
    • 機器から送信された SNMP Trap の情報を表示する
  • Graphs
    • 指定した MIB OID の取得値をグラフで表示する
  • Log
    • (おそらく)SnmpBのシステムに関するログを表示する。

参考

最後に

Martin Jolicoeur へ素敵なツールを提供してくれたことと、このツールの紹介に許可をくれたことに心から感謝します。

Dear Martin Jolicoeur,
Thank you very much for providing a best tool and for allowing me to introduce this tool.

Zabbix で発生したトリガー情報を Slack に通知する

目次

  • やりたいこと
  • 参考にした設定
  • 設定追加、変更したところ
    • Zabbixの設定
    • Slackの設定
  • 通知テスト
  • できあがり

今回やりたいこと

Zabbixを使用して監視した結果をSlackに通知したい。
そうすれば外でも何があったか把握できる。
メールでもいいかなとも思ったが、せっかくだから Slack を使ってみる、といった感じ。

参考にした情報

https://qiita.com/Higemal/items/f0bc18bf66e54628b22a
↑ とても参考になりました。ありがとうございました ペコリ

設定追加、変更したところ

私の環境では、参考にさせていただいた手順だけでは期待した動作ができず、少し調べて設定を追加、変更しました。

Zabbixの設定

メディアタイプでテストを実行したところエラー発生。
エラーの内容は SyntaxError: unterminated statement (line 116) と表示されている。

ググってみたところ、このエラー自体は既知のものらしく、以下の手順で修正できた。

  • Zabbix の 管理 → メディアタイプ で Slack を選択
  • 画面下方の スクリプト のボックスを選択
  • Java Script の編集画面になるので、以下修正 ※ 計2か所
    • 修正前文字:Can't
    • 修正後文字:Can\'t
    • ZabbixのメディアタイプでJS編集画面
  • 適用 を押して Java Script の編集終了
  • 更新 を押して メディアタイプ Slack の編集終了

これでいけると思いテストを再実行。
今度は違うエラーが表示された。
次項へ続く。

Slackの設定

次に表示されたエラーは "missing_scope"。
調べたところ Slack 側で作成した App に権限が不足しているとのこと。
以下の手順で設定変更実施。

  • https://api.slack.com/apps にアクセス
  • 先だって作成したアプリを選択
  • 画面左の Features → OAuth & Permissions を選択
  • Scopes 内で以下の設定がなければ追加する (※ これがあればできた、という程度で精査はしていません。。。)
    • channels:read
    • chat:write
    • files:read
    • files:write
  • Scopes 内の設定を変更すると、ブラウザの画面上部に You’ve changed the permission scopes your app uses. Please reinstall your app for these changes to take effect (and if your app is listed in the Slack App Directory, you’ll need to resubmit it as well). と表示される。
    • reinstall your app がリンクになっているので選択する
  • 設定完了

これでいけると思いテストを再実行する。

通知テスト

メディアタイプ → Slack でテスト実行。
今度は成功。Slackにもテスト情が通知された。

できあがり

Zabbix から Slack に通知を上げることができた。
これで監視データから通知ができる仕組みが準備できたので、必要 or 有用な通知を上げるようにしてみる。

Zabbix のデータが記録されるテーブルのカラムを確認して保存されるデータ型をチェック

確認環境

Zabbix

Zabbix Server 5.0.17

[root@zbx-svr-5 ~]# zabbix_server -V
zabbix_server (Zabbix) 5.0.17
Revision 0a4ac3dabc 18 October 2021, compilation time: Oct 18 2021 13:38:05

Copyright (C) 2021 Zabbix SIA
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it according to
the license. There is NO WARRANTY, to the extent permitted by law.

This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit (http://www.openssl.org/).

Compiled with OpenSSL 1.0.1e-fips 11 Feb 2013
Running with OpenSSL 1.0.1e-fips 11 Feb 2013
[root@zbx-svr-5 ~]#

DB

MariaDB 10.1.48

[root@zbx-svr-5 ~]# mysql -V
mysql  Ver 15.1 Distrib 10.1.48-MariaDB, for Linux (x86_64) using readline 5.1
[root@zbx-svr-5 ~]#

テーブルごとのカラム確認

history

  • カラムに設定されている value のデータ型:double (浮動小数点型)
  • このテーブルの保存される Zabbix のアイテムのデータ型:数値(浮動小数)
MariaDB [zabbix]> show columns from history;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| itemid | bigint(20) unsigned | NO   | MUL | NULL    |       |
| clock  | int(11)             | NO   |     | 0       |       |
| value  | double              | NO   |     | 0       |       |
| ns     | int(11)             | NO   |     | 0       |       |
+--------+---------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

MariaDB [zabbix]>

他のテーブルに history_uint とか history_str とかあるので、history浮動小数の値を扱っているのは個人的に以外だった。
Zabbix を実装したとき、はじめに扱ったデータが浮動小数のデータだったのかも。(個人の意見です。)

history_uint

  • カラムに設定されている value のデータ型: bigint(20) unsigned (符号なし整数 → 整数だけで 8 バイト(=64ビット)使用可能)
  • このテーブルの保存される Zabbix のアイテムのデータ型:数値(整数)
MariaDB [zabbix]> show columns from history_uint;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| itemid | bigint(20) unsigned | NO   | MUL | NULL    |       |
| clock  | int(11)             | NO   |     | 0       |       |
| value  | bigint(20) unsigned | NO   |     | 0       |       |
| ns     | int(11)             | NO   |     | 0       |       |
+--------+---------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

MariaDB [zabbix]>

符号なしなので 0 ~ 18446744073709551615 まで使える。大きい。

history_str

  • カラムに設定されている value のデータ型: varchar(255) (最大 255 バイトを格納できる可変長文字列)
  • このテーブルの保存される Zabbix のアイテムのデータ型:文字列
MariaDB [zabbix]> show columns from history_str;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| itemid | bigint(20) unsigned | NO   | MUL | NULL    |       |
| clock  | int(11)             | NO   |     | 0       |       |
| value  | varchar(255)        | NO   |     |         |       |
| ns     | int(11)             | NO   |     | 0       |       |
+--------+---------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

MariaDB [zabbix]>

余談ですが、varchar(255)varchar(256) のどちらにするかで論争があるとかないとか。

history_text

  • カラムに設定されている value のデータ型: text (16ビット → 65535文字)
  • このテーブルの保存される Zabbix のアイテムのデータ型:テキスト
MariaDB [zabbix]> show columns from history_text;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| itemid | bigint(20) unsigned | NO   | MUL | NULL    |       |
| clock  | int(11)             | NO   |     | 0       |       |
| value  | text                | NO   |     | NULL    |       |
| ns     | int(11)             | NO   |     | 0       |       |
+--------+---------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

MariaDB [zabbix]>

文字列よりも大きい文字を扱う際に使用。
テーブルの内容を確認したところ、私の環境では Template Module Linux generic by Zabbix agentSoftware installed というアイテムのデータだけが書き込まれていた。

history_log

  • カラムに設定されている value のデータ型: text (16ビット → 65535文字)
  • このテーブルの保存される Zabbix のアイテムのデータ型:ログ
MariaDB [zabbix]> show columns from history_log;
+------------+---------------------+------+-----+---------+-------+
| Field      | Type                | Null | Key | Default | Extra |
+------------+---------------------+------+-----+---------+-------+
| itemid     | bigint(20) unsigned | NO   | MUL | NULL    |       |
| clock      | int(11)             | NO   |     | 0       |       |
| timestamp  | int(11)             | NO   |     | 0       |       |
| source     | varchar(64)         | NO   |     |         |       |
| severity   | int(11)             | NO   |     | 0       |       |
| value      | text                | NO   |     | NULL    |       |
| logeventid | int(11)             | NO   |     | 0       |       |
| ns         | int(11)             | NO   |     | 0       |       |
+------------+---------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)

MariaDB [zabbix]>

value は text だが、timestamp や source、severity などログの保存に必要な情報を同時に記録できるようになっている。
ログはどれだけの文字数書かれているかわからないから、text 型になっているのかな。

  • カラムに設定されている value のデータ型:double (浮動小数点型)
  • このテーブルの保存される Zabbix のアイテムのデータ型:数値(浮動小数)
MariaDB [zabbix]> show columns from trends;
+-----------+---------------------+------+-----+---------+-------+
| Field     | Type                | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+-------+
| itemid    | bigint(20) unsigned | NO   | PRI | NULL    |       |
| clock     | int(11)             | NO   | PRI | 0       |       |
| num       | int(11)             | NO   |     | 0       |       |
| value_min | double              | NO   |     | 0       |       |
| value_avg | double              | NO   |     | 0       |       |
| value_max | double              | NO   |     | 0       |       |
+-----------+---------------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

MariaDB [zabbix]>

history テーブルに記録されたデータのトレンド用テーブル。
最大値、最小値、平均値にまとめる。

以下、Zabbix の公式より。

ヒストリが各収集値を保存するのに対して、トレンドでは1時間に1回、平均化された情報を保つため、リソースを節約することができます。

収集したデータを1時間分の最大値、最小値、平均値としてトレンド用のテーブルに記録し、ヒストリのテーブルからはデータを削除する、と理解。

  • カラムに設定されている value のデータ型: bigint(20) unsigned (符号なし整数 → 整数だけで 8 バイト(=64ビット)使用可能)
  • このテーブルの保存される Zabbix のアイテムのデータ型:数値(整数)
MariaDB [zabbix]> show columns from trends_uint;
+-----------+---------------------+------+-----+---------+-------+
| Field     | Type                | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+-------+
| itemid    | bigint(20) unsigned | NO   | PRI | NULL    |       |
| clock     | int(11)             | NO   | PRI | 0       |       |
| num       | int(11)             | NO   |     | 0       |       |
| value_min | bigint(20) unsigned | NO   |     | 0       |       |
| value_avg | bigint(20) unsigned | NO   |     | 0       |       |
| value_max | bigint(20) unsigned | NO   |     | 0       |       |
+-----------+---------------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

MariaDB [zabbix]>

history_int テーブルに記録されたデータのトレンド用テーブル。
最大値、最小値、平均値にまとめる。
Zabbix のデータのまとめ方は trends テーブルに記載した内容と同じと理解。

MySQL、MariaDB でよく使うコマンドメモ

パーティション

パーティション化したテーブルの情報を見たい

  • コマンド
SELECT TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, PARTITION_ORDINAL_POSITION, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME =  '<テーブル名>';
  • 実行例
MariaDB [zabbix]> SELECT TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, PARTITION_ORDINAL_POSITION, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME =  'history';
+--------------+------------+----------------+----------------------------+------------+
| TABLE_SCHEMA | TABLE_NAME | PARTITION_NAME | PARTITION_ORDINAL_POSITION | TABLE_ROWS |
+--------------+------------+----------------+----------------------------+------------+
| zabbix       | history    | NULL           |                       NULL |    2029405 |
+--------------+------------+----------------+----------------------------+------------+
1 row in set (0.00 sec)

MariaDB [zabbix]>

↑ パーティショニングしていないテーブルだった。。。
手元にパーティションしたテーブル情報がなかったので、どこかで更新します。

断片化(フラグメント)系

断片化されているサイズ確認

  • コマンド
select table_schema, table_name, data_free, table_rows from information_schema.tables where table_name='<テーブル名>';
  • 実行例
MariaDB [zabbix]> select table_schema, table_name, data_free, table_rows from information_schema.tables where table_name='history';
+--------------+------------+-----------+------------+
| table_schema | table_name | data_free | table_rows |
+--------------+------------+-----------+------------+
| zabbix       | history    |   4194304 |    2036794 |
+--------------+------------+-----------+------------+
1 row in set (0.00 sec)

MariaDB [zabbix]>

上記のコマンド結果の data_free に表示されている数値が断片化しているサイズを示す。
断片化のサイズが大きいと、使用している実サイズの中に利用できていない無駄な領域がたくさんあることを示している。

断片化を解消したい

  • コマンド
alter table <テーブル名> engine innodb, LOCK=NONE;

LOCK=NONEDDL中にロックせずに並列DMLを可能にすることを指定する。
このオプションをつけてコマンド実行し、LOCK しないことができない場合(LOCKしないといけない場合)にはエラーになる(らしい)。

  • 実行例
MariaDB [zabbix]> select table_schema, table_name, data_free, table_rows from information_schema.tables where table_name='history';
+--------------+------------+-----------+------------+
| table_schema | table_name | data_free | table_rows |
+--------------+------------+-----------+------------+
| zabbix       | history    |   4194304 |    2028627 |
+--------------+------------+-----------+------------+
1 row in set (0.00 sec)

MariaDB [zabbix]>
MariaDB [zabbix]> alter table history engine innodb, LOCK=NONE;
Query OK, 0 rows affected (2 min 25.59 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [zabbix]>
MariaDB [zabbix]>
MariaDB [zabbix]> select table_schema, table_name, data_free, table_rows from information_schema.tables where table_name='history';
+--------------+------------+-----------+------------+
| table_schema | table_name | data_free | table_rows |
+--------------+------------+-----------+------------+
| zabbix       | history    |         0 |    2029270 |
+--------------+------------+-----------+------------+
1 row in set (0.00 sec)

MariaDB [zabbix]>

用語

InnoDB

いくつかの情報から、以下のことがわかった。

  • InnoDB は、高い信頼性と高いパフォーマンスとのバランスをとる汎用のストレージエンジン
  • MySQL5.5からデフォルトのストレージエンジンとなっており、MyISAM と違いトランザクションが利用可能
  • MySQLMariaDBのためのデータベースエンジン

MySQLMariaDB を利用する上では標準のエンジンと理解。

DDL (Data Definition Language)

DDL はデータ定義言語と呼ばれ、データベース内の表、ビューやインデックスなどの各種オブジェクトの作成や変更をするためのSQL文のこと。