MySQL が大規模トランザクションを避けるべき理由とその解決方法

MySQL が大規模トランザクションを避けるべき理由とその解決方法

何が大問題ですか?

長時間実行され、長時間コミットされないトランザクションは、大規模トランザクションと呼ばれます。

大企業の原因

  • 操作するデータがさらにあります
  • ロック競合が多い
  • トランザクションにはDB以外の時間のかかる操作が他にもある
  • 。 。 。

大きな出来事の影響

  • 同時実行状況では、データベース接続プールがバーストする傾向がある
  • ロックするデータが多すぎるため、ブロックやロックタイムアウトが頻繁に発生する
  • 実行時間が長く、マスタースレーブ遅延が発生する可能性がある
  • ロールバックには長い時間がかかります
  • UNDOログの拡張
  • 。 。 。

大規模なトランザクションをクエリする方法

**注**: この記事のSQL操作はMySQLバージョン5.7に基づいています。

クエリ実行時間が 10 秒を超える場合を例に挙げます。

information\_schema.innodb\_trx から TIME\_TO\_SEC(timediff(now(),trx\_started))>10 となる \* を選択します。

大きな取引を避ける方法

一般的な解決策

  • トランザクションで一度に大量のデータを処理しないようにする
  • トランザクションでは、不要なクエリを避けるようにしてください
  • トランザクションでは、トランザクション タイムアウトを引き起こす可能性のある、時間のかかる操作をあまり多く実行しないようにしてください。 RPC 呼び出しやメッセージ キュー操作などの一部の非 DB 操作をトランザクションの外部に配置するようにしてください。

mysql5.7 に基づくソリューション

  • InnoDB トランザクションでは、行ロックは必要な場合にのみ追加されますが、不要になったときにすぐには解放されません。代わりに、トランザクションが終了したときにのみ解放されます。 **トランザクションで複数の行をロックする必要がある場合は、ロックの競合を引き起こし、同時実行性に影響を与える可能性が最も高いロックをできるだけ後ろに配置します**
  • SETMAX_EXECUTION_TIME コマンドを使用して、各ステートメントの最大クエリ時間を制御し、単一のステートメントによるクエリが誤って長時間実行されるのを防ぎます。
  • information_schema.Innodb_trxテーブルを監視し、長いトランザクションのしきい値を設定し、それを超過すると警告または強制終了する
  • 業務機能のテストフェーズでは、すべての general_logs を出力し、ログの動作を分析して事前に問題を見つける必要があります。
  • innodb_undo_tablespaces 値を設定して、UNDO ログを別のテーブルスペースに分離します。大規模なトランザクションによってロールバック セグメントが大きくなりすぎる場合は、設定後にクリーンアップする方が簡単になります。

付録 クエリトランザクション関連ステートメント

**注**: SQL文はMySQL 5.7バージョンに基づいています

# 実行中のすべてのトランザクションとその実行時間を照会します。 select t.\*,to\_seconds(now())-to\_seconds(t.trx\_started) idol\_time from INFORMATION\_SCHEMA.INNODB\_TRX t



# トランザクションの詳細と実行されたSQLを照会する

information\_schema.innodb\_trx a から now(),(UNIX\_TIMESTAMP(now()) - UNIX\_TIMESTAMP(a.trx\_started)) diff\_sec,b.id,b.user,b.host,b.db,d.SQL\_TEXT を選択し、information\_schema.innodb\_trx a を内部結合し information\_schema.PROCESSLIST b を生成します。

a.TRX\_MYSQL\_THREAD\_ID=b.id かつ b.command = 'Sleep' の場合

内部結合パフォーマンス\_schema.threads c ON b.id = c.PROCESSLIST\_ID

内部結合 performance\_schema.events\_statements\_current d ON d.THREAD\_ID = c.THREAD\_ID;



# トランザクションによって実行されたすべての履歴SQLレコードをクエリする SELECT

 ps.id 'プロセスID'、

 追伸:ユーザー様、

 追伸:ホスト、

 esh.EVENT_ID、

 trx.trx_started、

 esh.event\_name 'イベント名',

 esh.sql\_text 'SQL'、

 追伸時間 

から

 パフォーマンス\_SCHEMA.イベント\_ステートメント\_履歴 esh

 PERFORMANCE\_SCHEMA.threads th を esh.thread\_id = th.thread\_id に結合します

 information\_schema.PROCESSLIST ps を ps.id = th.processlist\_id に結合します。

 LEFT JOIN information\_schema.innodb\_trx trx ON trx.trx\_mysql\_thread\_id = ps.id 

どこ

 trx.trx_id は NULL ではありません 

 かつ ps.USER != 'SYSTEM\_USER' 

注文する

 esh.EVENT_ID;

 

 # 単純なクエリトランザクションロック select \* from sys.innodb\_lock\_waits

 

 #トランザクションロックの詳細を照会するSELECT

 tmp.\*,

 c.SQL\_テキストブロッキング\_sql\_text、

 p.HOST ブロッキング\_ホスト 

