一、背景
- 安装好Oracle 12c数据库后还和使用11g时那样去创建表空间、用户名、导入表,但是从创建用户名开始就出现问题。后来一查才了解到,Oracle 12c引入了CDB(ContainerDatabase,数据库容器)和PDB(Pluggable Database,可插拔数据库)新的特性,所有的问题出现都是因为不理解新特性导致的。
二、遇到的问题
- 创建新用户时,提示:ORA-65096:公共用户名或角色名无效
- 创建新用户时,提示:ORA-01109: 数据库未打开
- impdp导入时,提示:ORA-39083: 对象类型 USER:"UAMS_1" 创建失败, 出现错误:ORA-65096: 公用用户名或角色名无效 以及 ORA-39083: 对象类型 USER:"UAMS_1" 创建失败, 出现错误:ORA-01917: 用户或角色 'USER' 不存在
- impdp导入时,提示:UDI-12154: 操作产生了 ORACLE 错误 12154 ORA-12154: TNS: 无法解析指定的连接标识符
- impdp导入时,提示:ORA-39002: 操作无效 ORA-39070: 无法打开日志文件 ORA-39087: 目录名 DMP 无效
三、出现的原因
- 上述问题出现的原因都是因为12c默认打开的CDB数据库,你不手动切换到PDB数据库的话,你所创建的表空间、用户名、impdp时使用的文件目录都在CDB数据库下。我是在碰到「ORA-65096:公共用户名或角色名无效」第一个问题时,通过创建本地用户解决的问题,导致后续所有的操作都出现了问题。
四、解决办法(与第二步问题相对应)
- 原因:我们使用sys用户默认登录的是CDB数据库,CDB数据库只能创建公共用户,而Oracle规定公共用户命名是有规范的:以 c## 或者 C## 开头,但是本地用户没有此限制。我采取的解决办法是创建了本地用户。
- 原因:我理解12c 的orclpdb数据库实例默认是关闭的。切换到本地数据库后然后打开它再重新新建本地用户。切换命令:alter session set container=ORCLPDB; 打开命令:alter pluggable database ORCLPDB open; 。
- 原因:在orcl实例下找不到这些用户,需要将impdp命令中@后的orcl参数改为orclpdb。
- 原因:没有给PDB数据库配置实例名。找到tnsnames.ora文件,给PDB数据库配置个实例名,不能与orcl相同。
- 注意:格式严格按照orcl实例名的写,第一行开始不能有空格。
- 原因:之前创建的dmp目录是在CDB数据库下创建的。切换到orclpdb本地数据库下重新创建dmp目录。