クラウドインフラストラクチャ上のAdobe CommerceのMySQL ディスクスペースが少ない

この記事では、Adobe Commerce上のMySQLのクラウドインフラストラクチャ上のスペースが非常に少ない、またはスペースがない場合の解決策を紹介します。 症状としては、サイトの停止、カートに製品を追加できない、データベースに接続できない、データベースにリモートでアクセスできない、ノードにSSHできない、などが挙げられます。 症状には、以下に示すように、Galera、環境同期、PHP、データベース、デプロイメントエラーも含まれます。 「​ ソリューション ​」をクリックして、ソリューション セクションに直接ジャンプします。

説明 description

問題

データベースが大きすぎます。 この問題には、データベース接続の切断、データベースのアップロードエラー、その他のさまざまな問題が含まれる場合があります。

発生する可能性のあるエラー:

ガレラ:

  • SQLSTATE[ 08S01]:通信リンクの失敗:1047 WSREPは、アプリケーション使用の読み込みエラー:​用のノードをまだ準備していません
  • SQLSTATE[ HY000]:一般エラー:1180 エラー5 「入出力エラー」​が発生しました
  • SQLSTATE[ 08S01]:通信リンクの失敗:1047 WSREPはまだアプリケーション使用のためのノードを準備していません

環境同期エラー:

  • SQLSTATE:一般エラー:1180 コミット中にエラー5 「入出力エラー」が発生しました

PHP エラー:

  • php: PDO::__construct (): MySQL サーバーが消えました。
  • php エラー:PDO::__construct (): グリーティングパケットの読み込み中にエラーが発生しました。 PID=NNNN.
  • ERROR 2013 (HY000): 「初期通信パケットを読み取り」時にMySQL サーバーへの接続が失われました。システムエラー:0 「内部エラー/チェック (システムエラーではありません)」。

データベースエラー:

  • エラーコード:1114
  • InnoDB: FTS補助インデックステーブルにword ノードを書き込み中にエラー(ディスク領域不足)が発生しました。
  • SQLSTATE[ HY000]:一般エラー:2006 MySQL サーバーが消えました
  • [ ERROR] Slave SQL: クエリで「テーブル <table_name>がいっぱいです」というエラーが発生しました。
  • 単位のmysql.serviceが失敗した状態に入りました。
  • エラー:‘ソケット ‘/var/run/mysqld/mysqld.sock’ (111 “Connection refused”)を介してローカル MySQL サーバーに接続できません’
  • 1205 ロックの待機タイムアウトが超過しました。トランザクションを再開しようとしました。クエリはcron_schedulejob_code, status, created_at, scheduled_at)値(?, ?, YYYY-02-07 HH:MM:SS, YYYY-MM-DD HH:MM:SS)に挿入しました

展開エラー:

  • E: コマンド ‘[ ‘sudo’、’-u’、<environment name>、‘bash’、‘-c’、‘/etc/platform/<環境名> /post_deploy.sh’] 'が0以外の終了ステータス 255を返しました
  • E: コマンド '[ ‘ssh’, u< node IP address> , ‘sudo /usr/bin/sv -w 30 restart site-<environment name>g-nginx’] 'が0以外を返しました
  • スキーマをアップグレードしています… SQLSTATE[ HY000]:一般エラー:1114 テーブル <table_name>がいっぱいです
  • SQLSTATE[ HY000]:一般エラー:3 ファイルの書き込み中にエラーが発生しました。/<environment name>/#
  • W: <filename> (エラーコード:28 “デバイスに空き領域がありません”) インデックス作成エラー(/tmp内の孤立した一時.ibd ファイルと共に):
  • カタログ ルール インデクサーが例外をスローします。 その後、一時テーブルがクリーンアップされず、現在のMySQL マスターノード​のディスクが埋まりません

複製する手順:

/data/mysql (またはMySQL データストレージが設定されている場所)がいっぱいかどうかを確認するには、CLIで次のコマンドを実行します。

df -h

MySQL ディスク上の空きメモリの10%未満は、障害の主な指標です。

原因

十分なノードがないこと、使用可能なストレージ容量、一時テーブルを生成する不正なクエリなど、様々な問題により、/data/mysql マウントが完全になる可能性があります。

解決策 resolution

MySQLをトラックに戻す(またはスタックするのを防ぐ)には、すぐに行うステップがあります。大きなテーブルをフラッシュしてスペースを解放します。

ただし、長期的な解決策としては、より多くのスペースを割り当て、​ データベースのベストプラクティス ​に従い、注文/請求書/出荷アーカイブ ​機能を有効にすることなどが考えられます。

以下に、迅速かつ長期的な解決策の詳細を示します。

チェックインして解放する

利用可能なノードが十分にあることを確認します。 これを行うには、次のコマンドを実行します。

df -i

出力は次のようになります。

Filesystem Inodes   Used   Free Use% Mounted on/dev/nvme2n1 655360    1695  653665    1% /data/mysql

使用率%が< 70%であることを確認してください。 ノードはファイルと関連付けられます。 パーティションからファイルを削除すると、Indeが解放されます。

ストレージ容量の確認と解放

使用可能なストレージスペースを確認します。 これには、次を実行します。

df -k

出力は次のようになります。

Size Used Avail Use% Mounted on·       50G 49G 95M 100% /data/mysql

