oracle安装及使用


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数据库中两个不同的日志机制,用于不同的目的。

  1. 归档日志(Archive Log):
    • 归档日志是用于数据库备份和恢复的一种机制。
    • 当数据库处于归档日志模式时,数据库会将已提交的事务日志写入归档日志文件中,而不仅仅是写入在线重做日志文件。
    • 归档日志文件可以用于在数据库发生故障时进行恢复,以保证数据的完整性和一致性。
    • 归档日志对于数据恢复和灾难恢复非常重要,但对于实时数据捕获(如CDC)并不是必需的。
  2. 补充日志(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