[僅限PaaS]{class="badge informative" title="僅適用於雲端專案(Adobe管理的PaaS基礎結構)和內部部署專案的Adobe Commerce 。"}

雲端基礎結構上Adobe Commerce的MySQL磁碟空間不足

本文提供解決方案,協助您在雲端基礎結構上的Adobe Commerce上遇到MySQL空間極低或沒有空間的情況。 症狀包括網站中斷、客戶無法將產品新增到購物車、無法連線到資料庫、從遠端存取資料庫,以及無法透過SSH連線到節點。 症狀還包括Galera、環境同步、PHP、資料庫和部署錯誤,如下所列。 按一下方案直接跳至方案區段。

受影響的產品和版本

雲端基礎結構上的Adobe Commerce 2.3.0-2.3.6-p1, 2.4.0-2.4.2

問題

資料庫變得太大。 症狀可能包括遺失資料庫連線、資料庫上載錯誤和各種其他問題。

您可能會遇到的錯誤:

加萊拉:

  • SQLSTATE[08S01]:通訊連結失敗: 1047 WSREP尚未準備應用程式使用的節點 匯入錯誤:
  • SQLSTATE[HY000]:一般錯誤: 1180 Got error 5 "Input/output error"
  • SQLSTATE[08S01]:通訊連結失敗: 1047 WSREP尚未準備應用程式使用的節點

環境同步錯誤:

  • SQLSTATE:一般錯誤: 1180在COMMIT ​期間發生錯誤5「輸入/輸出錯誤」

php錯誤:

  • php: PDO::__construct(): MySQL伺服器已消失。
  • php錯誤: PDO::__construct():讀取問候語封包時發生錯誤。 PID=NNNN.
  • 錯誤2013 (HY000):在'讀取初始通訊封包'時與MySQL伺服器的連線中斷,系統錯誤: 0「內部錯誤/檢查(非系統錯誤)」。

資料庫錯誤:

  • 錯誤碼: 1114
  • InnoDB:將Word節點寫入FTS輔助索引資料表時發生錯誤(磁碟空間不足)。
  • SQLSTATE[HY000]:一般錯誤: 2006 MySQL伺服器已消失
  • [ERROR]從屬SQL:錯誤「資料表<table\_name>已滿」。
  • 單元mysql.service進入失敗狀態。
  • 錯誤: '無法透過通訊端'/var/run/mysqld/mysqld.sock'連線到本機MySQL伺服器(111 '已拒絕連線')'
  • 1205超過鎖定等待逾時;嘗試重新啟動交易,查詢為: INSERT INTO &#39;cron_schedule&#39; (&#39;job_code&#39;, &#39;status&#39;, &#39;created_at&#39;, &#39;scheduled_at&#39;) VALUES (?, ?, YYYY-02-07 HH:MM:SSYYYY-MM-DD HH:MM:SS)

部署錯誤:

  • E:命令'['sudo', '-u', <environment name>, 'bash', '-c', '/etc/platform/<environment name>/post_deploy.sh']'傳回非零的結束狀態255
  • E:命令'['ssh', u<node IP address>, 'sudo /usr/bin/sv -w 30重新啟動網站 — <environment name>g-nginx']'傳回非零
  • 正在升級結構描述…… SQLSTATE[HY000]:一般錯誤: 1114資料表<table\_name>已滿
  • SQLSTATE[HY000]:一般錯誤: 3寫入檔案時發生錯誤。/<environment name>/#
  • W: <filename> (錯誤碼: 28「裝置上已無空間」) 索引錯誤(以及/tmp中孤立的暫時.ibd檔案):
  • 目錄規則索引子擲回例外狀況。 暫時資料表在事後未被清理,然後填入目前MySQL主節點 ​上的磁碟

要再現的步驟

您可以在CLI中執行下列命令,以檢查/data/mysql (或設定MySQL資料儲存體的位置)是否已滿的方式之一:

df -h

MySQL磁碟上的可用記憶體不足10%是中斷的主要指標。

原因

由於一系列問題(例如沒有足夠的索引節點、可用的儲存空間,以及產生臨時表格的錯誤查詢),/data/mysql掛載可能會變滿。

解決方案

您可以立即採取步驟將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檔案中。 只有在重新啟動資料庫時,才會移除此檔案。 如果它正在佔用所有可用的空間,則必須重新啟動資料庫。 如果存在錯誤的查詢,則會重新建立它。

排清大型表格

WARNING
我們強烈建議在執行任何操作之前建立資料庫備份,並在網站負載過高期間避免這些操作。 請參閱我們的開發人員檔案中的傾印您的資料庫

檢查是否有大型資料表,並考慮是否有任何資料表可以清除。 請在主要(來源)節點上執行此操作。

例如,通常可以排清含有報表的表格。 如需有關如何尋找大型資料表的詳細資訊,請參閱尋找大型 MySQL 資料表文章。

如果沒有大型報表表格,請考慮排清_index表格,以將Adobe Commerce應用程式返回正軌。 index_price個資料表將是最佳候選者。 例如,catalog_category_product_index_storeX個資料表,其中X的值可以是「1」到最大存放區計數。 請注意,您需要重新索引以還原這些表格中的資料,而且在大目錄的情況下,此重新索引可能需要花很長的時間。

排清它們後,請等待wsrep同步完成。 您現在可以建立備份,並採取更重大的步驟來增加更多空間,例如分配/購買更多空間,以及啟用訂單/發票/出貨封存功能。

檢查二進位記錄設定

檢查您的MySQL伺服器二進位記錄設定: log_binlog_bin_index。 如果已啟用這些設定,記錄檔可能會變得龐大。 建立支援票證,要求清除大型二進位記錄檔。 此外,請要求檢查二進位記錄是否正確設定,以定期清除記錄檔,以免佔用太多空間。

如果您沒有MySQL伺服器設定的存取權,請要求支援以進行檢查。

回收未使用的已配置磁碟空間

  1. SSH至節點1並登入MySQL:

    code language-sh
    mysql -h127.0.0.1 -p`php -r "echo (include('app/etc/env.php'))['db']['connection']['default']['password'];"` -u`whoami` `whoami`
    

    如需詳細步驟,請參閱連線並針對Adobe Commerce資料庫執行查詢。

  2. 檢查未使用的空間:

    code language-sql
    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;
    

    範例輸出:

    table 0-row-3 1-row-3
    table_name size_MB Allocated_but_unused
    vertex_taxrequest 28145.20 14943.00

    檢查輸出以檢視是否有已配置但未使用的記憶體。 當資料已從表格內刪除,但記憶體仍配置給該表格時,就會發生這種情況。

  3. 將您的網站置於維護模式,並停止cron工作,讓資料庫上沒有任何互動。 如需相關步驟,請參閱啟用或停用維護模式以及停用cron工作

  4. 使用下列命令重新建立表格以回收該空間(例如使用上面列出的具有最多未使用空間的表格):

    code language-sql
    ALTER TABLE vertex_taxrequest Engine = "INNODB";
    
  5. 執行以下查詢來檢查在資料行​ Allocated_but_unused ​中顯示高值的每個資料表的未配置空間。

    code language-sql
    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
8bd06ef0-b3d5-4137-b74e-d7b00485808a