文档章节

ORACLE---对象的管理

柳白子
 柳白子
发布于 2016/12/09 17:09
字数 2748
阅读 13
收藏 0

对象管理
一、表
 

1.堆表:
2.索引组织表:


表数据和索引数据都放到索引段中
用到表的数据量很大,将表数据和索引数据放到同一个索引段中,只需要扫描一个段就可以取出数据,减少块的读取
索引组织表先插入的放到前面,后插入的放到后面,根据大小排序
建表语法:
create table <>(column datatype.....,) organization index //必须要指定主键列
删除,修改与表一致
 

3.对象表:


列下面还有列

    |    ename     |          tel      |
    |name | sex   |    tel1 | tel2 |
  
>>>insert into teel valuse('aa',tel_type('123456','123564'),'cd ');
>>>select e.tel.tel1 from teel e; //必须要给一个别名才可以查到
>>>update teel t set t.tel.tel1='13012345' where name='aa';
>>>alter type tel_type frop attribute(tel1) cascade; //删除某一列下的子列,因为该语句为PLSQL语句,所以用户掉不到数据,只有退出后重新登录,或者执行一些DDL操作后,才能从表中查到数据

 

4.簇表:

(项目中不常用)
多表查询的时候,两个表当中有相同的列(列名相同,数据类型相同,内容相同)
create cluster <> (column datatype);
create index <> on cluster();
create table <> ();


 

5.分区表:

(使用频率和堆表一致)

a.什么时候要创建分区表


当一个表中的数据量达到1G,而我们的堆表无法满足时,我们需要将普通表创建为分区表
 

b.分区表的特点


1)每个分区的数据可以分开存放,放到不同磁盘中,减少磁盘IO
2)数据可以按分区进行备份
3)用户可以查询某一个记录时,可以只扫描某一个分区,减少扫描时间
4)每个分区可以指定到不同的磁盘,保证数据的安全
 

c.分区表的分类

一个表中最多只能分1023个分区,要是分区不够,我们只能在分区下再创建分区


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1)range范围分区:要分区的列,值在某个范围内
create table <> (column datatype ,...) partition by range(column)
partition <> values less than () ,
partition <>values less than(),
....
partition <> valuse less than (maxvalue);
 

SQL> l
  1   create table remp (deptno number,ename varchar2(20),sal number)
  2  partition by range(sal)
  3  (partition p1 values less than(1000),
  4  partition p2 values less than(2000),
  5  partition p3 values less than(3000),
  6* partition p4 values less than(maxvalue))
SQL> /

Table created.


>>>select * from remp p1;
>>>select segment_name from user_segments; //每一个分区一个段

create table hemp (deptno number,ename varchar2(20),hirdate date)
partition by range(hirdate)
(partition p1  values less than(to_date('1981-01-01','yyyy-mm-dd')),
 partition p1  values less than(to_date('1982-01-01','yyyy-mm-dd')),
 partition p1  values less than(to_date('1983-01-01','yyyy-mm-dd')),
 partition p1  values less than(to_date('1988-01-01','yyyy-mm-dd'))
 );



11g中引进的范围分区的一种:间隔分区(年,月,天,小时,分钟,秒)
分隔函数
numtoyminterval(2,'year') //每隔两年分区
numtoyminterval(1,'month') //每隔一月分区
numtodsinterval(7,'day')

,每隔一年就会建一个分区

create table r1 (name varchar2(10) ,hdate date)
partition by range(hdate)
interval (numtoyminterval(1,'year'))
(
partition p1 values less than(to_date('1981-01-01','yyyy-mm-dd'))
);


2)hash哈希分区:对表中的列进行分区,但这个列没有规律可循
create table <> (column datatupe,...) partition by hash (column)
(
partition <>,
partition <>.
....
);


SQL> create table hemp (ename varchar2(20),empno number) partition by hash (ename)
  2  (partition p1,
  3  partition p2,
  4  partition p3);

Table created.

SQL> 

SQL> select * from hemp p2;




3)list列表分区:要分区的列,列的值是固定的
要分区的列重复值很多,可以使用in列举出来

SQL> create table lemp(deptno number,ename varchar2(20))partition by list(deptno)
  2  (partition p1 values(10),
  3  partition p2 values(20),
  4  partition p3 values(30)
  5  partition p4 values(default));

Table created.

SQL> 



11g的新功能

create table lemp (hiredate date,ename varchar2(20),hdate (as to_char(hiredate,'yyyy')))  partition by list(hdate)
( partition p1 values('1980'),
partition p2 values('1981'),
partition p3 values('1982'),
partition p4 values(default));


  4)组合分区:表已经分区,但需要在进行分区
10g---
(by list+by range
by range+by hash
by list+by hash
)

11g---9种分区 by range+by range

create table <> (column datatype ....) partition by list(column)
subpartition by range(colunm)
(
partition <> values(..)
(
subpartition <> values less than(..),
subpartition <> values less than(..),
subpartition <> values less than(..)
)
partition <> values(...)
(
subpartition <> values less than(..),
subpartition <> values less than(..),
subpartition <> values less than(..)
)
);

