Oracle之同义词,DBLINK,表空间

昨天讲了物化视图了,今天讲一下同义词的这个概念

Oracle之同义词,DBLINK,表空间

就是synonym,反正这个我叫习惯了,这个同义词了解过吗,这个可能了解的不多吧,MYSQL里面有同义词的概念吗,给我点反馈,

你用MYSQL里面有同义词吗,比如说啊,那我举一个例子,MSYQL是不是可以指定不同的用户,比如张三这个用户,然后连一个DB,

就是一台服务器,就是这是MYSQL,就是有一个MYSQL,有一个dyb,然后还有easyest,然后还有tmaven,还有这个test,这是一个

CONNECTION,下面有好多数据库,有这么多个,那我是不是建立不同的用户,指定让他访问不同的数据库,能明白我说的意思吧,

你们用MYSQL能这么去做吗,有一个t1数据库,这边在来个t2数据库,然后我能不能t1和t2,其实是一个服务器,这两个数据库的

表能不能共享,说白了就是两个SCHEMA,SCHEMA1就是用户1,他所有的数据库可能是t1,用户2所指定的数据库是t2,然后这个库

的表能不能共享,能不能跨片的做共享,这边一张表和这边一张表,想做一个join,join操作,或者是做其他操作,MYSQL可以吗,

有用过的吗,能查另一个用户的表吗,不能吧,我印象中是不能,那肯定是不能,不要说不能跨库,那咱们的ORACLE是可以做这个事的,

就是他可以指定不同的SCHEMA,就比如你这个scott,就是HR,就是其他的用户,或者是另外建一个用户,我就是一个tablespace,

不同的空间,我可以做什么事啊,我建立一个这个东西,grant create synonym to scott,同义词就是synonym,同义词create出来,

然后我就可以做什么事呢,两个SHCEMA之间做一个表的共享,同义词在ORACLE里面分两种,一种是公有同义词,一种是私有同义词,

私有同义词就相当于你建立以后,这个表明叫做EMP,然后我可以说给这个表起一个别名,最后给他叫a,最后我就SELECT * FROM

EMP就可以查出这个数据,我也可以SELECT * FROM a,也能查出来同样的数据,可以给他起个别名,但是咱们一般创建的是公有

同义词,公有同义词一般是hi所有用户都可以使用的,就是你ORACLE里面所有的SCHEMA用户,都可以相互之间的访问,就是里面的表

都是可以的,当然你要指定,创建的语法就是create public synonym,然后to什么什么,然后to scott,或者是create public 

synonym xyz for emp;这个是啥意思啊,这是起一个别名叫xyz,然后for一个emp,emp这个表,然后同义词的用法差不多就是

咱们看到的这种形式,然后我可以创建两种,私有同义词

Oracle之同义词,DBLINK,表空间

这里有一个例子,就是create synonym wyz for emp1,我把emp1给drop掉了,就是这个表被我删掉了,然后你去

select * from wyz的时候它会说,已删除表,然后转换同义词不再有效,那证明什么啊,证明其实我们这个同义词还是存在的,

就是这个意思,然后你又可以利用一个闪回,你把这个表drop掉了,你只要没有recycle bin,你这个表还是在垃圾箱里的,

你还可以给他闪回回来,闪回回来是flashback table emp1 to before drop,emp1就是你刚才删的那个表,然后to before drop,

这样的话又回来了,回来之后再去查这个wyz,还是有的,这个就是我刚才说的那个事,我们之前公司也是用了同义词,数据迁移这

Oracle之同义词,DBLINK,表空间

就这些东西,这里面我是创建了好多的这个东西,我先把PL/SQL Developer打开,然后我建一个SQL Window,

我们看一下以前我们是怎么去用的

Oracle之同义词,DBLINK,表空间

当前要知道什么是SCHEMA,ZCDB这些都是SCHEMA,然后我首先要做的事是什么事啊,我要做的事情是先把同义词给

