对 PostgreSQL 配置 Oracle GoldenGate

John Doe 四月 29, 2024

摘要:本文列出了有关为 PostgreSQL 配置 Oracle GoldenGate 的详细信息。

目录

准备数据库用户和权限

了解如何在 PostgreSQL 中为 Oracle GoldenGate 创建数据库用户和分配权限。

Oracle GoldenGate for PostgreSQL 需要的数据库权限

Oracle GoldenGate 进程需要一个数据库用户捕获数据,并将其传送到一个 PostgreSQL 数据库,建议创建一个专用的 PostgreSQL 数据库用户,进行提取和复制。

Oracle GoldenGate 需要以下数据库用户权限,才能从一个 PostgreSQL 数据库捕获,并应用到另一个 PostgreSQL 数据库。

数据库复制权限

权限 提取 复制 目的
CONNECT 是的 是的 数据库连接所需。GRANT CONNECT ON DATABASE dbname TO gguser;
WITH REPLICATION 是的 不涉及 用户从复制槽进行提取时需要此权限。ALTER USER gguser WITH REPLICATION;
WITH SUPERUSER 是的 不涉及 需要用来启用表级补充日志记录(ADD TRANDATA),但可以在对表启用 TRANDATA 后撤销。ALTER USER gguser WITH SUPERUSER;
USAGE ON SCHEMA 是的 是的 用于访问要复制的模式中的表的元数据。GRANT USAGE ON SCHEMA tableschema TO gguser;
SELECT ON TABLES 是的 是的 对要复制的表,授予 SELECT 访问权限。GRANT SELECT ON ALL TABLES IN SCHEMA tableschema TO gguser;
在目标表上INSERTUPDATEDELETETRUNCATE。或者,如果复制每个表,则可以对复制用户使用GRANT INSERT, UPDATE, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA TO …,而不是对每个表授予INSERTUPDATEDELETE 不涉及 是的 将提取的 DML 应用到目标对象。GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLE tablename TO gguser;

心跳和检查表的权限

权限 提取 复制 目的
CREATE ON DATABASE 是的 是的 提取和复制用户在添加一个 Oracle GoldenGate 模式时,需要此权限来创建心跳和检查表。GRANT CREATE ON DATABASE dbname TO gguser; 或者,如果 GGSCHEMA 与用户相同,则可以通过发出 CREATE SCHEMA AUTHORIZATION ggsuser; 在用户下创建对象。
CREATE, USAGE ON SCHEMA 是的 是的 用于创建/删除心跳和检查表(如果提取或复制用户不拥有这些对象)。GRANT CREATE, USAGE ON SCHEMA ggschema TO gguser;
EXECUTE ON ALL FUNCTIONS 是的 是的 用于心跳更新和清除函数的执行(如果调用函数的用户不拥有这些函数对象)。GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA ggschema TO gguser;
SELECT, INSERT, UPDATE, DELETE 是的 是的 用于心跳和检查表的插入、更新和删除(如果用户不拥有这些对象)。GRANT SELECT, INSERT, UPDATE, DELETE, ON ALL TABLES IN SCHEMA ggschema TO gguser;

准备数据库连接、系统和参数设置

了解如何在 PostgreSQL 中为 Oracle GoldenGate 配置数据库连接、系统和参数设置。

配置数据库连接

Oracle GoldenGate 通过 ODBC(开放式数据库连接)驱动程序连接到 PostgreSQL 数据库,并要求为每个源端和目标端的 PostgreSQL 数据库创建一个系统数据源名称(DSN),其中会包含正确的数据库连接详细信息。

本节包含有关设置提取和复制需要使用的 DSN 连接的说明。

在创建一个 DSN 之前,请确保已按照安装 PostgreSQL 的 DataDirect 驱动程序的说明,安装和配置了驱动程序。

注意:不要经过PgBouncer连接池,来连接到 PostgreSQL 数据库进行提取,因为PgBouncer不了解复制协议,因此提取连接不会被识别为复制连接。

在 Linux 中配置数据库连接

