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数据库配置文件
linux 版 ORACLE自启
Oracle数据库 字符集中文乱码
Oracle 时间判断
不要使用trim(column)>someDate
直接 column > someDate
oracle数据库连接串
;表达式 SID格式/表达式 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国际许可协议进行许可。