create table lremp(ename varchar2(20),deptno number,sal number) partition by list(deptno)
subpartition by range(sal)
(
paratition p1 values (10)
(
subpartition p11 values less than(1000),
subpartition p12 values less than(2000),
subpartition p13 values less than(3000),
subpartition p14 values less than(maxvalue)
),
partition p2 values(20,30)
(
subpartition p11 values less than(1000),
subpartition p12 values less than(2000),
subpartition p13 values less than(3000),
subpartition p14 values less than(maxvalue))
);

>>select * from lremp subpatition p22;


d.分区表与普通表的转换


1)插入数据法
会产生大量的redo,不适合数据量大的表,也不适合7*24小时的数据库
insert
2)交换分区法
10-20-30 适合数据量较大的表,速度较快,也会产生redo也会产生undo,业务量较大,业务高峰期,也不建议使用
建分区表

create table t12 (ename varchar2(10),deptno number(2) ,sal number(7,2)) partition by list(deptno)
(
partition p1 values (10),
partition p2 values (10),
partition p3 values (10),
partition p4 values (default)
);
// 建和分区表对应的普通表,并在表中写入数据
create table e1 as select ename,deptno,sal from emp where deptno=10;
create table e1 as select ename,deptno,sal from emp where deptno=20;
create table e1 as select ename,deptno,sal from emp where deptno=30;
create table e1 as select ename,deptno,sal from emp where deptno not in (10,20,30);


alter table t12 exchange partition p1 with table e1; //将我们的普通表中的数据交换到分区表中去,普通表会被清空,分区表会更新我们的普通表数据
alter table t12 exchange partition p2 with table e2;
alter table t12 exchange partition p3 with table e3;

3)在线重定义(工作中可用,可以保证两个表中的数据一致)
必须要有主键列
SQL> desc DBMS_REDEFINITION

1>创建分区表
2>使用在线重定义表转换

dbms_redefinition.start_redef_table('SCOOT','EMP','LEMP') //括号里的内容依次为(uname , orig_table, int_table)
dbms_redefinition.sync_interim__table('SCOOT','EMP','LEMP')
dbms_redefinition.finish_redef__table('SCOOT','EMP','LEMP') //如果不执行完成同步操作,emp中只要有数据插入都会同步到lemp表中,但是会锁住lemp表,所以也不适合高峰时期
 

e.分区表的管理

1.增加分区
alter table <> add partition <> values() ;//增加list分区
alter table <> add partition <> valuse less than () ;//增加range分区
alter table <> add partition <> ; //增加hash分区
alter table <> add subpartition <> values(); //组合分区list
alter table <> add subpartition <> values() less than ();
alter table <> add subpartition <> ; //组合分区hash

2.删除分区
alter table <> drop partition <> values();
alter table <> drop partition <> ;
3.合并分区

alter table <> merge partitions p1,p2 into partition p2;
alter table <> merge subpartitions <> ,<> into subpartition <> ;//合并子分区

4、分区索引创建
1)全局索引:一个分区表上只创建一个索引
create index <> on <> (colmn) global;
alter index <> rebuild online ; //在线重建,必须要事务完成后才能成功,很少有用户做DML操作时才能取创建

2)本地索引:一个分区表上每个分区都创建一个索引 ,适用于DDL 操作较多的分区
create index <> on <> (clomn) local ;
alter index <> rebuild partition <>;

>>>desc user_indexes //查看创建的索引
>>>desc user_ind_partitions //查看分区表的索引


 

6.外部表:


数据不是存放在数据库中,而是在外部文件中

1.将其他数据库的数据先导成文本格式,然后再用sqllosder 方式导进去
sqlloader : 将外部文件导入到表中,数据就存放到数据文件中了,可以做DML操作,DQL操作
1>$sqlloader
2>infile =/tmp/a.txt 对应的表,对应的列


$sqlldr scott/tiger control=/tmp/sqlload.ctl

vim /tmp/sqlload.ctl

load data 
infile ‘/tmp/a.txt ’                       //从哪个地方加载
append                                     //以怎样的方式加载
into table dept                              //加载到哪里去
fields terminated by  ‘,’                   //列以什么方式间隔
 trailling nullcols                             //过滤最后的空行
(deptno,dname,loc)                    //加载的每个数据对应的列



cd /opt/u01/oracle/11g/sqldeveloper/

2.下面这两种方式,是引用的方式,数据还是放在外部空间里,只能做查询操作,不可以做DML操作 (工作中基本不会用到这种方式)
oracle loader : 加载文本外部文件

 