创建出来,那你看我上面这几个方式,上面都是CREATE PUBLIC SYNONYM,然后这个是我自己写的同义词,这个名字

是随便起的,然后是FOR YZXT这个用户,这个也是一个用户,也是一个用户SCHEMA,然后FOR YZXT这个对象点什么什么

YZXT你可以理解为HR点什么什么的,可以这么去理解,然后你创建完这么一堆同义词以后呢,证明你这个同义词在全局

范围内有效,整个ORACLE都有效,整个实例都有效,然后我可以做的事情就是你登陆我的HR用户也好,YZXT这个SCHEMA

也好,然后去干什么事呢,把我刚才创建的名字,给另外一个SCHEMA,可以这么去转换,然后另外一个SCHEMA就可以查这

张表,差不多就是这个用法,其实以前工作的时候大量的用到了同义词,就是做查询方便,就是简单的举个例子,实际

操作一下你就明白了,比如现在我换一个用户,比如我换一个HR,还是ORCL,还是同一个实例,然后hr/tiger,现在我们

已经换用户了,之前是scott,现在换成了hr了,hr里面肯定是表都不一样,表里面都有这么多,有一个EMPLOYEES,还有

一个JOBS

Oracle之同义词,DBLINK,表空间

那EMPLOYEEs里面的数据就多了,我记得以前也说过,首先列也多了,基本上考OCP的时候都是用这张表出题,让你去做,

因为这张表数据多,那现在我想干什么啊,我想通过hr用户,把EMPLOYEES这张表变成公有的,别人可以去访问的这个东西,

就是同义词吗,这个怎么去做啊,就是CREATE PUBLIC SYNONYM,这个表指代的是谁啊,原先叫EMPLOYEES,然后我这边可以随便

取个名字,AAA,然后FOR谁,当前登陆的是HR,所以就是FOR HR点,就是HR用户下的哪张表,然后里面都是HR的表,FOR HR.EMPLOYEES,

然后我去建立一下,CREATE PUBLIC SYNONYM AAA FRO HR.EMPLOYEES,他可能没有创建同义词的权限,这个用户,那你操作起来

就有点麻烦了,首先你得使用system去登陆,coon system/[email protected] as sysdba,先登陆一下,

然后grant create public synonym to hr

Oracle之同义词,DBLINK,表空间

这回他就已经有了,已经有了我再创建行不行,这个时候就创建执行OK了,执行OK了以后

Oracle之同义词,DBLINK,表空间

我之前SELECT * FROM EMPLOYEES,我能查到数据,由于是公有同义词,我就可以这样,SELECT * FROM aaa,

同样,就相当于给他起个别名

Oracle之同义词,DBLINK,表空间

接下来要做的是grant,就是GRANT SELECT权限,给他其他的选项都行,给他update的权限,给他更新的权限,给他DELETE

drop的权限,等等,先给他SELECT的权限,GRANT SELECT的权限怎么去写的,ON这个同义词表,TO一个SCHEMA,你之前这个表

叫AAA,创建公有同义词,这是你HR用户下创建的同义词叫这个,然后咱们TO的是SCOTT,就这样去做,这样他也OK了,

GRANT SELECT ON AAA TO SCOTT,OK以后我们换一个用户去登陆,换scott,那换scott之后,现在我登陆的人就是scott了,

SCOTT数据库里面就这几张表,肯定是没有EMPLOYEES这张表,你看现在肯定是没有那张表的,然后我去做查询,随便来个query吧,

咱们就直接来个SELECT * FROM AAA那就可以了

Oracle之同义词,DBLINK,表空间

我就看到另外一个SCHEMA HR他里面的这张表了,但是现在只有查询权限,你说你要更新什么,比如我现在想做一个

UPDATE,UPDATE AAA SET FIRSTNAME或者EMAIL,我随便给他一个EMAIL值,WHERE EMPLOYEE_ID等于198

UPDAET AAA SET EMAIL = '1111' WHERE EMPLOYEE_ID = '198',我们这个执行,他说权限不足,肯定是权限不足的,因为

