5.6から5.7へバージョンアップ後のGTID関連機能の注意事項。
著者: Qin Fulang 氏。Aikesheng の DBA チームのメンバーで、日々のプロジェクトの問題の処理と会社のプラットフォームの問題のトラブルシューティングを担当しています。インターネットが好きで、写真に詳しく、料理の腕も立つ DBA は、良い運転手ではありません、ディディ〜
Aikeson オープンソース コミュニティによって作成されているため、オリジナルのコンテンツを許可なく使用することはできません。転載する場合は編集者に連絡し、出典を明示してください。
この記事は合計 400 ワードあり、読むのに 2 分かかると予想されます。
背景
金融会社のシステムは 5.6 から 5.7.30 に移行したばかりで、移行前は GTID が有効になっていませんでしたが、移行後は GTID 関連の機能が有効になりました。CREATE TABLE ... SELECT ...
インポートされたデータをビジネスで通常の方法で使用すると、次のエラーが発生しますError Code:1786 (HY000): Mysql Statement violates GTID consistency: CREATE TABLE ... SELECT
。
問題の原理
この問題は比較的単純で、移行した MySQL5.7 では GTID が使用されており、パラメーター (GTID の強整合性) が有効になっていることが原因ですenforce_gtid_consistency
。
分散トランザクションの一貫性を確保するために、MySQL は GTID を使用してトランザクションを一意に識別します。GTID モードでは、DDL ステートメントと DML ステートメントは、異なるトランザクション操作を識別するために異なる GTID を自動的に生成します。ただし、CREATE TABLE ... SELECT ...
生成される GTID は 1 つだけであり、DDL 操作と DML 操作は 1 つのトランザクション実行にマージされるため、ステートメントの実行が失敗したときにマスターとスレーブのデータの不整合が発生します。このパラメーターをオンにすると、enforce_gtid_consistency
GTID トランザクションのアトミック性が向上します。
公式ドキュメントでもCREATE TABLE ... SELECT ...
この操作について説明しています。
解決
安全上の理由から、このパラメータをオフにすることはお勧めできません。
MySQL5.7 では、次のように SQL を 2 つの文に分割することでこの問題を解決できます。
#先创建表
CREATE TABLE ... LIKE...
#再插入数据
INSERT INTO ... SELECT ...
以前の 1 つの SQL は簡単かつ迅速に別のテーブルに派生できますが、安全性の観点から少し面倒な場合があります。
MySQL 8.0
良いニュースは、MySQL8.0.21 以降、アトミック DDL をサポートするストレージ エンジンでCREATE TABLE ... SELECT ...
ステートメントの使用が許可されることです。
さらに技術的な記事については、https: //opensource.actionsky.com/をご覧ください。
SQLEについて
Axon オープン ソース コミュニティの SQLE は、マルチシナリオ監査、標準化されたオンライン プロセス、MySQL 監査のネイティブ サポート、およびスケーラブルなデータベース タイプをサポートするデータベース ユーザーおよび管理者向けの SQL 監査ツールです。
SQL取得
タイプ | 住所 |
---|---|
リポジトリ | https://github.com/actiontech/sqle |
書類 | https://actiontech.github.io/sqle-docs/ |
リリースニュース | https://github.com/actiontech/sqle/releases |
データ監査プラグイン開発ドキュメント | https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse |