问题1:
ORA-65096: 公用用户名或角色名无效
原因:
Oracle 12C以及更高版本中引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。
CDB相当于操作系统,调用并管理各个PDB。PDB相当于真正提供业务需求的数据库实例。Oracle 12C或更高版本安装后只创建了CDB,需要自己生成相应的PDB。 Oracle 12C或更高版在安装时,默认创建为容器数据库。
解决方法:
cdb创建用户是用户名前面必须要加上C##或c##,这时又会出现问题2:
问题2:
ORA-65048: 在插接式数据库 ORCLPDB 中处理当前 DDL 语句时出错
ORA-00959: 表空间 'TESTSPACE' 不存在
原因:
看了以下其他大神说,还是cdb的问题。查询一下现在的session:
sqlplus / as sysdba;
show con_name;
当前连接的session是cdb。这就导致了我在cdb创建了表空间但是pdb上面并没有这个表空间。由于cdb与pdb表空间结构不同,所以就出现了【ORA-00959: 表空间 'TESTSPACE' 不存在】的错误。
解决方法:
查看以下cdb数据库容器下的pdb
show pdbs;
如果结果为CDB&ROOT,则为容器状态(CBD),结果为ORCLPDB(这个PDB名字根据自己的实际情况而定,不是固定的),则为可插拔数据库(PDB)。
可以看到里面有个ORCLPDB,可以看到我现在的ORCLPDB的打开方式是可读写的,如果是mounted执行以下打开。
--启动相应pdb(orclpdb是我的pdb的名称)
alter pluggable database orclpdb open;
用navicat重新连接了一下这个可插拔数据库。
连接上PDB之后,创建用户也不许要加C##了
给用户赋予修改表空间的权限
alter user testuser quota unlimited on testspace
在程序启动时mybatis报错:【表或视图不存在】,以下是错误的连接参数
url: jdbc:oracle:thin:@localhost:1521/ORCLPDB username: system
此时是因为我没有使用我创建的用户进行连接,想着直接用权限较高的system就可以了,但是却报出了【表或视图不存在】这个错误,实际上username要使用自己创建的才行,不过还得给自己创建的用户添加以下权限,不然也会报错。
赋权sql:
-- 需要在system下进行赋权,我这里直接赋予dba权限
grant dba to testuser;
这样程序连接也不会又问题了。
其它:
查询表的所有命名空间:
select tablespace_name from user_tablespaces;
创建表空间
-- 创建表空间
CREATE tablespace testspace -- 创建名为testspace的表空间
datafile 'D:\testspace.dbf' -- 表空间存放在 'D:\testspace.dbf'
size 100m -- 表空间大小为 100m
autoextend on -- 表空间开启自动递增
next 10m -- 每次递增10m
创建用户
-- 创建用户(必须依托表空间,一个表空间下可建多个用户)
create user testuser --创建名为testuser的用户
identified by root -- 密码为root
default tablespace testspace -- 创建到名为testspace表空间下