使用率%が> 70%の場合は、スペースを解放または追加するためのアクションを実行する必要があります。

大きなibtmp1 ファイルを確認します

各ノードの/data/mysql上の大きなibtmp1 ファイルを確認します。このファイルは一時テーブルの表領域です。 一時テーブルを生成する不正なクエリがある場合、それらのクエリはibtmp1 ファイルに含まれます。 このファイルは、データベースを再起動した場合にのみ削除されます。 使用可能なすべての領域を使用している場合は、データベースを再起動する必要があります。 不正なクエリがある場合は、再作成されます。

大きな表をフラッシュ

警告:操作を実行する前にデータベースのバックアップを作成し、サイトの読み込み時間が長い場合は操作を避けることを強くお勧めします。 開発者用ドキュメントの​ データベースのダンプ ​を参照してください。

大きなテーブルがあるかどうかを確認し、いずれかのテーブルをフラッシュできるかどうかを検討します。 これをプライマリ(ソース)ノードで行います。

例えば、レポートを含むテーブルは通常、フラッシュできます。 大きなテーブルの検索方法について詳しくは、大きなMySQL テーブルの検索の記事を参照してください。

大きなレポートテーブルがない場合は、Adobe Commerce アプリケーションを元の状態に戻すために、_index個のテーブルをフラッシュすることを検討してください。 index_price個のテーブルが最適な候補になります。 例えば、catalog_category_product_index_storeX個のテーブルで、Xは「1」から最大ストア数までの値を持つことができます。 これらのテーブルのデータを復元するにはインデックスを再作成する必要があり、大きなカタログの場合、このインデックス再作成には多くの時間がかかる場合があります。

フラッシュしたら、wsrepの同期完了を待ちます。 バックアップを作成し、より多くの領域を追加するために、より大きな手順を実行できるようになりました。例えば、より多くの領域の割り当て/購入、および注文/請求書/出荷アーカイブ ​機能の有効化などです。

バイナリログ設定の確認

MySQL サーバーのバイナリログ設定を確認してください:log_binlog_bin_index。 設定が有効になっている場合、ログファイルが巨大になる可能性があります。 ​ サポートチケット ​を作成して、大きなバイナリログファイルのパージを要求します。 また、ログが定期的にパージされ、多くのスペースを取らないように、バイナリログが正しく設定されていることを確認するリクエストも送信します。

MySQL サーバー設定にアクセスできない場合は、サポートをリクエストして確認してください。

未使用の割り当て済みディスク領域の再利用

  1. ノード 1にSSHで接続し、MySQLにログインします。

    mysql -h127.0.0.1 -pphp -r “echo (include (‘app/etc/env.php’)) [‘db’] [‘connection’] [‘default’] [‘password’] ;” -uwhoami whoami"

    詳細な手順については、Adobe Commerce データベースに対するクエリの接続と実行を参照してください。

  2. 未使用のスペースを確認します。

    code language-none
    SELECT table_name, round((data_length+index_length)/1048576,2) AS size_MB, round((data_free)/1048576,2) AS Allocated_but_unused FROM information_schema.tables WHERE data_free > 1048576*10 ORDER BY data_free DESC;
    Example output:
    
    table 0-row-3 1-row-3
    table_name size_MB Allocated_but_unused
    sales_order_grid 28145.20 14943.00

    出力を確認して、割り当てられているものの未使用のメモリがあるかどうかを確認します。 これは、テーブル内からデータが削除されたが、メモリがそのテーブルに割り当てられている場合に発生します。

  3. サイトをメンテナンスモードに設定し、cron ジョブを停止して、データベース上でインタラクションが発生しないようにします。 手順については、​ メンテナンスモードを有効または無効にするおよびcron ジョブを無効にするを参照してください。

  4. 次のコマンドを使用してテーブルを再作成することで、そのスペースを再利用します(例えば、上記のテーブルを使用して最も未使用のスペースを使用します)。

    ALTER TABLE sales_order_grid Engine = "INNODB";

  5. 次のクエリを実行して、列 Allocated_but_unused 内の高い値を示す各テーブルの未割り当て領域を確認します。

    SELECT table_name, round((data_length+index_length)/1048576,2) as size_MB, round((data_free)/1048576,2) as Allocated_but_unused FROM information_schema.tables WHERE 1 AND data_free > 1048576*10 ORDER BY       data_free DESC;

  6. 現在​ メンテナンスモードを無効にするおよびcron ジョブを有効にする

スペースの割り当て/購入

未使用のディスクがある場合は、MySQL用にディスク領域を割り当てます。 空きディスク容量があるかどうかを確認する方法については、「​ ディスク容量の制限を確認する」の記事を参照してください。

  • スタータープラン、すべての環境、およびプロプラン統合環境の場合、未使用のディスク領域を割り当てることができます。 詳しくは、「MySQL用に空き領域を割り当てる」を参照してください。
  • Pro プランのステージング環境と実稼動環境の場合は、​ サポート ​に連絡して、未使用のディスク領域を割り当ててください。
  • スペースの制限に達してもスペースが少ない場合は、より多くのディスクスペースを購入することを検討してください。詳しくは、Adobe アカウントチームにお問い合わせください。

関連トピックス

Commerce実装プレイブックのデータベーステーブルを修正するためのベストプラクティス ​

recommendation-more-help
experience-cloud-kcs-help-kbarticles