oracle安装及使用
1、docker安装oracle
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
2、配置oracle环境变量
docker exec -it oracle11 bash
vi /etc/profile
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:$PATH
source /etc/profile
这里设置的ORACLE_SID将作为登录的服务名
3、配置数据库
sqlplus /nolog --登录
conn /as sysdba --
alter user system identified by system;--修改system用户账号密码;
alter user sys identified by system;--修改sys用户账号密码;
create user test identified by test; -- 创建内部管理员账号密码;
grant connect,resource,dba to test; --将dba权限授权给内部管理员账号和密码;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; --修改密码规则策略为密码永不过期;(会出现坑,后面讲解)
alter system set processes=1000 scope=spfile; --修改数据库最大连接数据;
4、重启
conn /as sysdba
shutdown immediate; --关闭数据库
startup; --启动数据库
exit:退出
5、开启日志归档
sqlplus /nolog --登录
conn /as sysdba --
archive log list;
查看日志归档设置状态,发现未开启日志归档。
alter system set db_recovery_file_dest_size = 10G;
alter system set db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' scope=spfile;
需要手动创建/opt/oracle/oradata/recovery_area目录,注意授权
mkdir -p /opt/oracle/oradata/recovery_area
chown -R oracle:root /opt/oracle/
chmod -R 0777 /opt/oracle
重启+启动归档日志+查看归档日志状态
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
archive log list;
更详细配置:
https://github.com/ververica/flink-cdc-connectors/blob/master/docs/content/connectors/oracle-cdc.md
6、flink-cdc
导入依赖
<dependency>
<groupId>com.ververica</groupId>
<artifactId>flink-connector-oracle-cdc</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
flink版本是1.13.6,scala版本是2.11,oracle-cdc版本是2.2.1
示例代码:
Properties properties = new Properties();
properties.put("database.tablename.case.insensitive","false");
SourceFunction<String> sourceFunction = OracleSource.<String>builder()
.hostname("192.168.31.219")
.port(1521)
.database("helowin") // monitor XE database
.schemaList("TEST") // monitor inventory schema
.tableList("TEST.DEMO") // monitor products table
.username("system")
.password("system")
// .startupOptions(StartupOptions.latest())
.debeziumProperties(properties)
.deserializer(new JsonDebeziumDeserializationSchema()) // converts SourceRecord to JSON String
.build();
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.addSource(sourceFunction)
.print().setParallelism(1); // use parallelism 1 for sink to keep message ordering
env.execute();
必须加 properties.put("database.tablename.case.insensitive","false"); 否则会报错:
io.debezium.DebeziumException: Supplemental logging not configured for table HELOWIN.TEST.demo. Use command: ALTER TABLE TEST.demo ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS
大小写导致的问题:需要注明的是,对于 database.tablename.case.insensitive 参数,Debezium 目前仅对 Oracle 11g 默认设置为 true,对其余 Oracle 版本均默认设置为 false。所以读者如果使用的不是 Oracle 11g 版本,可无需修改该参数,但仍需显式指定大写的表名。
踩坑
oracle用docker安装后过去了12天,今天连接是发现报错archiver error. Connect internal only, until freed.google后猜测大概意思是,归档错误,只允许内部连接,直到被清理。看网上的说法应该是归档日志满了,不清理日志,外网无法连接。
docker exec -it oracle11g /bin/bash
sqlplus /nolog
报错,
source /etc/profile
sqlplus /nolog
conn /as sysdba;
查询日志归档使用情况
select * from V$FLASH_RECOVERY_AREA_USAGE;
archived log 为99.99。确定是日志满了。
exit --退出sqlplus
rman -- 进入rman
connect target /
crosscheck archivelog all; -- 检查日志
delete expired archivelog all; -- 删除过期日志
DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7'; -- 删除7天前的日志
再次查询日志,发现只有0.62了,连接oracle也可以连接了。
还有就是将日志空间设置大一点(未测试)
alter system set DB_RECOVERY_FILE_DEST_SIZE=10g
不确定是在sqlplus中执行还是在rman中执行
补充日志和归档日志
归档日志(Archive Log)和补充日志(Supplemental Logging)是Oracle数据库中两个不同的日志机制,用于不同的目的。
- 归档日志(Archive Log):
- 归档日志是用于数据库备份和恢复的一种机制。
- 当数据库处于归档日志模式时,数据库会将已提交的事务日志写入归档日志文件中,而不仅仅是写入在线重做日志文件。
- 归档日志文件可以用于在数据库发生故障时进行恢复,以保证数据的完整性和一致性。
- 归档日志对于数据恢复和灾难恢复非常重要,但对于实时数据捕获(如CDC)并不是必需的。
- 补充日志(Supplemental Logging):
- 补充日志是一种用于捕获数据库更改操作的机制。
- 当启用补充日志后,数据库会将更改操作的详细信息记录到重做日志中,包括修改的表、列和行的信息。
- 补充日志对于实时数据捕获(如CDC)非常重要,因为它提供了更详细的更改信息,使应用程序能够准确地捕获和处理这些更改。
对于使用CDC(Change Data Capture)的情况,你需要启用补充日志。补充日志记录了数据库中的更改操作,使CDC工具(如Flink CDC)能够捕获这些更改并将其传递给其他应用程序进行处理。
总结:
- 归档日志用于备份和恢复数据库,保证数据的完整性和一致性。
- 补充日志用于实时数据捕获(如CDC),记录数据库的更改操作,以便其他应用程序可以捕获和处理这些更改。
之前搞的是归档日志,这里开启补充日志
ALTER DATABASE ARCHIVELOG 命令用于开启Oracle数据库的归档日志模式,而不是补充日志(Supplemental Logging)。
补充日志是一种用于捕获数据库更改操作的机制,以便其他应用程序(如Flink CDC)可以监听和处理这些更改。要在Oracle数据库中启用补充日志,你需要执行以下步骤:
确保你具有适当的权限,例如sysdba权限。
使用sys用户登录到Oracle数据库。
执行以下命令来启用补充日志:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
这将在数据库级别启用补充日志(在当前数据库中启用补充日志)。
如果你只想为特定表启用补充日志,可以执行以下命令:
ALTER TABLE ORCL.TEST.TEST1 ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
这将为ORCL.TEST.TEST1表启用补充日志,并为所有列配置补充日志。
请注意,启用补充日志可能会增加数据库的负载和存储需求。确保在启用补充日志之前评估其对系统性能和资源的影响。
参考:https://github.com/ververica/flink-cdc-connectors/blob/master/docs/content/connectors/oracle-cdc.md