Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/
Relational Migrator
/ /

配置 Oracle 迁移先决条件

当您从Oracle源数据库迁移数据时, Relational Migrator会自动检查数据库是否存在所需的配置更改,并生成SQL脚本来实现这些更改。 让数据库管理员 (数据库管理员 (DBA))查看脚本并在数据库服务器上运行命令。

Oracle配置取决于迁移作业的类型:

  • 快照迁移作业会一次性迁移所有数据,然后停止。

  • 持续迁移作业运行快照迁移,然后进入 CDC 阶段,该阶段会持续复制数据更改。

有关支持的Oracle版本的详细信息,请参阅支持的数据库和版本。

  • 如果您要从 Oracle 12c 实例迁移,则必须以 SYSDBA 角色运行命令。

  • Oracle 12c 引入了可插入数据库(PDB) 的概念。 某些命令可以在 PDB 上运行,而启用 ARCHIVELOG 等命令必须在容器/主数据库(CDB) 上运行。 有关每种架构的详细信息,请参阅 容器数据库和可插入数据库概述。

  • 某些命令会根据数据库是单租户还是多租户而有所不同。在多租户数据库中,权限必须包含后缀 CONTAINER=ALL。要检查数据库是否为多租户数据库,运行以下SQL查询:

    SELECT cdb AS is_multitenant FROM v$database;
  • 您无法针对Oracle Database Express Edition (XE)运行持续迁移作业,因为 XE 不支持必要的日志。

1

以下代码为 Relational Migrator 创建一个新的 Oracle 服务帐户,以连接到 Oracle 实例。 或者,您可以使用现有的 Oracle 服务帐户,通过适当的权限连接到 Relational Migrator。

提示

  1. 创建服务帐户:

    CREATE USER <user> IDENTIFIED BY "<password>";
  2. 确认该服务帐户拥有迁移作业中的表。

    所需的权限取决于服务帐户是否拥有迁移作业中使用的表。 要检查表所有权,运行以下查询:

    SELECT TABLE_NAME, OWNER
    FROM ALL_TABLES
    WHERE TABLE_NAME ='<table_name>'
    ORDER BY OWNER, TABLE_NAME;
  3. 向服务帐户授予权限。

    重要

    如果您以普通用户身份迁移多租户容器数据库,请在授予权限时附加 CONTAINER=ALL。 示例:

    GRANT CREATE SESSION TO <user> CONTAINER=ALL;

    如果服务帐户表所有者:

    GRANT CREATE SESSION TO <user>;
    GRANT SELECT ON V_$DATABASE TO <user>;

    如果服务帐户不是表所有者:

    GRANT CREATE SESSION TO <user>;
    GRANT SELECT_CATALOG_ROLE TO <user>;
    GRANT SELECT ANY TABLE TO <user>;
    GRANT SELECT ON V_$DATABASE TO <user>;
    GRANT FLASHBACK ANY TABLE TO <user>;
1

