本文是一系列文章之一,提供有關規劃及執行 Oracle® 11g/12c 資料庫遷移至 Cloud SQL for MySQL 5.7 版本第二代執行個體的相關重要資訊和指引。本系列包含以下部分:
- 將 Oracle 使用者遷移至 MySQL 適用的 Cloud SQL:術語和功能 (本文)
- 將 Oracle 使用者遷移至 MySQL 適用的 Cloud SQL:資料類型、使用者和資料表
- 將 Oracle 使用者遷移至 MySQL 適用的 Cloud SQL:查詢、儲存的程序、函式和觸發事件
- 將 Oracle 使用者遷移至 MySQL 適用的 Cloud SQL:安全性、作業、監控和記錄
術語
本節將詳細說明 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 |
系統動態檢視畫面 | 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/ |
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 特殊表格,主要用於擷取虛擬資料欄值,例如 SYSDATE 或 USER |
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」。
系統資料庫和結構定義
Oracle 資料庫例項會取得特定系統架構 (例如 SYS/SYSTEM
),並具備資料庫中繼資料物件的擁有者角色。
相反地,MySQL 會保留多個系統資料庫 (與 Oracle 結構定義相反),用於中繼資料層 (請注意,資料庫名稱會區分大小寫):
-
mysql
系統資料庫會保留資料表,用於儲存 MySQL 伺服器在執行時所需的資訊,例如:- 系統權限表
- 物件資訊表
- 記錄系統表
- 複製系統表
- 最佳化工具系統表
- 時區系統表
-
INFORMATION_SCHEMA
是主要資料庫資料字典和系統目錄。它可讓您存取資料庫中繼資料,也就是 MySQL 伺服器的內部資料庫資訊,例如資料庫或資料表名稱、資料欄資料類型和存取權限。 -
系統資料庫,用於收集 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
結構定義自 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 權限的使用者 (例如SYS
和SYSTEM
) 才能查看。
針對動態成效檢視畫面,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 也會處理暫存資料表。您可以在表格 CREATE
或 ALTER
期間設定儲存引擎,如下例所示:
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
參數。
前往 Cloud Storage 的「編輯執行個體」頁面。
在「標記」下方,按一下「新增項目」,然後搜尋
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
模式。這項變更會持續套用至目前的工作階段,並只保留至工作階段結束。
顯示
autocommit
之類的變數:mysql> SHOW VARIABLES LIKE '%autoc%';
您會看到下列輸出內容,其中
autocommit
為ON
:+---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+
停用
autocommit
:mysql> SET autocommit=off;
顯示
autocommit
之類的變數:mysql> SHOW VARIABLES LIKE '%autoc%';
您會看到下列輸出內容,其中
autocommit
為OFF
:+---------------+-------+ | 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 版階段)。
如要驗證 SESSION
和 GLOBAL
層級的目前隔離層級,請使用下列陳述式:
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] ...] |
---|
交易可透過 START TRANSACTION
或 BEGIN
實作。
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;