概览
Database Migration Service 支持从源数据库到 Cloud SQL for PostgreSQL 目标数据库的持续迁移。
适用于 Oracle 的受支持源数据库包括以下版本:
- Oracle 11g,11.2.0.4 版
- Oracle 12c,12.1.0.2 版
- Oracle 12c,12.2.0.1 版
- Oracle 18c
- Oracle 19c
- Oracle 21c
- Oracle Real Application Clusters (RAC)
Database Migration Service 利用 Oracle LogMiner API(Oracle 数据库的一部分)来查询归档的重做日志文件。重做日志文件包含有关数据库的活动历史记录的信息。如需详细了解 Database Migration Service 如何使用这些日志文件,请参阅 Oracle 迁移的数据流简介。
配置源 Oracle 数据库
您必须先通过执行以下操作配置数据库,然后才能使用 Database Migration Service 从来源 Oracle 数据库中拉取数据:
设置归档日志记录来跟踪数据库中的更改,例如
INSERT
、UPDATE
、DELETE
和RENAME
操作。向将用于连接到数据库并访问架构和代码对象的用户账号授予适当的权限。
默认情况下,Database Migration Service 会尝试通过 DBA_VIEWS 访问您的所有对象定义。使用
SELECT ANY DICTIONARY
特权授予对DBA_VIEWS
的访问权限。如果迁移用户账号无法访问 DBA 视图,Database Migration Service 会回退到 ALL_VIEWS。这种方法可让您最大限度地灵活地定义最符合您要求的安全模型。如果您希望 Database Migration Service 仅访问对象定义的一部分,请为迁移用户授予具有更精细特权配置的角色,而不是
SELECT ANY DICTIONARY
。为数据库定义数据保留政策,以确定将归档哪些数据、将保留多长时间、在保留期限结束时应归档还是销毁数据。
Database Migration Service 目前可与以下类型的 Oracle 数据库搭配使用:
配置 Amazon RDS for Oracle 数据库
验证数据库是否正以
ARCHIVELOG
模式运行。为此,请运行以下命令:SELECT LOG_MODE FROM V$DATABASE;
如果结果为
ARCHIVELOG
,则继续执行第 2 步。如果结果为
NOARCHIVELOG
,则需要为数据库启用ARCHIVELOG
模式。归档的日志文件会占用磁盘空间,因此您需要为数据库配置 DB_RECOVERY_FILE_DEST_SIZE 参数。使用此参数指定目标数据库恢复文件要使用的总空间硬性限制(以字节为单位)。通过设置此参数,您可以管理信息可用性与磁盘空间之间的折衷。
通过运行以下命令,为数据库定义数据保留政策:
exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',96);
我们建议您将备份和归档日志至少保留 4 天,建议保留 7 天。
配置 Oracle 日志文件轮替政策。我们建议日志文件大小不要超过 512 MB。如需详细了解如何管理日志轮替,请参阅使用 Oracle 的重做日志文件。
启用补充日志数据。为此,请先运行以下命令来对数据库启用补充日志记录:
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');
接下来,选择是为特定表还是整个数据库启用日志记录。
如需仅记录特定表的更改,请针对要复制的每个表运行以下命令:
ALTER TABLE SCHEMA.TABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS
替换以下内容:
- SCHEMA:包含表的架构的名称。
- TABLE:您要记录更改的表的名称。
如需复制数据库中的大部分或所有表,请考虑为整个数据库启用日志记录。
在 SQL 提示符处,运行以下命令可为整个数据库启用补充日志数据:
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','ALL');
向将用于连接到数据库的用户账号授予适当的权限。为此,请运行以下命令:
GRANT CONNECT TO USER_NAME; GRANT CREATE SESSION TO USER_NAME; exec rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$ARCHIVED_LOG','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_LOGS','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_CONTENTS','USER_NAME','SELECT'); exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR','USER_NAME','EXECUTE'); exec rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR_D','USER_NAME','EXECUTE'); GRANT SELECT ANY TRANSACTION TO USER_NAME; GRANT SELECT ANY TABLE TO USER_NAME; GRANT SELECT ANY DICTIONARY TO USER_NAME; GRANT SELECT ON DBA_EXTENTS TO USER_NAME;
如果您的来源数据库是 Oracle 12c 或更新版本,则授予以下额外的权限:
GRANT LOGMINING TO USER_NAME;
配置自行托管的 Oracle 数据库
验证数据库是否正以
ARCHIVELOG
模式运行。为此,请运行以下命令:SELECT LOG_MODE FROM V$DATABASE;
如果结果为
ARCHIVELOG
,则继续执行第 2 步。如果结果为
NOARCHIVELOG
,则需要为数据库启用ARCHIVELOG
模式。以
SYSDBA
身份登录后运行以下命令:SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN;
归档的日志文件会占用磁盘空间,因此您需要为数据库配置 DB_RECOVERY_FILE_DEST_SIZE 参数。使用此参数指定目标数据库恢复文件要使用的总空间硬性限制(以字节为单位)。通过设置此参数,您可以管理信息可用性与磁盘空间之间的折衷。
通过运行以下 Oracle Recovery Manager (RMAN) 命令,为数据库定义数据保留政策:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 4 DAYS;
我们建议您将备份和归档日志至少保留 4 天,建议保留 7 天。
返回到用于配置 Oracle 日志文件轮替政策的数据库工具的 SQL 提示。我们建议日志文件大小不要超过 512 MB。
启用补充日志数据。为此,请先运行以下命令来对数据库启用补充日志记录:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
接下来,选择是为特定表还是整个数据库启用日志记录。
如需仅记录特定表的更改,请针对要复制的每个表运行以下命令:
ALTER TABLE SCHEMA.TABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS
替换以下内容:
- SCHEMA:包含表的架构的名称。
- TABLE:您要记录更改的表的名称。
如需复制数据库中的大部分或所有表,请考虑为整个数据库启用日志记录。
运行以下命令可为整个数据库启用补充日志数据:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (all) COLUMNS;
向将用于连接到数据库的用户账号授予适当的权限。为此,请运行以下命令:
GRANT CONNECT TO USER_NAME; GRANT CREATE SESSION TO USER_NAME; GRANT SELECT ON SYS.V_$DATABASE TO USER_NAME; GRANT SELECT ON SYS.V_$ARCHIVED_LOG TO USER_NAME; GRANT SELECT ON SYS.V_$LOGMNR_CONTENTS TO USER_NAME; GRANT SELECT ON SYS.V_$LOGMNR_LOGS TO USER_NAME; GRANT EXECUTE ON DBMS_LOGMNR TO USER_NAME; GRANT EXECUTE ON DBMS_LOGMNR_D TO USER_NAME; GRANT SELECT ANY TRANSACTION TO USER_NAME; GRANT SELECT ANY TABLE TO USER_NAME; GRANT SELECT ANY DICTIONARY TO USER_NAME; GRANT EXECUTE_CATALOG_ROLE TO USER_NAME; GRANT SELECT ON DBA_EXTENTS TO USER_NAME;
如果您的来源数据库是 Oracle 12c 或更新版本,则授予以下额外的权限:
GRANT LOGMINING TO USER_NAME;
配置自行托管的 Oracle 可插拔数据库
Database Migration Service 支持 Oracle 多租户架构,其中单个容器数据库 (CDB) 包含一个或多个可插入数据库 (PDB)。每个可插拔数据库都是一个自包含的数据库,具有唯一的 ID 和名称,并且可以独立管理。
如需配置自行托管的 Oracle 可插拔数据库,以便将其与 Database Migration Service 搭配使用,请执行以下步骤:
验证数据库是否正以
ARCHIVELOG
模式运行。为此,请从CDB$ROOT
容器中运行以下命令:SELECT LOG_MODE FROM V$DATABASE;
如果结果为
ARCHIVELOG
,则继续执行第 2 步。如果结果为
NOARCHIVELOG
,则需要为数据库启用ARCHIVELOG
模式。以
SYSDBA
身份登录后运行以下命令:SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN;
归档的日志文件会占用磁盘空间,因此您需要为数据库配置 DB_RECOVERY_FILE_DEST_SIZE 参数。使用此参数指定目标数据库恢复文件要使用的总空间硬性限制(以字节为单位)。通过设置此参数,您可以管理信息可用性与磁盘空间之间的折衷。
从
CDB$ROOT
容器中运行以下 Oracle Recovery Manager (RMAN) 命令,为数据库定义数据保留政策:CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 4 DAYS;
我们建议您将备份和归档日志至少保留 4 天,建议保留 7 天。
返回到用于配置 Oracle 日志文件轮替政策的数据库工具的 SQL 提示。我们建议日志文件大小不要超过 512 MB。
启用补充日志数据。为此,请先运行以下命令来在
CDB$ROOT
级别对数据库启用补充日志记录:ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
接下来,选择是为特定表还是整个可插拔数据库启用日志记录。
如需仅记录特定表的更改,请连接到可插拔数据库容器,然后针对要复制的每个表运行以下命令:
ALTER TABLE SCHEMA.TABLE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS
替换以下内容:
- SCHEMA:包含表的架构的名称。
- TABLE:您要记录更改的表的名称。
如需复制数据库中的大部分或所有表,请考虑为整个数据库启用日志记录。
运行以下命令可为整个数据库启用补充日志数据:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (all) COLUMNS;
创建普通用户。普通用户在
CDB$ROOT
容器和可插拔数据库中的身份是相同的。普通用户可以连接到根目录以及具有权限的任何可插拔数据库,并在其中执行操作。常用用户名必须以C##
或c##
开头。向将用于连接到数据库的普通用户授予适当的权限。在
CDB$ROOT
容器和可插拔数据库级别需要不同的权限。连接到
CDB$ROOT
容器并运行以下命令:GRANT CREATE SESSION TO USER_NAME; GRANT SET CONTAINER TO USER_NAME; GRANT SELECT ON SYS.V_$DATABASE TO USER_NAME; GRANT SELECT ON SYS.V_$LOGMNR_CONTENTS TO USER_NAME; GRANT EXECUTE ON DBMS_LOGMNR TO USER_NAME; GRANT EXECUTE ON DBMS_LOGMNR_D TO USER_NAME; GRANT LOGMINING TO USER_NAME; GRANT EXECUTE_CATALOG_ROLE TO USER_NAME;
连接到可插拔数据库并运行以下命令:
GRANT CREATE SESSION TO USER_NAME; GRANT SET CONTAINER TO USER_NAME; GRANT SELECT ANY TABLE TO USER_NAME; GRANT SELECT ANY DICTIONARY TO USER_NAME; GRANT SELECT ON SYS.V_$DATABASE TO USER_NAME; GRANT SELECT ON SYS.V_$ARCHIVED_LOG TO USER_NAME; GRANT SELECT ON DBA_SUPPLEMENTAL_LOGGING TO USER_NAME; GRANT SELECT ON DBA_EXTENTS TO USER_NAME;