要在 Linux 中为 Oracle GoldenGate 进程创建数据库连接,请在/etc/odbc.ini文件中创建一个 DSN(数据源名称)。多个 DSN 可以设置在同一个 ODBC 文件中。

创建 DSN 文件时,请使用以下最低设置:

  • Data Source Name – 将由 Oracle GoldenGate 进程引用的源端或目标数据库连接的用户自定义名称,例如 Extract 或 Replicat。DSN 名称的长度最长允许为 32 个字母/数字字符,并且只能包含下划线(_)和破折号(-)的特殊字符。

  • IANAAppCodePage=4 – 是默认设置,但当数据库字符集不是 Unicode 时,可以根据 IANAAppCodePage 页上指定的指南进行修改。

  • InstallDir – 是 Oracle GoldenGate 安装路径的值,例如:/u01/app/ogg

  • Driver – 对于 21.8 之前的 Oracle GoldenGate 发布版本,请设置为/<GoldenGate_Installation_Path>/lib/GGpsql25.so

    对于 Oracle GoldenGate 版本 21.8 及更高版本,请将该值设置为/<GoldenGate_Installation_Path>/datadirect/lib/ggpsql25.so

  • Database – 源端数据库或目标数据库的名称。

  • HostName – 是数据库主机 IP 地址或主机名。

  • PortNumber – 是数据库的监听端口。

  • 您也可以为提取或复制用户提供LogonIDPassword,但这些将会以明文存储。建议将这些字段存放在 DSN 之外,可以将其作为凭据别名存储在 Oracle GoldenGate 的钱包中,并在提取和复制中使用USERIDALIAS参数引用它们。

以下是一个包含两个 DSN 条目的/etc/odbc.ini样例文件。下面的示例中使用的数据源名称是PG_src和 PG_tgt。

  1. /etc/odbc.ini文件中为每个源端或目标数据库创建 DSN。

    sudo vi /etc/odbc.ini
    
    #Sample DSN entries [ODBC Data Sources]
    PG_src=Oracle GoldenGate PostgreSQL Wire Protocol
    PG_tgt=Oracle GoldenGate PostgreSQL Wire Protocol
    [ODBC] IANAAppCodePage=4 InstallDir=/u01/app/ogg
    
    [PG_src]
    Driver=/u01/app/ogg/datadirect/lib/ggpsql25.so
    Description=Oracle GoldenGate PostgreSQL Wire Protocol
    Database=sourcedb
    HostName=remotehost
    PortNumber=5432
    
    [PG_tgt]
    Driver=/u01/app/ogg/datadirect/lib/ggpsql25.so
    Description=Oracle GoldenGate PostgreSQL Wire Protocol
    Database=targetdb
    HostName=remotehost
    PortNumber=5432
    
  2. 保存和关闭odbc.ini文件。

在 Windows 中配置数据库连接

要在 Windows 中创建一个数据库连接,请使用 Windows ODBC 数据源管理器,为每个源端和目标数据库创建一个系统 DSN。

  1. 在 Windows 系统上,打开 “控制面板” 文件夹。

  2. 打开 “管理工具” 文件夹。

  3. 打开 ODBC 数据源(64 位)。将显示 “ODBC 数据源管理器” 对话框。

  4. 选择 “系统 DSN” 选项卡,然后单击 “添加”。

  5. 在 “创建新数据源” 下,选择 “Oracle GoldenGate PostgreSQL Wire Protocol” 驱动程序,然后单击 “完成”。

  6. 此时将显示 “创建一个新数据源” 向导。

  7. 提供以下内容:

    • 对于 “数据源名称”,可键入 DSN 的名称,长度不超过 32 个字母/数字字符,不支持除下划线和短划线以外的特殊字符。
    • (可选)对于 “说明”,可键入此 DSN 的说明。
    • 提供数据库服务器的主机名、数据库端口号和数据库名称。
  8. 单击 “确定” 关闭对话框。

    您也可以在 “安全” 选项卡下提供 “用户名” 信息,但建议将此字段留空,而是将用户名和密码作为凭证别名存储在 Oracle GoldenGate 的钱包中,并使用 “提取和复制” 中的USERIDALIAS参数引用它们。

配置对 PostgreSQL 的 SSL 支持

