孤立資料表

本頁說明 MySQL 中孤立資料表的已知問題。

什麼是孤立資料表?

孤立資料表是指定義與 MySQL 資料字典中斷連線的資料表,可能發生在 MySQL 5.6 或 MySQL 5.7。如果發生下列任一情況,就無法將 MySQL 5.7 升級至 MySQL 8.0:

  • 存在 InnoDB 資料檔案 (.ibd),但沒有對應的定義檔案 (.frm),反之亦然。
  • ALTER TABLE 陳述式遺留的中間資料表,不再由任何有效的應用程式邏輯參照或使用。

孤立的臨時資料表

孤立臨時資料表名稱開頭為 #sql- 前置字元,例如 #sql-123

使用下列查詢,找出孤立的臨時 (temp) 資料表:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME RLIKE '#sql-[0-9].*';

您可以使用 DROP TABLE 指令捨棄孤立的暫時資料表,不必執行任何其他額外步驟。這項做法適用於大多數情況:

DROP TABLE `DB`.`#mysql50#TEMPORARY_ORPHAN_TABLE`;

DB 替換為您要使用的資料庫名稱。

範例如下:

DROP TABLE `testdb`.`#mysql50##sql-1234`;

如果先前的 DROP 資料表指令無法運作,則定義檔 (.frm) 可能會由其他 ALTER TABLE 作業重複使用。在這種情況下,您必須在磁碟上建立預留位置 .frm 檔案,才能移除資料表。如需協助,請與 Cloud SQL 支援團隊聯絡。如果沒有支援合約,請參閱自助式方法,瞭解疑難排解步驟。

孤立的中間資料表

孤立中繼資料表名稱會以 #sql-ib 前置字串開頭,例如 #sql-ib23-343224

使用下列查詢找出孤立的中繼資料表:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql-ib%';

如要移除中繼孤立資料表,請先變更孤立定義檔名 (.frm),使其與資料表名稱相符,然後從指令列捨棄資料表。

如要移除中繼孤立資料表,請與 Cloud SQL 支援團隊聯絡,如果沒有支援合約,請參閱「自助式方法」一節的疑難排解步驟。

孤立的普通資料表

如果資料檔案 (.ibd) 仍保留在檔案系統中,但資料字典不再正確參照該檔案,就會發生孤立 InnoDB 表格。這種情況需要手動介入。

如要解決這個問題,請與 Cloud SQL 支援團隊聯絡。支援團隊可以建立預留位置 .frm 檔案,然後使用 DROP TABLE 指令嘗試移除資料表。如果無法成功移除,可能需要從資料目錄手動移除 InnoDB (.ibd) 檔案。

手動移除檔案後,即可備份所有資料表和資料庫結構。

使用 DROP DATABASE 捨棄資料庫,並使用 CREATE DATABASE 建立資料庫。最後一個步驟可能需要停機,才能完成與受影響資料庫連線的應用程式。

如果沒有支援合約,請參閱自助式方法,瞭解疑難排解步驟。

自助式疑難排解

如果無法刪除個別資料表,請嘗試下列自助式疑難排解方法,包括捨棄或遷移整個資料庫,以移除孤立資料表。這個方法會造成中斷。如果貴機構簽署了支援服務合約,我們強烈建議您與 Cloud SQL 支援團隊聯絡,尋求協助。

如要移除孤立的暫時性資料表,請務必先按照「孤立的暫時性資料表」一節中的步驟操作。如果 DROP TABLE 指令失敗,請嘗試下列建議。

事前準備

  • 強烈建議您完整備份執行個體,以降低資料遺失的風險。

  • 為盡量縮短應用程式停機時間,強烈建議您複製執行個體,並在正式環境中完成下列遷移步驟前,先驗證這些步驟。

    詳情請參閱「複製執行個體」。

使用物件遷移作業捨棄結構定義

資料庫物件遷移程序包含多個步驟,可將資料表等資料庫物件移至臨時結構定義:

  1. 備份其他資料庫物件,包括程序、函式和檢視區塊。
  2. 捨棄並重新建立受影響的結構定義。
  3. 將備份的物件匯回原始結構定義。

這種遷移方法通常會導致應用程式停機。為盡量減少中斷,請事先準備所有必要指令碼。舉例來說,請確保指令碼已準備好處理下列情況:

  • 重新命名資料表,並將其移至臨時結構定義。
  • 備份其他資料庫物件,例如程序、函式、檢視區塊等。
  • 將所有資料庫物件還原至原始結構定義。

