將 Oracle 使用者遷移至 MySQL 適用的 Cloud SQL:術語和功能

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

術語

本節將詳細說明 Oracle 和 MySQL 適用的 Cloud SQL 之間的資料庫術語相似之處和差異。並比較各資料庫平台的核心層面。由於架構上的差異 (例如,Oracle 12c 推出了多租戶功能),因此比較結果會區分 Oracle 11g 和 12c 版本。本文所參照的 MySQL 適用 Cloud SQL 版本為 5.7.x。

Oracle 11g 和 MySQL 適用的 Cloud SQL 之間的用語差異

Oracle 11g 說明 MySQL 適用的 Cloud SQL 主要差異
執行個體 單一 Oracle 11g 執行個體只能容納一個資料庫。 執行個體 一個 MySQL 執行個體可以容納多個資料庫。
資料庫 資料庫可視為單一執行個體 (資料庫名稱與執行個體名稱相同)。 資料庫 多個或單一資料庫可為多個應用程式提供服務。
結構定義 結構定義和使用者是相同的,因為兩者都視為資料庫物件的擁有者 (使用者可在未指定或未分配至結構定義的情況下建立)。 結構定義 結構定義稱為資料庫,而資料庫物件是在特定結構定義/資料庫下建立。
User 與結構定義相同,因為兩者都是資料庫物件的擁有者,例如:例項 → 資料庫 → 結構定義/使用者 → 資料庫物件。 User 資料庫使用者具備特定權限,可連結或修改特定結構定義/資料庫的資料庫物件,例如執行個體 → 資料庫/結構定義 → 資料庫物件。
角色 定義的一組資料庫權限,可做為群組鏈結,並指派給資料庫使用者。 MySQL 權限 MySQL 5.7 不支援角色管理。您可以使用 GRANT 子句設定權限,讓使用者在不同層級 (讀取/寫入等) 上擁有資料庫物件的權限。
管理員/系統使用者 擁有最高存取權的 Oracle 管理員使用者:
SYS
SYSTEM
超級使用者 部署完成後,Cloud SQL for MySQL 就會擁有 root@'%' 使用者 (可從任何主機連線) 和名為 mysql.sys 的額外使用者,後者只能從 localhost 連線。
字典/中繼資料 Oracle 會使用下列中繼資料表:
USER_TableName
ALL_TableName
DBA_TableName
字典/中繼資料 MySQL 會使用多個資料庫/結構定義字典/結構描述:
MYSQL
INFORMATION_SCHEMA
PERFORMANCE_SCHEMA
SYS
每個資料庫也都是系統資料庫,並會在每個 MySQL 適用的 Cloud SQL 部署中建立。
系統動態檢視畫面 Oracle 動態檢視畫面:
V$ViewName
系統動態檢視畫面 您可以在多個系統資料庫中找到 MySQL 動態檢視畫面:
INFORMATION_SCHEMA
PERFORMANCE_SCHEMA
SYS
Tablespace Oracle 資料庫的主要邏輯儲存結構;每個表格空間可容納一或多個資料檔案。 Tablespace 與 Oracle 類似,MySQL 資料表空間也是邏輯單位,但只代表單一資料表,這與 Oracle 資料表空間不同,後者可包含多個資料檔案 (可容納多個資料表的資料)。

MySQL 支援使用已分配的資料檔案建立新資料表空間,然後建立附加至新建立資料表空間的新資料表。請注意,使用資料庫參數設定表格空間設定 (例如大小和限制),而非在建立表格空間時設定。
資料檔案 Oracle 資料庫的實體元素,用於儲存資料,並在特定的資料表空間下定義。

單一資料檔案的初始大小和最大大小已定義,且可容納多個資料表的資料。

Oracle 資料檔案使用 .dbf 後置字元 (非必要)。
資料檔案 MySQL 適用的 Cloud SQL 會使用 innodb_file_per_table 參數,其值為「ON」(預設值);此設定會為每個資料表和專屬的資料表空間產生新的資料檔案。

