原文地址: https://debezium.io/blog/2022/09/30/debezium-oracle-series-part-1/
欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.
Debezium for Oracle - Part 1: Installation and Setup
September 30, 2022 by Chris Cranford
debezium oracle examples
这篇文章是一个由三部分组成的系列文章的一部分,该系列文章旨在探讨使用Debezum来吸收甲骨文数据库中使用甲骨文日志程序的更改。在整个系列中,我们将检查为甲骨文建立概念(POC)部署证明的所有步骤。我们将讨论多租户的设置和配置以及细微差别。我们还将深入研究任何已知的陷阱和您可能需要知道的问题,以及如何调试特定问题。最后,我们将讨论性能和监控,以维护一个健康的连接器部署。
在整个练习过程中,我们希望这将向您展示为甲骨文部署Debezu是多么简单。这个系列的安装和安装部分可能看起来相当复杂,但是这些步骤中的许多可能已经存在于先前的环境中。我们将深入研究每一个步骤,解释它是必要的,如果您使用容器映像部署。
所以,不要再拖延了,让我们马上投入!
oracle是什么?
尽管这个问题看起来很讽刺,但有些人可能不知道甲骨文数据库是什么。甲骨文数据库是一个关系数据库管理系统(rbdms),一个存储和提供访问经常相关的数据点的权限的数据库。数据库由甲骨文公司开发和销售,是市场上最受信任和使用最广泛的关系数据库引擎之一,提供了可伸缩的关系数据库体系结构。
甲骨文数据库由代表数据或架构对象逻辑结构集合的模式集合组成。架构对象可以是从触发器、视图、表、数据类型、序列、过程、函数和其他方面的任何东西。此外,甲骨文12还引入了一个多租户体系结构,允许一个数据库实例作为一个多租户容器数据库(CDB)来运行,其中包含零、一或许多客户创建的可插入数据库(pdbs)。
目标是,安装甲骨文数据库,将Debezum与甲骨文连接,并将吸收的变化转换为存储在阿帕奇卡夫卡中的变化事件。
设置安装oracle
要开始,我们需要一个运行中的甲骨文数据库环境。最简单的方法之一就是 码头工人 通过部署一个容器运行甲骨文数据库。甲骨文已经在他们的 集装箱注册处 如果您打算从现有的甲骨文数据库中吸收更改,则可以跳过这一节。
甲骨文容器图像都是预先建立的甲骨文与多租赁。这意味着我们将根据一个多租户体系结构来跟踪设置。如果你使用的是一个不使用多重租赁的安装,可能需要做一些小的调整。
在这个练习中,我们将使用 容器图像 .使用docker pull ,在使用下列命令与甲骨文容器注册处进行身份验证后,会拉取图像:
docker pull container-registry.oracle.com/database/enterprise:latest
启动容器,使用docker run 指挥官。由于数据库容器映像必须首先安装甲骨文数据库,因此需要有若干环境变量,如数据库SID、可插入数据库名和密码。
docker run -d
–name dbz_oracle21
-p 1521:1521
-e ORACLE_SID=ORCLCDB
-e ORACLE_PDB=ORCLPDB1
-e ORACLE_PWD=oraclepw
container-registry.oracle.com/database/enterprise:latest
…ORACLE_SID 指用于识别数据库的系统/服务ID。因为我们使用的是多重租赁,我们将使用名称ORCLCDB 代表 集装箱数据库 或国开行。在甲骨文的多租户架构中,ORACLE_PDB 指用以识别 可移植数据库 ,或设计书管理局。最后,ORACLE_PWD 指使用的密码SYS 和SYSTEM 用户,我们稍后会使用。
容器将将数据持久保存到容器文件系统上的数据库文件中。移除容器时,数据将丢失.若要在容器外持久保存数据,请参阅甲骨文注册中心的自述,以了解如何在容器上设置卷。docker run 指挥官。
我们显而易见地将码头容器启动为一个守护进程,一个后台进程。如果您希望看到容器中发生了什么,可以使用该命令docker logs -f dbz_oracle21 跟踪容器的数据库日志。
在接下来的几分钟里,将在容器内配置和安装数据库,当一个新的容器启动而不存在初始配置和数据库时就会发生这种情况。通过在日志中寻找一个类似于以下内容的旗帜,您将知道安装是否成功:
#########################
DATABASE IS READY TO USE!
#########################
在这一点上,安装已经结束,可以安全地进入下一节。
配置甲骨文
为了吸收甲骨文数据库的更改,有几个数据库配置是必要的。如果您使用的是先前存在的环境,则可能会跳过其中一些步骤。
以下配置是必要的:
档案日志
重做日志
补充伐木
CDB和PDB中的用户和表空间/架构
配置甲骨文:档案日志
甲骨文将已填充的重做日志组(数据库事务日志)保存到一个或多个脱机目的地,统称为"归档重做日志"或"归档日志"。主要数据库中的更改使用存档日志复制到逻辑或物理备用环境中。
当重做日志填充并归档时,会发生日志开关。重做日志和归档日志都发生了变化。当重做日志存档时,Debezum需要访问归档日志以完成处理重做条目。
使用於 安装甲骨文 没有启用档案日志记录部分。如果使用另一个映像或原有环境,则必须检查是否启用了归档日志记录。去检查状态,用SYS 安装期间所定义的用户及密码ORACLE_PWD 去连接ORCLCDB 数据库和执行下列查询:
SELECT LOG_MODE FROM V$DATABASE
如果列包含ARCHIVELOG ,然后启用归档日志记录。如果列中包含了NOARCHIVELOG ,归档日志没有启用,需要进一步配置。
在设置甲骨文存档日志时,我们不仅需要启用日志功能,还需要在磁盘上指定存储日志的位置。如果您使用的是先前存在的环境,则需要就此与数据库管理员进行协商。大多数数据库服务器使用特殊路径存储存档日志文件,您将需要知道是否使用了甲骨文自动存储管理(ASM),或者数据库服务器上有哪个卷有足够的空间。
让我们打开甲骨文数据库容器的终端。我们希望使用SQL*+连接到数据库容器,以使用允许容易卸载和重新启动数据库的客户机。所以在新的终端,执行:
docker exec -it dbz_oracle21 -e ORACLE_SID=ORCLCDB sqlplus sys as sysdba
如果连接到现有的甲骨文环境,也可以ssh 到数据库服务器的外壳运行SQL*加。
上面的命令将启动甲骨文的SQL*+,一个命令行甲骨文SQL客户端。客户会要求你的密码,这和ORACLE_PWD 环境变量或oraclepw 如果您使用的是甲骨文注册表容器。利用你的环境SYS 当连接到现有的甲骨文环境时,用户密码.
我们需要设定两个数据库参数:
db_recovery_file_dest_size
存储归档日志可用的字节数。
假设现有归档日志和要归档的下一个日志的大小超过此配置值。在这种情况下,甲骨文数据库归档程序将会阻塞。如果所有重做日志都需要归档,并且档案程序进程被阻塞,那么数据库将阻止更改,直到档案程序解除块。使用RMAN 实用程序解除了档案程序进程的阻塞,允许归档任何挂起的重做日志。因此,根据您的数据库保留策略选择一个合适的大小通常是一个好主意。
db_recovery_file_dest
存储归档日志的磁盘上的位置。
这个位置必须是可读和可写的甲骨文数据库用户,通常被称为oracle 用户。
为了设置这些值,我们将在SQL*+终端窗口中执行下列SQL命令,在此窗口中,我们已经将数据库连接为SYS 用户。同样,如果您正在连接到一个先前存在的环境,请在这里进行之前咨询您的数据库管理员。
ALTER SYSTEM SET db_recovery_file_dest_size = 10G;
ALTER SYSTEM SET db_recovery_file_dest = ‘/opt/oracle/oradata/ORCLCDB’ scope=spfile;
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
ARCHIVE LOG LIST;
以上所述ALTER 语句调整数据库参数,指定存档日志的保留最高可达10GB,并且/opt/oracle/oradata/ORCLCDB 日志的存储位置。
SQL*+的最终输出应显示以下内容:
SQL> Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 1
Next log sequence to archive 3
Current log sequence 3
归档日志的配置已经完成,当数据库日志开关发生时,甲骨文拱形过程将将重做日志转换为存储在磁盘指定位置的归档日志。
甲骨文支持多个归档日志目的地的概念,允许在不同的文件位置存储重做日志。在使用甲骨文数据存储器将存档日志的副本转移到辅助服务器进行灾难恢复或业务智能时,多个存储位置是常见的。我们不会在这篇博文中讨论如何配置这一功能,但值得注意的是,这一功能是存在的,而且可能是有用的。
配置甲骨文:重做日志
甲骨文的事务日志被称为重做日志。这些日志非常重要,因为它们用于数据库崩溃或媒体无法恢复到检查点。不幸的是,甲骨文容器图像经常使用重做日志配置,这对Debezu没有用处。
有两个 采矿战略 为德贝兹的甲骨文连接器准备的。该策略控制连接器如何与甲骨文物流者交互,以及连接器如何输入架构和表的变化。
redo_log_catalog
数据字典将定期写入重做日志,随着时间的推移,将产生更高一代的归档日志。这个设置允许跟踪DDL更改,因此如果表的架构改变,这将是实现这个目的的理想策略。
online_catalog
数据字典不会定期写入重做日志,留下与当前行为一致的归档日志生成。甲骨文物流公司将大大加快变更的挖掘速度;然而,这种性能的代价是 不 追踪DDL变化。如果表的模式保持不变,这将是实现这一目的的理想策略。
当使用时online_catalog 模式,你可以完全跳过这一步。
当使用时redo_log_catalog 模式(默认),重做日志的大小对于降低日志开关的频率至关重要。当日志切换发生时,重新启动日志程序会话并在重做日志中重建数据字典。该词典由LLOBMIR读取,并用于跟踪会话重新启动时的DDL变化,这可能导致在填充字典表时出现轻微的初始会话延迟。总的来说,当重做日志大到足以将数据字典写入单个日志文件时,您将获得更好的性能。
甲骨文容器注册表的图像带有重做日志大小的200MB .当使用默认的挖掘策略时,这个默认的大小太小了,所以我们将调整这一点,以便日志使用一个400MB .
当使用甲骨文安装时,不需要多租户,使用400MB 由于根数据库中存在一系列基本表,但在启用多租户时,可插入数据库中不存在,因此可能仍然略有小的影响。请使用500MB 相反,如果你在吸收一个没有多租户的甲骨文环境的变化。
无论多租户,这些价值在您的生产环境中应该更重要。您的DBA将能够使用甲骨文的大小指南来确定基于日志开关频率和系统负载的最佳值。
在做出任何改变之前,检查环境的当前状态是很重要的。在启用归档日志记录的同一终端中,执行下面的SQL来确定当前的日志大小。
SELECT GROUP#, BYTES/1024/1024 SIZE_MB, STATUS FROM V$LOG ORDER BY 1;
甲骨文集装箱登记册图像将返回以下输出:
GROUP# SIZE_MB STATUS
1 200 INACTIVE
2 200 INACTIVE
3 200 CURRENT
这个输出告诉我们有3个日志组,每个组消耗200MB 每根日志的空间。此外,与每个组相关的状态非常重要,因为它代表了日志的当前状态。
下文详细描述了圆木雕像:
INACTIVE
这意味着甲骨文已经初始化了日志,目前还没有使用。
ACTIVE
这意味着甲骨文已经初始化了日志,目前正在使用。重做日志是必需的,在发生故障时使用,这样数据库就可以安全地恢复。
CURRENT
这意味着甲骨文目前正在编写这个日志。当使用甲骨文实际应用程序集群(RAC)时,多个日志可以标记为当前日志,表示每个集群节点的日志。
UNUSED
这意味着甲骨文没有初始化日志,也没有使用。
现在,使用相同的终端窗口,执行下面的SQL来确定文件名和重做日志的位置。
SELECT GROUP#, MEMBER FROM V$LOGFILE ORDER BY 1, 2;
甲骨文集装箱登记册图像将返回以下输出:
GROUP# MEMBER
1 /opt/oracle/oradata/ORCLCDB/redo01.log
2 /opt/oracle/oradata/ORCLCDB/redo02.log
3 /opt/oracle/oradata/ORCLCDB/redo03.log
我们可以从中收集到,每个日志组由一个重做日志组成。甲骨文确实支持每个组多日志的概念,允许所谓的多路复用。您通常只会在生产环境中看到这种情况,偶尔也会在测试环境中看到这种情况,但在开发或容器环境中很少看到这种情况。
我们的目标是调整BYTES 列于V$LOG 有价值的表400MB .不幸的是,进行这种调整的唯一方法是删除并重新创建日志组,这只有在STATUS 其中之一是INACTIVE 或UNUSED .因为日志组1INACTIVE 上面,我们将从它开始,但是您可以安全地按任何顺序在日志组上执行这个过程。
在SQL*+运行的终端中,执行以下操作:
ALTER DATABASE CLEAR LOGFILE GROUP 1;
ALTER DATABASE DROP LOGFILE GROUP 1;
ALTER DATABASE ADD LOGFILE GROUP 1 (’/opt/oracle/oradata/ORCLCDB/redo01.log’) size 400M REUSE;
这将删除并重新创建具有400MB .我们将在MEMBER 从VLOGFILE 表如果数据库使用多路复用,每个日志组有多个日志文件,则使用以逗号分隔的文件名列表来注册每个日志文件。
继续对所有日志组执行上述程序,相应地更改日志组和文件名,直到所有日志组和文件名。INACTIVE 或UNUSED 团体的规模400MB .一旦需要改变的是那些CURRENT ,您可以在数据库上发出日志开关,使用以下SQL将数据库提前到下一个重做日志:
ALTER SYSTEM SWITCH LOGFILE;
如果你重新检查日志的大小V$LOG ,你会看到输出如下:
SQL> SELECT GROUP#, BYTES/1024/1024 SIZE_MB, STATUS FROM V$LOG ORDER BY 1;
GROUP# SIZE_MB STATUS
1 400 CURRENT
2 400 UNUSED
3 200 ACTIVE
我们现在需要等待数据库最终将日志组3的状态切换到INACTIVE .开关可能需要几分钟,所以耐心等待,并定期检查尺寸。一旦身份达到INACTIVE ,使用相同的程序修改最后的日志组和文件名。
最后一次检查V$LOG 在最后一个日志组之后,我们会看到所有东西看起来都很有序:
SQL> SELECT GROUP#, BYTES/1024/1024 SIZE_MB, STATUS FROM V$LOG ORDER BY 1;
GROUP# SIZE_MB STATUS
1 400 CURRENT
2 400 UNUSED
3 400 UNUSED
在这一点上,我们修改了所有重做日志的大小,减少了当Debezns执行数据字典构建步骤时日志开关的频率。
配置甲骨文:补充日志记录
甲骨文重做日志主要用于例如和媒体恢复,因为这些操作所需的数据被自动记录。默认情况下无法使用日志记录器,因为甲骨文没有从框中提供任何补充日志数据。由于Debezns依赖于后勤人员,所以必须至少启用补充日志记录,以便为甲骨文执行任何更改数据捕获。
可以使用两种不同的策略来设置补充日志:
补充测井记录
补充测井记录
为了让Debezns与日志程序接口和使用链行和各种存储安排进行工作,必须在最低级别启用数据库补充日志记录。要启用此级别,请在当前的SQL*+终端中执行以下SQL:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
在讨论配置连接器时,我们将在稍后的一节中介绍基于表的补充日志记录。
配置甲骨文:用户设置
对于Debezum连接器来捕获更改事件,它必须建立一个JDBC连接到数据库,并执行一系列的日志程序API。用户帐户需要特定权限才能访问这些日志程序API并从捕获的表中收集数据。
当使用多租户体系结构时,如甲骨文容器注册表图像所示,我们将不得不使用两个有效的数据库,ORCLCDB (容器或根数据库)和ORCLPDB1 (可插入数据库)。所有捕获的表都将在PDB中创建和维护,但有时候连接器需要访问根数据库来读取特定的系统表。
因此,在一个多租户架构中,我们必须首先设置我们的用户帐户将使用的两个表空间。要创建这些表空间,请在SQL*+终端中执行以下SQL:
CONNECT sys/oraclepw@ORCLCDB as sysdba;
CREATE TABLESPACE logminer_tbs DATAFILE ‘/opt/oracle/oradata/ORCLCDB/logminer_tbs.dbf’
SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
CONNECT sys/oraclepw@ORCLPDB1 as sysdba;
CREATE TABLESPACE logminer_tbs DATAFILE ‘/opt/oracle/oradata/ORCLCDB/ORCLPDB1/logminer_tbs.dbf’
SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
如果部署没有在甲骨文数据库上使用多租户启用,则在ORCLPDB1 数据库是不必要的。此外,确保为表空间、凭证和数据库IDID提供的路径对您的安装是正确的。您可能需要与您的DBA协商才能正确创建表空间。
一旦表空间存在,现在是创建用户帐户本身的时候了。如果您正在使用一个多租户环境,那么用户名必须使用普通用户前缀,以便甲骨文能够在CDB根数据库和PDB可插入数据库中创建它;否则,用户名可以是任何东西。由于我们正在使用一个多租户数据库安装与我们的容器,我们将创建一个用户帐户,称为c##dbzuser .
CONNECT sys/oraclepw@ORCLCDB as sysdba;
CREATE USER c##dbzuser IDENTIFIED BY dbz DEFAULT TABLESPACE LOGMINER_TBS
QUOTA UNLIMITED ON LOGMINER_TBS
CONTAINER=ALL;
用户帐户需要几个权限.在本出版时,许可清单包括以下内容:
GRANT CREATE SESSION TO c##dbzuser CONTAINER=ALL;
GRANT SET CONTAINER TO c##dbzuser CONTAINER=ALL;
GRANT SELECT ON V_$DATABASE TO c##dbzuser CONTAINER=ALL;
GRANT FLASHBACK ANY TABLE TO c##dbzuser CONTAINER=ALL;
GRANT SELECT ANY TABLE TO c##dbzuser CONTAINER=ALL;
GRANT SELECT_CATALOG_ROLE TO c##dbzuser CONTAINER=ALL;
GRANT EXECUTE_CATALOG_ROLE TO c##dbzuser CONTAINER=ALL;
GRANT SELECT ANY TRANSACTION TO c##dbzuser CONTAINER=ALL;
GRANT SELECT ANY DICTIONARY TO c##dbzuser CONTAINER=ALL;
GRANT LOGMINING TO c##dbzuser CONTAINER=ALL;
GRANT CREATE TABLE TO c##dbzuser CONTAINER=ALL;
GRANT LOCK ANY TABLE TO c##dbzuser CONTAINER=ALL;
GRANT CREATE SEQUENCE TO c##dbzuser CONTAINER=ALL;
GRANT EXECUTE ON DBMS_LOGMNR TO c##dbzuser CONTAINER=ALL;
GRANT EXECUTE ON DBMS_LOGMNR_D TO c##dbzuser CONTAINER=ALL;
GRANT SELECT ON V_KaTeX parse error: Expected 'EOF', got '#' at position 9: LOG TO c#̲#dbzuser CONTAI…LOG_HISTORY TO c##dbzuser CONTAINER=ALL;
GRANT SELECT ON V_KaTeX parse error: Expected 'EOF', got '#' at position 17: …OGMNR_LOGS TO c#̲#dbzuser CONTAI…LOGMNR_CONTENTS TO c##dbzuser CONTAINER=ALL;
GRANT SELECT ON V_KaTeX parse error: Expected 'EOF', got '#' at position 23: …PARAMETERS TO c#̲#dbzuser CONTAI…LOGFILE TO c##dbzuser CONTAINER=ALL;
GRANT SELECT ON V_KaTeX parse error: Expected 'EOF', got '#' at position 18: …CHIVED_LOG TO c#̲#dbzuser CONTAI…ARCHIVE_DEST_STATUS TO c##dbzuser CONTAINER=ALL;
GRANT SELECT ON V_$TRANSACTION TO c##dbzuser CONTAINER=ALL;
你可以参考最新的 文件 检讨所需拨款是否已更改。我们已经创建了我们将在配置中使用的连接器用户,并给予了用户所有必要的数据库权限。
结论
在本系列的这一部分,我们介绍了甲骨文是什么,为什么它如此流行。我们还包括使用容器安装甲骨文数据库和配置甲骨文实例,以允许Debezium吸收更改。在…中 下一部分 在这个系列中,我们将深入研究在阿帕奇卡夫卡连接上部署德贝兹甲骨文连接器。