create table <> () organization external
(
type oracle load

 create directory ext1 as '/tmp';   
 grant read,write on directory  ext1  scott ;
 

  
  
create table extab(deptno number ,name varchar2(20) ,loc varchar2(10)) organization 
 external
 (
 type oracle_loader 
 default directory ext1
 access parameters 
 (
  records delimited by newline
 fields terminated by ‘,’
 )
 location (a.txt); 




oracle datapump :只能加载二进制文件,基本不会使用

 

 

 

7.临时表:

一般用作测试

1.居于事务的临时表
事物一旦被提交,表就会被清空
create global temporary table <> (colmn datatype ,...) on commit delete rows;


2.居于会话的临时表,当前会话创建,一旦结束会话,表就会被清空
create global temporary table <> (column datatype,...,...) on commit preserve rows ;

3.普通临时表

create global temporary table <> (column datatype,...,); //用户执行用户切换,rollback ,退出会话,commit 表都会被清空


>>>create global temporary table t1 (name varchar2(20) ,deptno number ) on commit delete rows ;


8.网络管理:

 

1.专有连接
用户连接有专门的进程进行相应
user ----server process

2.共享连接 []
用户连接数据库时,没有服务进程相应,而将用户的信息放到调度里,而调度放到队列[队列]中
uesr ----dispater --[SAG] ----server ------data buffer ------|


3.监听程序工作原理
用户进程跟服务器能不能连接主要是去问我们的监听
客户端程序------tnsnames.ora/本地命名解析文件
1.sqlplus sys/oracle@updb as sysdba //远程连接
b.去客户端验证用户名密码
c.通过服务器连接实例
2.sqlplus sys/oracle@ip:1521/service_names as sysdba

服务器端程序listener.ora
1.静态注册
将实例名/服务名写到了监听文件中
SID_DESC (实例名/服务名 oracle家目录 ....)


2.动态注册
由pmon 进程去动态注册

alter system register; //手动注册,pmon也是去执行这条命令


lsnrctl status //查看监听状态
lsnrctl stop //停掉我们的监听
ready : 动态注册
unknow: 静态注册

项目中一般使用静态监听,可以保证用户时时可以连接
一个数据库中只使用一个listener.ora
一个监听可以监听一个数据库,也可监听多个数据库
一个监听程序可以被多个实例监听 ----集群
监听的默认端口为:1521

4.如何配置监听
在grid 目录下面执行 netca 创建出来的为动态的监听 图形界面创建 ,监听文件会放到/opt/u01/grid/11g/nerwork/admin/listener.ora ,在哪个文件下面执行就会创建到相应的文件目录下

add-->listener-->ipc--->1521--->no-->
netmgr 创建出来的为 静态的监听


静态注册,监听两个库



有参数的修改,必须重启监听
lsnrctl stop
lsnrctl start
tnsname.ora

5.监听程序的管理

11g以前 : lsnrtcl start

            lsnrctl status

            lsnrctl stop

            lsnrctl reload

11g 以后---

srvctl start listener  //只能启动监听名字为listener的监听

srvctl start listener -l listener1 //启动名字为listener1的监听

srvctl add listener -l listener1  //监听没有在grid文件里,加入到grid文件里进行管理

srvctl remove listener

lsnrctl start

 

show parameter service_name //查看服务名,如果为updba.com 一般走的专有连接

select service_name ,username,server for v$session //service 为dedicated 表示是专有连接

                                         shared 是sys用户的共享连接,none是普通用户的共享连接

vim /opt/u01/oracle/11g/network/admin/tnsnames.ora

增加server

查看网络是否通畅,用

tsping updb

tnsping updb

 

 

© 著作权归作者所有

上一篇: ORACLE管理---备份
下一篇: ORACLE--用户管理
柳白子
粉丝 8
博文 118
码字总数 137799
作品 0
成都
私信 提问
Navicat检测 Oracle 数据库安全性的方法

Navicat for Oracle 作为一套超强的Oracle数据库系统管理工具。它可以在Oracle数据库8i以上的版本中运行,并支持其大部分最新功能。并且帮助Oracle新手们快速的学习掌握使用方法。一些用户对...

Navicat数据库管理工具
2016/06/08
16
0
基于ADO.NET方法的数据库连接的数据发生器控件dotConnect for Oracle

dotConnect for Oracle完全基于ADO.NET方法,因此您完全可以采用标准ADO.NET数据提供的方法来使用它。是一款为Microsoft .NET Framework提供直接Oracle数据库连接的数据发生器控件。 具体功能...

netkongjian
2014/04/18
106
0
Oracle 同义词创建及其作用

在Oracle中对用户的管理是使用权限的方式来管理的,也就是说,如果我们想使用数据库,我们就必须得有权限,但是如果是别人将权限授予了我们,我们也是能对数据库进行操作的,但是我们必须要已...

鉴客
2011/07/12
293
0
Oracle专题1之Oracle概述、Oracle数据库的体系结构以及常用命令

1、Oracle概述 - Oracle Database,简称为Oracle。是美国ORACLE(甲骨文)公司的一款对象关系型的数据库管理系统(ORDBMS)。目前在数据库市场上占有主要份额。 - Oracle的发展史:1977年埃里...

极客微信条
2017/11/30
0
0
全兼容Oracle?扒一扒浪潮K-DB是咋做的?

  【IT168 评论】“如果说Linux是类Unix操作系统,那么K-DB就是类Oracle数据库。会Unix的人,上手Linux要多少时间,则Oracle DBA上手K-DB就要多少时间。”以上观点来自一位参加了8月30日I...

it168网站
2015/11/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
42
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部