你只给了SELECT 的权限,你没有给他其他的权限,能明白我的意思吧,同义词这个事没问题吧,就是可以这么去做,多个

SCHEMA之间进行交互,这个其实还是非常好用的,有什么用你想一想呗,这个东西怎么说呢,你说的是SCHEMA是直接交互,

你用用户点什么什么,但是我这个相当于是全局,全局所有的都能用,能理解我说的意思吧,而且我这个东西删了,他这个

同义词依然存在,就是我把EMPLOYEES这张表删掉,这个同义词还是存在,我刚才不是又看过这个例子吗,就是有一个

drop table,emp1删了以后,我照样可以闪退回来,还能闪回回来,这个我查一下,这个我还真不知道,没注意,不同实例

的能进行查询吗,你如果两个实例都开起来,我搜一下,这个我也没注意,不同实例的同义词查询,可以的,那就证明同义词

就很强大了,我记得也是可以的,但是我没试,那这块你想想吧,对应着你的数据库,两个数据库了,相当于两个实例了,同义词

进行交互,咱们实验一下,这个非常简单,我记得也是可以的,咱们试一试,但是没敢说一定可以,好久不弄也就忘了,你不天天玩

他也是真的不行,我现在又启动了一个实例,我记得也是可以的,刚才那个好像就是不同的实例,现在都进来了,一个是连接的

实例不同了,刚才我们已经创建了一个同义词了,AAA,那我这里是不是SELECT * FROM AAA就行了呢,应该怎么去做来的,我记得行

但是没这么简单,就是你现在是不同的实例,然后同义词公用,我想一想啊,SELECT * FROM AAA这是不行的,我换一下,应该权限

也是有关,那我就conn system/[email protected] AS SYSDBA,select * from aaa,那就是不行,咱们先不考虑这么多了,简单的知道

同义词的用法就行了,然后咱们继续往下走,下一个例子就是DBLINK这一块

Oracle之同义词,DBLINK,表空间

DBLINK干什么事呢,他可以用于不同数据库,不同的数据库实例,或者是远程连接,这个肯定行的,这个不用想,同义词

这个我还真不知道行不行,反正我是知道他是基于SCHEMA进行区分的,但是DBLINK是可以不同的数据库,不同的实例可以去

相连的,然后有了这个DBLINK以后,然后你就可以去查,查不同实例的表,然后可以做一系列的操作,这个DBLINK没问题吧,

应该都听过这个东西,DBLINK,DBLINK不就是这个东西,多简答啊,刚才我们是两个实例了,其实我也可以两个数据库,

当然这个我不浪费时间了,我现在这个是SCOTT,我去怎么做呢,就是create public database link,然后随便取个名字,

然后connect to bjsxt,identified by PASSWD,这个就是bjsxt的实例,然后identified by,这个是什么啊,PASSWORD我这边

也是bjsxt,using是什么啊,描述DESCRIPTION,ADDRESS地址是哪儿,我的地址是192.168.2.200,或者是你本地的地址都行,

ORACLE的PORT都是1521,然后你这块的实例名称是什么,SERVICE_NAME是bjsxt,因为我要link的是bjsxt这块,然后create出来,

这个名字就叫bjsxt_link,就叫link1吧,随便起个名字,但是他有创建link的权限吗,权限不足,那怎么办啊,我用DBA创建一个

权限吧,conn system/[email protected] as sysdba,就是这个语句,然后我们回车

 

Oracle之同义词,DBLINK,表空间

Oracle之同义词,DBLINK,表空间

这里就直接create dblink,就创建好了,创建好了以后就可以直接去做了,bjsxt里面有什么表呢,换一个实例,bjsxt

用户名是bjsxt,密码也是bjsxt,你进去看到这个实例用户里边,他有什么对应的表,Tables有这么多

Oracle之同义词,DBLINK,表空间

