将 Oracle 用户迁移到 Cloud SQL for MySQL:术语和功能

本文档是系列文章中的一篇,该系列提供了关键的信息和指导来帮助计划和执行 Oracle® 11g/12c 数据库到 Cloud SQL for MySQL 5.7 版第二代实例的迁移。本系列文章包含以下部分:

术语

本部分详细介绍了 Oracle 与 Cloud SQL for MySQL 在数据库术语方面的异同。它回顾和比较了每个数据库平台的核心方面。由于架构上的差异(例如 Oracle 12c 引入了多租户功能),比较针对 Oracle 11g 和 12c 版本进行了区分。此处参考的 Cloud SQL for MySQL 版本是 5.7.x。

Oracle 11g 与 Cloud SQL for MySQL 之间的术语差异

Oracle 11g 说明 Cloud SQL for MySQL 主要区别
实例 一个 Oracle 11g 实例只能保存一个数据库。 实例 一个 MySQL 实例可以保存多个数据库。
数据库 数据库可用作单个实例(数据库的名称与实例名称相同)。 数据库 多个或单个数据库服务于多个应用。
架构 架构和用户是相同的,因为它们都被视为数据库对象的所有者(可在不指定架构或分配给架构的情况下创建用户)。 架构 架构被称为数据库,而数据库对象是在特定架构/数据库下创建的。
用户 与架构相同,因为这两者都是数据库对象的所有者(例如实例 → 数据库 → 架构/用户 → 数据库对象)。 用户 数据库用户,具有特定权限可连接或修改特定架构/数据库上的数据库对象(例如实例 → 数据库/架构 → 数据库对象)。
角色 定义的一组数据库权限,可链接为一个组并分配给数据库用户。 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
其中每个数据库也是系统数据库,并且与每个 Cloud SQL for MySQL 部署一起创建。
系统动态视图 Oracle 动态视图:
V$ViewName
系统动态视图 多个系统数据库中都有 MySQL 动态视图:
INFORMATION_SCHEMA
PERFORMANCE_SCHEMA
SYS
表空间 Oracle 数据库的主要逻辑存储结构;每个表空间可以保存一个或多个数据文件。 表空间 与 Oracle 类似,MySQL 表空间是一个逻辑单元,但仅表示一个表,而不像 Oracle 表空间可拥有多个数据文件(保存多个表的数据)。

MySQL 支持使用分配的数据文件创建新的表空间,然后创建附加到新创建的表空间的新表。请注意,表空间配置设置(如大小和限制)是使用数据库参数设置的,而不是在创建表空间时设置的。
数据文件 Oracle 数据库的物理元素,它们用于保存数据且在特定表空间下进行定义。

单个数据文件按初始大小和最大大小来定义,可保存多个表的数据。

Oracle 数据文件使用 .dbf 后缀(可选)。
数据文件 Cloud SQL for MySQL 使用值为“ON”(默认值)的 innodb_file_per_table 参数;此配置为每个表生成一个新的数据文件,还生成一个专用的表空间。

