將 Oracle 使用者遷移至 MySQL 適用的 Cloud SQL:安全性、作業、監控和記錄

本文是一系列文章之一,提供有關規劃及執行 Oracle® 11g/12c 資料庫遷移至 Cloud SQL for MySQL 5.7 版本第二代執行個體的相關重要資訊和指引。本系列包含以下部分:

安全性

本節說明 Oracle Cloud SQL for MySQL 之間的資料加密差異,並討論稽核 MySQL 適用的 Cloud SQL 存取控制。

Oracle 資料加密

除了基本使用者驗證和使用者權限管理機制外,Oracle 也提供 TDE (透明資料加密) 機制,可在作業系統層級新增額外的加密層,保護靜態資料安全。設定完成後,系統會自動實作 Oracle TDE,無須使用者手動操作。為了導入 Oracle TDE,建議您在可接受這類加密的資料庫物件 (例如表格空間、資料表或資料欄) 上,明確 (透過指令) 設定 Oracle TDE。如要處理傳輸中資料的安全性,建議您導入網路安全性解決方案。

MySQL 適用的 Cloud SQL 資料加密

Google Cloud 提供多層加密技術,可妥善保護儲存在 Google Cloud 產品 (包括 Cloud SQL) 中的靜態客戶資料。Cloud SQL 會使用 AES-128 或 AES-256 加密技術進行加密。如需更多資訊,請參閱下列有關靜態資料加密的相關主題。與 Oracle 加密 (必須透過設定動作實作) 不同, Google Cloud 會為客戶的靜態資料加密,無須採取任何行動。從結構轉換的角度來看,使用者無須採取任何行動,且加密作業仍會對使用者公開。

如要進一步瞭解 Google Cloud 如何處理傳輸中資料加密功能,請參閱「如何管理傳輸中資料的加密功能」。

稽核

Oracle 提供多種稽核方法,例如標準和精細稽核。相較之下,MySQL 預設不會提供同等的稽核解決方案。為克服這項限制,您可以使用 Google Cloud資訊主頁和監控功能,但為了擷取資料庫 DML/DDL 作業,您可以使用慢速查詢、一般和錯誤記錄做為更可靠的稽核解決方案。

為了實作這個解決方案,建議您使用 FLAGS 例項啟用慢速查詢記錄和一般記錄。此外,您應根據業務需求管理這些記錄的保留期限。

您可以使用 Google Cloud 稽核記錄收集稽核資訊。這些記錄涵蓋三個主要層級:

  • 管理員活動稽核記錄 (預設為啟用)
  • 資料存取稽核記錄 (預設為停用)
    • 請參閱設定資料存取記錄一文。
    • 請注意,資料存取稽核記錄不會記錄可在未登入Google Cloud情況下存取的資源資料存取作業。
  • 系統事件稽核記錄 (預設為啟用)

查看 Google Cloud 稽核記錄

以下是查看稽核記錄的存取路徑: Google Cloud 管理控制台 > 首頁 > 活動

您可以篩選稽核層級之間的資訊精細程度。下圖顯示管理員活動稽核。

稽核層級之間的篩選精細程度。

Cloud Logging 頁面

以下是記錄頁面的存取路徑: Google Cloud 控制台 > Cloud Logging

您可以依據記錄類型篩選資訊精細程度。下圖顯示一般稽核記錄 (使用者、主機和 SQL 陳述式的稽核資料)。

一般稽核記錄。

MySQL 適用的 Cloud SQL 存取控制

使用者可以使用具備授權靜態 IP 位址的 MySQL 用戶端,或使用 Cloud SQL Proxy,以類似於其他資料庫連線的方式連線至 Cloud SQL for MySQL 執行個體。對於 App Engine 或 Compute Engine 等其他連線來源,使用者有幾種選擇,例如使用 Cloud SQL Proxy。如需這些選項的詳細說明,請參閱「執行個體存取權控管」。

作業