以下代码为 Relational Migrator 创建一个新的 Oracle 服务帐户,以连接到 Oracle 实例。 或者,您可以使用现有的 Oracle 服务帐户,通过适当的权限连接到 Relational Migrator。

  1. 创建服务帐户:

    CREATE USER <user> IDENTIFIED BY "<password>";
  2. 确认该服务帐户拥有迁移作业中的表。

    所需的权限取决于服务帐户是否拥有迁移作业中使用的表。 要检查表所有权,运行以下查询:

    SELECT TABLE_NAME, OWNER
    FROM ALL_TABLES
    WHERE TABLE_NAME ='<table_name>'
    ORDER BY OWNER, TABLE_NAME;
  3. 向服务帐户授予权限。

    重要

    如果您以普通用户身份迁移多租户容器数据库,请在授予权限时附加 CONTAINER=ALL。 示例:

    GRANT CREATE SESSION TO <user> CONTAINER=ALL;

    如果服务帐户表所有者:

    GRANT CREATE SESSION TO <user>;
    GRANT SELECT ON V_$DATABASE TO <user>;

    如果服务帐户不是表所有者:

    GRANT CREATE SESSION TO <user>;
    GRANT SELECT_CATALOG_ROLE TO <user>;
    GRANT SELECT ANY TABLE TO <user>;
    GRANT SELECT ON V_$DATABASE TO <user>;
    GRANT FLASHBACK ANY TABLE TO <user>;
  1. 向服务帐户授予其他权限以运行持续迁移作业。

    如果要迁移多租户容器数据库,请附加 CONTAINER=ALL

    GRANT SET CONTAINER TO <user>;
    GRANT EXECUTE_CATALOG_ROLE TO <user>;
    GRANT SELECT ANY TRANSACTION TO <user>;
    GRANT LOGMINING TO <user>;
    GRANT CREATE TABLE TO <user>;
    GRANT LOCK ANY TABLE TO <user>;
    GRANT CREATE SEQUENCE TO <user>;
    GRANT SELECT ON DBA_TABLESPACES TO <user>;
    GRANT EXECUTE ON DBMS_LOGMNR TO <user>;
    GRANT EXECUTE ON DBMS_LOGMNR_D TO <user>;
    GRANT SELECT ON V_$LOG TO <user>;
    GRANT SELECT ON V_$LOG_HISTORY TO <user>;
    GRANT SELECT ON V_$LOGMNR_LOGS TO <user>;
    GRANT SELECT ON V_$LOGMNR_CONTENTS TO <user>;
    GRANT SELECT ON V_$LOGMNR_PARAMETERS TO <user>;
    GRANT SELECT ON V_$LOGFILE TO <user>;
    GRANT SELECT ON V_$ARCHIVED_LOG TO <user>;
    GRANT SELECT ON V_$ARCHIVE_DEST_STATUS TO <user>;
    GRANT SELECT ON V_$TRANSACTION TO <user>;
    GRANT SELECT ON V_$MYSTAT TO <user>;
    GRANT SELECT ON V_$STATNAME TO <user>;
2
  1. 要检查是否已启用存档日志记录,运行以下查询:

    SELECT LOG_MODE FROM V$DATABASE;

    如果启用了日志记录,则输出 ARCHIVELOG,如果未启用,则输出 NOARCHIVELOG

  2. 如果尚未启用存档日志记录,启用其启用。

    Relational Migrator可以自动生成代码以启用日志记录。 以下代码是示例。 如果要迁移多租户数据库,请对容器/主数据库运行这些命令。

    ALTER SYSTEM SET db_recovery_file_dest_size = 10G;
    ALTER SYSTEM SET db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' scope=spfile;
    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT
    ALTER DATABASE ARCHIVELOG;
    ALTER DATABASE OPEN;
3
  1. 在数据库上启用补充日志记录:

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
  2. 为迁移中的每个表启用补充日志记录:

    ALTER TABLE schemaName.tableName ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
    /* Additional ALTER TABLE STATEMENTS... */
4
  1. 创建所需的表空间:

    CONNECT sys/oraclepw@PDB_NAME as sysdba;
    CREATE TABLESPACE logminer_tbs DATAFILE '/opt/oracle/oradata/CDB_NAME/PDB_NAME/logminer_tbs.dbf'
    SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
    CONNECT sys/password@CDB_NAME as sysdba;
    CREATE TABLESPACE logminer_tbs DATAFILE '/opt/oracle/oradata/CDB_NAME/logminer_tbs.dbf'
    SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

    多租户架构中的持续迁移需要在每个可插入数据库和容器数据库中都有一个表空间。

  2. 将表空间配额分配给服务用户:

    ALTER USER <user> DEFAULT TABLESPACE LOGMINER_TBS QUOTA UNLIMITED ON LOGMINER_TBS CONTAINER=ALL;

重要

此过程适用于在Amazon RDS 上托管的Oracle实例。

1

