将 Oracle 用户迁移到 Cloud SQL for MySQL:安全、操作、监控和日志记录

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

安全

本部分介绍了 Oracle Cloud SQL for MySQL 之间的数据加密差异,就 Cloud SQL for MySQL 访问权限控制的审核进行了探讨。

Oracle 数据加密

除了基本的用户身份验证和用户权限管理之外,Oracle 还提供了 TDE(透明数据加密)机制,在操作系统级层添加一个额外的加密层来实现静态数据安全。配置完成后,系统会自动实现 Oracle TDE,无需用户进行任何手动交互。为了实现 Oracle TDE,我们建议您在受支持的必需数据库对象(例如表空间、表或列)上通过命令明确配置它,这些对象可接受这种加密。为了处理传输中的数据的安全性,我们建议您实现网络安全解决方案。

Cloud SQL for MySQL 数据加密

Google Cloud 提供了多层加密来保护 Google Cloud 产品(包括 Cloud SQL)中的静态客户数据。Cloud SQL 使用 AES-128 或 AES-256 加密方法进行加密。如需了解详情,请参阅下面有关静态加密的主题。与必须通过配置操作实现的 Oracle 加密不同,Google Cloud 无需任何操作即可加密客户静态数据。从架构转换的角度来看,无需执行任何操作,且加密过程对用户透明。

如需更好地了解 Google Cloud 如何处理对传输中的数据的加密,请参阅如何管理对传输中的数据的加密

审核

Oracle 提供了多种审核方法,例如标准审核和精细审核。相比之下,MySQL 默认情况下不提供等效的审核解决方案。为克服此限制,您可以使用 Google Cloud 信息中心和监控,但为了捕获数据库 DML/DDL 操作,您可以使用慢查询日志、常规日志和错误日志作为更可靠的审核解决方案。

为实现此解决方案,我们建议您使用实例 FLAGS 来启用慢查询日志和常规日志。此外,您还应根据业务需求管理这些日志的保留设置。

您可以使用 Google Cloud 审核日志来收集审核信息。这些日志涵盖三个主要级别:

  • 管理员活动审核日志(默认启用)
  • 数据访问审核日志(默认停用)
    • 了解如何配置数据访问日志
    • 请注意,数据访问审核日志不会记录对无需登录 Google Cloud 即可访问的资源执行的数据访问操作。
  • 系统事件审核日志(默认启用)

查看 Google Cloud 审核日志

以下是查看审核日志的访问路径:Google Cloud 控制台 > 主页 > 活动

您可以过滤审核级别之间的信息粒度。以下屏幕截图显示了管理员活动审核。

过滤审核级别之间的粒度。

Cloud Logging 页面

以下是日志记录页面的访问路径:Google Cloud 控制台 > Cloud Logging

您可以过滤日志类型之间的信息粒度。以下屏幕截图显示了常规日志审核(审核用户、主机和 SQL 语句的数据)。

常规审核日志。

Cloud SQL for MySQL 访问权限控制

与任何其他数据库连接类似,用户可以通过使用具有已获授权的静态 IP 地址的 MySQL 客户端或使用 Cloud SQL 代理连接到 Cloud SQL for MySQL 实例。对于其他连接来源(如 App Engine 或 Compute Engine),用户拥有多个选项,例如使用 Cloud SQL 代理。实例访问权限控制中更详细地介绍了这些选项。

操作

本部分介绍导出和导入、实例级备份和恢复、MySQL 事件调度器(用于数据库作业),以及用于只读操作和灾难恢复的备用实例。

导出和导入

Oracle 执行逻辑导出和导入操作的主要方法是使用 EXPDP/IMPDP 命令的 Data Pump 实用程序(旧版 Oracle 导出/导入功能包含 expimp 命令)。MySQL 等效命令是 mysqldumpmysqlimport 实用程序,它们会生成转储文件,然后在数据库或对象级层执行导入(包括仅导出和导入元数据)。

