【MySQL】GTIDを深く学ぶ(一)
7012 ワード
前言:今日张さんがグループの中でGTIDを分かち合ったことを闻いて、私自身にとって、GTIDを再认识する机会でもあります.张さんの分かち合いを见て、比较的简単で精錬しています.夜、家に帰る途中で、私は今日の文章を何か书くことを考えています.それでは、公式サイトからGTIDに関する文章をいくつか翻訳してGTIDとして勉强するシリーズの文章にしようと思います. GTIDの概念 GTID sets mysql.gtid_executed Table mysql.gtid_executed Table Compression
GTIDは、単一インスタンスの一意の識別子だけでなく、プライマリ・スレーブ構造のセットにおいても一意の識別子であり、すべてのGTIDとすべてのトランザクションが一対一の関係であるソース・ライブラリ(プライマリ・ライブラリ)がトランザクションのコミットごとに生成される一意の識別子である.GTID形式は以下の通りである.
GTID = source_id:transaction_id
sourceidはソースライブラリを表し、通常、サーバのserver_uuidは主にこの目的のためです.transaction_idは、トランザクションのコミット順序によって生成される連続する数値です.例えば、最初にコミットされたトランザクションのトランザクション番号は1であり、10番目にコミットされたトランザクションが生成するトランザクション番号は10であり、GTIDが0であることは不可能である.たとえばserver_uuidが3 E 11 FA 47-71 CA-11 E 1-9 E 33-C 80 AA 9429562の23番目のトランザクションのGTIDは、以下のように表される.
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
以上のGTIDはSHOW SLAVE STATUSまたはbinlogで見ることができることを示している.コマンドmysqlbinlog--base 64-output=DECODE-ROWSまたはSHOW BINLOG EVENTS解析binlogファイルで見ることができます.たとえば、SHOW MASTER STATUSまたはSHOW SLAVE STATUSでは、次の形式が見られます.
3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5
この例ではserver_を示しますuuidは、3 E 11 FA 47-71 CA-11 E 1-9 E 33-C 80 AA 9429562の最初から5番目のトランザクションです.この式は、START SLAVEのコピーを開始する際のオプションSQL_にも使用されます.BEFORE_GTIDSとSQL_AFTER_GTIDS. GTID sets 1つのGTIDセットは、次のグローバルトランザクション番号によって表される:
GTIDセットはMySQLで様々な用途があります.例えば、.gtid_义齿gtid_purgedシステム変数もGTIDの値を保存している.また、関数GTID_SUBSET()とGTID_SUBTRACT()も入力パラメータとしてGTIDが必要です.システム変数がGTIDを返す場合、UUIDのアルファベットと数字は昇順に並べられます.
GTIDは通常主従構造に現れる.これはbinlogを解析することによって、ライブラリから任意のトランザクションを適用するソースを取得できることを示します.また、指定されたGTIDのトランザクションが指定されたデータベース上で実行されると、同じGTIDのトランザクションは実行されなくなります.したがって,同じGTIDのトランザクションはスレーブ上で1回しか実行できないため,データの一貫性が保証される.
マスタースレーブ構造がGTIDを採用すると、マスターライブラリのbinlogfile名とコピーされた場所ポイントは不要になります.すべての同期に必要なプライマリ・ライブラリの情報は、レプリケーションされたデータ・ストリームから直接入手できます.GTIDは、従来のレプリケーションに必要なファイルオフセットの代わりになります.よって、チェンジマスター時にMASTER_は不要ですFILEとMASTER_LOG_POSオプションは、MASTER_をオンにするだけです.AUTO_POSITIONでいいです.
GTIDの生成は以下のステップで生成される:1.トランザクションがプライマリ・ライブラリで実行され、コミットされます.このトランザクションは、プライマリ・ライブラリのUUIDと、このインスタンスで使用されていない最小ゼロ以外のトランザクション・シーケンス番号によって識別されます.GTIDはマスタライブラリのbinlogに書き込まれる.
2.binlogはライブラリに転送されてからライブラリからのrelay logに格納され、slaveはGTIDを読み出して独自のgtid_を設定するnextの値、この値はslaveに次のトランザクションがこのGTIDを使用しなければならないことを教えます.注意:slave設定gtid_nextはセッションレベルの変数です
3.slaveはこのGTIDのトランザクションがすでに実行されているかどうかを確認し、他のセッションもこのGTIDを読んだことがない.このGTIDが使用されていない場合、slaveはGTIDを書き、トランザクションを適用して自分のbinlogに変更する.簡単に言えば、複数のクライアントが同じトランザクションを同時に適用することはできません.
4.なぜなら.gtid_nextは空ではなく、slaveは自発的にある事務のためにGTIDを生成するのではなく、GTIDを存在させる.gtid_nextという変数、つまりmasterからGTIDを取得し、その変数に書き込み、最後にbinlogを書きます. mysql.gtid_Excuted TableはMySQL 5から.7.5開始、GTID情報はgtid_に格納されるexecutedテーブル内(mysqlライブラリ).このテーブルの各行には、各GTIDの情報、ソースライブラリのuuid、開始および終了のトランザクション番号が格納されます.MySQLのインストールまたはアップグレード後、mysql.gtid_executedテーブルは自動的に作成され、構築テーブルSQLは以下の通りです:
mysql.gtid_executedテーブルはslaveがbinlogをオンにしないでGTIDを使用することを許可し、binlogが失われた場合でもGTIDの履歴情報を保持する.GTIDになるしかないMODEまたはON_PERMISSIVEの場合、GTIDはテーブルに格納されますが、どのGTIDがテーブルに格納されるかはbinlogがオンになっているかどうかによって異なります. binlogが閉じた場合、またはlog_slave_updatesが閉じると、データベースはGTIDをテーブル内のトランザクションとともに格納します.また、テーブルはユーザー構成の頻度で圧縮されます.この場合、binlog後者のslave update loggingが閉じているslaveにのみ適用できます.masterはbinlogマスターを開いてコピーする必要があるため、masterには表示されません. binlogがオンになったら.binlogが切断されてもサービスが再起動されてもmysqlはbinlogトランザクションに書き込まれたGTIDをgtid_に書き込むexecutedテーブル.この状況は、プライマリ・スレーブ・レプリケーションのプライマリ・ライブラリに適用されるか、binlogのスレーブをオンにします.サーバが突然シャットダウンした場合、現在のbinlogのGTIDはgtid_に格納されません.executedテーブル、この場合mysqlが回復するとGTIDがテーブルとgtid_に書き込まれますexecuted変数.binlogを開くとmysql.gtid_executeテーブルは、実行されたすべてのトランザクションのGTIDの完全なレコードを提供するのではなく、グローバル値gtid_によって提供されます.executedレコード.mysql.gtid_executedテーブルはRESET MASTERでリセットされます. mysql.gtid_Excuted Table Compression時間が経つにつれてmysql.gtid_Executedテーブルには、同じサーバ上の単一gtidから参照される複数のローが埋め込まれます.トランザクションIDは、ここに示すように、 のシーケンスを構成します.
このようなローのセットをトランザクション識別子全体にわたって単一のローで置き換えることで、定期的にテーブルを圧縮すると、次のようにかなりのスペースを節約できます.
gtidsが有効になると、サーバはmysqlに周期的に対応する.gtid_Executedテーブルは、このタイプの圧縮を実行します.実行したgtids圧縮を設定できます.サイクルシステム変数は、テーブルの圧縮を許可する前に通過するトランザクションの数を制御し、圧縮率を制御します.この変数のデフォルト値は1000です.これは、デフォルトでは、テーブルの圧縮が1000トランザクションごとに実行されることを意味します.圧縮は完全に実行されません.しかし、そうすれば、gtidを大幅に増やす必要があるかもしれません.Executedテーブルに必要なディスク容量.
mysql.gtid_Executedテーブルの圧縮は、スレッド/sql/compress_という名前で行われます.gtid_tableの専用フロントスレッドが実行されます.このスレッドは、表示処理リストの出力には表示されませんが、以下に示すように、スレッドテーブルの行と見なすことができます.
スレッド/sql/compress_gtid_tableスレッドは、gtids圧縮トランザクションが実行するまでスリープ状態にある、前述mysqlを実行するまで目が覚める.gtid_Executedテーブルの圧縮.その後、別のgtids圧縮トランザクションが発生するまで休眠し、目が覚めて再び圧縮を実行し、このサイクルを繰り返して不確定になります.バイナリ・ログ・レコードが無効になっている場合、この値を0に設定すると、スレッドは常にスリープし、目が覚めません.
GTIDは、単一インスタンスの一意の識別子だけでなく、プライマリ・スレーブ構造のセットにおいても一意の識別子であり、すべてのGTIDとすべてのトランザクションが一対一の関係であるソース・ライブラリ(プライマリ・ライブラリ)がトランザクションのコミットごとに生成される一意の識別子である.GTID形式は以下の通りである.
GTID = source_id:transaction_id
sourceidはソースライブラリを表し、通常、サーバのserver_uuidは主にこの目的のためです.transaction_idは、トランザクションのコミット順序によって生成される連続する数値です.例えば、最初にコミットされたトランザクションのトランザクション番号は1であり、10番目にコミットされたトランザクションが生成するトランザクション番号は10であり、GTIDが0であることは不可能である.たとえばserver_uuidが3 E 11 FA 47-71 CA-11 E 1-9 E 33-C 80 AA 9429562の23番目のトランザクションのGTIDは、以下のように表される.
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
以上のGTIDはSHOW SLAVE STATUSまたはbinlogで見ることができることを示している.コマンドmysqlbinlog--base 64-output=DECODE-ROWSまたはSHOW BINLOG EVENTS解析binlogファイルで見ることができます.たとえば、SHOW MASTER STATUSまたはSHOW SLAVE STATUSでは、次の形式が見られます.
3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5
この例ではserver_を示しますuuidは、3 E 11 FA 47-71 CA-11 E 1-9 E 33-C 80 AA 9429562の最初から5番目のトランザクションです.この式は、START SLAVEのコピーを開始する際のオプションSQL_にも使用されます.BEFORE_GTIDSとSQL_AFTER_GTIDS.
gtid_set:
uuid_set [, uuid_set] ...
| ''
uuid_set:
uuid:interval[:interval]...
uuid:
hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh
h:
[0-9|A-F]
interval:
n[-n]
(n >= 1)
GTIDセットはMySQLで様々な用途があります.例えば、.gtid_义齿gtid_purgedシステム変数もGTIDの値を保存している.また、関数GTID_SUBSET()とGTID_SUBTRACT()も入力パラメータとしてGTIDが必要です.システム変数がGTIDを返す場合、UUIDのアルファベットと数字は昇順に並べられます.
GTIDは通常主従構造に現れる.これはbinlogを解析することによって、ライブラリから任意のトランザクションを適用するソースを取得できることを示します.また、指定されたGTIDのトランザクションが指定されたデータベース上で実行されると、同じGTIDのトランザクションは実行されなくなります.したがって,同じGTIDのトランザクションはスレーブ上で1回しか実行できないため,データの一貫性が保証される.
マスタースレーブ構造がGTIDを採用すると、マスターライブラリのbinlogfile名とコピーされた場所ポイントは不要になります.すべての同期に必要なプライマリ・ライブラリの情報は、レプリケーションされたデータ・ストリームから直接入手できます.GTIDは、従来のレプリケーションに必要なファイルオフセットの代わりになります.よって、チェンジマスター時にMASTER_は不要ですFILEとMASTER_LOG_POSオプションは、MASTER_をオンにするだけです.AUTO_POSITIONでいいです.
GTIDの生成は以下のステップで生成される:1.トランザクションがプライマリ・ライブラリで実行され、コミットされます.このトランザクションは、プライマリ・ライブラリのUUIDと、このインスタンスで使用されていない最小ゼロ以外のトランザクション・シーケンス番号によって識別されます.GTIDはマスタライブラリのbinlogに書き込まれる.
2.binlogはライブラリに転送されてからライブラリからのrelay logに格納され、slaveはGTIDを読み出して独自のgtid_を設定するnextの値、この値はslaveに次のトランザクションがこのGTIDを使用しなければならないことを教えます.注意:slave設定gtid_nextはセッションレベルの変数です
3.slaveはこのGTIDのトランザクションがすでに実行されているかどうかを確認し、他のセッションもこのGTIDを読んだことがない.このGTIDが使用されていない場合、slaveはGTIDを書き、トランザクションを適用して自分のbinlogに変更する.簡単に言えば、複数のクライアントが同じトランザクションを同時に適用することはできません.
4.なぜなら.gtid_nextは空ではなく、slaveは自発的にある事務のためにGTIDを生成するのではなく、GTIDを存在させる.gtid_nextという変数、つまりmasterからGTIDを取得し、その変数に書き込み、最後にbinlogを書きます.
CREATE TABLE gtid_executed (
source_uuid CHAR(36) NOT NULL,
interval_start BIGINT(20) NOT NULL,
interval_end BIGINT(20) NOT NULL,
PRIMARY KEY (source_uuid, interval_start)
)
mysql.gtid_executedテーブルはslaveがbinlogをオンにしないでGTIDを使用することを許可し、binlogが失われた場合でもGTIDの履歴情報を保持する.GTIDになるしかないMODEまたはON_PERMISSIVEの場合、GTIDはテーブルに格納されますが、どのGTIDがテーブルに格納されるかはbinlogがオンになっているかどうかによって異なります.
mysql> SELECT * FROM mysql.gtid_executed;
+--------------------------------------+----------------+--------------+
| source_uuid | interval_start | interval_end |
|--------------------------------------+----------------+--------------|
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 37 | 37 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 38 | 38 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 39 | 39 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 40 | 40 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 41 | 41 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 42 | 42 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 43 | 43 |
...
このようなローのセットをトランザクション識別子全体にわたって単一のローで置き換えることで、定期的にテーブルを圧縮すると、次のようにかなりのスペースを節約できます.
+--------------------------------------+----------------+--------------+
| source_uuid | interval_start | interval_end |
|--------------------------------------+----------------+--------------|
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 37 | 43 |
...
gtidsが有効になると、サーバはmysqlに周期的に対応する.gtid_Executedテーブルは、このタイプの圧縮を実行します.実行したgtids圧縮を設定できます.サイクルシステム変数は、テーブルの圧縮を許可する前に通過するトランザクションの数を制御し、圧縮率を制御します.この変数のデフォルト値は1000です.これは、デフォルトでは、テーブルの圧縮が1000トランザクションごとに実行されることを意味します.圧縮は完全に実行されません.しかし、そうすれば、gtidを大幅に増やす必要があるかもしれません.Executedテーブルに必要なディスク容量.
mysql.gtid_Executedテーブルの圧縮は、スレッド/sql/compress_という名前で行われます.gtid_tableの専用フロントスレッドが実行されます.このスレッドは、表示処理リストの出力には表示されませんが、以下に示すように、スレッドテーブルの行と見なすことができます.
mysql> SELECT * FROM performance_schema.threads WHERE NAME LIKE '%gtid%'\G
*************************** 1. row ***************************
THREAD_ID: 26
NAME: thread/sql/compress_gtid_table
TYPE: FOREGROUND
PROCESSLIST_ID: 1
PROCESSLIST_USER: NULL
PROCESSLIST_HOST: NULL
PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Daemon
PROCESSLIST_TIME: 1509
PROCESSLIST_STATE: Suspending
PROCESSLIST_INFO: NULL
PARENT_THREAD_ID: 1
ROLE: NULL
INSTRUMENTED: YES
HISTORY: YES
CONNECTION_TYPE: NULL
THREAD_OS_ID: 18677
スレッド/sql/compress_gtid_tableスレッドは、gtids圧縮トランザクションが実行するまでスリープ状態にある、前述mysqlを実行するまで目が覚める.gtid_Executedテーブルの圧縮.その後、別のgtids圧縮トランザクションが発生するまで休眠し、目が覚めて再び圧縮を実行し、このサイクルを繰り返して不確定になります.バイナリ・ログ・レコードが無効になっている場合、この値を0に設定すると、スレッドは常にスリープし、目が覚めません.