本節將說明匯出和匯入、執行個體層級的備份和還原、MySQL 事件排程器 (適用於資料庫工作),以及用於只讀作業和災難復原的待命執行個體。

匯出及匯入

Oracle 執行邏輯匯出和匯入作業的主要方法是使用 EXPDP/IMPDP 指令的 Data Pump 公用程式 (舊版 Oracle 匯出/匯入功能包含 expimp 指令)。MySQL 的對應指令為 mysqldumpmysqlimport 公用程式,可產生轉儲檔案,然後在資料庫或物件層級執行匯入作業 (包括僅匯出及匯入中繼資料)。

對於 Oracle DBMS_DATAPUMP 公用程式 (Oracle 方法,可套用直接與 DBMS_DATAPUMP 套件互動的 EXPDP/IMPDP 功能),沒有直接的 MySQL 等價解決方案。如要從 Oracle DBMS_DATAPUMP PL/SQL 程式碼轉換,請使用其他程式碼 (例如 Bash 或 Python) 實作邏輯元素,並使用 MySQL mysqldumpmysqlimport 執行匯出/匯入作業。

MySQL mysqldumpmysqlimport 公用程式會在用戶端層級執行 (作為 MySQL 用戶端程式的一部分),並遠端連線至 MySQL 適用的 Cloud SQL 執行個體。傾印檔案是在用戶端建立。

mysqldump

用戶端公用程式會執行邏輯備份和資料匯入作業 (以 sql 的形式)。這會產生一組可執行的 SQL 陳述式,用於重現原始資料庫物件定義和資料表資料。mysqldump 公用程式也可以產生 CSV 格式、其他分隔文字或 XML 格式的輸出內容。這個輸出格式的最大優點是,您可以在還原前查看或編輯匯出的輸出內容,因為它是文字檔案。主要缺點是,這並非用於備份大量資料的快速或可擴充的解決方案。

mysqldump 用法:

-- Single database backup & specific tables backup
# mysqldump database_name > outpitfile.sql
# mysqldump database_name tbl1 tbl2 > outpitfile.sql

-- Back up all databases
# mysqldump --all-databases > all_databases.sql

-- Ignore a given table
# mysqldump --databases db1 --ignore-table db1.tbl > outpitfile.sql

-- Back up metadata only - Schema only
# mysqldump --no-data db1 > bck.sql

-- Include stored procedures and functions (routines)
# mysqldump db1 --routines > db1.sql

-- Back up only rows by a given WHERE condition
# mysqldump db1 tbl1 --where="col1=1" > bck.sql

-- Include triggers for each dumped table (default)
# mysqldump db1 tbl1 —triggers > bck.sql

mysqlimport

這是用戶端程式,可為 LOAD DATA INFILE SQL 陳述式提供指令列介面。mysqlimport 常用於將文字或 CSV 檔案中的資料匯入具有對應結構的 MySQL 資料表。Oracle SQL*Loader 可轉換為 mysqlimport,因為兩者都具備從外部檔案載入資料的相同功能。

mysqlimport 用法

-- Example of loading data from a CSV file into a table:
-- Create a table named csv_file
mysql> create table file(col1 int, col2 varchar(10));

-- Create a CSV file (delimited by tab)
# echo 1    A > file.csv
# echo 2    B >> file.csv
# echo 3    C >> file.csv

-- Import the CSV file into the csv_file table
-- Note that the file and table name must be named identically
# mysqlimport -u USER -p -h HOSTNAME/IP DB_NAME --local file.csv
csv_file: Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

-- Verify
# mysql -u USER -p -h HOSTNAME/IP DB_NAME -e "SELECT * FROM file"
+------+------+
| col1 | col2 |
+------+------+
|    1 | A    |
|    2 | B    |
|    3 | C    |
+------+------+

-- Example of using LOAD DATA INFILE to load a CSV file (using the same
   table from the previous example, with the CSV delimiter defined by
   comma)
mysql> LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE file
       FIELDS TERMINATED BY ','
       LINES TERMINATED BY '\n' (col1, col2);

