从Oracle数据库或类似文本文件、MariaDB(或MySQL)获取数据的几种方法。Oracle数据库不希望您这样做,因此需要进行一些必要的调整。其中一种方法是使用触发器、UDF、UPD-通信和简单的服务器,这是从Oracle到MariaDB的同步复制系列文章的***部分。也就是说,从Oracle导出数据到文本文件是Oracle不愿意看到的。它希望您将数据保存在其中,解决它,现在您可以使用Oracle转储工具。这已经很好并且适用于大多数Oracle数据类型。对于复制,如果您不使用触发器或其他机制,也许最好使用开源的东西,或者是否可以在不指定特殊工具的情况下完成?一种方法是在Oracle前面放一个代理。这个很有用,但是开发和熟悉Oracle的通信协议太费时间了,我不想做(我承认我懒)。所以现在只能尝试其他的方式,直接从Oracle中拷贝数据。稍后我将展示一个实际示例来执行此操作,它不需要太多代码,但现在我将解释它是如何工作的。正确获取Oracle中的数据是比较困难的,所以本系列博客的第一部分将对Oracle做更多的解释,这是一个很好的理由(例如:不用自己实现就可以使用),让我们开始吧。从现在开始,Oracle中没有二进制日志(binlog)(也没有修改日志)。Oracle有redologs,InnoDB/XtraDB也采用这种方式。它们都是基于同一个目的——在发生崩溃时恢复数据库。由于redolog达到了这个目的,所以它记录的是比binlog更底层的日志。数据库中的任何修改事件都可以在Oracle的重做日志中找到,包括许多Oracle内部进程。Oracle在幕后做了很多事情,不像MariaDB严重依赖操作系统,它会更多地使用它自己的内部管理,比如文件空间管理和类似的东西。当然,这并不是说Oracle在这方面比MariaDB好,或者恰恰相反,Oracle诞生的时候,你要支持很多不同的操作系统,所以在某些方面你需要透明地设计(也就是,设计更抽象,高层不必依赖操作系统实现)。同时,甲骨文诞生的时代,大部分磁盘的大小都只有5MB,所以很多都是保守的(这暴露了我的年龄,是的,我的出生日期早于MilleSmall的主打歌《MyBoyLollipop》。与流行的看法相反,它不是罗德斯图尔特使用口琴独奏的那个,总结今天的“无用知识”课程)。在我们详细查看Oracle重做日志之前,我想解释一下。Oracle中还有一个文件,很小但是很重要,叫做控制文件。控制文件用于跟踪所有其他文件和关联的数据库设置。对于重做日志,有两个目的。一种基本方式是非归档(NOARCHIVELOG)模式,这意味着日志文件将被重用。这类似于InnoDB/XtraDB日志文件的使用方式,其目的是提供一种在崩溃后恢复的方法。想象一下,你需要使用这些日志文件来恢复某个时间点,前提是你已经保存了这些文件,例如:做了一个物理备份并保存了这些文件。对于MariaDB,我们将使用binlog进行时间点恢复。使用重做日志的目的是为了恢复某个时间点的Oracle。我们必须保存重做日志。在归档模式下,Oracle有一个单独的进程“归档”来做,即当日志写满,切换日志时,将日志保存在别处。所有这些,当前的和存档的重置日志文件都记录在Oracle控制文件中。了解Oracle的这些知识对于理解代码的工作原理非常重要。还有一个我需要简单讨论一下,就是Oracle的ROWID。ROWID是Oracle中表中一行数据的唯一标识。ROWID实际上是一个物理地址。在某些情况下,当表属于聚合表时,可以在两个不同的表中使用相同的ROWID,但对于表来说,里面的ROWID唯一标识一行。使用表的ROWID,可以使用伪列ROWID,可以在WHERE和SELECT语句中使用。所以,现在我们要灵活运用上面的知识。Oracle的redologs包含了数据库的变化,所以我们可以使用redologs来达到和MariaDB中binlog一样的目的,比如replication。为了进行复制,我们首先需要能够读取重做日志,我们可以读取重做日志文件,但它相当复杂,如果你坚持这样做,你可以阅读thisdoc中的示例,但我认为它不是一个好主意。相反,我们应该使用Oracle的工具。对于我们感兴趣的DML,我们需要复制处理表的INSERT、UPDATE和DELETE语句,然后在事务结束时提交。对于这些操作,我们希望重做日志中包含以下数据:操作类型唯一表标识符(不是表名)列和值更改RowIDSCN(系统更改编号)。现在我需要谈谈SCN。SCN非常简单;它是一个48位整数,用于标记事务并在每次启动新事务时向上递增。可以得到表中最后一次变化的SCN,实际上是该行所在block的SCN(可以跟踪ROW的变化,有很多很奇葩的选项可以满足用户的需求。)。在我写完这篇博文之前,我想演示一下如何从重做日志文件中获取数据。在您问之前,oracle没有重做日志单元或类似的东西。这不是MariaDB,这是Oracle数据库。Oracle数据库的工具本身并不是工具,而是OraclePL/SQL包。在这种情况下日志分析,或像DBMS_LOGMNR这样的包。为了进行日志分析,我们需要以存档模式运行数据库。所以如果你是新安装的Oracle数据库,请以特权用户登录:$sqlplus/assysdba然后运行以下命令:SQL>SHUTDOWNIMMEDIATE;SQL>STARTUPMOUNT;SQL>ALTERDATABASEARCHIVELOG;SQL>ALTERDATABASEOPEN;另外,为了获取所有数据后,我们必须向重做日志添加“补充数据”。这意味着我还没有查看数据,但如果你愿意,请相信我。在同一个SQL*Plus窗口中,运行:SQL>ALTERDATABASEADDSUPLEMENTALLLOGDATA;我们可以从这里开始分析日志。这包括两个步骤:***,开始分析日志本身,然后选择一个表来存储分析日志。让我们看看如何开始使用SQL脚本分析日志。调用脚本startlog.sql:columnmin_scnnew_valuestartscncolumncurrent_scnnew_valueendscnSELECTMIN(FIRST_CHANGE#)min_scnFROMv$log;SELECTcurrent_scnFROMv$database;EXECUTEDBMS_LOGMNR.START_LOGMNR(STARTSCN=>&startscn,-ENDSCN=>&endscn,-OPTIONS=>DBMS_LOGMNR.COMMITTED_DATA_ONLY+-DBMS_LOGMNR.CONTINUOUS_MINE+-DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);SETARRAYSIZE1然后运行脚本,因为脚本不包含明显的退出语句,所以脚本执行后你仍然会看到SQL*Plus命令提示符。这与MariaDB命令行的工作方式不同。$sqlplus/assysdba@startlog.sql现在我们可以获取日志数据了,比如我们有一个表叫T1,我们对T1做了一些修改,那么我们可以使用如下语句获取相关记录:SQL>SELECTsql_redoFROMv$logmnr_contentsWHEREtable_name='T1'ANDseg_owner='ANDERS'ANDoperationIN('INSERT','UPDATE','DELETE');SQL_REDO----------------------------------------------------------------------------insertinto"ANDERS"."T1"("C1","C2")values('1','2');insertinto"ANDERS"."T1"("C1","C2")values('2','2');更新"ANDERS"."T1"set"C2"='3'where"C2"='2'andROWID='AAAE5KAAEAAAAFfAAA';更新"ANDERS"."T1"设置“C2”='3',其中“C2”='2'andROWID='AAAE5KAAEAAAAFfAAB';这似乎不完整!但其中的某些东西可能是有道理的,对吧?对于本系列的下一篇博文,我们将尝试。这篇博文或多或少是关于Oracle数据库的,下一篇博文将更多地描述如何复制到MariaDB,这是我们希望存储数据的地方,不是吗?快乐的SQL编程!