没有直接针对 MySQL DBMS_DATAPUMP 实用程序的 MySQL 等效解决方案,其中该实用程序是应用 EXPDP/IMPDP 功能直接与 DBMS_DATAPUMP 软件包交互的 Oracle 方法。如需从 Oracle DBMS_DATAPUMP PL/SQL 代码进行转换,请使用备用代码(例如 Bash 或 Python)来实现逻辑元素,并使用 MySQL mysqldumpmysqlimport 运行导出/导入操作。

MySQL mysqldumpmysqlimport 实用程序在客户端级层运行(作为 MySQL 客户端程序的一部分),远程连接到 Cloud SQL for MySQL 实例。转储文件在客户端创建。

mysqldump

客户端实用程序会执行逻辑备份和数据导入(如 sql)。这会生成一组 SQL 语句,执行这些语句可重现原始数据库对象定义和表数据。mysqldump 实用程序还可以生成 CSV 格式、其他带分隔符的文本或 XML 格式的输出。此输出格式的主要优点是,您可以在恢复导出输出之前进行查看或修改,因为这是一种文本文件。主要的缺点是,它不是用于备份大量数据的快速或可扩缩的解决方案。

mysqldump 使用情形

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

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

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

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

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

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

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

mysqlimport

这是一个客户端程序,提供了用于 LOAD DATA INFILE SQL 语句的命令行界面。mysqlimport 常用于将文本或 CSV 文件中的数据导入到具有相应结构的 MySQL 表中。Oracle SQL*Loader 可以转换为 mysqlimport,因为这两者都可从外部文件加载数据。

mysqlimport 使用情形

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

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

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

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

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

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

Cloud SQL for MySQL 导出/导入

以下文档链接说明了如何使用 gsutil/gcloud 与 Cloud SQL 实例和 Cloud Storage 进行交互,从而应用导入导出操作。

实例级备份和恢复

很简单就能从 Oracle RMAN 或 Data Pump 迁移到 Cloud SQL for MySQL 并向其添加其他备份和恢复选项(例如虚拟机快照、冷备份或第三方工具)。无需任何代码或其他知识。您可以使用 Google Cloud 控制台或 Google Cloud CLI 来管理此过程。(上述示例是使用第二代 Cloud SQL 实例编译的。)

MySQL 数据库备份方法的类型是按需备份自动备份

您可以使用 Cloud SQL for MySQL 数据库实例恢复功能来恢复到同一实例、覆盖现有数据,或恢复到其他实例。借助 Cloud SQL for MySQL,您还可以在启用自动备份选项的情况下,使用二进制日志记录功能将 MySQL 数据库恢复到特定时间点

通过 Cloud SQL for MySQL 可克隆独立版本的源数据库。此功能仅适用于主数据库或其他克隆,不能从只读副本实例中获取。您还可以使用此功能从某个时间点恢复 MySQL 实例,从而在需要时恢复数据。您可以使用 Google Cloud 控制台或 gcloud CLI 应用 Cloud SQL for MySQL 数据库恢复功能。

MySQL 事件调度器(数据库作业)

要启动预定义数据库过程,MySQL 事件调度器的功能相当于 Oracle DBMS_JOBS 或 Oracle DBMS_SCHEDULER。默认情况下,event_scheduler 数据库参数设置为 OFF。如果需要,应使用 Cloud SQL 标志将该设置切换为 ON

您可以使用 MySQL 事件调度器,通过特定的逻辑在特定时间运行显式的 DML/DDL 命令或调度一个存储过程或函数。

Oracle DBMS_JOBSDBMS_SCHEDULER 的转换注意事项

所有 Oracle 作业都必须手动或使用商用 PL/SQL 转换工具转换为 MySQL 语法和功能。

使用以下语句从客户端运行验证当前的 event_scheduler 参数值:

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