MySQL 数据文件使用 .ibd(数据)和 .frm(元数据)文件。
系统表空间 包含整个 Oracle 数据库的数据字典表和视图对象。 系统表空间 与 Oracle 一样,包含字典/元数据表。存储在附加有 ibdata1 数据文件的 innodb_system 表空间中。
临时表空间 包含在会话期间有效的架构对象;此外,它还支持运行不适合服务器内存的操作。 临时表空间 用途与 Oracle 相同,它存储在附加有 ibtmp1 数据文件的 MySQL innodb_temporary 表空间中。
撤消
表空间
一种特殊类型的系统永久表空间,在自动撤消管理模式(默认设置)下运行数据库时,Oracle 用它来管理回滚操作。 撤消表空间 与 Oracle 类似,MySQL 撤消表空间包含用于回滚用途的撤消日志。默认情况下,此选项设置为 OFF,并在未来的 MySQL 版本中表述为已弃用
ASM Oracle 存储空间自动管理是一个集成的高性能数据库文件系统和磁盘管理器,均由使用 ASM 配置的 Oracle 数据库自动运行。 不支持 MySQL 使用“存储引擎”这一术语来描述不同的数据处理实现,但不支持 Oracle ASM。Cloud SQL for MySQL 支持许多可实现存储自动化(例如存储空间自动扩容)、性能和可伸缩性的功能。
表/视图 用户创建的基本数据库对象。 表/视图 与 Oracle 相同。
具体化视图 使用特定 SQL 语句定义,可以根据特定配置手动或自动刷新。 不受 MySQL 支持 要解决此问题,可使用触发器/视图来替代 Oracle 具体化视图。
序列 Oracle 唯一值生成器。 自动递增 MySQL 不支持 Oracle 序列;而是使用 AUTO_INCREMENT 作为自动序列生成功能的替代解决方案。
同义词 充当其他数据库对象的备用标识符的 Oracle 数据库对象。 不支持 MySQL 不支持 Oracle 同义词;要解决此问题,您可以在设置相应权限时使用视图。
分区 Oracle 提供了许多分区解决方案,用于将大型表拆分为较小的托管部分。 分区 MySQL 提供更多有限的分区支持来提高性能,同时保留数据管理和维护操作,例如 Oracle 分区。
闪回数据库 Oracle 专有功能,可用于将 Oracle 数据库初始化到之前定义的时间,让您能够查询或恢复误修改或损坏的数据。 不支持 替代解决方案是,您可以使用 Cloud SQL 备份和时间点恢复将数据库恢复到先前的状态(例如在删除表之前恢复)。
sqlplus Oracle 命令行界面,可用于查询和管理数据库实例。 mysql 等效于 MySQL 的命令行界面,用于进行查询和管理。可以从任何具有相应权限的客户端连接到 Cloud SQL。
PL/SQL Oracle 扩展了过程语言,使其涵盖 ANSI SQL。 MySQL MySQL 具有自己的扩展过程语言(具有不同的语法和实现),并且此扩展语言没有其他命名。
包头和包体 Oracle 专属功能,可将存储过程和函数分组到同一逻辑引用下。 不支持 MySQL 支持将存储过程和函数作为具有组分配的单个对象。
存储过程和函数 使用 PL/SQL 实现代码功能。 存储过程和函数 MySQL 具有专有的过程语言实现,支持创建存储过程和函数。
触发器 用于控制表的 DML 实现的 Oracle 对象。 触发器 与 Oracle 相同。
PFILE/SPFILE Oracle 实例和数据库级参数保存在被称为 SPFILE 的二进制文件中(在之前的版本中,该文件被称为 PFILE),该文件可作为用于手动设置参数的文本文件。 Cloud SQL for MySQL 数据库标志 您可以通过数据库标志实用程序设置或修改 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。在 Cloud SQL for MySQL 中,此参数根据所选的实例类型进行预定义,并且值会相应更改。
结果缓存 通过从缓冲区缓存中检索行来减少 SQL I/O 操作,可以在会话级别使用数据库参数和提示进行管理。 查询缓存 基本用途与 Oracle 结果缓存相同,可在数据库级别和会话级别进行管理。
数据库提示 控制对 SQL 语句的影响,这些语句会影响优化器的行为来提升性能。Oracle 具有 50 多个不同的数据库提示。 数据库提示 与 Oracle 相比,MySQL 支持的数据库提示数量有限(优化器提示和索引提示)。请注意,MySQL 使用不同的数据库提示、语法和命名。
RMAN Oracle 恢复管理器实用程序。用于通过扩展功能实现数据库备份,进而支持多个灾难恢复场景等(例如克隆)。 Cloud SQL for MySQL 备份 Cloud SQL for MySQL 提供了两种应用完整备份的方法:按需备份和自动备份。
数据转储 (EXPDP/IMPDP) Oracle 转储生成实用程序,可用于导出/导入、数据库备份(在架构或对象级别)、架构元数据、生成架构 SQL 文件等诸多功能。
mysqldump/mysqlimport
MySQL 转储(导出)实用程序,可作为客户端连接(远程)并生成转储文件 (SQL)。稍后,您可以压缩转储文件并将其移动到 Cloud Storage。mysqldump 实用程序仅适用于导出步骤。
SQL*Loader 可使用此工具上传文本文件和 CSV 文件等外部文件中的数据。
mysqlimport/
LOAD FILE INFILE
通过 mysqlimport 实用程序,可以将文本或 CSV 文件(Google 支持其他文件格式)加载到具有相应结构的数据库表中。
Data Guard 使用备用实例的 Oracle 灾难恢复解决方案,用户可用它从备用实例执行“读取”操作。 Cloud SQL for MySQL 高可用性和复制功能 为了实现灾难恢复或高可用性,Cloud SQL for MySQL 提供故障切换副本架构,并使用只读副本进行只读操作(读取/写入分离)。
Active Data Guard/Golden Gate Oracle 的主要复制解决方案,支持备用 (DR)、只读实例、双向复制(多源)和数据仓储等多种用途。 Cloud SQL for MySQL 只读副本 Cloud SQL for MySQL 只读副本,用于实现读取/写入分离的聚类。目前,不支持 Golden Gate 双向复制或异构复制等多源配置。
RAC Oracle 真正应用集群。Oracle 专有聚类解决方案,通过部署具有单个存储单元的多个数据库实例来提供高可用性。 不支持 Google Cloud SQL 尚不支持多源架构。如需实现具有读取/写入分离和高可用性的聚类架构,请使用 Cloud SQL 高可用性和只读副本。
Grid/Cloud Control (OEM) Oracle 软件,用于管理和监控 Web 应用格式的数据库和其他相关服务。此工具可用于实时分析数据库来了解使用频繁的工作负载。 Cloud SQL for MySQL Console、Cloud Monitoring 使用 Cloud SQL for MySQL 进行监控,包括详细时间和基于资源的图表。此外,还可使用 Cloud Monitoring 保存特定的 MySQL 监控指标和日志分析来实现高级监控功能。
重做日志 Oracle 事务日志,包含两个(或更多)预分配且已定义的文件,这些文件用于在发生数据修改时存储所有数据修改。重做日志旨在实例失败时保护数据库。 重做日志 MySQL 也有重做日志文件,它们用于在崩溃恢复期间纠正由未完成事务的重做日志机制写入的数据。
归档日志 归档日志提供了对备份和复制等操作的支持。Oracle 在每次重做日志切换操作后写入归档日志(若已启用)。 二进制日志 事务日志保留的 MySQL 实现。主要用于复制目的(通过 Cloud SQL 默认启用)。
控制文件 Oracle 控制文件保存数据库的相关信息,例如数据文件、重做日志名称和位置、当前日志序列号,以及实例检查点信息。 MySQL MySQL 架构没有与 Oracle 实现类似的控制文件。这使用 SHOW MASTER STATUS 命令通过 MySQL 参数进行控制,目的是查看当前二进制日志的位置。
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 用于管理和运行 SQL 和 PL/SQL 语句的 Oracle 免费 SQL GUI(也可与 MySQL 搭配使用)。 MySQL Workbench 用于管理和运行 SQL 和 MySQL 代码语句的 MySQL 免费 SQL GUI。
提醒日志 Oracle 主日志,用于记录一般数据库操作和错误。 MySQL 错误日志 使用 Cloud Logging 日志查看器查看 MySQL 错误日志
DUAL Oracle 特殊表,主要用于检索伪列值,例如 SYSDATEUSER DUAL 表 MySQL 允许在 SQL 语句中将 DUAL 指定为表,这些语句不依赖于任何表中的数据。
外部表 Oracle 允许用户创建外部表,其源数据位于数据库外部的文件中。 不受支持。 无直接对等项。
Listener Oracle 网络进程,负责侦听传入的数据库连接 Cloud SQL 授权网络 在 Cloud SQL 授权网络配置页面中获得许可后,MySQL 可接受来自远程来源的连接
TNSNAMES 用于定义数据库地址的 Oracle 网络配置文件,便于使用连接别名建立连接。 不存在 MySQL 接受使用 Cloud SQL 实例连接名称或专用/公共 IP 地址的外部连接。Cloud SQL 代理是一种额外的安全访问方法,您无需允许特定的 IP 地址或配置 SSL 即可使用该代理连接到 Cloud SQL for MySQL(第二代实例)。
实例默认端口 1521 实例默认端口 3306
数据库链接 Oracle 架构对象,可用于与本地/远程数据库对象进行交互。 不支持 如需使用其他解决方法,请使用应用代码从远程数据库连接和检索数据。

