製品

Percona

pt-upgrade

コマンド

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両方のホストでエラーが起きた場合(文法エラー)