事件调度器示例

  • Oracle DBMS_SCHEDULER

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

    mysql> CREATE EVENT job_sessions_1d_del
           ON SCHEDULE EVERY 1 DAY
           COMMENT 'Deletes last day data from the sessions table'
           DO
           DELETE FROM sessions
              WHERE session_date < DATE_SUB(SYSDATE(), INTERVAL 1 DAY);
    
  • MySQL 事件调度器元数据

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

只读操作和灾难恢复实现的备用实例

Oracle Active Data Guard 使备用实例可以充当只读端点,同时仍然通过重做和归档日志应用新数据。您还可以出于读取目的,使用 Oracle GoldenGate 启用其他实例,同时实时应用数据修改,作为变更数据捕获 (CDC) 解决方案。

Cloud SQL for MySQL 支持读取/写入分离,方法是使用只读副本近乎实时地将主实例中的任何读取内容或分析工作负载定向到备用复制源。您可以使用 Google Cloud 控制台或 gcloud CLI 应用 Cloud SQL for MySQL 只读副本的设置。

Cloud SQL for MySQL 支持其他复制选项:复制到外部 MySQL 实例从外部 MySQL 实例进行复制

您可以将 Oracle Active Data Guard 和 Oracle GoldenGate 作为灾难恢复 (DR) 解决方案,添加已与主实例同步的备用实例。

Cloud SQL for MySQL 只读副本不打算充当 DR 方案的备用实例;为此,Cloud SQL 提供了配置 MySQL 实例来实现高可用性的功能(使用 Google Cloud 控制台或 gcloud CLI)。

某些操作可能需要重新启动实例(例如,将 HA 添加到现有主实例)。从高可用性 (HA) 服务等级协议 (SLA) 的角度来看,如果主实例在大约 60 秒内无响应,则 HA 备用实例将在重新连接后可用。如需为 Cloud SQL for MySQL 启用 HA,请参阅以下说明

日志记录和监控

主要依靠 Oracle 的提醒日志文件来识别常规系统事件和错误事件,从而了解任何 Oracle 数据库实例生命周期(主要是排查故障事件和错误事件)。

Oracle 提醒日志会显示以下方面的信息:

  • Oracle 数据库实例错误和警告(ORA- + 错误编号)。
  • Oracle 数据库实例启动和关停事件。
  • 与网络和连接相关的问题。
  • 数据库重做日志切换事件。
  • 可能会提及 Oracle 跟踪文件,其中有一个链接可用来了解关于特定数据库事件的其他详细信息。

此外,Oracle 还提供诸如 LISTENER、ASM 和 Enterprise Manager (OEM) 等不同服务的专用日志文件,它们在 Cloud SQL for MySQL 中没有等效组件。

Cloud SQL for MySQL 日志类型:

MySQL 日志类型 说明 备注
活动日志 包含 API 调用或其他用于修改 Cloud SQL for MySQL 实例的配置或元数据的管理操作的相关数据。 此日志是 Cloud Audit Logs 组下的三种日志之一。
数据访问日志 包含用于读取资源配置或元数据的 API 调用的相关数据,以及用户用于创建、修改或读取用户提供的资源数据所进行的 API 调用的相关数据。 此日志是 Cloud Audit Logs 组下的三种日志之一。请注意,此日志仅记录对无需登录 Google Cloud 即可访问的事件的 MySQL 实例执行的数据访问操作。

mysql.err
这是 MySQL 主日志文件可以与 Oracle 的提醒日志进行比较。这两种日志都会保存数据库实例事件日志记录,例如启动和关停事件以及错误和警告事件。 MySQL 5.7 错误消息指南

mysql-slow.log
MySQL 慢查询日志会收集超出预定义配置的查询的数据,例如每个运行时间超过 2 秒(默认为 10 秒)的查询。 此日志默认停用。如需启用此日志,请设置以下变量(数据库参数):

  • slow_query_log
  • long_query_time