mysql> SELECT * FROM file;
+------+------+
| col1 | col2 |
+------+------+
|    1 | A    |
|    2 | B    |
|    3 | C    |
+------+------+

MySQL 適用的 Cloud SQL 匯出/匯入:

以下說明文件連結說明如何使用 gcloud CLI 與 Cloud SQL 執行個體和 Cloud Storage 互動,以便套用匯出匯入作業。

執行個體層級備份與還原

從 Oracle RMAN 或 Data Pump 遷移至 MySQL 適用的 Cloud SQL 相當簡單,而且還可使用其他備份和還原選項 (例如虛擬機器快照、冷備份或第三方工具)。不需要編寫程式碼或具備額外知識。您可以使用Google Cloud 主控台或 Google Cloud CLI 來管理這項程序。(上述範例是使用第二代 Cloud SQL 執行個體編譯的)。

MySQL 資料庫備份方法類型包括隨選備份自動備份

您可以使用 Cloud SQL for MySQL 資料庫執行個體還原功能,將資料還原至相同的執行個體 (覆寫現有資料),或還原至其他執行個體。您也可以啟用自動備份選項,透過 MySQL 適用的 Cloud SQL 使用二進位檔記錄,將 MySQL 資料庫還原至特定時間點

MySQL 適用的 Cloud SQL 可克隆來源資料庫的獨立版本。這項功能僅適用於主要 (主) 資料庫或其他複本,無法從讀取/複本執行個體取得。您也可以使用這項功能,從某個時間點還原 MySQL 執行個體,以便在需要時復原資料。您可以使用Google Cloud 控制台或 gcloud CLI 套用 MySQL 適用的 Cloud SQL 資料庫還原作業。

MySQL 事件排程器 (資料庫工作)

如要啟動預先定義的資料庫程序,MySQL 事件排程器的功能等同於 Oracle DBMS_JOBS 或 Oracle DBMS_SCHEDULER。根據預設,event_scheduler 資料庫參數會設為 OFF。如有需要,請使用 Cloud SQL 標記將其切換為 ON

您可以使用 MySQL 事件排程器執行明確的 DML/DDL 指令,或在特定時間和特定邏輯下排定儲存程序或函式。

Oracle DBMS_JOBSDBMS_SCHEDULER 的轉換考量:

所有 Oracle 工作都必須手動轉換成 MySQL 語法和功能,或使用市售的 PL/SQL 轉換工具。

使用下列陳述式,驗證用戶端執行作業的目前 event_scheduler 參數值:

mysql> SHOW VARIABLES LIKE '%event_s%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+

事件排程器範例:

  • Oracle DBMS_SCHEDULER

    SQL> BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
       job_name             => 'job_sessions_1d_del',
       job_type             => 'PLSQL_BLOCK',
       job_action           => 'BEGIN DELETE FROM sessions WHERE
                                      session_date < SYSDATE - 1;
                                END;',
       start_date           => SYSTIMESTAMP,
       repeat_interval      => 'FREQ=DAILY',
       end_date             => NULL,
       enabled              =>  TRUE,
       comments             => 'Deletes last day data from the sessions table');
    END;
    /
    
  • MySQL EVENT 轉換:

    mysql> CREATE EVENT job_sessions_1d_del
           ON SCHEDULE EVERY 1 DAY
           COMMENT 'Deletes last day data from the sessions table'
           DO
           DELETE FROM sessions
              WHERE session_date < DATE_SUB(SYSDATE(), INTERVAL 1 DAY);
    
  • MySQL 事件排程器中繼資料:

    mysql> SELECT * FROM INFORMATION_SCHEMA.EVENTS \G;
    
    -- OR
    
    mysql> SHOW EVENTS FROM HR;
    

用於唯讀作業和災難復原導入的待命執行個體

Oracle Active Data Guard 可讓待命執行個體在透過重做和封存記錄套用新資料時,充當唯讀端點。您也可以使用 Oracle GoldenGate,在即時套用資料修改時啟用額外的讀取用途例項,做為變更資料擷取 (CDC) 解決方案。

