相信可能有很多用oracle数据库做项目数据库的同学们都多多少少有遇到这个错误。上网搜索的时候,大部分的答案都是需要在建库时加前缀“C##”,或者是修改可插拔数据库PDB的状态等。这些答案可能解决了大多数人的问题,但像我们本身使用多种类型数据库的人来说,习惯就容易让我们与正确答案迷失方向。

首先我遇到这个问题的起始需求是:建一个数据库。

使用的语句是:Create database KG;

获得的结果:

ORA-01501: CREATE DATABASE 失败

ORA-01100: 数据库已装载

后来我分析了一下为什么会产生这个错误,按理来说,这个建库语句是没有语法问题的,后来我便从错误代码ORA-01501开始分析,发现很多人出现了这个问题。比较大众的说法是oracle自12C版本开始后 ,有了PDB和CDB的概念,也就是多租户模式概念,从oracle的官网也可以得知这个概念。简洁的来说,CDB和PDB之间的关系可以类比于操作系统中的容器和应用程序的关系。CDB就像一个操作系统,可以容纳多个PDB,每个PDB就像一个独立的应用程序,可以在CDB中运行、管理和维护。oracle12C后的版本为了支持多租户的架构,引入了“C##”前缀创建用户,用以区别普通用户与容器数据库的区别~为什么是“c##”的格式,还因为在Oracle 12C之前,用户的名称必须以字母开头,并且不能以”#”字符开头。所以也有这个原因。

解决方案:可以直接用创建用户的方式创建数据库。

For example:create user c##GZTEST02;

试试能不能正常建表:

可以啦~问题正常解决。在这里,建立了一个公共用户相当于建立了一个数据库~我觉得这样好理解。至于PDB和PDB的区别和一些查询权限等的区别,有兴趣的同学可以留言~我出一期比较精细的,或者后期放在后台自取PDF。

当然,个人系统差异原因,不是所有的都是这个原因,只能作为参考。

我觉得解决问题比较主要的还是对概念的理解:

  1. oracle12C和之前版本的区别 (PDB 和 CDB 的区别)c##

  2. 建表语句的习惯 create database xxx 变更为 create user***

这是我个人的解决方案,欢迎各位留言自己的解决方法。如果能帮到你,那就是我的荣幸

本人的微信公众号为:会用数据库 (欢迎关注!!)

不定时更新,希望与渴望进步的你一起找bug,学好数据库~