mysql-general.log
日志会收集有关客户端连接和断开连接的数据,以及针对 MySQL 数据库实例运行的任何 SQL 语句的相关数据。此日志对于问题排查非常有用,通常在操作完成时变为 OFF 默认停用;要启用 general_log 变量,应将其设置为 ON
二进制日志 MySQL 服务器使用二进制日志记录功能来记录修改了数据的所有语句。此日志主要用于进行备份和复制。 默认情况下,在 Cloud SQL for MySQL 中启用二进制日志记录参数,以启用恢复和只读副本部署。如需启用二进制日志记录功能,请将 log_bin 配置参数设置为 ON
中继日志 保存从主实例二进制日志接收的语句,以在从属实例(只读副本)中实现所有数据修改。 仅适用于辅助实例和只读副本。

查看 Cloud SQL for MySQL 操作日志

Cloud Logging 是查看所有日志详细信息的主要平台。您可以选择不同的日志,并按日志事件级别(例如“严重”“错误”或“警告”)进行过滤。您还可以设置活动时间范围和自由文本过滤。

查看 Cloud Logging 中的日志

示例

以下屏幕截图展示了使用自定义时间范围作为过滤条件在 mysql-slow.log 文件中查找特定查询的情形。

在 mysql-slow.log 中查找查询。

MySQL 数据库实例监控

Oracle 的主界面监控信息中心是 OEM 和 Grid/Cloud Control 产品(例如最佳活动图表)的一部分,对于会话或 SQL 语句级别的实时数据库实例监控非常有用。Cloud SQL for MySQL 通过 Google Cloud 控制台提供了类似的监控功能。您可以查看有关 Cloud SQL for MySQL 数据库实例的汇总信息,其中有多个监控指标,例如 CPU 利用率、存储空间用量、内存用量、读取/写入操作、入站流量/出站流量字节数、活动连接数等。

Cloud Logging 支持 Cloud SQL for MySQL 的其他监控指标。以下屏幕截图展示了过去 12 小时的 MySQL 查询图表。

过去 12 小时的 MySQL 查询图表。

MySQL 只读副本监控

您可使用 Google Cloud 控制台监控指标按监视主实例类似的方法来监控只读副本(如前所述)。此外,还有一个专用于监控复制延迟的监控指标,它确定主实例与只读副本实例之间的延迟时间(以秒为单位),可通过 Google Cloud 控制台中的“只读副本实例概览”标签页进行监控。

您可以使用 gcloud CLI 检索复制状态

gcloud sql instances describe REPLICA_NAME

您还可以使用 MySQL 客户端中的命令进行复制监控,可提供主数据库和从属数据库以及二进制日志和中继日志的状态。

您可以使用以下 SQL 语句来验证只读副本的状态:

mysql> SHOW SLAVE STATUS;

MySQL 监控

本部分介绍了基本的 MySQL 监控方法,这些方法被视为 DBA(Oracle 或 MySQL)执行的日常任务。

会话监控

Oracle 会话监控通过查询被称为“V$”视图的动态性能视图来完成。V$SESSIONV$PROCESS 视图通常用于通过 SQL 语句来获取当前数据库活动的相关实时数据分析。您可以使用命令和 SQL 语句来监控 MySQL 中的会话活动。例如,MySQL SHOW PROCESSLIST 命令会提供有关会话活动的以下详细信息:

mysql> SHOW PROCESSLIST;

您还可以使用 SELECT 语句来查询和过滤 SHOW PROCESSLIST 结果:

mysql>  SELECT * FROM information_schema.processlist;

长时间运行的事务监控

为了实时识别可能会导致性能问题的长时间运行的事务,您可以查询 information_schema.innodb_trx 动态视图。此视图仅显示在 MySQL 数据库实例中运行的待处理事务的记录。

锁定监控

您可以使用 information_schema.innodb_locks 动态视图来监控数据库锁定情况,该视图提供有关可能导致性能问题的锁定出现次数的实时信息。