MySQL 資料檔案會使用 .ibd (資料) 和 .frm (中繼資料) 檔案。
系統表格空間 包含整個 Oracle 資料庫的資料字典資料表和檢視物件。 系統表格空間 與 Oracle 相同,包含字典/中繼資料資料表。儲存在與 ibdata1 資料檔案連結的 innodb_system 表格空間中。
臨時表格空間 包含在工作階段期間有效的架構物件;此外,還支援無法在伺服器記憶體中執行的運算。 臨時表格空間 用途與 Oracle 相同,儲存在附加 ibtmp1 資料檔案的 MySQL innodb_temporary 表格空間中。
復原
tablespace
特殊類型的系統永久表空間,Oracle 會在自動取消作業管理模式 (預設) 下執行資料庫時,使用此類型管理回溯作業。 復原資料表空間 與 Oracle 類似,MySQL Undo 表格空間包含用於回溯的撤銷記錄。根據預設,這個選項會設為 OFF,並在日後的 MySQL 版本中列為已淘汰
ASM Oracle 自動儲存空間管理系統是整合式高效能資料庫檔案系統,由使用 ASM 設定的 Oracle 資料庫自動執行。 不支援 MySQL 使用「儲存引擎」一詞來描述不同的資料處理實作方式,但不支援 Oracle ASM。MySQL 適用的 Cloud SQL 支援許多提供儲存空間自動化功能的功能,例如自動增加儲存空間、效能和可擴充性。
資料表/檢視畫面 使用者建立的基本資料庫物件。 資料表/檢視畫面 與 Oracle 相同。
具體化檢視表 使用特定 SQL 陳述式定義,可根據特定設定手動或自動重新整理。 MySQL 不支援 解決方法是使用觸發事件/檢視畫面,而非 Oracle 具象化檢視畫面。
順序 Oracle 專屬值產生器。 自動遞增 MySQL 不支援 Oracle 序列;請使用 AUTO_INCREMENT 做為自動序列產生功能的替代解決方案。
同義詞 Oracle 資料庫物件,可做為其他資料庫物件的替代 ID。 不支援 MySQL 不支援 Oracle 同義字。為解決這個問題,您可以設定適當的權限,然後使用檢視表。
分區 Oracle 提供許多分割解決方案,可將大型資料表拆分為較小的可管理區塊。 分區 MySQL 的分割支援功能較為有限,但可保留資料管理和維護作業,例如 Oracle 分割區。
Flashback 資料庫 Oracle 專屬功能,可用於將 Oracle 資料庫初始化至先前定義的時間,讓您查詢或還原不小心修改或損壞的資料。 不支援 如要採用其他解決方案,您可以使用 Cloud SQL 備份和時間點復原功能,將資料庫還原至先前的狀態 (例如在表格刪除前還原)。
sqlplus Oracle 指令列介面,可讓您查詢及管理資料庫執行個體。 mysql 可用於查詢及管理的 MySQL 等級指令列介面。可從具備適當 Cloud SQL 權限的任何用戶端連線。
PL/SQL Oracle 將程序語言擴充為 ANSI SQL。 MySQL MySQL 有自己的擴充程序語言,具有不同的語法和實作方式,且沒有為這項擴充語言提供額外命名。
套件與套件主體 Oracle 專屬功能,可將儲存程序和函式分組至相同的邏輯參照。 不支援 MySQL 支援以群組配置的形式,將預存程序和函式做為單一物件。
預存程序和函式 使用 PL/SQL 實作程式碼功能。 預存程序和函式 MySQL 支援使用專屬程序語言實作來建立儲存程序和函式。
觸發條件 Oracle 物件,用於控制資料表的 DML 實作。 觸發條件 與 Oracle 相同。
PFILE/SPFILE Oracle 例項和資料庫層級參數會儲存在名為 SPFILE 的二進位檔案中 (在先前版本中,該檔案名為 PFILE),可用作手動設定參數的文字檔。 MySQL 適用的 Cloud SQL 資料庫標記 您可以透過資料庫旗標公用程式設定或修改 Cloud SQL for MySQL 參數。您無法使用 MySQL 用戶端指令列介面 (例如 mysql> SET GLOBAL ...) 變更 Cloud SQL for MySQL 中的資料庫參數。您只能使用資料庫旗標公用程式變更這些參數。
SGA/PGA/AMM 控制資料庫執行個體記憶體配置的 Oracle 記憶體參數。 INNODB_BUFFER_POOL_SIZE MySQL 有自己的記憶體參數。等效的參數可能是 INNODB_BUFFER_POOL_SIZE。在 MySQL 適用的 Cloud SQL 中,這個參數是由所選執行個體類型預先定義,並且會根據該值進行變更。
結果快取 從緩衝區快取擷取資料列,藉此減少 SQL I/O 作業,這些資料列可在工作階段層級使用資料庫參數和提示進行管理。 查詢快取 與 Oracle 結果快取具有相同的基本用途,可在資料庫層級和工作階段層級管理。
資料庫提示 控制 SQL 陳述式對最佳化器行為的影響,以便提升效能。Oracle 有超過 50 種不同的資料庫提示。 資料庫提示 與 Oracle 相比,MySQL 支援的資料庫提示有限 (最佳化工具提示和索引提示)。請注意,MySQL 會使用不同的資料庫提示、語法和命名方式。
RMAN Oracle Recovery Manager 公用程式。用於備份資料庫,並提供擴充功能,以支援多種災難復原情境和其他功能 (複製等)。 MySQL 適用的 Cloud SQL 備份 MySQL 適用的 Cloud SQL 提供兩種方法來套用完整備份:隨選備份和自動備份。
資料匯入工具 (EXPDP/IMPDP) Oracle 傾印產生公用程式,可用於許多功能,例如匯出/匯入、資料庫備份 (在結構定義或物件層級)、結構定義中繼資料、產生結構定義 SQL 檔案等。
mysqldump/mysqlimport
MySQL 傾印 (匯出) 公用程式,可透過遠端連線做為用戶端,並產生傾印檔案 (SQL)。之後,您可以壓縮傾印檔案並將其移至 Cloud Storage。mysqldump 公用程式僅適用於匯出步驟。
SQL*Loader 這項工具可讓您從外部檔案 (例如文字檔、CSV 檔案等) 上傳資料。
mysqlimport/
LOAD FILE INFILE
mysqlimport 公用程式可將文字或 CSV 檔案 (Oracle 支援其他檔案格式) 載入至具有對應結構的資料庫資料表。
Data Guard 使用待命例項的 Oracle 災難復原解決方案,可讓使用者從待命例項執行「READ」作業。 MySQL 適用的 Cloud SQL 高可用性和複寫功能 為了達成災難復原或高可用性,MySQL 適用的 Cloud SQL 提供容錯移轉備用資源架構,並使用讀取備用資源執行唯讀作業 (讀取/寫入分離)。
Active Data Guard/Golden Gate Oracle 的主要複製解決方案,可用於多種用途,例如備援 (DR)、唯讀執行個體、雙向複製 (多來源)、資料倉儲等等。 MySQL 適用的 Cloud SQL 唯讀備用資源 使用 MySQL 適用的 Cloud SQL Read Replica,透過 READ/WRITE 分離功能實作叢集。目前不支援多來源設定,例如 Golden Gate 雙向複製或異質複製。
RAC Oracle Real Application Cluster。Oracle 專屬分群法解決方案,可透過單一儲存空間部署多個資料庫執行個體,提供高可用性。 不支援 Google CloudCloud SQL 尚不支援多來源架構。如要實現具備讀/寫分離和高可用性的叢集架構,請使用 Cloud SQL 高可用性和讀取備用資源。
電網/雲端控制 (原始設備製造商) Oracle 軟體,可用於以網頁應用程式格式管理及監控資料庫和其他相關服務。這項工具可用於即時資料庫分析,以瞭解高工作負載。 MySQL 適用的 Cloud SQL 主控台、Cloud Monitoring 使用 MySQL 適用的 Cloud SQL 進行監控,包括詳細的時間和資源圖表。您也可以使用 Cloud Monitoring 儲存特定的 MySQL 監控指標和記錄檔分析,以便使用進階監控功能。
重做記錄 Oracle 交易記錄,由兩個或多個預先配置的定義檔案組成,可儲存所有資料修改作業。重做記錄的目的是在執行個體發生故障時保護資料庫。 重做記錄 MySQL 也有重做記錄檔案,可在當機復原期間使用,修正由不完整交易重做記錄機制所寫入的資料。
封存記錄檔 封存記錄可支援備份和複製作業等功能。在每次重做記錄切換作業後,Oracle 會寫入封存記錄 (如果已啟用)。 binlog MySQL 實作交易記錄保留功能。主要用於複製目的 (Cloud SQL 預設為啟用)。
控制檔案 Oracle 控制檔案會保留資料庫的相關資訊,例如資料檔案、重做記錄檔名稱和位置、目前記錄序號,以及執行個體檢查點的相關資訊。 MySQL MySQL 架構不包含類似 Oracle 實作方式的控制檔案。這項功能會透過 MySQL 參數控制,並使用 SHOW MASTER STATUS 指令查看目前的二進位記錄位置。
SCN Oracle SCN (系統變更編號) 是所有 Oracle 資料庫元件維持資料一致性的主要方法,可滿足交易的 ACID 模型。 記錄檔序號 資料庫一致性的 MySQL 實作項目會使用 LSN (記錄序號)。
AWR Oracle AWR (自動工作負載存放區) 是詳細報表,可提供 Oracle 資料庫執行個體效能相關詳細資訊,並被視為用於效能診斷的 DBA 工具。
performance_schema
MySQL 沒有與 Oracle AWR 等同的報表,但會收集 performance_schema 收集到的效能資料。另一個解決方案是使用 MySQL Workbench 效能資訊主頁。
DBMS_SCHEDULER
Oracle 公用程式,用於設定及計時預先定義的作業。
EVENT_SCHEDULER
MySQL 資料庫內部排程器功能。根據預設,這項功能會設為 OFF
透明資料加密 將儲存在磁碟上的資料加密,以便提供靜態資料保護機制。 Cloud SQL 進階加密標準 Cloud SQL for MySQL 會使用 256 位元進階加密標準 (AES-256),為靜態資料和傳輸中資料提供安全防護
進階壓縮 為改善資料庫儲存空間、降低儲存空間費用,並提升資料庫效能,Oracle 提供資料 (資料表/索引) 進階壓縮功能。 InnoDB 資料表壓縮功能 MySQL 提供資料表壓縮功能,方法是使用 ROW_FORMAT 參數 (已設為 COMPRESSED) 建立資料表。進一步瞭解索引壓縮
SQL Developer Oracle 免費 SQL GUI,可用於管理及執行 SQL 和 PL/SQL 陳述式 (也可與 MySQL 搭配使用)。 MySQL Workbench MySQL 免費 SQL GUI,可用於管理及執行 SQL 和 MySQL 程式碼陳述式。
快訊記錄 一般資料庫作業和錯誤的 Oracle 主記錄。 MySQL 錯誤記錄 使用 Cloud Logging 記錄檢視器監控 MySQL 錯誤記錄
DUAL 資料表 Oracle 特殊表格,主要用於擷取虛擬資料欄值,例如 SYSDATEUSER DUAL 資料表 MySQL 允許在 SQL 陳述式中將 DUAL 指定為資料表,且不依賴任何資料表的資料。
外部資料表 Oracle 允許使用者建立外部資料表,在資料庫外部檔案中提供來源資料。 不支援 沒有直接對應的功能。
Listener Oracle 網路程序,負責監聽傳入的資料庫連線 Cloud SQL 授權網路 在 Cloud SQL 的「Authorized Networks」設定頁面中允許後,MySQL 就會接受來自遠端來源的連線
TNSNAMES Oracle 網路設定檔,定義資料庫位址,以便透過連線別名建立連線。 不存在 MySQL 會接受使用 Cloud SQL 執行個體連線名稱或私人/公開IP 位址的外部連線。Cloud SQL Proxy 是另一種安全存取方法,可連線至 Cloud SQL for MySQL (第二代執行個體),無須允許特定 IP 位址或設定 SSL。
執行個體的預設通訊埠 1521 執行個體的預設通訊埠 3306
資料庫連結 Oracle 結構定義物件,可用於與本機/遠端資料庫物件互動。 不支援 如要使用其他解決方法,請使用應用程式程式碼連線至遠端資料庫並擷取資料。

