コマンド
pt-upgrade [オプション] [ログファイル] [DSN1] [DSN2]
【必須項目】
- ・ [ DSN ] : h=ホスト名,u=ユーザ名,p=パスワード
- ・ [ログファイル] : 比較するログファイルを指定します
【主なオプション】
- ・ –no-read-only : ログファイルの全てのクエリを比較するようになります(通常はSELECT,SET文しか比較しません)
- ・ –type : 比較するログファイルのフォーマットを指定することができます。通常はslowlogになっています
フォーマット名ログの内容slowlogスロークエリログgenlog一般クエリログbinlogバイナリログrowlog1行に1つSQL文を書いた、オリジナルファイル
目的
異なるサーバ間で、クエリ実行時間の違いや、エラーの有無を比較した結果を出力します
シナリオ
バージョンが異なるサーバを二台用意します
mysql5.6 | ホスト名=localhost、DBユーザ名=root、パスワード=password |
---|---|
mysql5.7 | ホスト名=192.168.11.42、DBユーザ名=root、パスワード=password |
※ デフォルトの設定では、SELECTの権限があればツールは動きます
Slowクエリログは、デフォルトでは10秒以上のクエリが記録されるようになっていますが、0秒以上で記録するように変更します
my.cnf に追記
long_query_time = 0
localhost(mysql5.6)側でいくつかクエリを実行します
コマンドを実行する前に、my.cnfのlong_query_timeオプションを元に戻し、その後ログを比較します
# pt-upgrade /var/lib/mysql/slow_queries.log \
> h=localhost,p=password h=192.168.11.51,u=test,p=password
結果
[root@localhost mysql]# pt-upgrade /var/lib/mysql/slow_queries.log h=localhost,u=root,p=password h=192.168.11.42,u=root,p=password
#-----------------------------------------------------------------------
# Logs
#-----------------------------------------------------------------------
File: /var/lib/mysql/slow_queries.log
Size: 6146
#-----------------------------------------------------------------------
# Hosts
#-----------------------------------------------------------------------
host1:
DSN: h=localhost
hostname: localhost.localdomain
MySQL: MySQL Community Server (GPL) 5.6.35
host2:
DSN: h=192.168.11.42
hostname: localhost.localdomain
MySQL: MySQL Community Server (GPL) 5.7.17
########################################################################
# Query class 67A347A2812914DF
########################################################################
Reporting class because there are 3 query errors.
Total queries 3
Unique queries 3
Discarded queries 0
mysqldump
##
## Query errors diffs: 3
##
-- 1.
No error
vs.
DBD::mysql::db do failed: Unknown database 'employees' [for Statement "USE `employees`"]
SELECT /*!40001 SQL_NO_CACHE */ * FROM `salaries`
-- 2.
No error
vs.
DBD::mysql::db do failed: Unknown database 'employees' [for Statement "USE `employees`"]
SELECT /*!40001 SQL_NO_CACHE */ * FROM `salaries`
-- 3.
No error
vs.
DBD::mysql::st execute failed: No database selected [for Statement "SELECT /*!40001 SQL_NO_CACHE */ * FROM `salaries`"]
SELECT /*!40001 SQL_NO_CACHE */ * FROM `salaries`
#-----------------------------------------------------------------------
# Stats
#-----------------------------------------------------------------------
failed_queries 0
not_select 8
queries_filtered 0
queries_no_diffs 0
queries_read 11
queries_with_diffs 0
queries_with_errors 3
良い点
環境の異なるサーバ間で、同じクエリを実行した結果を簡単に確かめることができます
バージョンアップを行う前に、移行後のデータの安全・整合性を確かめることができます
その他
クエリの実行結果を一度ファイルに保存しておき、そのファイルと比較することもできます
- ・ pt-upgrade [オプション] –save-results [保存先ディレクトリ] [ログファイル] [DSN1]
- ・ pt-upgrade [オプション] [リザルトディレクトリ] [DSN2]
–save-results [保存先ディレクトリ] : ログファイルに書かれたクエリと、その実行結果やレコードを保存します
[リザルトディレクトリ] : リザルトファイルのあるディレクトリを指定します
–save-results を使用すると、保存先のディレクトリに以下のようなファイルが作成されます
query | 実行されたクエリ |
---|---|
results | クエリの実行結果(エラー結果もしくは、警告や実行時間) |
rows | 抽出されたレコードの内容 |
比較結果が出力されるのは、以下のような場合です
Row Count | 抽出されたレコードの行数が違う場合 |
---|---|
Row Data | 抽出されたレコードの内容が違う場合 |
Warnings | 片方のホストで警告が出た場合 |
Query time | クエリの実行時間が大幅に異なる場合 |
Query errors | 片方のホストでエラーが起きた場合 |
SQL errors | 両方のホストでエラーが起きた場合(文法エラー) |