ORACLE-12创建用户出现的错误及解决方法

        在项目开发中,我们难免会遇到需要自己创建表空间,然后自己创建用户,并为该自己创建的用户分配自己创建的表空间为默认表空间。这个时候,有一个问题,会让你一开始很无奈。接下来就说说我的心痛史吧。

       2017-10-23日,我在汕头。因为项目需要,我在自己使用的计算机中安装了ORACLE-12C数据库,并创建了表空间JLM_TAB;接着在创建用户c##JLM_DMS,并将此用户的默认表空间指定为刚刚创建的JLM_TAB,指定角色一般都是CONNET和DBA的前两项。最后单击应用的时候,报这样的错在数据库PDBORCL表空间JLM_TAB不存在。瞬间整个人完全蒙了,第一次遇到,是有点措手不及。一开始,根本没仔细看在数据库PDBORCL表空间JLM_TAB不存在,这句错误提示,还以为在创建用户本身出现了问题,于是我断开并删除当前链接,重新创建链接,在新创建链接下重新创建用户c##JLM_TAB,同样指定默认表空间为JLM_TAB,然而数据库还是报跟之前一样的错误。这下彻底被眼前的错误征服了,只能选择百度了。才找到了错误的根本原因。其实分析错误的关键地方就在于我没仔细看的错误提示:在数据库PDBORCL表空间JLM_TAB不存在。如果我第一次就详细阅读并分析这个错误的话,也不至于浪费我那么多的时间。其实回过头来仔细看看这句错误提示的话,错误的根本原因就很明显了。

        其实错误提示将创建用户失败的根本原因说的很清楚,这个原因就是 在数据库PDBORCL中不存在表空间JLM_TAB。额???到了这里你是不是很不解呀,我在创建该用户之前明明创建了表空间JLM_TAB的呀,而且创建成功的呀,怎么错误提示的是表空间不存在呢?没关系,这个时候先抽支烟压压惊,我们自己实在不解的话,就去百度看看。果然在百度中找到了答案:因为跟ORACLE-11g相比,ORACLE-12c中加入了一个新特性,那就是PDB的概念,PDB全称为PluggableDatabase,即可插拔数据库。在ORACLE-12c之前,实例与数据库是一对一或多对一的关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE-12c后,实例与数据库可以是一对多的关系。在来说下CDB的概念,CDB全称ContainerDatabase,中文翻译为数据库容器,一个CDB数据库容器可承载多个可插拔数据库(PDB)。首先容器数据库创建新用户并分配表空间时必须在没有PDB的情况下进行,当有PDB时,PDB与CDB必须有相同的表空间,否则会报错。如果是在PDB与CDB有相同表空间的情况下给CDB用户分配表空间,则分配CDB的表空间给用户PDB的表空间并不受影响,而且,CDB用户必须以C##开头,否则创建不了。

        明白这一点后,我们不难理解,因为我们以SYS或SYSTEM用户登录数据库,创建的表空间JLM_TAB其实创建在CDB用户中。而没有创建在PDB用户中,所以PDB中没有表空间JLM_TAB。此时问题便迎刃而解了。

        首先按快捷键win+R打开运行窗口,输入cmd,即打开命令提示符,在命令提示符窗口中输入 surplus,即打开ORACLE数据库自带的命令操作窗口。在此窗口中输入 sys as sysdba,意思是ORACLE的系统管理员用户sys 以sysdba身份或角色登录数据库。接下来输入密码,特别注意的是,输入密码是不会显示任何字符。不知道这一点的人还以为键盘坏了呢。然后就登录到ORACLE数据库中。此时输入 show con_name 命令,意思是查看当前容器,此时一定会显示CDB$ROOT,一看就明白当前容器是CDB,到这里你应该明白之前创建的表空间JLM_TAB为什么在CDB中了吧,以为ORACLE数据库默认所有用户连接到的是CDB,那么我们现在需要的是在PDB中创建表空间JLM_TAB,而当前容器是CDB,哈哈,这个问题很好解决,ORACLE强大的命令集足以解决这个问题。接下来就是切换当前用户sys的容器了,输入 alter session set container=PDBORCL,此时在用show con_name命令查看当前容器,显示的一定是PDBORCL,即此时数据库容器切换为PDB了。这一步一定要详细说明下,之前我按照百度上说的,指定要切换的容器时(即该命令“=”后面的值),将该值指定为PDB$SEED,命令是执行成功,而在创建表空间的时候,又报错:

                            ORA-00604:SQL递增级 1 错误,

                            ORA-16000 : 以只读的方式打开PDB$SEED。

        当时又是一阵头疼,试了几遍,依然报同样的错误,后来回头看创建用户时报的错,如醍醐灌顶,恍然大悟了。错误提示的是在数据库PDBORCL中表空间JLM_TAB不存在,而我指定的PDB却是PDB$SEED,这般低级错误,人家不报错才怪,明白错误原因后,立即将PDB$SEED修改为PDBORCL,在输入创建表空间命令,则大功告成。

                        create tablespace JLM_TAB

                            Logging

                            datafile D:\Oracle-12c\tablespace\JLM_TAB\PDB.DBFsize 526m

扫描二维码关注公众号,回复: 1561004 查看本文章

                            autoextend on next 10m

                            extent management local;

        需要注意的是,在CDB和PDB中的表空间要一致,但.dbf文件的名称不能相同,路径可相同也可不相同。此时用户创建一定会成功的。

        最后,来补充一下,当我们摆脱ORACLE数据库的客户端,如何用SQL语句创建一个用户,创建用户的SQL语句如下所示:

                CREATE USER C##DMS_OPR IDENTIFIED BY JLM2018188

                DEFAULT TABLESPACE "DMS_TAB"

                TEMPORARY TABLESPACE "TEMP"

        特别注意:当我们使用alter session set container=pdbmorcl将数据库切换为PDB后,有时候执行创建表空间语句时会报错:ORA-01109: 数据库未打开,这个时候我们不要惊慌失措,其实出现此问题的原因就是刚从CDB切换为PDB数据库后的PDB没有打开,所以就无法执行创建表空间的语句。解决方法就是将PDB打开,其操作命令是:alter pluggable database [PDB数据库名称] open;  我的本地PDB的名称是PDBMORCL,所以上述命令为:

                                        alter pluggable database PDBMORCL open;

        这次经历虽然花费了我很多时间,但这就是每个程序员走过的路,每一个程序员都是在这些错误中慢慢摸索,慢慢成长起来的。也让我明白了一个道理,以后在工作中遇到问题,首先一定不要着急,仔细看看所报的错误,在错误中发现原因,并冷静思考,得到解决问题的方法,加油,只要有勤奋好学,努力刻苦,锲而不舍,自律自信的精神,你的优秀是早晚的事。

猜你喜欢

转载自blog.csdn.net/weixin_38133660/article/details/80632139