Skip to main content

Oracle相关问题处理

安装步骤

安装步骤地址

报错处理一

ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/data/oracle/product/11.2.0/db_1/dbs/initorcl.ora

处理方案

报错处理二

ORA-00205: error in identifying control file, check alert log for more info

处理方案

具体操作步骤:

  • 使用命令dbca创建数据库jc中,去/usr/oracle/app中执行如下命令:即可拿到control_files路径。 find . -name control0*
  • 在SQL>窗口中执行如下命令,看control_files的路径如查找到的是否一致
show parameter control_files
alter system set control_files='/usr/oracle/app/oradata/jc/control01.ctl' scope=spfile;
alter system set control_files='/usr/oracle/app/flash_recovery_area/jc/control02.ctl' scope=spfile;

Oralce数据库配置文件

.bash_profile initjc.ora

linux 版 ORACLE自启

参见博客

Oracle数据库 字符集中文乱码

参见博客

Oracle 时间判断

不要使用trim(column)>someDate

直接 column > someDate

oracle数据库连接串

  1. ;表达式 SID格式
  2. /表达式 ServiceName格式

修复Oracle密码过期问题

Select * FROM dba_profiles s Where s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;


alter user jc identified by 123456;
alter user syste identified by 123456;

Mybtis主键自增处理

oracle

@Bean
public IKeyGenerator keyGenerator() {
return new H2KeyGenerator();
}

@KeySequence(value="xxx_sequence)
@TableId(type=IdType.INPUT)
prive Long primaryKey;

mysql

@TableId(type=IdType.AUTO)
// 在Mapper上面写
@Insert(xxx)
@Options(useGeneratedKeys=true, keyProperty="id")
int insertOne(XxxPo po)

使用MybatisPlusInterceptor + DynamicTableNameInnerInterceptor实现多租户

这个可以实现单schema动态名schema,但是sequence的schema前缀是没有的

@Configuration
public class MybatisPlusConfig {

// schema白名单,防止非法拼接
private static final Set<String> SCHEMA_WHITELIST = Set.of("SCHEMA_A", "SCHEMA_B");

// 需要动态切schema的表(其余表原样执行,不做任何改写)
private static final Set<String> MANAGED_TABLES = Set.of("orders", "order_items");

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

// 如果有分页插件,必须先加分页,再加动态表名,顺序影响处理链
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.ORACLE));

DynamicTableNameInnerInterceptor dynamicTableNameInterceptor =
new DynamicTableNameInnerInterceptor();

dynamicTableNameInterceptor.setTableNameHandler((sql, tableName) -> {
String schema = SchemaContextHolder.getSchema();

// 未设置schema,原样返回,不介入(走数据源默认schema)
if (schema == null || schema.isEmpty()) {
return tableName;
}
if (!SCHEMA_WHITELIST.contains(schema)) {
throw new IllegalArgumentException("非法schema: " + schema);
}
if (!MANAGED_TABLES.contains(tableName.toLowerCase())) {
return tableName; // 非受管表不改写
}
return schema + "." + tableName;
});

interceptor.addInnerInterceptor(dynamicTableNameInterceptor);
return interceptor;
}
}

补充sequence schema前缀方案,使用${schema}。 或者可以使用这种方式静态添加schema,(⚠️一个工程引入多个数据源,只会有一份keygenerators。)

@Component
public class SchemaAwareOracleKeyGenerator implements IKeyGenerator {

@Override
public String executeSql(String incrementerName) {
String schema = SchemaContextHolder.getSchema();
if (schema == null || !SCHEMA_WHITELIST.contains(schema)) {
throw new IllegalArgumentException("取序列时非法schema: " + schema);
}
return "SELECT " + schema + "." + incrementerName + ".NEXTVAL FROM DUAL";
}

@Override
public DbType dbType() {
return DbType.ORACLE;
}
}
协议
本作品代码部分采用 Apache 2.0协议 进行许可。遵循许可的前提下,你可以自由地对代码进行修改,再发布,可以将代码用作商业用途。但要求你:
  • 署名:在原有代码和衍生代码中,保留原作者署名及代码来源信息。
  • 保留许可证:在原有代码和衍生代码中,保留Apache 2.0协议文件。
本作品文档部分采用 知识共享署名 4.0 国际许可协议 进行许可。遵循许可的前提下,你可以自由地共享,包括在任何媒介上以任何形式复制、发行本作品,亦可以自由地演绎、修改、转换或以本作品为基础进行二次创作。但要求你:
  • 署名:应在使用本文档的全部或部分内容时候,注明原作者及来源信息。
  • 非商业性使用:不得用于商业出版或其他任何带有商业性质的行为。如需商业使用,请联系作者。
  • 相同方式共享的条件:在本文档基础上演绎、修改的作品,应当继续以知识共享署名 4.0国际许可协议进行许可。