クラウドインフラストラクチャー上のAdobe Commerceで MySQL のディスク領域が不足している

この記事では、クラウドインフラストラクチャ上で MySQL の容量が非常に少ない場合や、Adobe Commerce上に MySQL の容量がない場合のソリューションを提供します。 サイトの停止、買い物かごに製品を追加できない、データベースに接続できない、データベースにリモートでアクセスできない、ノードに SSH 接続できないなどの症状があります。 また、Galera、環境の同期、PHP、データベース、および以下に示すデプロイメントエラーも症状に含まれます。 ​ ソリューション ​ をクリックして、ソリューションセクションに直接ジャンプします。

説明 description

問題

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

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

ガレラ:

  • SQLSTATE[ 08S01]:通信リンク エラー:1047 WSREP はまだアプリケーション使用のインポート エラー用ノードを準備していません:
  • SQLSTATE[ HY000]:一般エラー:1180 エラー 5 が発生しました「入力/出力エラー」
  • SQLSTATE[ 08S01]:通信リンク エラー:1047 WSREP はまだアプリケーションで使用するノードを準備していません

環境同期エラー:

  • SQLSTATE:一般的なエラー:1180 COMMIT 中にエラー 5 「Input/output error」が発生する

PHP エラー:

  • php: PDO::__construct (): MySQL サーバが終了しました。
  • php エラー:PDO::__construct (): greeting パケットの読み込み中にエラーが発生しました。 PID=NNNN.
  • エラー 2013 (HY000): '初期通信パケットの読み取り'で MySQL サーバーへの接続が切断されました。システムエラー:0 "内部エラー/チェック (システムエラーではありません)"。

データベース エラー:

  • Error_code: 1114
  • InnoDB: FTS 補助インデックス テーブルにワード ノードを書き込み中にエラー(ディスク領域不足)が発生しました。
  • SQLSTATE[ HY000]:一般エラー:2006 MySQL サーバーが停止しました
  • [ ERROR] スレーブ SQL: クエリで「テーブル <table_name> がいっぱいです」というエラーが発生しました。
  • ユニット mysql.service が失敗状態になりました。
  • エラー:'ソケット「/var/run/mysqld/mysqld.sock」を使用してローカル MySQL サーバーに接続できません(111 "接続が拒否されました)'
  • 1205 ロック待機タイムアウトを超えました。トランザクションを再開してください。クエリは次のとおりです:INSERT INTO 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'] 'がゼロ以外の終了ステータス 255 を返しました
  • E: コマンド「[ 'ssh'、u< ノードの IP アドレス >、「sudo /usr/bin/sv -w 30 restart site-<environment name>g-nginx']」でゼロ以外が返されました
  • スキーマをアップグレードしています… SQLSTATE[ HY000]:一般エラー:1114 テーブル <table_name> がいっぱいです
  • SQLSTATE[ HY000]:一般エラー:3 ファイルの書き込み中にエラーが発生しました。/<environment name>/#
  • W: <filename> (エラーコード:28 「デバイスに空き領域がありません」)、インデックス作成エラー(/tmp の孤立した一時.ibd ファイルも含む):
  • カタログルールインデクサーで例外がスローされる。 一時テーブルは、その後にクリーンアップされず、現在の MySQL マスターノードのディスクに書き込まれます

再現手順 :

/data/mysql (または MySQL データストレージが設定されている場所)の空き容量があるかどうかを確認する方法の 1 つは、CLI で次のコマンドを実行することです。

df -h

MySQL ディスクの空きメモリが 10% 未満であることが、停電の主な指標です。

原因

inode が不足している、使用可能なストレージ領域が不足している、一時テーブルを生成する不適切なクエリなど、様々な問題が原因で、/data/mysql マウントがいっぱいになる可能性があります。

解決策 resolution

MySQL を元の状態に戻す(または停止するのを防ぐ)ための即時の手順があります。大きなテーブルをフラッシュして、領域を解放します。

しかし、長期的なソリューションとしては、より多くのスペースを割り当て、​ 注文/請求書/出荷アーカイブ ​ 機能の有効化など、​ データベースのベストプラクティス ​ に従うことになります。

以下は、迅速なソリューションと長期的なソリューションの両方の詳細です。

inode のチェックと解放

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

df -i

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

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

使用率 % が 70%< あることを確認します。 inode はファイルと相関関係があります。 パーティションからファイルを削除すると、inode が解放されます。

ストレージスペースの確認と解放

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

df -k

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

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

使用率 % が 70%> ある場合は、領域を解放または追加するために対処する必要があります。

サイズの大きい ibtmp1 ファイルの確認

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

大きいテーブルのフラッシュ

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

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

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

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

フラッシュしたら、wsrep 同期が完了するまで待ちます。 これで、バックアップを作成し、容量の割り当てや購入、​ 注文/請求書/出荷アーカイブ ​ 機能の有効化など、容量を追加するためにより重要な手順を実行できます。

バイナリログ設定を確認

MySQL サーバーのバイナリログ設定(log_bin および log_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 用に割り当てるディスク領域を増やします。 空きディスク容量があるかどうかを確認する方法については、​ ディスク容量制限の確認 ​ の記事を参照してください。

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

関連資料

Commerce実装プレイブックの ​ データベーステーブルを変更する際のベストプラクティス ​

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f