Oracle 12c 和 MySQL 適用的 Cloud SQL 之間的用語差異

Oracle 12c 說明 MySQL 適用的 Cloud SQL 主要差異
執行個體 Oracle 12c 執行個體中導入的多用戶群功能,可將多個資料庫設為可插入資料庫 (PDB),而非 Oracle 11g,因為在 Oracle 11g 中,Oracle 執行個體只能取得一個資料庫。 執行個體 MySQL 適用的 Cloud SQL 可容納多個資料庫,並以不同的命名方式提供多項服務和應用程式。
CDB 多租戶容器資料庫 (CDB) 可支援一或多個 PDB,同時可建立 CDB 全域物件 (影響所有 PDB),例如角色。 MySQL 執行個體 MySQL 執行個體可與 Oracle CDB 相提並論。兩者都為 PDB 提供系統層。
PDB PDB (可插入式資料庫) 可用於隔離服務和應用程式,並可做為可攜式結構定義集合。 MySQL 資料庫/結構定義 MySQL 資料庫可為多項服務、應用程式和許多資料庫使用者提供服務。
工作階段序列 從 Oracle 12c 開始,您可以在工作階段層級 (只會在工作階段內傳回唯一值) 或全域層級 (例如使用暫存資料表時) 建立序號。 自動
遞增
MySQL 不支援序列,但使用者可以使用 AUTO_INCREMENT 資料欄屬性做為替代方案。
身分識別欄 Oracle 12c IDENTITY 類型會產生序列,並將其與資料表欄建立關聯,而不需要手動建立個別的序列物件。 自動遞增 使用 AUTO_INCREMENT 欄屬性模擬 Oracle 12c 身分欄的功能 (自動序列產生功能的替代方案)。
資料分割 Oracle 分割是一種解決方案,可將一個 Oracle 資料庫分割成多個較小的資料庫 (分割區),以便為 OLTP 環境提供可擴充性、可用性和地理分布。 不支援 (做為功能) MySQL 沒有等同的區塊功能。您可以使用 MySQL (做為資料平台) 搭配支援的應用程式層,實作區塊處理。
記憶體內建資料庫 Oracle 提供一系列功能,可改善 OLTP 和混合工作負載的資料庫效能。 不支援 MySQL 沒有等同的功能。您可以改用 Memorystore
遮蓋 作為 Oracle 進階安全性功能的一部分,遮蓋功能可執行資料欄遮蓋作業,防止使用者和應用程式顯示機密資料。 不支援 MySQL 沒有等同的功能。

