データベース管理に便利なユーティリティ(対象のサーバーが一つ)

データベース管理に便利なユーティリティ(対象のサーバーが一つ)

mysqldiskusage データベースのディスク仕様量の表示

接続先を指定すれば、その接続先のデータベースディスク利用量を計算してくれます。以下が実行例です。

mysqluc> mysqldiskusage --server=root:root@localhost:3306
  # Source on localhost: ... connected.
  # Database totals:
  +---------------------+-------------+
  | db_name             |      total  |
  +---------------------+-------------+
  | mydb                | 406,979     |
  | mysql               | 1,645,921   |
  | performance_schema  | 510,023     |
  | sakila              | 30,495,478  |
  | test                | 123,270     |
  | world               | 471,349     |
  +---------------------+-------------+
Total database disk usage = 33,653,020 bytes or 32.09 MB
#...done.

各種ログ類のサイズも結果に含めることができます。バイナリログ(-b), リレーログ(-r), 一般ログ・スロークエリ・エラーログ(-l), InnoDB関連(InnoDBログ、共有テーブルスペース)ファイル(-i)を個別に指定するか、-aですべてを表示するようにしてください。

ただし、図2のようにユーティリティをローカルで実行する場合とリモートで実行する場合には、取得できる情報に差があります。

図2:ローカルとリモートの差(クリックで拡大)

mysqlindexcheck 重複、もしくは冗長なインデックスをチェック

データベースのパフォーマンスアップにはインデックスの設計、追加が不可欠です。しかしながら大規模でテーブル数・カラム数が多い場合や、長期にわたって多人数によるメンテナンスが実施されたテーブルなどでは、重複したインデックスや、冗長なインデックスが作成されていることがよくあります。

本ユーティリティはそのチェックに利用できます。チェック内容は表とインデックスの定義から静的にチェックされ、あくまでもサジェスチョンであることにお気をつけください(すべてが正しいとは限りませんので、すべてに対処が必要とは限りません)。

例えば以下のような定義があるとき、idx2があればidx1は不要です。

create table t1(i1 int, v2 varchar(20)) engine=myisam;
  insert into t1 values(1,'Firebird'),(2,'MySQL'),(3,'PostgreSQL');
  create index idx1 on t1(i1);
  create index idx2 on t1(i1,v2);

このテーブルのインデックスチェックを、修正のためのDROP文も表示(-d)するオプション込みで行うと以下の実行例となります。

mysqluc> mysqlindexcheck --server=root:root@localhost:3306 -d test.t1
  # Source on localhost: ... connected.
  # The following index is a duplicate or redundant for table test.t1:
  #
  CREATE INDEX `idx1` ON `test`.`t1` (`i1`) USING BTREE
  #     may be redundant or duplicate of:
  CREATE INDEX `idx2` ON `test`.`t1` (`i1`, `v2`) USING BTREE
  #
  # DROP statement:
  #
  ALTER TABLE `test`.`t1` DROP INDEX `idx1`;
  #

結果としてidx1が冗長、もしくは重複としてカウントされ、DROP文が表示されます。

MySQLのインデックスについて詳細は米facebookの松信さんがサン・マイクロシステムズ勤務時代に作成した次のドキュメントが役立ちます。ご興味のあるかたはご参照ください。

> インデックスを使いこなす

また参考文献にあげた拙書や奥野さんの本にもインデックスの説明と、その効果を確認するためのEXPLAIN句の読み方の情報があります。

mysqlmetagrep メタデータの検索

データベースオブジェクト('database', 'trigger', 'user','routine', 'column', 'table', 'partition', 'event', 'view')から指定パターンのオブジェクトを検索します。grepと名前がついていますが、デフォルトの検索はLIKEにより行われます。

例えばTで始まるデータベースから、Tで始まるテーブル、ビューを検索するには以下の実行例で検索します。

mysqluc> mysqlmetagrep --server=root:root@localhost:3306 -e 't%' --search-objects=table,view --database='t%' --format=vertical
  *************************       1. row *************************
  Connection: root:*@localhost:3306
  Object Type: TABLE
  Object Name: t1
  Database: test
  Field Type: TABLE
  Matches: t1
  1 row.

検索対象のデータベースオブジェクト種別は上記のように--search-objectsオプションにカンマで区切って指定できます。
--search-objectsを指定しない場合は、すべてのデータベースオブジェクトがリストアップされ大変なことになります。

またストアドルーチン、トリガ、イベントのBODY部分も検索対象にしたい場合には-bオプションもあわせて指定してください。

mysqlprocgrep プロセス情報の検索

MySQLではクライアントからの各接続の状態をSHOW FULL PROCESSLIST;(もしくは、同内容をSQLにて絞り込める情報スキーマ(I_S)のPROCESSLISTテーブル)にて確認できますが、mysqlprocgrepはI_Sと同等の絞り込みに加えてアクション(クエリのKILL, 接続のKILL)を行えるようにしたものです。

例えば現在の処理を4時間(14400秒)より長く続けている接続の一覧を取得する場合、I_Sの場合は以下のクエリにて求めます。

mysql> select * from information_schema.processlist where time > 14400;

同じ処理をmysqlprocgrepで行うには以下の実行例にて検索します。

mysqluc> mysqlprocgrep --server=root:root@localhost:3306 --age=4:00:00
  +------------------------+-----+-------+------------------+-------+----------+--------+--------+-------+
  | Connection             | Id  | User  | Host             | Db    | Command  | Time   | State  | Info  |
  +------------------------+-----+-------+------------------+-------+----------+--------+--------+-------+
  | root:*@localhost:3306  | 13  | root  | localhost:53549  | None  | Sleep    | 27634  |        | None  |
  | root:*@localhost:3306  | 36  | root  | localhost:57658  | test  | Sleep    | 17770  |        | None  |
  +------------------------+-----+-------+------------------+-------+----------+--------+--------+-------+

Commandで絞り込むには--match-commandオプション、Stateで絞り込むには--match-stateオプションで絞り込めます。またそのほかの項目(id,user,host,db,info)でも同様の書式(--match-項目)で絞り込めます。
絞り込んだ結果、当該クエリのKILLには--kill-queryオプション、当該接続のKILLには--kill-connectionオプションを指定します。

例えば、CommandがSleepになって4時間(14400秒)より長い時間経っている接続をKILLするには、以下のオプションにて実行します。

mysqluc> mysqlprocgrep --server=root:root@localhost:3306 --age=4:00:00 --match-command='Sleep' --kill-connection

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30