準備好這些指令碼後,請完成下列步驟:

  1. 在同一個執行個體上建立臨時結構定義 (例如:fix_orphan_tables)。
  2. 停止受影響結構定義上的應用程式流量。
  3. 使用 RENAME TABLE 將所有資料表移至臨時結構定義:

    RENAME TABLE DB.TABLE_NAME TO fix_orphan_tables.TABLE_NAME;
    

    請替換下列項目:

    • DB:您要使用的資料庫名稱。
    • TABLE_NAME:資料表名稱。
  4. 備份資料庫物件,例如檢視區塊、常式、預存程序、觸發程序和事件。其中一種做法是使用 mysqldump

    mysqldump -u USER --password=PASSWORD \
      -h HOST_IP --set-gtid-purged=OFF --no-data --no-create-db  \
      --no-create-info --routines --triggers --skip-opt --events \
      DB > DB_export.sql
    

    請替換下列項目:

    • USER:使用者名稱。
    • PASSWORD:資料庫密碼。
    • HOST_IP:主機的 IP 位址。
    • DB:您要使用的資料庫名稱。

    強烈建議您使用 SHOW CREATE VIEW 指令片段手動備份檢視區塊。

  5. 捨棄含有孤立資料表的結構定義。

  6. 使用原始名稱建立結構定義。

  7. 確認是否已移除孤立資料表:

    SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%ORPHAN_TABLE_NAME</var>';
    

    ORPHAN_TABLE_NAME 替換為孤立資料表名稱。

  8. 將資料表複製回原始結構定義:

    RENAME TABLE fix_orphan_tables.TABLE_NAME TO DB.TABLE_NAME;
    

    請替換下列項目:

    • TABLE_NAME:資料表名稱。
    • DB:您要使用的資料庫名稱。
  9. 複製步驟 4 中備份的所有資料庫物件。

    mysql -u USER \
      --password=PASSWORD \
      -h <var>HOST_IP \
      -D<var>DB < <var>DB_export.sql
    

    請替換下列項目:

    • USER:使用者名稱。
    • PASSWORD:資料庫密碼。
    • HOST_IP:主機的 IP 位址。
    • DB:您要使用的資料庫名稱。

    強烈建議您使用 CREATE VIEW 陳述式重新建立檢視區,手動還原檢視區。

  10. 繼續先前停止的任何應用程式流量。

使用傾印和載入功能,在同一個執行個體中捨棄結構定義

如要移除孤立資料表,也可以完整傾印受影響的結構定義,然後捨棄並重新建立結構定義,最後還原傾印。在某些情況下,這個方法可能更快且較不複雜。為盡量減少中斷,請務必事先準備好所有備份和還原指令碼。

準備好這些指令碼後,請完成下列步驟:

  1. 停止受影響結構定義的應用程式流量。
  2. 使用 mysqldump 備份孤立資料表所在的結構定義,包括所有儲存的程序、觸發程序、檢視區塊和事件。
  3. 捨棄結構定義。
  4. 再次建立結構定義,並還原備份檔案。
  5. 繼續處理在第一個步驟中停止的任何應用程式流量。

傾印並載入至新的或重新建立的執行個體

在特定情況下,您無法捨棄含有孤立資料表的結構定義。 在這種情況下,您必須遷移至新執行個體,或使用邏輯傾印和載入作業重新建立現有執行個體。這兩種做法都會導致應用程式中斷,您可能需要重新設定應用程式,指向新建立或重建的資料庫執行個體。以下各節將說明這兩種方法。

使用資料庫移轉服務 (DMS) 將資料遷移至新執行個體

  1. 使用資料庫移轉服務建立新的 MySQL 適用的 Cloud SQL 執行個體。
  2. 備用執行個體完成與新執行個體相關聯的資料複製作業後,請停止所有連線至來源執行個體的應用程式。
  3. 升級 MySQL 適用的 Cloud SQL 備用執行個體。
  4. 將所有應用程式連線指向新升級的 MySQL 適用的 Cloud SQL 執行個體,然後重新啟動應用程式。

手動傾印及還原

  1. 如果您要建立新的資料庫執行個體,請建立與目前執行個體設定相同的執行個體。
  2. 停止目前資料庫執行個體上的所有應用程式流量。
  3. 使用 mysqldump 或類似公用程式備份所有結構定義。
  4. 如果使用相同執行個體,請刪除並重新建立執行個體。
  5. 使用您在第三個步驟中建立的備份,將備份還原至新執行個體,或還原至重新建立的相同執行個體。
  6. 將應用程式指向新執行個體或重新建立的相同執行個體,然後繼續執行應用程式作業。

後續步驟

  1. 疑難排解
  2. 就地升級資料庫主要版本