功能

雖然 Oracle 11g/12c 和 MySQL 適用的 Cloud SQL 資料庫適用於不同的架構 (基礎架構和擴充程序語言),但兩者都具備關聯式資料庫的相同基本要素。這些物件支援資料庫物件、多使用者並行工作負載和交易 (ACID 相容性)。它們還會管理鎖定爭用情形,支援多個隔離層級 (取決於業務需求),並做為線上交易處理 (OLTP) 作業和線上分析處理 (OLAP) 的關聯資料儲存庫,滿足持續性的應用程式需求。

以下章節將概略說明 Oracle 與 MySQL 適用的 Cloud SQL 之間的一些主要功能差異。在某些情況下,如果有需要,這個部分會提供詳細的技術比較資料。

建立及查看現有資料庫

Oracle 11g/12c MySQL 適用的 Cloud SQL 5.7
您通常會使用 Oracle 資料庫建立輔助程式 (DBCA) 公用程式建立資料庫,並查看現有資料庫。手動建立的資料庫或執行個體需要指定其他參數:
SQL> CREATE DATABASE ORADB
     USER SYS IDENTIFIED BY password
     USER SYSTEM IDENTIFIED BY password
     EXTENT MANAGEMENT LOCAL
     DEFAULT TEMPORARY TABLESPACE temp
     UNDO TABLESPACE undotbs1
     DEFAULT TABLESPACE users;
使用 CREATE DATABASE Name; 陳述式格式,如以下範例所示:
mysql> CREATE DATABASE MYSQLDB;
Oracle 12c MySQL 適用的 Cloud SQL 5.7
在 Oracle 12c 中,您可以從種子建立 PDB,方法是從容器資料庫 (CDB) 範本或現有 PDB 的複本。您使用了多個參數:

SQL> CREATE PLUGGABLE DATABASE PDB
     ADMIN USER usr IDENTIFIED BY passwd
     ROLES = (dba)
     DEFAULT TABLESPACE sales
     DATAFILE '/disk1/ora/dbs/db/db.dbf'
     SIZE 250M AUTOEXTEND ON
     FILE_NAME_CONVERT =
     ('/disk1/oracle/dbs/pdbseed/',
      '/disk1/oracle/dbs/salespdb/')
      STORAGE (MAXSIZE 2G)
      PATH_PREFIX =
      '/disk1/oracle/dbs/salespdb/';
請使用 CREATE DATABASE Name; 形式的陳述式,如以下範例所示:
mysql> CREATE DATABASE MYSQLDB;
列出所有 PDB:
SQL> SHOW is PDBS;
列出所有現有資料庫:
mysql> SHOW DATABASES;
連線至其他 PDB:
SQL> ALTER SESSION SET CONTAINER=pdb;
連線至其他資料庫:
mysql> use databaseName;
或:
mysql> \u databaseName;
開啟或關閉特定 PDB (開啟/唯讀):
SQL> ALTER PLUGGABLE DATABASE pdb CLOSE;
不支援單一資料庫。

所有資料庫都位於同一個 MySQL 適用的 Cloud SQL 執行個體中,因此所有資料庫都會一併上線或下線。

透過 Cloud SQL 主控台管理資料庫

  • 在 Google Cloud 控制台中,依序前往「Storage」>「SQL」>「Instance」>「Databases」>「View/Create」

    用於建立/查看 MySQL 資料庫的控制台頁面。

系統資料庫和結構定義

Oracle 資料庫例項會取得特定系統架構 (例如 SYS/SYSTEM),並具備資料庫中繼資料物件的擁有者角色。