咱们有SYS_USERS表吗,SELECT * FROM [email protected],就把另个数据已经查出来了

Oracle之同义词,DBLINK,表空间

这里又两条记录,一个admin,一个xiaoxiao,我可以去查SELECT * FROM [email protected];这个实例里面也应该有

SYS_FILE文件的,SYS_FILE不行,我再换一个,这个表里有数据,就是SYS_FUNC,SELECT * FROM [email protected],

这些都是可以查

Oracle之同义词,DBLINK,表空间

具体那个为什么不能查,这也是要告诉你的一个原因,就是这个实例,SYS_FILE这个表为什么不能查,观察一下这个数据

结构你就知道了,你会发现这个表里有什么啊

Oracle之同义词,DBLINK,表空间

有二进制文件,有BLOB文件,有BLOB文件允许查吗,SELECT * FROM [email protected],里面不能够查带二进制的数据

Oracle之同义词,DBLINK,表空间

就是说有一个问题,这个东西虽然也能做,但是不能够查带有BLOB,CLOB的这种东西,他觉得这个东西太费事了,

DBLINK查这个够呛,因为那样的话交互量太大了,现在两个库之间可以做这个事情了,两个数据库之间可以做这个事情了,

这个就方便了很多,咱们就把同义词和DBLINK说一下


然后这块有PL/SQL的编程,这个在很久以前就说了,咱们这个后期肯定会讲的,就会直接去用的,之前的例子也发给你了,

所以这个也就不说了

Oracle之同义词,DBLINK,表空间

接下来你可以看一下,我就不写了,因为我觉得太麻烦了,就是你在ORACLE里面创建一个正常的表空间,它是怎么去做的呢,

就是一个create,创建临时表空间,create temporary tablespace,然后起个名字,临时表空间的数据文件放在哪里,自己指定

一个文件,然后大小随便写了一个G,然后可扩展,后面还可以加很多的东西,比如每次扩展50M,最大闲置是两个G,或者是20个G

这都行,然后是其他的东西,这是临时表空间创建的时候,然后创建正式的表空间就是create tablespace,就不用那个temporary了,

然后也是随便取个名字,创建一个数据文件,指定数据文件的大小,还可以扩展,每次扩展是多大,最大的限度是多大,然后继承

management local,你说你这个数据文件,一个已经满了,怎么办,我local里面还可以添加数据文件,一个文件不够我再加一个,

这里指定的是maxsize,这是20个G,20G指的是什么啊,指的是你整个dbf,一个表空间的一个,他的最大大小,但是如果你在给我加一个

数据文件的话,那这就是另外一个数据文件了,那你可以给另外一个数据文件指定多大,这都是可以的,就是垂直的,按库的,一个ORACLE

实例的增加表空间,可以这么去做,创建完表空间以后,create user随便取个名,然后给一个密码,然后default tablespace是什么,

就是我上面创建的数据表空间,然后指定他的临时表空间是什么,如果正常生产环境中你要是就使用这一个用户,如果都使用这一个

用户去操作,grant dba to 你创建好的用户就完事了,怎么做都行,表空间的使用,简单的使用,还有一些查看表空间的使用率,

这都可以去做的

Oracle之同义词,DBLINK,表空间

然后还有一些查看表空间的使用率,这都是可以去做的,ORACLE里面有些SQL都是好长好长的

Oracle之同义词,DBLINK,表空间

就直接能看到,先不用管查询语句是什么意思,反正就是1024*1024,取出来的就是多少兆了,我们现在有这么多的

tablespace,BJSXT,EB,以前在做ACTIVITY的时候,工作流,他给我分配了一个表空间,然后还有很多,这就不说了,

可以去看的,数据库实例名称,select instance_name from v$instance,你看到当前数据库实例,其实你对ORACLE如果没兴趣的话,

你可能就真没兴趣了

Oracle之同义词,DBLINK,表空间

orcl就是我们当前的实例,这些都是很基础的,表空间就不说了,咱们就稍微停一下