Oracle 12c 与 Cloud SQL for MySQL 之间的术语差异

Oracle 12c 说明 Cloud SQL for MySQL 主要区别
实例 在 Oracle 12c 实例中引入的多租户功能,能将多个数据库保存为可插入数据库 (PDB),而 Oracle 11g 不同,Oracle 实例只能获取一个数据库。 实例 Cloud SQL for MySQL 可保存多个数据库,这些数据库对不同的服务和应用使用不同的命名。
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 没有等效功能。您可以使用内存存储作为替代方案。
隐去 “隐去”属于 Oracle 高级安全功能,它可执行列遮盖操作,防止用户和应用显示敏感数据。 不支持 MySQL 没有等效功能。

功能

虽然 Oracle 11g/12c 和 Cloud SQL for MySQL 数据库使用不同的架构(基础架构和扩展过程语言),但它们在关系型数据库的基本方面是相同的。它们都支持数据库对象、多用户并发工作负载和事务(ACID 兼容性)。它们还管理支持多个隔离级别(根据业务需求)的锁定争用,并作为联机事务处理 (OLTP) 操作和联机分析处理 (OLAP) 的关系数据存储区来满足持续的应用要求。

以下部分简要介绍了 Oracle 与 Cloud SQL for MySQL 之间的一些主要功能差异。在某些情况下,如有需要,本部分会包括详细的技术比较信息。