Cloud SQL for MySQL 支援讀/寫分離功能,可使用唯讀備用資源,將任何讀取或分析工作負載從主要來源,以近乎即時的方式導向其他備用複製來源。您可以使用 Google Cloud 控制台或 gcloud CLI 為 MySQL 適用的 Cloud SQL 讀取副本套用設定。

MySQL 適用的 Cloud SQL 支援其他複寫選項:複寫至外部 MySQL 執行個體從外部 MySQL 執行個體複寫

您可以將 Oracle Active Data Guard 和 Oracle GoldenGate 做為災難復原 (DR) 解決方案,新增已與主要執行個體同步的待命執行個體。

MySQL 適用的 Cloud SQL 唯讀備用資源並非用於備援情況的待命執行個體,因此 Cloud SQL 提供設定 MySQL 執行個體的高可用性功能 (使用 Google Cloud 主控台或 gcloud CLI)。

部分作業可能需要重新啟動執行個體 (例如將 HA 新增至現有的主執行個體)。從高可用性 (HA) 服務水準協議的角度來看,如果主要執行個體大約 60 秒無回應,則系統會在重新連線時提供 HA 待命執行個體。如要為 MySQL 適用的 Cloud SQL 啟用 HA,請參閱以下操作說明

記錄和監控

Oracle 的警示記錄檔是識別一般系統事件和錯誤事件的主要來源,可用於瞭解任何 Oracle 資料庫執行個體的生命週期 (主要用於排解失敗事件和錯誤事件)。

Oracle 快訊記錄會顯示下列資訊:

  • Oracle 資料庫例項錯誤和警告 (ORA- + 錯誤編號)。
  • Oracle 資料庫執行個體啟動和關閉事件。
  • 網路和連線相關問題。
  • 資料庫重做記錄切換事件。
  • 您可能會看到 Oracle 追蹤記錄檔案,並附上特定資料庫事件的詳細資料連結。

此外,Oracle 為不同的服務提供專屬記錄檔,例如 LISTENER、ASM 和 Enterprise Manager (OEM),這些服務在 MySQL 適用的 Cloud SQL 中並沒有相應的元件。

MySQL 適用的 Cloud SQL 記錄類型:

MySQL 記錄類型 說明 附註
活動記錄 包含 API 呼叫或其他管理動作的資料,這些動作會修改 Cloud SQL for MySQL 執行個體的設定或中繼資料。 這個記錄是 Cloud 稽核記錄群組下的三個記錄之一。
資料存取記錄 包含讀取資源設定或中繼資料的 API 呼叫,以及建立、修改或讀取使用者所提供資源資料的使用者驅動 API 呼叫的資料。 這個記錄是 Cloud 稽核記錄群組下的三個記錄之一。請注意,這個記錄只會記錄 MySQL 例項的資料存取作業,且只會記錄可在未登入Google Cloud的情況下存取的事件。
mysql.err
這是 MySQL 主要記錄檔案 可與 Oracle 的警示記錄進行比較。這兩個記錄都會記錄資料庫例項事件,例如啟動和關閉事件,以及錯誤和警告事件。 MySQL 5.7 錯誤訊息指南
mysql-slow.log
MySQL 慢速查詢記錄會收集超出預先定義設定的查詢資料,例如執行時間超過 2 秒 (預設為 10 秒) 的每個查詢。 預設為停用。如要啟用這項記錄,請設定下列變數 (資料庫參數):

  • slow_query_log
  • long_query_time