以下代码为 Relational Migrator 创建一个新的 Oracle 服务帐户,以连接到 Oracle 实例。 或者,您可以使用现有的 Oracle 服务帐户,通过适当的权限连接到 Relational Migrator。

  1. 创建服务帐户:

    CREATE USER <user> IDENTIFIED BY "<password>";
  2. 确认该服务帐户拥有迁移作业中的表。

    所需的权限取决于服务帐户是否拥有迁移作业中使用的表。 要检查表所有权,运行以下查询:

    SELECT TABLE_NAME, OWNER
    FROM ALL_TABLES
    WHERE TABLE_NAME ='<table_name>'
    ORDER BY OWNER, TABLE_NAME;
  3. 向服务帐户授予权限。

    重要

    如果您以普通用户身份迁移多租户容器数据库,请在授予权限时附加 CONTAINER=ALL。 示例:

    GRANT CREATE SESSION TO <user> CONTAINER=ALL;

    如果服务帐户表所有者:

    GRANT CREATE SESSION TO <user>;
    GRANT SELECT ON V_$DATABASE TO <user>;

    如果服务帐户不是表所有者:

    GRANT CREATE SESSION TO <user>;
    GRANT SELECT_CATALOG_ROLE TO <user>;
    GRANT SELECT ANY TABLE TO <user>;
    GRANT SELECT ON V_$DATABASE TO <user>;
    GRANT FLASHBACK ANY TABLE TO <user>;
  1. 向服务帐户授予其他权限以运行持续迁移作业。

    如果要迁移多租户容器数据库,请附加 CONTAINER=ALL

    GRANT FLASHBACK ANY TABLE TO <user>;
    GRANT EXECUTE_CATALOG_ROLE TO <user>;
    GRANT SELECT ANY TRANSACTION TO <user>;
    GRANT LOGMINING TO <user>;
    GRANT CREATE TABLE TO <user>;
    GRANT LOCK ANY TABLE TO <user>;
    GRANT CREATE SEQUENCE TO <user>;
    CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$DATABASE', '<user>', 'SELECT');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('DBA_LOG_GROUPS', '<user>', 'SELECT');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR', '<user>', 'EXECUTE');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('DBMS_LOGMNR_D', '<user>', 'EXECUTE');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOG', '<user>', 'SELECT');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOG_HISTORY', '<user>', 'SELECT');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_LOGS', '<user>', 'SELECT');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_CONTENTS', '<user>', 'SELECT');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGMNR_PARAMETERS', '<user>', 'SELECT');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$LOGFILE', '<user>', 'SELECT');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$ARCHIVED_LOG', '<user>', 'SELECT');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$ARCHIVE_DEST_STATUS', '<user>', 'SELECT');
    CALL rdsadmin.rdsadmin_util.grant_sys_object('V_$TRANSACTION', '<user>', 'SELECT');

    如果 RDS实例是多租户实例,则表空间需要额外的权限:

    CALL rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES', '<user>', 'SELECT');
2
  1. 要检查是否已启用存档日志记录,运行以下查询:

    SELECT LOG_MODE FROM V$DATABASE;

    如果启用了日志记录,则输出 ARCHIVELOG,如果未启用,则输出 NOARCHIVELOG

  2. 如果尚未启用存档日志记录,启用其启用。

    Relational Migrator可以自动生成代码以启用日志记录。 以下代码是示例。 如果要迁移多租户数据库,请对容器/主数据库运行这些命令。

    CALL rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours', 24);
3
  1. 在数据库上启用补充日志记录:

    CALL rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');
  2. 为迁移中的每个表启用补充日志记录:

    ALTER TABLE schemaName.tableName ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
    /* Additional ALTER TABLE STATEMENTS... */
4

创建所需的表空间:

CREATE TABLESPACE logminer_tbs;
CALL rdsadmin.rdsadmin_util.alter_default_tablespace(tablespace_name => 'logminer_tbs');

多租户架构中的持续迁移需要在每个可插入数据库和容器数据库中都有一个表空间。为服务用户分配这些表空间的配额。

后退

Oracle

在此页面上