可以通过在 PostgreSQL 配置文件($PGDATA/postgresql.conf)中将配置参数 SSL 设置为 on 来启用 SSL。如果启用了 SSL,则相应的hostssl条目必须出现或添加到pg_hba.conf文件中。

启用 SSL 后,Oracle GoldenGate 会使用默认位置的根证书、根证书吊销列表(CRL)、服务器客户端证书和密钥,如以下代码片段所示:

~/.postgresql/root.crt
~/.postgresql/root.crl
~/.postgresql/postgresql.crt
~/.postgresql/postgresql.key

您需要根据此列表创建所需的文件,并将它们存储在适当的位置。

如果使用非默认位置设置 SSL 配置,则应根据环境设置以下环境变量。

PGSSLROOTCERT
PGSSLCRL
PGSSLCERT
PGSSLKEY
$ODBCINI 文件中需要的更改

可以通过在$ODBCINI文件中将EncryptionMethod DSN属性设置为 1 或 6,来启用 SSL 支持。

如果设置为 0(No Encryption),则不会对数据进行加密。

如果设置为 1 (SSL),则使用 “加密协议版本” 连接选项中指定的 SSL 协议,对数据进行加密。如果数据库服务器不支持指定的加密方法,则连接将失败,驱动程序将返回错误。

如果设置为 6 (RequestSSL),则如果服务器配置了启用 SSL,则登录请求和数据都会使用 SSL 进行加密。如果服务器未配置启用 SSL,则会建立未加密的连接。使用的 SSL 协议由“加密协议版本”连接选项设置决定。

如果还需要验证数据库服务器/客户端证书,则需要创建相应的 KeyStore 文件,并在$ODBCINI中相应地设置下面提到的 ODBC DSN 属性。

KeyStore=<path to .p12 keystore file>
KeyStorePassword=<keystore-passwd>
TrustStore=<path to root certificate>
ValidateServerCertificate=1

数据库配置

对于 Oracle GoldenGate,请在 PostgreSQL 数据库配置文件$PGDATA/postgresql.conf中配置以下参数:

  • 对于提取或复制的远程连接,请设置 PostgreSQL 的listen_addresses,以允许远程数据库连接。例如:

    listen_addresses=remotehost_ip_address

    注意:需要确保配置好pg_hba.conf文件,设置客户端身份验证,以允许来自 Oracle GoldenGate 主机的连接。有关详细信息,请参阅以下文档:pg_hba.conf 文件

  • 要支持 Oracle GoldenGate 提取,必须将预写式日志记录设置为logical,这会添加支持事务记录解码所需的信息。

    必须设置最大复制槽数,以允许为每次提取打开一个槽,通常情况下,每个数据库不需要超过一个提取连接。例如,如果 PostgreSQL 已在使用物理复制,并且正在使用当前配置的复制槽,请增加该值以允许建立提取连接。

    应设置好最大 WAL 日志发送器数,以匹配最大复制槽数。

    可选地,你可以在预写式日志中启用提交时间戳,在启用逻辑式 WAL 日志记录的同时进行设置时,将从该点开始的第一个 DML 提交记录,跟踪记录正确的时间戳。否则,Oracle GoldenGate 捕获遇到的第一条记录,会带有不正确的提交时间戳。

    wal_level = logical                       # set to logical for Capture
    
    max_replication_slots = 1                 # max number of replication slots,
                                              # one slot per Extract/client
    
    max_wal_senders = 1                       # one sender per max repl slot
    
    track_commit_timestamp = on               # optional, correlates tx commit time
                                              # with begin tx log record (useful for
                                              # timestamp-based positioning)
    
  • 进行上述的任何更改后,重新启动数据库。

对要处理的表做准备

您必须执行以下任务对表做准备,以便在 PostgreSQL 的 Oracle GoldenGate 环境中使用它们。

禁用目标表上的触发器和级联约束

在源表上由于触发器操作或级联约束会发生 DML 操作,如果将 Oracle GoldenGate 配置为捕获这些 DML 操作,则要在目标表上禁用触发器以及级联删除和更新的约束。

