Oracle12c创建新用户提示公共用户名或角色无效(oracle12c容器数据库和可插拔数据库的关系分析)
2017-02-18 18:02
597 查看
今天将备份的数据库还原到一台新的电脑上,首先要创建用户,执行如下语句:
结果出现了一个错误:
我们可以看出提示的是:公共用户名或角色无效。这时候我就郁闷了,呃,查资料,发现创建用户的时候要以c##开头,也就是刚才的创建语句应该这么写:
就这样试了一下,果真创建成功了,可是为什么要这么做,有些不明白,然后继续查资料,原因是这样的:
Oracle 12C引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE
12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。
CDB组件(Components of a CDB)
一个CDB数据库容器包含了下面一些组件:
ROOT组件
ROOT又叫CDB$ROOT, 存储着ORACLE提供的元数据和Common User,元数据的一个例子是ORACLE提供的PL/SQL包的源代码,Common User 是指在每个容器中都存在的用户。
SEED组件
Seed又叫PDB$SEED,这个是你创建PDBS数据库的模板,你不能在Seed中添加或修改一个对象。一个CDB中有且只能有一个Seed. 这个感念,个人感觉非常类似SQL SERVER中的model数据库。
PDBS
CDB中可以有一个或多个PDBS,PDBS向后兼容,可以像以前在数据库中那样操作PDBS,这里指大多数常规操作。
这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个PDB是一个容器。每个容器在CDB中都有一个独一无二的的ID和名称。
怎么查看数据库是否为CDB?
4000
执行下面这条语句:
如果得到的结果为YES,那么就是CDB的数据库,否则,则不是。
怎么查看当前的容器?
执行下面这条语句:
执行结果如下:
怎么查看CDB中的PDB信息?
执行下面这条语句:
在容器间切换:
--------------------------------------------------------------分割线------------------------------------------------------------------------
那么说了这么多,怎么就可以创建用户而不用加c##了呢,我在这里创建一个新的数据库,步骤如下:
打开 Database Configuration Assistant
出现如下界面:
点击“下一步”出现如下界面,在创建数据库的时候将“创建为容器数据库”项取消勾选。
这样新创建的数据库就可以使用了。
create user fxhy identified by "123456" default tablespace USERS temporary tablespace TEMP;
结果出现了一个错误:
我们可以看出提示的是:公共用户名或角色无效。这时候我就郁闷了,呃,查资料,发现创建用户的时候要以c##开头,也就是刚才的创建语句应该这么写:
create user c##fxhy identified by "123456" default tablespace USERS temporary tablespace TEMP;
就这样试了一下,果真创建成功了,可是为什么要这么做,有些不明白,然后继续查资料,原因是这样的:
Oracle 12C引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE
12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。
CDB组件(Components of a CDB)
一个CDB数据库容器包含了下面一些组件:
ROOT组件
ROOT又叫CDB$ROOT, 存储着ORACLE提供的元数据和Common User,元数据的一个例子是ORACLE提供的PL/SQL包的源代码,Common User 是指在每个容器中都存在的用户。
SEED组件
Seed又叫PDB$SEED,这个是你创建PDBS数据库的模板,你不能在Seed中添加或修改一个对象。一个CDB中有且只能有一个Seed. 这个感念,个人感觉非常类似SQL SERVER中的model数据库。
PDBS
CDB中可以有一个或多个PDBS,PDBS向后兼容,可以像以前在数据库中那样操作PDBS,这里指大多数常规操作。
这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个PDB是一个容器。每个容器在CDB中都有一个独一无二的的ID和名称。
怎么查看数据库是否为CDB?
4000
执行下面这条语句:
select CDB from v$database;
如果得到的结果为YES,那么就是CDB的数据库,否则,则不是。
怎么查看当前的容器?
执行下面这条语句:
show con_name;
执行结果如下:
怎么查看CDB中的PDB信息?
执行下面这条语句:
select con_id, dbid, guid, name , open_mode from v$pdbs;
执行结果如下:
启动PDB数据库的方式: 执行下面这条语句:
alter pluggable database PDBORCL open;
执行结果如下:
关闭PDB数据库的方式: 执行下面这条语句:
alter pluggable database PDBORCL close;
执行结果如下:
在容器间切换:
alter session set container=PDBORCL; alter session set container=CDB$ROOT;
--------------------------------------------------------------分割线------------------------------------------------------------------------
那么说了这么多,怎么就可以创建用户而不用加c##了呢,我在这里创建一个新的数据库,步骤如下:
打开 Database Configuration Assistant
出现如下界面:
点击“下一步”出现如下界面,在创建数据库的时候将“创建为容器数据库”项取消勾选。
这样新创建的数据库就可以使用了。
相关文章推荐
- Oracle12c创建新用户提示公共用户名或角色无效
- oracle12c创建用户提示ORA-65096:公用用户名或角色无效
- Oracle12c创建新用户提示公共用户名或角色无效
- oracle12c 创建用户出现ORA-65096: 公用用户名或角色名无效
- 分享知识-快乐自己:oracle12c创建用户提示ORA-65096:公用用户名或角色无效
- oracle12创建用户错误ORA-65096: 公用用户名或角色名无效 invalid common user or role name
- oracle12创建用户授权和密码报:65096 公用用户名或角色无效
- 使用plsql创建的用户,以普通身份无法登录进去,提示ORA-01017: 用户名/口令无效; 登录被拒绝
- 使用plsql创建的用户,以普通身份无法登录进去,提示ORA-01017: 用户名/口令无效; 登录被拒绝
- oracle12创建用户错误ORA-65096: 公用用户名或角色名无效 invalid common user or role name
- oracle12创建用户错误ORA-65096: 公用用户名或角色名无效 invalid common user or role name
- PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系
- sql2000创建所有关系图时提示“无效的类别字符串”的解决办法
- SQL server2005服务器登录名、角色、数据库用户、角色、架构的关系
- MS-SQL2005服务器登录名、角色、数据库用户、角色、架构的关系
- Oracle创建删除用户、角色、表空间、导入导出数据库命令行方式总结(转)
- SQL server2005服务器登录名、角色、数据库用户、角色、架构的关系
- 创建oracle 数据库表空间,角色,用户的sql语句
- Oracle创建删除用户、角色、表空间、导入导出数据库命令行方式总结
- Oracle创建删除用户、角色、表空间、导入导出数据库命令行方式总结