创建和查看现有数据库

Oracle 11g/12c Cloud SQL for MySQL 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 Cloud SQL for MySQL 5.7
在 Oracle 12c 中,您可以通过种子创建 PDB,这通过容器数据库 (CDB) 模板或通过从现有 PDB 克隆 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;
不支持单个数据库。

所有数据库都位于同一 Cloud SQL for MySQL 实例下;因此,所有数据库均全部启动或全部关闭。

通过 Cloud SQL 控制台管理数据库

  • 在 Google Cloud 控制台中,转到存储空间 > SQL > 实例 > 数据库 > 查看/创建

    用于创建/查看 MySQL 数据库的 Console 页面。

系统数据库和架构

Oracle 数据库实例通过数据库元数据对象的 owner 角色获取某些系统架构(例如 SYS/SYSTEM)。

而 MySQL 拥有多个系统数据库(与 Oracle 架构相反),用于提供元数据层(请注意,数据库名称区分大小写):

  • Mysql

    mysql 系统数据库拥有一些表,它们用于存储 MySQL 服务器运行时所需的信息,例如:

    • 系统特权表
    • 对象信息表
    • 日志系统表
    • 复制系统表
    • 优化器系统表
    • 时区系统表
  • INFORMATION_SCHEMA

    INFORMATION_SCHEMA 充当主数据库数据字典和系统目录。它提供对数据库元数据的访问权限,该元数据是有关 MySQL 服务器的内部数据库信息,例如数据库或表的名称、列数据类型和访问特权。

  • performance_schema

    收集 MySQL 实例的相关统计信息的系统数据库。performance_schema 系统数据库拥有一些指标,可在非常精细的级别监控服务器执行情况。该架构在运行时提供服务器内部执行检查,可主要靠它来分析数据库性能问题。

    默认情况下,不使用 Cloud SQL for MySQL 启用 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 版本中提供了 sys 架构,它主要保存 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 CMD)