mysql-general.log
這個記錄會收集用戶端連線和中斷連線的資料,以及針對 MySQL 資料庫執行個體執行的任何 SQL 陳述式。這項記錄可用於疑難排解,通常在作業完成後會變成 OFF 預設為停用。如要啟用,請將 general_log 變數設為 ON
二進位記錄 MySQL 伺服器會使用二進位記錄功能,記錄所有修改資料的陳述式。這個記錄的主要用途是備份和複製。 根據預設,Cloud SQL for MySQL 會啟用二進位記錄參數,以便啟用復原和唯讀備用資源部署作業。如要啟用二進位檔記錄,請將 log_bin 設定參數設為 ON
轉發記錄 保留從主要二進位記錄接收的陳述式,以便在次要執行個體 (唯讀備援) 中實作所有資料修改作業。 僅適用於次要 (從屬) 執行個體和唯讀副本。

查看 MySQL 適用的 Cloud SQL 作業記錄

Cloud Logging 是查看所有記錄詳細資料的主要平台。您可以選取不同的記錄,並依記錄事件層級 (例如「重要」、「錯誤」或「警告」) 進行篩選。您也可以設定事件時間範圍和免費文字篩選條件。

在 Cloud Logging 中查看記錄。

示例

下圖顯示如何使用自訂時間範圍做為篩選條件,在 mysql-slow.log 檔案中尋找特定查詢。

在 mysql-slow.log 中找出查詢。

MySQL 資料庫執行個體監控

Oracle 的主要 UI 監控資訊主頁是 OEM 和 Grid/Cloud Control 產品的一部分 (例如「Top Activity」圖表),可用於在工作階段或 SQL 陳述式層級監控即時資料庫執行個體。MySQL 適用的 Cloud SQL 使用 Google Cloud 控制台提供類似的監控功能。您可以查看 Cloud SQL for MySQL 資料庫執行個體的摘要資訊,其中包含多項監控指標,例如 CPU 使用率、儲存空間使用率、記憶體使用率、讀取/寫入作業、進入/傳出位元組、有效連線等等。

Cloud Logging 支援 MySQL 適用的 Cloud SQL 的其他監控指標。以下螢幕截圖顯示過去 12 小時的 MySQL 查詢圖表。

MySQL 查詢過去 12 小時的圖表。

MySQL 讀取複本監控

您可以使用 Google Cloud 主控台監控指標 (如前所述),以類似於主要執行個體的方式監控讀取副本。此外,我們還有專屬的監控指標,可用於監控複製延遲時間,也就是從主要執行個體到唯讀備用資源執行個體之間的延遲時間 (可透過 Google Cloud 主控台的唯讀備用資源執行個體總覽分頁監控)。

您可以使用 gcloud CLI 擷取複寫狀態

gcloud sql instances describe REPLICA_NAME

您也可以使用 MySQL 用戶端的指令進行複寫監控,該指令會提供主要和子資料庫、二進位記錄和中繼記錄的狀態。

您可以使用下列 SQL 陳述式驗證唯讀備用機制的狀態:

mysql> SHOW SLAVE STATUS;

MySQL 監控

本節將說明基本 MySQL 監控方法,這些方法可視為 DBA (Oracle 或 MySQL) 執行的例行工作。

工作階段監控

Oracle 工作階段監控功能會查詢稱為「V$」的動態效能檢視畫面。V$SESSIONV$PROCESS 檢視畫面通常用於透過 SQL 陳述式,取得目前資料庫活動的即時洞察資訊。您可以使用指令和 SQL 陳述式,監控 MySQL 中的工作階段活動。舉例來說,MySQL SHOW PROCESSLIST 指令可提供工作階段活動的詳細資料,如下所示:

mysql> SHOW PROCESSLIST;

您也可以使用 SELECT 陳述式查詢及篩選 SHOW PROCESSLIST 結果:

mysql>  SELECT * FROM information_schema.processlist;

長時間交易監控

如要即時找出可能導致效能問題的長時間交易,您可以查詢 information_schema.innodb_trx 動態檢視畫面。這個檢視畫面只會顯示在 MySQL 資料庫執行個體中執行的開放式交易記錄。

鎖定監控

您可以使用 information_schema.innodb_locks 動態檢視畫面監控資料庫鎖定,該畫面會提供可能導致效能問題的鎖定事件即時資訊。