解析Oracle数据库中的对象集合schema
搭建一个oracle,下面会有很多schema,每个schema下的数据都不影响。
感觉和mysql的库的概念很像,现在用的数据库管理系统其实也是这么划分的,mysql用的ip+port+库标识,oracle用ip+port+schema标识,平时还总听到一个实例的概念,我的理解就是实例就是一系列相关进程,代表了一个数据库服务。目前线上为了节省资源,常常把机器分成多个实例,用不同的端口号标识,每个实例上有多个schema。
旭哥跟我说的很形象,oracle一个实例上有对应多个库。mysql一个库上应多个实例。mysql的建库很灵活。
websql中一行数据中,name为mgmt_view,displayname为mgmt_view@dev_crm,jdbc为jdbc:oracle:thin:@10.232.31.xxx:1521:newcrm,jdbcusername为dev_ddl,dsname为dev_crm,dbname为newcrm(和jdbaurl上的一致),dbuser为mgmt_view,tnsname为dev_crm(应该是ora文件上的配置)。
name为stat,displayname为stat@dev_dbc ,jdbc为jdbc:oracle:thin:@10.232.31.xxx:1521:dev-dbc,jdbcusername为dev_ddl,dsname为dev-dbc,dbname为dev-dbc(和jdbaurl上的一致),dbuser为stat,tnsname为dev_dbc(应该是ora文件上的配置),
我本地的ora文件有如下配置:
localtest = (description = (address = (protocol = tcp)(host = xxx.com)(port = 1521)) (connect_data = (server = dedicated) (service_name = localtest) ) )
这里面有个servicename,还有的地方是sid,另外最开始还有个localtest名字,这个标识链接描述符。
#db_name是数据库的名称,在db安装时就已经设置了,这里不可修改,它决定了数据库安装文件的位置。 #instance_name是实例名,是数据库运行中名称。 其实在oo中db_name相当于类而instance_name向当于对象,它也是代表数据库运行中的内存及其进程,同时影响到了这些进程的名称,譬如:一个数据库db_name=cus,而其实例instance_name= aking,那么数据库起来后,其进程名可能为:pmon_aking_1。 #service_name我觉得应该是指数据库网络连接时的名称,在listener配置中会有所考虑的。这个值也是可以随意改动的,并且还可以有多个值。 #sid_name指数据库的运行的实例名,应该是和instance_name一致。 #global_dbname是listener配置的对外网络连接名称,我们在配置tnsname.ora时会考虑这个参数。这个参数可以任意的设置。
简而言之,打个比方,你的名字叫小明,但是你有很多外号。你父母叫你小明,但是朋友都叫你的外号。 这里你的父母就是oracle实例,小明就是sid,service name就是你的外号。 sid用于实例区分各个数据库,service name用于外部链接。 它们可能是不同的,要注意你得到的是哪个名字,合理使用,否则远程连接别的数据库可能出错。
还有一个概念是schema和user的关系。我就直接引用了,很形象:
oracle数据库中schema和user的关系是一一对应的,也就是说一个schema只对应一个user,一个user对应一个schema。当某个user下面有table,view,index......等schema object时,这个user就成了一个schema,也就是在enterprise manager中出现的那个,如果某个user下面没有table,view,index......等schema object时,这个user不会在enterprise manager中schema对象出现
user is just name, schema is home, with many stuff, tables, index, .....
本地的配置,servicename和sid都是一个
用dicmgr登录用到的schema和其他的schema
websql中sid在db_host中的sid字段,代表了库名,这个值和jdbcurl上对应的一致。
看了下同步字典的程序,dsname和tnsname就是tnsname,dbname是sid,name和dbuser对应的就是schemal,tnsname和sid可以从dbhostgroup这张表中直接取出来。schemal可以用一下的方法取出来:
select lower(username) username from dba_users where username not in ('stdbyperf', 'readonly', 'appqossys','anysql', 'dbflash', 'sys', 'system','monitor','tbsearch','manager', 'sysman', 'exfsys', 'wmsys', 'dip', 'tsmsys', 'oracle_ocm', 'outln', 'dbsnmp', 'perfstat', 'search', 'tools', 'tbdump', 'dmsys', 'xdb', 'anonymous') and username like ?
总结一下,oracle这些name确实很多,其中servicename和sid是实例级别的,schema类似于mysql中的库,一般和username可以等同。另外jdbcurl中端口后面的对应的是服务名称哦。还有要熟悉websql的database的表结构
oracle创建用户并创建其他schemal的相关视图和同义词
1 创建一个用户
create user "xxx" identified by xxx account unlock profile "default"; grant connect, resource to xxx;
2 给这个用户查询其他schemal上的表的权限
grant select on wf_dataexport to xxx; grant select on dbmis2_sql_exe_his to xxx;
3 在新用户上建立视图,用来查询其他schemal的表
create view "xxx"."v_xxx_wf_dataexport" as select * from idb.wf_dataexport; create view "xxx"."v_xxx_dbmis2_sql_exe_his" as select * from idb.dbmis2_sql_exe_his;
4 建立一个同义词
create or replace synonym xxx.base_aone_app for base_aone_app;
以上操作都在原有scheaml执行,并使用dba账号。
总结一下,oracle的管理命令基本上忘得差不多了,有空的时候捡起来看看。