本文档是系列文章中的一篇,该系列提供了关键的信息和指导来帮助计划和执行 Oracle® 11g/12c 数据库到 Cloud SQL for MySQL 5.7 版第二代实例的迁移。本系列文章包含以下部分:
- 将 Oracle 用户迁移到 Cloud SQL for MySQL:术语和功能(本文档)
- 将 Oracle 用户迁移到 Cloud SQL for MySQL:数据类型、用户和表
- 将 Oracle 用户迁移到 Cloud SQL for MySQL:查询、存储过程、函数和触发器
- 将 Oracle 用户迁移到 Cloud SQL for MySQL:安全、操作、监控和日志记录
术语
本部分详细介绍了 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 |
系统动态视图 | 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/ |
通过 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 特殊表,主要用于检索伪列值,例如 SYSDATE 或 USER |
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 没有等效功能。您可以使用Memorystore作为替代方案。 |
隐去 | “隐去”属于 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 > 实例 > 数据库 > 查看/创建。
系统数据库和架构
Oracle 数据库实例通过数据库元数据对象的 owner 角色获取某些系统架构(例如 SYS/SYSTEM
)。
而 MySQL 拥有多个系统数据库(与 Oracle 架构相反),用于提供元数据层(请注意,数据库名称区分大小写):
-
mysql
系统数据库拥有一些表,它们用于存储 MySQL 服务器运行时所需的信息,例如:- 系统特权表
- 对象信息表
- 日志系统表
- 复制系统表
- 优化器系统表
- 时区系统表
-
INFORMATION_SCHEMA
充当主数据库数据字典和系统目录。它提供对数据库元数据的访问权限,该元数据是有关 MySQL 服务器的内部数据库信息,例如数据库或表的名称、列数据类型和访问特权。 -
收集 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
参数。 -
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 特权(例如SYS
和SYSTEM
)的用户查看。
对于动态性能视图,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 也会处理临时表。您可以在表 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。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
参数。
转到 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 和 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 支持以下隔离级别:
- 读取已提交(默认)
- 可序列化
- 只读(不属于 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 版)。
如需在 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 | +-----------------------+------------------+
Cloud SQL for MySQL 事务结构
事务语法:
START TRANSACTION [transaction_characteristic [, transaction_characteristic] ...] |
---|
事务可以通过 START TRANSACTION
或 BEGIN
实现。
WITH CONSISTENT SNAPSHOT
选项会启动一个一致的 READ
事务(这实际上与发出 START TRANSACTION
相同),后跟任何表中的 SELECT
。启动一致的 READ
的 WITH 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;