これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド pt-upgradep です。
プログラム:
NAME
pt-upgrade - クエリ結果が異なるサーバーでも同一であることを確認します。
SYNOPSIS
使用法: pt-upgrade [オプション] ログ|結果 DSN [DSN]
pt-upgrade は、各「DSN」上の指定された MySQL 「LOGS」でクエリを実行し、結果を比較します。
そして、重大な違いがあれば報告します。 このツールは、後で使用できるように結果を保存することもできます
分析。 「LOGS」には、低速、一般、バイナリ、tcpdump、および「raw」を指定できます。
「slow.log」のクエリを使用して、host2 と host1 を比較します。
pt-upgrade h=host1 h=host2 throw.log
host2 を host1 から保存された結果と比較します。
pt-upgrade h=host1 --save-results host1_results/slow.log
pt-upgrade host1_results1/ h=host2
リスク
Percona Toolkit は成熟しており、現実世界で実証されており、十分にテストされていますが、すべてデータベースです
ツールはシステムやデータベース サーバーにリスクをもたらす可能性があります。 このツールを使用する前に、
お願いします:
・ツールのドキュメントを読む
・ツールの既知の「バグ」を確認します
· 非運用サーバーでツールをテストする
· 運用サーバーをバックアップし、バックアップを検証します。
DESCRIPTION
pt-upgrade は、新しいバージョンにアップグレード (またはダウングレード) しても安全かどうかを判断するのに役立ちます。
MySQL。 安全で保守的なアップグレード計画にはいくつかの手順があります。そのうちの XNUMX つは、
新しいバージョンの MySQL でもクエリは同じ結果を生成します。
pt-upgrade は、XNUMX つの低速ログ、一般ログ、バイナリログ、tcpdump ログ、および「生」ログからクエリを実行します。
サーバーを管理し、各クエリの実行と結果のさまざまな側面を比較し、あらゆる点をレポートします。
大きな違い。 通常、XNUMX つのサーバーは開発サーバーであり、XNUMX つは実行中です。
現在の製品バージョンの MySQL と、新しいバージョンの MySQL を実行しているもう XNUMX つです。
USE CASES
pt-upgrade には XNUMX つの使用例があります。 XNUMX つ目の標準的なケースは、「ホスト間」で実行する場合です。 ログ
ファイルと XNUMX つの DSN をコマンド ラインで指定します (MySQL サーバーごとに XNUMX つずつ)。 最初を参照
「あらすじ」の例。 クエリはツールとして各サーバー上で実行され、比較されます。
走る。 差異のあるクエリは、ツールの実行時またはツールの終了時に出力されます (「
「クエリが報告されるとき」)。 ディスクには何も保存されないため、この使用例では必要な作業は少なくなります。
ハードディスクの空き容量が必要ですが、ツールを実行する場合は両方のサーバーでクエリを実行する必要があります。
たとえサーバーの XNUMX つが変更されていない場合でも同様です。 お問い合わせが多い場合や、
実行には長い時間がかかり、XNUMX つのサーバーが変更されない場合は、
XNUMX番目の使用例。
XNUMX 番目の使用例は、「ホストへの結果の参照」を実行することです。 参考結果は、
単一の MySQL サーバーからの完全な結果がディスクに保存されます。 この場合、まず最初に行う必要があります
「--save-results」を使用して参照結果を生成し、ツールをもう一度実行して、
別の MySQL サーバーと結果を比較します。 「概要」の XNUMX 番目の例を参照してください。
通常、結果は MySQL の現在のバージョンに対して生成され、変更されません。
このユースケースでは、次のことが必要になる可能性があります a たくさん すべての結果 (行など) が含まれるため、ディスク領域の
クエリとクエリに関するその他のデータを保存する必要があります。 たくさんやる予定があるなら
MySQL の修正バージョンと比較すると、この使用例はより効率的です。 あるいは、あなたが
同時に両方のサーバーにアクセスできないため、このユースケースでは「実行」が可能です。
さあ、後で比較してください。」
重要 考慮事項
コンシステンシー
正確なレポートを取得するには、一貫した環境と一貫したデータが不可欠です。
pt-upgrade は、本番サーバーまたはアクティブなサーバーでは決して実行しないでください。
各クエリの同期読み取りを保証する簡単な方法はありません。 どちらかでデータが変更されている場合
pt-upgrade の実行中、レポートには、より多くの誤検知が含まれる可能性があります。
正当な違い。 ポイントアップグレード と仮定する それ 両言語で MySQL サーバ 静的、 変わらない
(除く の どれか 変更 製 by ツール if ran "--no-読み取り専用")。 読み取り専用
ワークロードはおそらくクエリ時間を除いてツールに影響を与えるべきではないため、読み取り専用スレーブは
中古。
比較した に
ホスト間の比較では、最初のホストの結果が標準を確立します。
XNUMX 番目のホストからの結果が比較されます。 参照結果とホストの比較では、
参照結果は、ホストが比較される標準です。 のような比較句
「より小さい」、「より優れている」などは、標準と比較してという意味です。
たとえば、イベントのクエリ時間が最初のホストで 0.01、次のホストで 0.5 の場合、
0.5 番目のホストでは、0.1 は XNUMX より悪いため、これは大きな違いです。
クエリが報告されます。
読み取り専用
デフォルトでは、pt-upgrade は「SELECT」ステートメントと「SET」ステートメントのみを実行します。 (これはそうではありません
「SELECT...INTO」ステートメントを含めます。これは行を返さず、出力をファイルにダンプします。
) 再作成可能なテスト サーバーまたは開発サーバーを使用していて、比較したい場合
ステートメントも書き込みます (「INSERT」、「UPDATE」、「DELETE」など)。その後、「--no-read-only」を指定します。
バイナリ ログを使用する場合は、バイナリ ログには次の情報が含まれないため、「--no-read-only」を指定する必要があります。
「SELECT」ステートメント。 「--[no]読み取り専用」を参照してください。
取引
このツールは独自のトランザクションを作成しませんが、「ログ」内のトランザクションはすべて
そのまま実行されます。 ログはシリアルであるため、通常はトランザクションが問題になることはありません。 もし、
ただし、何らかの形でトランザクションに関連するクエリを比較する必要があります (つまり、
この場合、おそらく「--[no]read-only」も無効にする必要があります)、その場合、pt-upgrade はおそらく機能しません
この目的のために設計されていないため、必要なことを行ってください。
pt-upgrade はデフォルトで「autocommit=1」で実行されます。
スロットリング
pt-upgrade には、専用のツールでのみ実行する必要があるため、調整オプションがありません。
テストサーバーまたは開発サーバー。 Do ラン ポイントアップグレード on 製造 サーバー!
したがって、このツールは CPU、メモリ、ディスク、ネットワークを大量に消費します。 クエリを実行します
できるだけ早く。
QUERY 違い
クエリの重大な違いは、各クエリのこれらの側面を比較することによって決定されます。
両方のホスト:
行数
クエリによって返される行数は同じである必要があります。 これは次のように報告されています
「行の差分」の下の「欠落行」。
行データ
クエリによって返される行データは同じである必要があります。 すべての違いは、
重要: 空白、float 精度など。
警告
クエリではエラーや警告が生成されないか、同じエラーが生成される必要があります。
または警告。
クエリ時間
クエリが一定の時間で実行されることはほとんどありませんが、その実行時間は一定時間以内である必要があります。
同じ桁かそれより小さい。
クエリエラー
クエリによって XNUMX つのホストのみで SQL エラーが発生した場合、これは「クエリ エラー」として報告されます。
クエリは XNUMX つのホスト上で動作するため、その構文はおそらく有効であり、エラーが発生する可能性があります。
他のホストに特有の何らかの条件に影響されます。
SQLエラー
クエリによって両方のホストで SQL エラーが発生した場合、これは「SQL エラー」として報告されます。 の
クエリの SQL 構文が無効である可能性があります。
レポート
pt-upgrade が実行されると、差分を含むクエリができるだけ早く出力されます (「WHEN」を参照)
クエリはレポートされます。レポートが長くなりすぎないように、クエリはレポートされません。
個別にレポートされますが、フィンガープリントによってクラスにグループ化されます。 クエリのフィンガープリントは、
リテラル値を削除し、空白を正規化することによって作成された、クエリの抽象化された形式。
したがって、これらのクエリは同じクラスに属します。
SELECT c FROM t WHERE id = 1
SELECT c FROM t WHERE id=5
ID = 9のtからcを選択します
これらのクエリのフィンガープリントは次のとおりです。
id=? t から c を選択します。
各クエリ クラスには、最大 "--max-class-size" 個の固有のクエリを含めることができます (デフォルトでは 1,000)。 上
「--max-examples」までは、クエリ クラスごとに、相違点の種類ごとにレポートされます。 徳により
同じクラスに属している場合、通常は XNUMX つのクエリの違いの例が代表的なものになります。
同じ違いを持つすべてのクエリのすべてを報告する必要はないため、すべての例を報告する必要はありません。
特定の違いがあるクラス内のクエリの総数は、
レポート。
実施例
#------------------------------------------------ ------------------------
# ログ
#------------------------------------------------ ------------------------
ファイル: /opt/mysql/slow.log
サイズ:59700
#------------------------------------------------ ------------------------
# ホスト
#------------------------------------------------ ------------------------
ホスト1:
DSN: h=127.1、P=12345
ホスト名: dev1
MySQL: MySQL 5.1.68
ホスト2:
DSN: h=127.1、P=12348
ホスト名: dev2
MySQL: MySQL 5.5.10
#################################################### ######################
# クエリクラス AAD020567F8398EE
#################################################### ######################
差分があるため、クラスをレポートしますが、まだレポートされていません。
合計クエリ数 1
ユニークなクエリ 1
破棄されたクエリ 0
t (ID, ユーザー名) 値に挿入(?+)
##
## 警告の差分: 1
##
--1。
コード:1265
レベル: 警告
メッセージ: 行 1 の列 'username' のデータが切り捨てられました
対
警告なし 1265
INSERT INTO t (id, username) VALUES (NULL, 'long_username')
#------------------------------------------------ ------------------------
# 統計
#------------------------------------------------ ------------------------
失敗したクエリ 0
not_select 0
クエリ_フィルター済み 0
クエリなし_差分 0
クエリ読み取り 1
クエリ_with_diffs 1
エラーのあるクエリ 0
「クエリクラス」 " セクションは "QUERY" をリストしているため、最も重要です。
相違点」。セクションの最初の部分には、クエリ クラスが変更された理由がリストされています。
レポート、クラス内のクエリ数、フィンガープリントが続きます。
クラスを定義します。
クエリ クラス セクションの残りの部分には、クラスの原因となった「クエリの相違点」がリストされています。
報告される。 それぞれのタイプの違いは、次の内容をリストする二重ハッシュ マーク ヘッダーで始まります。
違いのあるクラス内のクエリのタイプと総数。 それから、まで
「--max-examples」がリストされ、「-- 1.」、「--- 2.」などの番号が付けられます。各例には、
最初と XNUMX 番目のホストの差 (「ホスト」セクションに関連)、その後に
違いが明らかになった最初の SQL ステートメント。
WHEN クエリ です 報告
クエリ クラスは、「QUERY DIFFERENCES」またはクエリ エラーのいずれかが発生するとすぐに報告されます。
「--max-example」が付いています。 それ以外の場合、ツールの実行時に相違点のあるすべてのクエリがレポートされます。
終わります。
たとえば、クエリ クラスで XNUMX つのクエリ時間の差が見つかった場合、それは報告されません。
まだ。 XNUMX 番目のクエリ時間差が見つかると、次のようなクエリ クラスが報告されます。
他の相違点も見つかった可能性があります。 クラスに対するクエリは続行されます
実行されますが、クラスは再度報告されません。
出力
ツールの実行時に「REPORT」が STDOUT に出力されます。 内部警告、エラー、および
「--progress」が STDERR に出力されます。 XNUMX つを分離したままにするには、次のようにツールを実行します。
pt-upgrade ... 1>レポート 2>エラー &
次に、ツールの実行中に「tail -f err」を実行して、「--progress」を追跡します。
EXIT ステータス
一般に、ツールが正常に終了し、内部エラーがなかった場合、ツールはゼロで終了します。
警告またはエラーがあり、「QUERY DIFFERENCES」は見つかりませんでした。 それ以外の場合、ツールはゼロ以外で終了します
次のコードの XNUMX つ以上を使用します。
1
内部エラーまたは警告が多すぎます。 STDERRを参照してください。 こちらも参照
「--[いいえ]エラー時続行」。
4
「質問の違い」がありました。 「レポート」を参照してください。
8
「--run-time」の有効期限が切れました。 ツールはログまたは参照結果の読み取りを完了していません。
他の終了コードは、ツールがクラッシュしたか、予期せず終了したことを示します。 というエラーが
これは STDERR に出力されるはずでした。
特定の終了コードを確認するには、論理「AND」(「&」) を使用して最終的な終了ステータスを計算します。
終了コード。 たとえば、「5 & 1」が true であるため、終了ステータス 4 はコード 5 と 1 を意味します。
「5と4」は本当です。
OPTIONS
このツールは追加のコマンドライン引数を受け入れます。 「概要」と使用方法を参照してください。
詳細については情報。
--ask-pass
MySQL に接続するときにパスワードの入力を求められます。
- 文字コード
短縮形: -A; タイプ: 文字列
デフォルトの文字セット。 値が utf8 の場合、STDOUT の Perl の binmode を utf8 に設定します。
mysql_enable_utf8 オプションを DBD::mysql に渡し、その後 SET NAMES UTF8 を実行します。
MySQL に接続します。 他の値は、utf8 レイヤーを使用せずに STDOUT で binmode を設定します。
MySQL に接続した後、SET NAMES を実行します。
--config
タイプ:配列
このコンマ区切りの構成ファイルのリストを読んでください。 指定する場合、これが最初である必要があります
コマンドラインのオプション。
--[いいえ]エラー時続行
デフォルト:はい
エラーがあっても解析を続行します。 このツールは永遠に続くわけではありません。
エラーが 100 件発生すると停止します。この場合、ツールまたは入力にバグがある可能性があります。
無効です。
--[no]アップグレードテーブルの作成
デフォルト:はい
「--upgrade-table」データベースとテーブルを作成します。
-デーモン化
バックグラウンドにフォークしてシェルから切り離します。 POSIX オペレーティング システムのみ。
-データベース
短縮形:-D; タイプ:文字列
MySQL に接続するときのデフォルトのデータベース。
--デフォルトファイル
短縮形: -F; タイプ: 文字列
指定されたファイルから MySQL オプションのみを読み取ります。 絶対パス名を指定する必要があります。
--[no]クエリキャッシュを無効にする
デフォルト:はい
「SET SESSION query_cache_type = OFF」でクエリ キャッシュを無効にします。
-ドライラン
実行しますが、クエリの実行や比較は行いません。 これはコマンドラインを確認するのに役立ちます
オプション、MySQL への接続、ログまたは参照結果の解析。
- フィルター
タイプ:文字列
この Perl コードが true を返すイベントを許可します。
pt-query-digest のドキュメントで同じオプションを参照してください。
- 助けて
ヘルプを表示して終了します。
- ホスト
短い形式: -h; タイプ: 文字列
MySQL のホスト名または IP。
--ignore-warnings
タイプ:ハッシュ
警告を比較するときは、これらの MySQL 警告コードを無視してください。
- ログ
タイプ:文字列
デーモン化時に STDOUT と STDERR をこのファイルに出力します。 このオプションはのみ有効です
「--daemonize」を指定した場合。 ファイルが存在しない場合は作成され、存在しない場合は出力されます。
それに追加されます。
--最大クラスサイズ
タイプ:int; デフォルト:1000
各クエリ クラスの一意のクエリの最大数。 「レポート」を参照してください。
--最大例
タイプ:int; デフォルト:3
「QUERY DIFFERENCES」ごとにリストする例の最大数。 クエリクラスは
あらゆる種類のクエリの違いについて、これだけ多くの例が見つかるとすぐに報告されます。
- パスワード
短い形式: -p; タイプ: 文字列
「--user」の MySQL パスワード。
--pid
タイプ:文字列
指定された PID ファイルを作成します。 PID ファイルがすでに存在する場合、ツールは起動しません。
含まれているPIDは、現在のPIDとは異なります。 ただし、PIDファイルの場合
存在し、それに含まれる PID が実行されなくなった場合、ツールは PID を上書きします
現在の PID を持つファイル。 PID ファイルは、ツールが終了すると自動的に削除されます。
- 港
短縮形: -P; 型: int
MySQLのポート番号。
- 進捗
タイプ: 配列; デフォルト: 時間、30
進行状況レポートを STDERR に出力します。 このツールはログの読み取り中に進行状況レポートを出力します。
または結果を参照して、終了までのおおよその時間を見積もります。
値は、XNUMX つの部分からなるカンマ区切りのリストです。 最初の部分はパーセントにすることができます。
時間、または反復。 XNUMX 番目の部分では、更新を印刷する頻度を指定します。
パーセンテージ、秒、または反復回数で指定します。
--[いいえ]読み取り専用
デフォルト:はい
「SELECT」文と「SET」文のみを実行してください。 「--no-read-only」を指定した場合、 を
デフォルトで実行している場合でも、「DROP」、「DELETE」、「UPDATE」などのクエリが実行されます。
読み取り専用モードでは、確実に「SELECT」権限のみを持つ MySQL ユーザーを使用する必要があります。
ツールのバグに対して。
- 報告
タイプ: ハッシュ; デフォルト: ホスト、ログ、クエリ、統計
「レポート」のこれらのセクションを印刷します。
- ランタイム
タイプ:時間
終了するまでにどれくらいの時間実行するか。 デフォルトでは、ツールは読み取りが完了するまで実行されます。
ログまたは参照結果。
--結果の保存
タイプ:文字列
参照結果をこのディレクトリに保存します。 このオプションは、XNUMX つの DSN が存在する場合にのみ機能します。
を指定して参照結果を生成します。 ホストとリファレンスの結果を比較する場合、
DSN の代わりに結果ディレクトリを指定します。 の XNUMX 番目の例を参照してください。
「あらすじ」。
参照結果を使用できる a たくさん ディスク容量の。
--set-vars
タイプ:配列
この「変数=値」ペアのカンマ区切りリストに MySQL 変数を設定します。
デフォルトでは、ツールは以下を設定します。
wait_timeout=10000
コマンドラインで指定された変数は、これらのデフォルトをオーバーライドします。 例えば、
「--set-vars wait_timeout=500」を指定すると、デフォルト値の 10000 がオーバーライドされます。
変数を設定できない場合、ツールは警告を出力し、続行します。
- ソケット
短縮形: -S; タイプ: 文字列
接続に使用するソケットファイル。
- タイプ
タイプ: 文字列; デフォルト: スローログ
ログ ファイルの種類。 有効なタイプは次のとおりです。
値ログの種類
======= ==========================================
スローログ MySQL のスローログ
genlog MySQL の一般ログ
binlog MySQL バイナリ ログ (mysqlbinlog によって変換)
rawlog XNUMX 行に XNUMX つの SQL ステートメントを含むカスタム ログ
--アップグレードテーブル
タイプ: 文字列; デフォルト: percona_schema.pt_upgrade
この表を使用して警告をクリアします。 以前のクエリからのすべての警告をクリアするには、pt-
アップグレードは実行前に各ホストで「SELECT * FROM --upgrade-table LIMIT 1」を実行します。
それぞれのクエリ。
テーブルはデータベース修飾されている必要があります。 データベースとテーブルは自動的に作成されます。
「--no-create-upgrade-table」が指定されていない限り作成されます (「--no-create-upgrade-table」を参照)
"--[no]create-upgrade-table")。 テーブルがまだ存在しない場合は作成されます
この定義では次のようになります。
CREATE TABLE pt_upgrade (
id INT NOT NULL 主キー
)
- ユーザー
短い形式: -u; タイプ: 文字列
現在のシステム ユーザーでない場合は MySQL ユーザー。
- バージョン
バージョンを表示して終了します。
-[no]バージョンチェック
デフォルト:はい
Percona Toolkit、MySQL、およびその他のプログラムの最新バージョンを確認してください。
これは標準の「アップデートを自動的に確認する」機能であり、さらに XNUMX つの機能が追加されています。
特徴。 まず、ツールはローカル システム上の他のプログラムのバージョンをチェックします。
独自のバージョンに追加。 たとえば、すべての MySQL サーバーのバージョンをチェックします。
Perl、および Perl モジュール DBD::mysql に接続します。 次に、チェックして警告します。
既知の問題があるバージョンについて。 たとえば、MySQL 5.5.25 には重大なバグがあり、
5.5.25aとして再リリースされました。
更新または既知の問題は、ツールの通常の出力の前に STDOUT に出力されます。
この機能がツールの通常の動作を妨げることはありません。
詳細については、次のWebサイトをご覧ください。 。
--監視サーバー
タイプ:文字列
「--type」tcpdump のこの IP:ポートのイベントのみを解析します。 他のすべての IP アドレスは
無視されました。 指定しない場合、pt-upgrade は任意の IP を探してすべてのサーバーを監視します。
ポート 3306 または「mysql」を使用するアドレス。 標準以外のサーバーを監視している場合
ポートの場合、これは機能しないため、監視する IP アドレスとポートを指定する必要があります。
サーバーの混合を監視したい場合は、標準ポート 3306 で実行されているサーバーと、標準ポート XNUMX で実行されているサーバーが混在しているサーバーを監視する必要があります。
非標準ポートで実行している場合は、個別の tcpdump 出力を作成する必要があります。
非標準のポート サーバーを選択し、それぞれにこのオプションを指定します。 現時点では-
アップグレードではポート 3306 上のサーバーを自動検出できず、また、ポート XNUMX 上のサーバーを監視するように指示されます。
非標準のポート。
DSN OPTIONS
これらの DSN オプションは、DSN を作成するために使用されます。 各オプションは「option=value」のように与えられます。
オプションでは大文字と小文字が区別されるため、P と p は同じオプションではありません。 そんなことはありえない
「=」の前後には空白が必要です。値に空白が含まれる場合は、空白を含める必要があります。
引用した。 DSN オプションはカンマで区切られます。 詳細については、percona-toolkit マンページを参照してください。
詳細。
・A
DSN: 文字セット; コピー: はい
デフォルトの文字セット。
・ NS
DSN: データベース; コピー: はい
デフォルトのデータベース。
・ NS
DSN: mysql_read_default_file; コピー: はい
指定されたファイルからデフォルトのオプションのみを読み取ります
・h
DSN: ホスト; コピー: はい
ホストに接続します。
・l
コピー: はい
LOAD DATA LOCAL INFILE を明示的に有効にします。
何らかの理由で、一部のベンダーは --enable-local-infile を使用せずに libmysql をコンパイルします。
オプション。ステートメントを無効にします。 これは、次のような奇妙な状況を引き起こす可能性があります。
サーバーは LOCAL INFILE を許可しますが、それが使用されるとクライアントは例外をスローします。
ただし、サーバーが LOAD DATA を許可している限り、クライアントはそれを簡単に再度有効にすることができます。 見る
そして
<http://search.cpan.org/~capttofu/DBD-mysql/lib/DBD/mysql.pm>。 このオプションは、
まさにそれ。
このオプションをオンにするとエラーが発生したり、異なる結果が発生したりするケースは見つかりませんでした。
念のため、このオプションはデフォルトではオンになっていません。
・ NS
DSN: パスワード; コピー: はい
接続時に使用するパスワード。 パスワードにカンマが含まれている場合はエスケープする必要があります
バックスラッシュ付き: "exam\,ple"
・p
DSN: ポート; コピー: はい
接続に使用するポート番号。
・ NS
DSN: mysql_socket; コピー: はい
接続に使用するソケットファイル。
・あなた
DSN: ユーザー; コピー: はい
現在のユーザーでない場合は、ログインするユーザー。
ENVIRONMENT
環境変数「PTDEBUG」を使用すると、STDERR への詳細なデバッグ出力が有効になります。 有効にする
デバッグしてすべての出力をファイルにキャプチャするには、次のようにツールを実行します。
PTDEBUG=1 ポイントアップグレード ... > ファイル 2>&1
注意: デバッグ出力は大量であり、数メガバイトの出力が生成される可能性があります。
SYSTEM 募集要項
Perl、DBI、DBD::mysql、およびいくつかのコア パッケージが必要です。
Perlのかなり新しいバージョン。
onworks.net サービスを使用してオンラインで pt-upgradep を使用する