相反地,MySQL 會保留多個系統資料庫 (與 Oracle 結構定義相反),用於中繼資料層 (請注意,資料庫名稱會區分大小寫):

  • Mysql

    mysql 系統資料庫會保留資料表,用於儲存 MySQL 伺服器在執行時所需的資訊,例如:

    • 系統權限表
    • 物件資訊表
    • 記錄系統表
    • 複製系統表
    • 最佳化工具系統表
    • 時區系統表
  • INFORMATION_SCHEMA

    INFORMATION_SCHEMA 是主要資料庫資料字典和系統目錄。它可讓您存取資料庫中繼資料,也就是 MySQL 伺服器的內部資料庫資訊,例如資料庫或資料表名稱、資料欄資料類型和存取權限。

  • performance_schema

    系統資料庫,用於收集 MySQL 執行個體的統計資訊。performance_schema 系統資料庫會保存用於監控伺服器執行作業的細微指標。這個結構定義會在執行期間提供伺服器內部執行檢查,並可做為分析資料庫效能問題的主要來源。

    根據預設,使用 MySQL 適用的 Cloud SQL 時,performance_schema 不會啟用。如要啟用結構定義,請使用 gcloud 指令列工具:

    gcloud sql instances patch INSTANCE_NAME --database-flags performance_schema=on
    

    如要完成這項設定,您必須重新啟動執行個體。您無法使用 Google Cloud 主控台中的 Cloud SQL for MySQL 資料庫旗標頁面修改 --database-flags 參數。

  • sys

    sys 結構定義自 MySQL 5.5.7 版起便存在,主要用於儲存 performance_schema 系統資料表的檢視畫面。這個結構定義提供更易讀的檢視畫面組合,可將 performance_schema 資料彙整成更易於理解的形式。sys 結構定義也會保留多個已儲存的程序和函式,用於執行操作,例如設定 performance_schema 和產生診斷報告。

    只有在啟用 performance_schema 時,sys 結構定義才會顯示資訊。

查看中繼資料和系統動態檢視畫面

本節將概略說明 Oracle 中使用的幾個最常見的中繼資料資料表和系統動態檢視畫面,以及 Cloud SQL for MySQL 5.7 版中的對應資料庫物件。

Oracle 提供數百個系統中繼資料表和檢視畫面,而 MySQL 僅保留數十個。每個情況都可能有一個以上的資料庫物件,用於特定用途。

Oracle 提供多個層級的中繼資料物件,每個層級都需要不同的權限:

  • USER_TableName:可供使用者查看。
  • ALL_TableName:所有使用者均可查看。
  • DBA_TableName:只有具備 DBA 權限的使用者 (例如 SYSSYSTEM) 才能查看。

針對動態成效檢視畫面,Oracle 會使用 V$GV$ 前置字串。如要讓 MySQL 使用者能夠查看系統中繼資料資料表或檢視表,他們必須具備系統物件的特定權限。如要進一步瞭解安全性,請參閱「安全性」一節。

