今回は本連載において何度か登場しているPercona Toolkitのツールの1つ、pt-show-grantsについて紹介したいと思います。Percona Toolkitのツールに関しては、過去に以下の記事があります。インストール方法などもそちらで説明していますので、併せてご確認ください。
今回使用するPercona Toolkitのバージョンは、2021年11月時点で最新の3.3.1です。MySQLは8.0.26を使用しています。
pt-show-grantsを使ってみる
pt-show-grantsは指定したMySQLに登録させているユーザアカウント一覧を出力してくれます。さらに、それぞれのユーザアカウントをCREATE USER構文の形式、許可されている権限をGrant構文の形式で出力します。
例として、MySQLには'u1'@'10.0.0.1'
と'u2'@'10.0.0.2'
の2つのユーザアカウントのみが登録されているとします(rootユーザはもちろん登録されていますが、出力が長くなるため表示は割愛しています)。
このように、存在するユーザの一覧がCREATE USERやGRANT構文の形で表示されます。
pt-show-grantsが接続するMySQLの指定方法は、mysqlコマンドと同じようなオプションになっています。
- -h …接続するMySQLのホスト名
- -P …接続するMySQLのポート
- -u …接続するMySQLのユーザ名
- -p または --ask-pass …-pのあとに接続するMySQLのユーザのパスワードを指定。--ask-passは接続時にパスワードの入力を促します。mysqlコマンドの-pにパスワード指定しないでEnterを押したときの動きと同等です。
pt-show-grantsのオプションについて
前述の例では、そのMySQLに登録しているユーザアカウントをすべて出力します。オプションにより、出力するユーザを制限したりすることもできます。いくつかのオプションについて紹介したいと思います。
●--only
指定したユーザ名またはユーザアカウントのみを出力します。複数ユーザはカンマ区切りで指定します。
●--ignore
指定したユーザアカウントを除外して出力します。複数ユーザアカウントはカンマ区切りで指定します。
--only
はユーザ名とユーザアカウント('ユーザ名'@'ホスト')が許可され、--ignore
はユーザアカウントのみが許可されるので注意が必要です。よって、--ignore
を使って特定のユーザ名を一括で除外することはできないので、カンマ区切りで除外したいすべてのユーザアカウントを指定する必要があります。--ignore 'u1'@'10.0.0.1','u1'@'10.0.0.2','u1'@'10.0.0.3'
のようになります。
●--drop
DROP USER文を出力の前に追加します。
●--revoke
ユーザアカウントがもっている権限のREVOKE文を、出力の前に追加にします。
●--separete
ユーザアカウントごとの権限を1つのステートメントにまとめずに、それぞれのステートメントで出力します。
●--[no]include-unused-roles
MySQL 8.0以上の場合、ロールをダンプする際に未使用のロールを含めるかどうか指定します。
pt-show-grantsの使いどころについて
pt-show-grantsの使いどころとしては、以下が上げられます。
- ユーザアカウントのバックアップ
- ユーザアカウントのバージョン管理
- ユーザアカウントの差分抽出
- MySQLのアップグレード時のユーザアカウント移行手段
ユーザアカウントの差分抽出
先ほど説明した--separete
を使って出力することで、異なるMySQL間のユーザアカウントの権限の差分が比較しやすくなります。マスターとレプリカ間でユーザアカウントが異なっているか確認に使用することができます。
MySQLのアップグレード時のユーザアカウント移行手段
筆者は主にこの用途でpt-show-grantsを使用します。MySQLのインプレースアップグレードではなくアップグレードした別のMySQLインスタンスを用意してそこへ移行するときに役に立ちます。pt-show-grantsで出力された内容はそのまま実行できる形式になっているので、パイプで別のMySQLインスタンスに渡せば、ユーザアカウントの移行が可能です。
アップグレードしたMySQLインスタンスへの移行の大まかな流れとしては、以下になります。
- アップグレードしたMySQLインスタンス(移行先DB)を用意
- pt-show-grantsにて移行元DBからユーザアカウントを抽出し、移行先DBに適用。
- mysqldumpにて移行元DBからユーザデータベースのみエクスポートし、移行先DBにインポート。
- 移行元DB→移行先DBでレプリケーション構築
- アプリケーションの向き先を移行先DBに切り替える
ユーザアカウントの設定は、mysql
データベースのテーブルに格納されています。移行の際に、mysqldumpを使用してmysql
データベースをインポートせずにpt-show-grantsを使用する理由としてはバージョンによりmysql
データベースのテーブル構成が異なるためです。mysql
データベースをインポートすると、それらが上書きされ、mysql_upgradeコマンドでmysql
データベースのテーブル構成を更新する必要があります。
pt-show-grantsでユーザアカウントを移行することで、mysql_upgradeコマンドの実行し忘れによる予期せぬ障害を未然に防ぐことができます(注意:MySQL 8.0.16以降では起動時にアップグレードタスクを実行するようになったため、mysql_upgradeコマンド実行は不要です)。
また、この方法はさまざまなバージョンのアップグレード(MySQL 5.6から5.7、MySQL 5.7から8.0など)においても同様の方式で利用できるため、アップグレード方式を標準化することができます。そして、必要なユーザアカウントのみ移行するなど、ユーザの精査もしやすくなります。
まとめ
今回はpt-show-grantsについて紹介しました。Percona社が提供しているマニュアルpt-show-grantsを元に紹介しましたので、もっと深く知りたい方はこちらをご確認ください。