如果未禁用,则会在目标表上激活相同的触发器或约束,并和复制的数据发生冗余。考虑以下示例,其中源表是emp_srcsalary_src,目标表是emp_targsalary_targ

  1. emp_src执行删除操作。
  2. 它会级联删除到salary_src
  3. Oracle GoldenGate 将这两个删除操作发送到目标端。
  4. 父表的删除先到达并应用到emp_targ
  5. 父表的删除会级联删除到salary_targ
  6. salary_src的级联删除应用到salary_targ
  7. 该行无法被定位到,因为该行已在步骤 5 中删除。

在复制MAP语句中,将源表映射到适当的目标表,并映射源表使用触发器或外键级联约束引用的子表。触发和级联产生的操作必须映射到适当的目标表以保持数据完整性。在提取TABLE参数中包含相同的源端父表和源端子表。

确保表行的唯一性

Oracle GoldenGate 需要源表和目标表上有某种形式的唯一性行标识符,以便为复制的更新和删除操作找到正确的目标行。

除非在TABLEMAP语句中使用了KEYCOLS子句,否则 Oracle GoldenGate 会按以下优先级顺序,选择要使用的行标识符:

  1. 主键

  2. 按字母数字顺序,第一个不包含时间戳或非物化的计算列的唯一键。

  3. 如果上述键类型都不存在(即使表中可能定义了其他类型的键),则 Oracle GoldenGate 会以数据库允许在唯一键中使用的所有列,构造出一个伪键,不包括那些 Oracle GoldenGate 不支持出现在键中的列,还有那些从 Oracle GoldenGate 配置中排除的列。对于 PostgreSQL LOB 类型,如textxmlbyteacharvarchar,Oracle GoldenGate 支持将这些列作为源表或目标表中的主键,最大长度为 8191 字节。

    注意:如果表中有其他不可用的键,或者表中根本没有键,则 Oracle GoldenGate 会记录一条相应的消息到报告文件中。使用所有列构造键会影响 Oracle GoldenGate 在源端系统上的性能。在目标端,这样的键会导致复制使用更大、效率更低的WHERE子句。

    对于没有唯一性且具有相同值的重复行的表,复制动作将在对这些行执行更新和删除操作时中止。

  4. 如果表没有一个适当的键,或者如果您不希望使用现有的键,则可以定义一个替代键,前提是该表具有始终包含唯一值的列。通过在提取的TABLE参数和复制的MAP参数中包含一个KEYCOLS子句,来定义此替换键。指定的键会覆盖 Oracle GoldenGate 找到的任何现有主键或唯一键。请参见 Oracle GoldenGate 的参考中的 TABLE | MAP

启用表级的补充日志记录

启用补充日志记录的过程是,Oracle GoldenGate 设置源端数据库表级日志记录,以支持源端 DML 操作的更改数据捕获,根据日志记录的级别,会包括一些其他的未更改的列,这些列在配置了冲突检测和决议的双向复制等情况中会有用。

PostgreSQL 中有四个表级日志记录级别,对应于表的REPLICA IDENTITY设置,包括NOTHINGUSING INDEXDEFAULTFULL

对于需要未压缩的跟踪记录以及冲突检测和决议的用例,Oracle GoldenGate 需要FULL级别的日志记录,但是,在表有一个主键或唯一索引,且其更改是在简单的单向配置中复制的情况下,或者不需要完整的前映像或未压缩记录的情况下,则可以使用DEFAULT级别。Oracle GoldenGate 不支持NOTHINGUSING INDEX的日志记录级别,并且无法使用ADD TRANDATA设置。

以下是从 Admin Client 发出ADD TRANDATA的语法。

DBLOGIN SOURCEDB dsn_name USERIDALIAS alias_name
ADD TRANDATA schema.tablename ALLCOLS

注意:对于带有一个主键或唯一索引的表,需要使用ALLCOLS选项,来对表设置FULL级别的日志记录,否则会设置为DEFAULT级别的日志记录。

对于没有主键或唯一索引的表,总是会设置为FULL级别的日志记录,无论是否指定了ALLCOLS

要检查补充日志记录的级别:

INFO TRANDATA schema.tablename