から

 (

 選択

 r.trx_state 監視中のtrx_state、

 r.trx_id 待機中のtrx_id、

 r.trx\_mysql\_thread\_Id 待機中\_スレッド、

 r.trx_query 待機クエリ、

 b.trx_state ブロッキングtrx_state、

 b.trx_id ブロッキングtrx_id、

 b.trx\_mysql\_thread\_id ブロッキング\_スレッド、

 b.trx_query ブロッキングクエリ 

 から

 情報\_schema.innodb\_lock\_waits w

 INNER JOIN information\_schema.innodb\_trx b ON b.trx\_id = w.blocking\_trx\_id

 INNER JOIN information\_schema.innodb\_trx r ON r.trx\_id = w.requesting\_trx\_id 

 ) 一時、

 情報\_schema.PROCESSLIST p、

 パフォーマンス\_SCHEMA.イベント\_ステートメント\_現在のc、

 PERFORMANCE\_SCHEMA.threads t 

どこ

 tmp.blocking_thread = p.id 

 かつ t.thread_id = c.THREAD_ID 

 かつ t.PROCESSLIST_ID = p.id

上記は、MySQL で大規模トランザクションを回避する方法と大規模トランザクションを解決する方法の詳細です。MySQL の大規模トランザクションの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLにおけるトランザクション分離レベルの実装原理の詳細な説明
  • MySQLトランザクションを実行するための構文とプロセスの詳細な説明
  • mysql と oracle のデフォルトのトランザクション分離レベルの説明
  • MySQL トランザクション自動コミット自動コミット操作
  • トランザクションとロックを表示するための MySQL の一般的なステートメント
  • MySQL マスタースレーブ同期、トランザクションロールバックの実装原理
  • MySQLデータベースのトランザクションとロックの詳細な分析
  • Mysql トランザクションで Update を実行するとテーブルがロックされますか?
  • PHP+MySQL 分散トランザクションとソリューションに関する深い理解
  • MySQL は ACID トランザクションをどのように実装しますか?
  • MySQLにおけるトランザクションの永続性実装原理の詳細な説明

<<:  単一マシン上での Tomcat の複数インスタンスの実装

>>:  ReactプロジェクトでのTypeScriptの実装

推薦する

Linux ログ内のキーワードとその前後の情報を検索する方法の例

日常業務では、ログを表示する必要がよくあります。たとえば、 tail コマンドを使用してログをリアル...

Reactにおけるコンテキスト適用シナリオの分析

コンテキストの定義と目的コンテキストは、コンポーネント ツリーにプロパティを明示的に渡すことなく、コ...

MySQL データベースのバックアップをスケジュールするいくつかの方法 (包括的)

目次1. データをバックアップするためのmysqldumpコマンド2. 一般的なmysqldump操...

JavaScript タイマーの詳細

目次1. 簡単な紹介2. 間隔を設定する2.1 説明2.2 パラメータ2.3 戻り値2.4 使用法3...

CSS3 フレックスボックス自動記入の書き方を詳しく解説

この記事では、主に CSS3 フレックス エラスティック ボックスの自動塗りつぶしの書き方について詳...

MySql ログイン パスワードを忘れた場合とパスワードを忘れた場合の解決策

方法1: MySQL では、次のコマンド ラインで MySQL サーバーを起動することにより、アクセ...

一般的なMySQLコマンドの概要

mysqlrootパスワードの設定と変更初めて MySQL データベースに入ります。 !環境変数にm...

MySql ページングで limit+order by を使用する場合のデータ重複の解決策

目次まとめ問題の説明問題を分析する問題を解決するまとめ複雑な知識をシンプルに説明できることは重要です...

Dockerは1行のコマンドでFTPサービス構築の実装を完了します

1行のコマンド docker run -d \ -v /share:/home/vsftpd \ -...

CSSブレンドモードとSVGを使用して、製品画像の色を動的に変更します。

数日前、Codepen で @Kyle Wetton が書いた、CSS ブレンディング モードと S...

WeChatミニプログラムのすべてのページがログインされていることを確認する方法

目次現状解決さらなる解決策やっと現状WeChat ミニプログラムには、ホームページ、個人ページ、いく...

tomcat+nginx を使用してマルチアプリケーション デプロイメントを実装するためのサンプル コード

目次マルチアプリケーションの展開1-Tomcat 構成1.1- プロジェクト構成1.2-サービス構成...

MYSQLの主キー制約とユニーク制約の違いについて簡単に説明します。

目次主キー制約ユニーク制約主キー制約PRIMARY KRY 主キーは一意です。テーブルには主キーを ...

zabbix を使用して ogg プロセスを監視する (Linux プラットフォーム)

以前作成されたデータベースの ogg プロセスは、発見されるまでの約半月間ダウンしていました。起動で...

MySQLクエリ構文の概要

序文:この記事では主に、MySQL の where、group by、order by、limit、...