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 上での MySQL データベースのリモート展開の詳細な手順

LinuxリモートMySQLデータベースの展開、参考までに、具体的な内容は次のとおりです。 1.0 ...

HTML タグのリストと使用方法

HTMLタグのリストマークタイプ名前または意味効果述べるファイルのタグ付け<HTML> ...

CentOS での mysql5.7 の詳細なインストールと設定のチュートリアル

インストールユーザーにインストール権限があることを確認してくださいルートスイッチなしsuルート(su...

Dayjs を使用して Vue で一般的な日付を計算する方法

vue を使用してプロジェクトを開発する場合、フロントエンドでは次のような日付と時刻を計算する必要が...

Amoeba を使用して MySQL データベースの読み取り/書き込み分離を実装する方法の詳細な説明

MySQL には読み取りと書き込みを分離するアーキテクチャが多数あります。Baidu のそれらのほと...

js データ型とその判定方法の例

js データ型基本データ型: 数値、文字列、ブール値、未定義、null、シンボル、参照データ型: オ...

MySQL FAQ シリーズ: ibdata1 ファイルのサイズが突然増加しないようにする方法

0. はじめにibdata1 ファイルとは何ですか? ibdata1 は、innodb システム テ...

Nginx リバース プロキシ springboot jar パッケージ プロセス分析

Springboot プロジェクトをサーバーにデプロイする方法としては、war パッケージにパッケー...

C++ TpeScriptシリーズのジェネリックについて

目次1. テンプレート2. ジェネリック3. ジェネリック再帰4. デフォルトのジェネリックパラメー...

MySQL累積計算実装方法の詳しい説明

目次序文需要分析MySQL ユーザー変数累積計算にMysqlユーザー変数を使用する要約するこの記事で...

CocosCreator Huarongdaoデジタルパズルの詳しい説明

目次序文文章1. パネル2. 華容島ソリューション3. コード4. 注記序文華容路とは何ですか? 誰...

15行のCSSコードがAppleデバイスをクラッシュさせる可能性があり、最新のiOS 12も例外ではない

たった15行のCSSでiPhoneがクラッシュするWire のセキュリティ研究者 Sabri Had...

Flinkのフォールトトレラントメカニズムに関する簡単な説明:ジョブ実行とデーモン

目次1. ジョブ実行のフォールトトレランス1.1 タスクフェイルオーバー戦略1.2 ジョブ再開戦略2...

JavaScript 中断要求に対するいくつかの解決策の詳細な説明

目次1 約束呼び出しチェーンを中断する約束を破る中止メソッドのラッピング - Axios の Can...

IIS7 IIS8 リバースプロキシルールの記述、インストール、構成方法

目的: ステーションAをステーションBのセカンダリディレクトリとして扱うのように: http://w...