ORACLE---對象的管理

對象管理
1、表
 sql

1.堆表:
2.索引組織表:


表數據和索引數據都放到索引段中
用到表的數據量很大,將表數據和索引數據放到同一個索引段中,只須要掃描一個段就能夠取出數據,減小塊的讀取
索引組織表先插入的放到前面,後插入的放到後面,根據大小排序
建表語法:
create table <>(column datatype.....,) organization index //必需要指定主鍵列
刪除,修改與表一致
 數據庫

3.對象表:


列下面還有列vim

    |    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,而咱們的堆表沒法知足時,咱們須要將普通表建立爲分區表
 session

b.分區表的特色


1)每一個分區的數據能夠分開存放,放到不一樣磁盤中,減小磁盤IO
2)數據能夠按分區進行備份
3)用戶能夠查詢某一個記錄時,能夠只掃描某一個分區,減小掃描時間
4)每一個分區能夠指定到不一樣的磁盤,保證數據的安全
 oracle

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);
 app

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; //每個分區一個段less

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 <> ;//合併子分區

四、分區索引建立
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

相關文章
相關標籤/搜索