开放会话
V$SESSION
SHOW PROCESSLIST
INFORMATION_SCHEMA.PROCESSLIST
performance_schema.threads
正在运行的事务
V$TRANSACTION
INFORMATION_SCHEMA.INNODB_TRX
数据库对象
DBA_OBJECTS
不受支持。按类型查询每个对象。
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
表空间
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 的 RDBMS)不同,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。Cloud SQL for MySQL 第二代仅支持 InnoDB 存储引擎。

系统参数

可专门配置 Oracle 和 Cloud SQL for MySQL 数据库,使它们实现除默认配置之外的一些功能。如需更改 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 参数修改在下面 3 个范围内起作用:

  • SPFILE:参数修改将写入 Oracle spfile,需要重新启动实例才能使参数生效。
  • MEMORY:仅在不允许静态参数更改时才在内存层应用参数修改。
  • BOTH:在服务器参数文件和实例内存中均应用参数修改,不允许更改静态参数。

Cloud SQL for MySQL 配置标志

您可以使用 Google Cloud 控制台中的配置标志、gcloud CLI 或 CURL 修改 Cloud SQL for MySQL 系统参数。请参阅 Cloud SQL for MySQL 支持的可更改的所有参数的完整列表

MySQL 参数可划分到下面几个范围:

  • 动态参数:可在运行时更改。
  • 静态参数:需要重新启动实例才能生效。
  • 全局参数:将对所有当前和未来会话产生全局影响。
  • 会话参数:只能针对当前会话生命周期在会话级别更改,与其他会话隔离。

Cloud SQL for MySQL 内存参数 innodb_buffer_pool_size(规划 MySQL 环境和调整其大小时需要考虑的一个重要参数)由实例类型决定,无法通过使用配置标志或任何其他方法进行更改,例如:

  • 实例类型 db-n1-standard-1 有 1.4 GB 的内存分配。
  • 实例类型 db-n1-highmem-8 有 38 GB 的内存分配。

有关更改 Cloud SQL for MySQL 参数的示例

控制台

使用 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 和 Cloud SQL for MySQL 在事务和隔离级别迁移方面的主要区别。

提交模式

默认情况下,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) 定义了 4 个隔离级别。每个级别都提供了一种不同的方法来处理数据库事务的并发执行:

  • 读取未提交:当前处理的事务可以查看其他事务创建的未提交的数据。如果执行回滚,则所有数据都将恢复到其之前的状态。
  • 读取已提交:事务仅可查看已提交的数据更改,无法查看未提交的更改(“脏读取”)。
  • 可重复读取:仅在两个事务均发出 COMMIT 或均回滚后,一个事务才能查看另一事务所作的更改。
  • 可序列化:最严格/最强的隔离级别。此级别会锁定所有被访问的记录,还会锁定资源,避免记录被附加到表中。

事务隔离级别管理已更改的数据对其他正在运行的事务的可见性。此外,如果多个并发事务访问相同的数据,则所选的事务隔离级别会影响不同事务的交互方式。

Oracle 支持以下隔离级别:

  • 读取已提交(默认)
  • 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 类似,Cloud SQL for MySQL 支持 ANSI SQL:92 标准中指定的下面 4 个事务隔离级别

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

Cloud SQL for MySQL 的默认隔离级别为 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 |
+-----------------------+------------------+

Cloud SQL for MySQL 事务结构

事务语法:

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。启动一致的 READWITH CONSISTENT SNAPSHOT 子句不会更改事务隔离级别,且仅受 REPEATABLE READ 隔离级别支持,其中 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;