中繼資料類型 Oracle 資料表/檢視表 MySQL 資料表/檢視/顯示 (MySQL 指令)
開啟工作階段
V$SESSION
SHOW PROCESSLIST
INFORMATION_SCHEMA.PROCESSLIST
performance_schema.threads
執行交易
V$TRANSACTION
INFORMATION_SCHEMA.INNODB_TRX
資料庫物件
DBA_OBJECTS
不支援。根據物件類型查詢每個物件。
Tables
DBA_TABLES
INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.INNODB_SYS_TABLES
資料表欄
DBA_TAB_COLUMNS
INFORMATION_SCHEMA.COLUMNS
INFORMATION_SCHEMA.INNODB_SYS_COLUMNS
資料表和資料欄權限
TABLE_PRIVILEGES
DBA_COL_PRIVS
ROLE_TAB_PRIVS
INFORMATION_SCHEMA.COLUMN_PRIVILEGES
分區
DBA_TAB_PARTITIONS
DBA_TAB_SUBPARTITIONS
INFORMATION_SCHEMA.PARTITIONS
SHOW CREATE TABLE TableName
SHOW TABLE STATUS LIKE 'TableName'
觀看次數
DBA_VIEWS
INFORMATION_SCHEMA.VIEWS
限制
DBA_CONSTRAINTS
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
SHOW CREATE TABLE TableName
索引
DBA_INDEXES
DBA_PART_INDEXES
INFORMATION_SCHEMA.STATISTICS
INFORMATION_SCHEMA.INNODB_SYS_INDEXES
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
具體化檢視表
DBA_MVIEWS
不支援
預存程序
DBA_PROCEDURES
INFORMATION_SCHEMA.ROUTINES
儲存函式
DBA_PROCEDURES
INFORMATION_SCHEMA.ROUTINES
觸發條件
DBA_TRIGGERS
INFORMATION_SCHEMA.TRIGGERS
使用者
DBA_USERS
mysql.user
使用者權限
DBA_SYS_PRIVS
DBA_ROLE_PRIVS
SESSION_PRIVS
INFORMATION_SCHEMA.USER_PRIVILEGES
工作/
排程器
DBA_JOBS
DBA_JOBS_RUNNING
DBA_SCHEDULER_JOBS
DBA_SCHEDULER_JOB_LOG
INFORMATION_SCHEMA.EVENTS
Tablespaces
DBA_TABLESPACES
INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES
資料檔案
DBA_DATA_FILES
INFORMATION_SCHEMA.FILES
INFORMATION_SCHEMA.INNODB_SYS_DATAFILES
同義詞
DBA_SYNONYMS
不支援
序列
DBA_SEQUENCES
不支援
資料庫連結
DBA_DB_LINKS
不支援
統計資料
DBA_TAB_STATISTICS
DBA_TAB_COL_STATISTICS
DBA_SQLTUNE_STATISTICS
DBA_CPU_USAGE_STATISTICS
INFORMATION_SCHEMA.STATISTICS
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
SHOW INDEXES FROM TableName
智慧門鎖
DBA_LOCK
DBA_DDL_LOCKS
DBA_DML_LOCKS
V$SESSION_BLOCKERS
V$LOCKED_OBJECT
INFORMATION_SCHEMA.INNODB_LOCKS
INFORMATION_SCHEMA.INNODB_LOCK_WAITS
INFORMATION_SCHEMA.INNODB_TRX
performance_schema.metadata_locks
performance_schema.rwlock_instances
SHOW PROCESSLIST
資料庫參數
V$PARAMETER
V$NLS_PARAMETERS
SHOW PARAMETER Param
performance_schema.global_variables
performance_schema.session_variables
INFORMATION_SCHEMA.CHARACTER_SETS
SHOW VARIABLES LIKE '%variable%';
區隔
DBA_SEGMENTS
不支援區隔資料表。根據物件類型查詢每個物件。
角色
DBA_ROLES
DBA_ROLE_PRIVS
USER_ROLE_PRIVS
Roles not supported use instead:
information_schema.COLUMN_PRIVILEGES
information_schema.SCHEMA_PRIVILEGES
information_schema.TABLE_PRIVILEGES
information_schema.USER_PRIVILEGES
mysql.columns_priv
mysql.procs_priv
mysql.proxies_priv
mysql.tables_priv
工作階段記錄
V$ACTIVE_SESSION_HISTORY
DBA_HIST_*
sys.statement_analysis
performance_schema.events_stages_history
performance_schema.events_stages_history_long
performance_schema.events_statements_history
performance_schema.events_statements_history_long
performance_schema.events_transactions_history
performance_schema.events_transactions_history_long
performance_schema.events_waits_history
performance_schema.events_waits_history_long
版本
V$VERSION
sys.version
SHOW VARIABLES LIKE '%version%';
等待事件
V$WAITCLASSMETRIC
V$WAITCLASSMETRIC_HISTORY
V$WAITSTAT
V$WAIT_CHAINS
performance_schema.events_waits_current
performance_schema.events_waits_history
performance_schema.events_waits_history_long
sys.innodb_lock_waits
sys.io_global_by_wait_by_bytes
sys.io_global_by_wait_by_latency
sys.schema_table_lock_waits
sys.wait_classes_global_by_avg_latency
sys.wait_classes_global_by_latency
sys.waits_by_host_by_latency
sys.waits_by_user_by_latency
sys.waits_global_by_latency
SQL 微調和
分析
V$SQL
V$SQLAREA
V$SESS_IO
V$SYSSTAT
V$STATNAME
V$OSSTAT
V$ACTIVE_SESSION_HISTORY
V$SESSION_WAIT
V$SESSION_WAIT_CLASS
V$SYSTEM_WAIT_CLASS
V$LATCH
V$SYS_OPTIMIZER_ENV
V$SQL_PLAN
V$SQL_PLAN_STATISTICS
performance_schema.events_statements_current
performance_schema.events_statements_history
performance_schema.events_statements_history_long
sys.statement_analysis
sys.host_summary_by_statement_latency
sys.host_summary_by_statement_type
sys.statements_with_errors_or_warnings
sys.statements_with_full_table_scans
sys.statements_with_runtimes_in_95th_percentile
sys.statements_with_sorting
sys.statements_with_temp_tables
sys.user_summary_by_statement_latency
sys.user_summary_by_statement_type
slow-query-log
general-log
SHOW STATUS LIKE '%StatusName%';
執行個體
記憶體調整
V$SGA
V$SGASTAT
V$SGAINFO
V$SGA_CURRENT_RESIZE_OPS
V$SGA_RESIZE_OPS
V$SGA_DYNAMIC_COMPONENTS
V$SGA_DYNAMIC_FREE_MEMORY
V$PGASTAT
information_schema.INNODB_CMPMEM_RESET
information_schema.INNODB_CMPMEM
performance_schema.memory_summary_by_account_by_event_name
performance_schema.memory_summary_by_host_by_event_name
performance_schema.memory_summary_by_thread_by_event_name
performance_schema.memory_summary_by_user_by_event_name
performance_schema.memory_summary_global_by_event_name
performance_schema.replication_group_member_stats
performance_schema.replication_group_members
sys.memory_by_host_by_current_bytes
sys.memory_by_thread_by_current_bytes
sys.memory_by_user_by_current_bytes
sys.memory_global_by_current_bytes
sys.memory_global_total

MySQL 儲存引擎

與許多其他 RDBMS (包括 Oracle) 不同,MySQL 可透過可插入的儲存系統以多重形式運作。MySQL 可插入式儲存引擎架構可讓資料庫管理員依據特定應用程式需求,選取專用儲存引擎。

MySQL 資料庫伺服器中的 MySQL 可插入式儲存引擎元件,負責執行資料 I/O 作業,包括將資料儲存至磁碟或記憶體緩衝區。可插拔的儲存空間引擎架構提供一組標準管理和支援服務,這些服務在所有基礎儲存空間引擎中都很常見。

從 MySQL 5.5 以上版本開始,預設的儲存引擎為 InnoDB 儲存引擎,而 InnoDB 也會處理暫存資料表。您可以在表格 CREATEALTER 期間設定儲存引擎,如下例所示:

mysql> SHOW CREATE TABLE JOBS \G;

輸出內容如下:

*************************** 1. row ***************************
       Table: JOBS
Create Table: CREATE TABLE `JOBS` (
  `JOB_ID` varchar(10) NOT NULL,
  `JOB_TITLE` varchar(35) NOT NULL,
  `MIN_SALARY` decimal(6,0) DEFAULT NULL,
  `MAX_SALARY` decimal(6,0) DEFAULT NULL,
  PRIMARY KEY (`JOB_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

詳情請參閱 MySQL 不同儲存引擎
您可以使用下列查詢查看儲存引擎設定:

mysql> SHOW VARIABLES LIKE '%storage%';

輸出結果會與下列內容相似:

+----------------------------------+--------+
| Variable_name                    | Value  |
+----------------------------------+--------+
| default_storage_engine           | InnoDB |
| default_tmp_storage_engine       | InnoDB |
| disabled_storage_engines         |        |
| enforce_storage_engine           | Innodb |
| internal_tmp_disk_storage_engine | InnoDB |
+----------------------------------+--------+

您可以查看所有內建儲存引擎:

mysql> SHOW STORAGE ENGINES;

輸出結果會與下列內容相似:

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

請注意,InnoDB 是預設的儲存引擎,也是唯一支援交易的儲存引擎 (符合 ACID)。由於 InnoDB 是唯一可提供類似 Oracle 功能的儲存引擎,因此建議您隨時使用 InnoDB。適用於 MySQL 的 Cloud SQL 第二代僅支援 InnoDB 儲存引擎。

系統參數

您可以對 Oracle 和 MySQL 適用的 Cloud SQL 資料庫進行特定設定,以便在預設設定之外實現特定功能。如要變更 Oracle 中的設定參數,您必須具備特定管理權限 (主要是 SYS/SYSTEM 使用者權限)。

以下是使用 ALTER SYSTEM 陳述式變更 Oracle 設定的範例。在這個範例中,使用者只會在 spfile 設定層級變更「登入失敗的最大嘗試次數」參數 (修改內容僅在重新啟動後才會生效):

SQL> ALTER SYSTEM SET SEC_MAX_FAILED_LOGIN_ATTEMPTS=2 SCOPE=spfile;

在下一個範例中,使用者只要求查看 Oracle 參數值:

SQL> SHOW PARAMETER SEC_MAX_FAILED_LOGIN_ATTEMPTS;

輸出結果會與下列內容相似:

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sec_max_failed_login_attempts        integer     2

Oracle 參數修改功能適用於三個範圍:

  • SPFILE:參數修改內容會寫入 Oracle spfile,且需要重新啟動執行個體,參數才會生效。
  • 記憶體:參數修改作業只會套用至記憶體層,且不允許變更靜態參數。
  • BOTH:參數修改會套用至伺服器參數檔案和執行個體記憶體,且不允許變更靜態參數。

MySQL 適用的 Cloud SQL 設定標記

您可以使用 Google Cloud 控制台、gcloud CLI 或 CURL 中的設定旗標來修改 Cloud SQL for MySQL 系統參數。請參閱 完整的所有參數清單,瞭解 Cloud SQL 適用的 MySQL 支援哪些參數,並可供您變更。

MySQL 參數可分為以下幾個範圍:

  • 動態參數:可在執行期間變更。
  • 靜態參數:必須重新啟動執行個體,設定才會生效。
  • 全域參數:會對所有目前和未來的工作階段產生全域影響。
  • 工作階段參數:只能在工作階段層級變更,且只適用於目前工作階段的生命週期,與其他工作階段分開。

Cloud SQL for MySQL 記憶體參數 innodb_buffer_pool_size (規劃及設定 MySQL 環境大小時必須考量的其中一個重要參數) 是由執行個體類型決定,無法透過設定標記或任何其他方法進行變更,例如:

  • 執行個體類型 db-n1-standard-1 有 1.4 GB 的記憶體配置。
  • 執行個體類型 db-n1-highmem-8 有 38 GB 的記憶體配置。

變更 MySQL 適用的 Cloud SQL 參數的範例

控制台

使用 Google Cloud 控制台啟用 event_scheduler 參數。

  1. 前往 Cloud Storage 的「編輯執行個體」頁面。

    前往「編輯執行個體」

  2. 在「標記」下方,按一下「新增項目」,然後搜尋 event_scheduler,如以下螢幕截圖所示。

    在主控台中編輯事件排程器執行個體。

gcloud

  • 使用 gcloud CLI 啟用 event_scheduler 參數:

    gcloud sql instances patch INSTANCE_NAME \
        --database-flags event_scheduler=on
    

    輸出內容如下:

    WARNING: This patch modifies database flag values, which may require
    your instance to be restarted. Check the list of supported flags -
    /sql/docs/mysql/flags - to see if your
    instance will be restarted when this patch is submitted.
    
    Do you want to continue (Y/n)?
    

MySQL 工作階段

在工作階段層級停用 AUTOCOMMIT 模式。這項變更會持續套用至目前的工作階段,並只保留至工作階段結束。

  1. 顯示 autocommit 之類的變數:

    mysql> SHOW VARIABLES LIKE '%autoc%';
    

    您會看到下列輸出內容,其中 autocommitON

    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | autocommit    | ON    |
    +---------------+-------+
    
  2. 停用 autocommit

    mysql> SET autocommit=off;
    
  3. 顯示 autocommit 之類的變數:

    mysql> SHOW VARIABLES LIKE '%autoc%';
    

    您會看到下列輸出內容,其中 autocommitOFF

    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | autocommit    | OFF   |
    +---------------+-------+
    

交易和隔離等級

本節將說明 Oracle 和 MySQL 適用的 Cloud SQL 在交易和隔離層遷移方面的主要差異。

修訂版本模式

根據預設,Oracle 會在非自動修訂模式下運作,在這種模式下,每個 DML 交易都必須使用 COMMIT/ROLLBACK 陳述式來判斷。Oracle 和 MySQL 之間的其中一個基本差異,是 MySQL 預設會在自動修訂模式下運作,且每個 DML 交易都會透過明確指定 COMMIT/ROLLBACK 陳述式自動修訂。

如要強制 MySQL 以非自動提交模式運作,可以使用以下幾種做法:

  • 在儲存程序範圍內管理交易時,請使用 START TRANSACTION 子句,以便進入與 Oracle 相同的交易模式。
  • 請使用下列陳述式,在工作階段層級將 autocommit 系統參數設為 OFF,並在 DML 交易中明確使用 COMMIT/ROLLBACK 陳述式:

    mysql> SET autocommit=off;
    

隔離層級

ANSI/ISO SQL 標準 (SQL92) 定義了四個隔離層級。每個層級都提供不同的方法,用於處理資料庫交易的並行執行作業:

  • 讀取未提交:目前正在處理的交易可以查看其他交易所建立的未提交資料。如果執行回溯作業,所有資料都會還原為先前的狀態。
  • 已提交的讀取:交易只會看到已提交的資料變更,無法看到未提交的變更 (稱為「髒讀取」)。
  • 可重複讀取:只有在兩筆交易都發出 COMMIT 或都已回溯後,交易才能查看另一筆交易所做的變更。
  • 可序列化:最嚴格的隔離等級。這個層級會鎖定所有存取的記錄,並鎖定資源,以免記錄附加到資料表。

交易隔離等級可管理其他執行中的交易所看到的變更資料可見度。此外,當多個並行交易存取相同資料時,所選的交易隔離層級會影響不同交易的互動方式。

Oracle 支援下列隔離層級:

  • Read Committed (預設)
  • Serializable
  • 唯讀 (不屬於 ANSI/ISO SQL 標準 (SQL92) 的一部分)

Oracle MVCC (多版本並行控制):

  • Oracle 使用 MVCC 機制,在整個資料庫和所有工作階段中提供自動讀取一致性。
  • Oracle 會依據目前交易的系統變更編號 (SCN) 取得資料庫的一致性檢視畫面,因此,所有資料庫查詢只會傳回在執行查詢時,與 SCN 相關聯的已提交資料。
  • 隔離層級可在交易和工作階段層級變更。

以下是設定隔離層級的範例:

-- Transaction Level
SQL> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SQL> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SQL> SET TRANSACTION READ ONLY;

-- Session Level
SQL> ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;
SQL> ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;

與 Oracle 一樣,MySQL 適用的 Cloud SQL 支援 ANSI SQL:92 標準中指定的以下四個交易隔離層級

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ (default)
  • SERIALIZABLE

MySQL 適用的 Cloud SQL 預設隔離層級為 REPEATABLE READ。只有在兩筆交易都發出 COMMIT 指令後,才會提供任何新資料。這些隔離層級可在 SESSION 層級和 GLOBAL 層級變更 (全域層級修改目前處於使用設定旗標的 Beta 版階段)。

如要驗證 SESSIONGLOBAL 層級的目前隔離層級,請使用下列陳述式:

mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;

輸出內容如下:

+-----------------------+-----------------+
| @@GLOBAL.tx_isolation | @@tx_isolation  |
+-----------------------+-----------------+
| REPEATABLE-READ       | REPEATABLE-READ |
+-----------------------+-----------------+

您可以修改隔離層級語法,如下所示:

SET [SESSION] TRANSACTION ISOLATION LEVEL [READ WRITE | READ ONLY]
| REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE]

您可以在 SESSION 層級修改隔離等級:

mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

       -- Verify

mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;

輸出內容如下:

+-----------------------+------------------+
| @@GLOBAL.tx_isolation | @@tx_isolation   |
+-----------------------+------------------+
| REPEATABLE-READ       | READ-UNCOMMITTED |
+-----------------------+------------------+

MySQL 適用的 Cloud SQL 交易結構

交易語法:

START TRANSACTION
    [transaction_characteristic [, transaction_characteristic] ...]

transaction_characteristic: { WITH CONSISTENT SNAPSHOT | READ WRITE | READ ONLY }
BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET autocommit = {0 | 1}

交易可透過 START TRANSACTIONBEGIN 實作。

WITH CONSISTENT SNAPSHOT 選項會啟動一致的 READ 交易,這實際上等同於發出 START TRANSACTION,接著是任何資料表的 SELECT。啟動一致 READ (使用快照資訊,根據某個時間點呈現查詢結果的 READ 作業) 的 WITH CONSISTENT SNAPSHOT 子句不會變更交易隔離層級,且僅由 REPEATABLE READ 隔離層級支援。

一致的 READ 會使用快照資訊,根據某個時間點提供查詢結果,不受並行交易執行的修改影響。如果查詢資料已由其他交易變更,系統會使用復原記錄重建原始資料。這麼做有助於避免可能降低並行處理能力的鎖定問題。

REPEATABLE READ 隔離等級中,快照會根據執行第一個 READ 作業的時間。使用 READ COMMITTED 隔離層級時,快照會重設為每個一致的 READ 作業時間。

以下是交易和隔離層級設定的範例:

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
mysql> START TRANSACTION;
mysql> INSERT INTO tbl1 VALUES (1, 'A');
mysql> UPDATE tbl2 SET col1 = 'Done' WHERE KeyColumn = 1;
mysql> COMMIT;