Oracle數據庫操作處理筆記(1)表空間操作、表操作

一、表空間操作
1、文件系統:
(1)創建表空間
數據表空:

create tablespace tablespace_name logging datafile '/XXX/xxx/datafile_name1.ora' size 4095M;

臨時表空間:

create temporay tablespae tmp_tablespace_name tempfile '/XXX/xxx/datafile_name1.ora' size 4095M;

回滾表空間:

create undo tablespace undotbs_tablespace datafile '/XXX/xxx/datafile_name1.ora' size 4095M;

(2)增加表空間
數據表空間:

alter tablespace tablespace_name add datafile '/XXX/xxx/datafile_name1.ora' size 4095M;

臨時表空間:

alter tablespace temp_tablespace_name add tempfile '/XXX/xxx/datafile_name1.ora' size 4095M;

回滾表空間:

alter tablespace undotbs_tablespace_name add datafile '/XXX/xxx/datafile_name1.ora' size 4095M;

(3)刪除表空間
數據表空間:

drop tablespace tablespace_name;

alter database datafile '/xxx/xxx/undotbs_datafile_name1.dbf' offline drop;

臨時表空間:

drop tablespace tablespace_name;

alter database datafile '/xxx/xxx/undotbs_datafile_name1.dbf' offline drop;

注意,應該先創建好臨時表空間,並使之生效,然後才能再刪除現有臨時表空間

回滾段表空間:

drop tablespace tablespace_name;

alter database datafile '/xxx/xxx/undotbs_datafile_name1.dbf' offline drop;

注意,應該先創建好回滾段表空間,並使之生效,然後才能再刪除現有回滾段表空間

表空間大小查看:

select df.tablespace_name "tablespace_name", totalspace "totalspacem", freespace "freespacem",
round((1 - freespace / totalspace) * 100, 2) "usedspace%"
from (select tablespace_name, round(sum(bytes) / 1024 / 1024) totalspace from dba_data_files group by
tablespace_name) df,(select tablespace_name, round(sum(bytes) / 1024 / 1024) freespace from
dba_free_space group by tablespace_name) fs
where df.tablespace_name = fs.tablespace_name
order by 4 asc; 

2、裸卷:
(1)創建表空間
數據表空間:

create tablespace tablespace_name datafile '/dev/vgname/rlv_name1.dbf' size 4095M;

臨時表空間:

create tablespace temp tablespace_name datafile '/dev/vgname/rlv_name2.dbf' size 4095M;

回滾段表空間:

create undo tablespace undotbs_tablespace_name datafile 'dev/vgname /rlv_name1.dbf' size 4095M;

(2)刪除表空間
數據表空間:

drop tablespace tablespace_name;

alter database datafile '/xxx/xxx/undotbs_datafile_name1.dbf' offline drop;

臨時表空間:

drop tablespace tablespace_name;

alter database datafile '/xxx/xxx/undotbs_datafile_name1.dbf' offline drop;

注意,應該先創建好臨時表空間,並使之生效,然後才能再刪除現有臨時表空間

回滾段表空間:

drop tablespace tablespace_name;

alter database datafile '/xxx/xxx/undotbs_datafile_name1.dbf' offline drop;

注意,應該先創建好回滾段表空間,並使之生效,然後才能再刪除現有回滾段表空間

表空間大小查看:

select df.tablespace_name "tablespace_name", totalspace "totalspacem", freespace
"freespacem",round((1 - freespace / totalspace) * 100, 2) "usedspace%"
from (select tablespace_name, round(sum(bytes) / 1024 / 1024) totalspace from
dba_data_files group by tablespace_name) df,
(select tablespace_name, round(sum(bytes) / 1024 / 1024) freespace from
dba_free_space group	
by tablespace_name) fs
where df.tablespace_name = fs.tablespace_name
order by 4 asc; 

3.ASM存儲管理表空間操作
創建表空間

Create tablespace tablespace_name datafile
‘+ORA_DATA_group_name/xxx/datafile/datafile_name,ora’ size xxxM autoextend on;

如下:

create tablespace ora_data1 datafile  '+ORA_DATA1/racdb/datafile/ora_data1.ora' size 2048M autoextend on;
 
create tablespace ora_data1_ind datafile '+ORA_DATA1/racdb/datafile/ora_data1_ind.ora' size 2048M autoextend on;
 
alter database datafile '+ora_data1/racdb/datafile/system.256.722174987' resize 512M;

二、用戶、角色、權限

1、用戶創建、修改、刪除
用戶創建

create user username profile default identified by "user_passwd" default tablespace tablespace_name account unlock;

修改用戶密碼:

alter user username identified by new_password;

修改用戶使用狀態

alter user username account unlock;

用戶賦權限:

grant connect,resource,select any table,update any table,delete any table,insert any table,select any dictionary,create any procedure,execute any procedure,create any TRIGGER,create any view, unlimited tablespace,drop any view,create any sequence,select any sequence,drop any sequence,CREATE DATABASE LINK,CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK,CREATE ANY synonym,DROP ANY synonym,CREATE PUBLIC synonym,DROP PUBLIC SYNONYM,SELECT_CATALOG_ROLE to user_name;

給某一個用戶賦予某張表的某種權限:

grant privilege_name(select insert update) table_name to username;

例如:

grant update ON TABLE_NAME TO username;
grant delete ON TABLE_NAME TO username; 
grant insert ON TABLE_NAME TO username;

用戶權限回收:

revoke role_name from username;
alter user username default role all;

用戶刪除:

drop user username cascade (如果有數據,帶 cascade 參數)

查看用戶屬性和狀態:

select * from dba_users;
select * from dba_sys_privs
select * from dba_tab_privs

權限名稱:

administer database trigger
administer resource manager
alter any cluster
alter any dimension
alter any evaluation context
alter any index
alter any indextype
alter any library
alter any outline
alter any procedure
alter any role
alter any rule
alter any rule set
alter any sequence
alter any snapshot
alter any table
alter any trigger
alter any type
alter database
alter profile
alter resource cost
alter rollback segment
alter session
alter system
alter tablespace
alter user
analyze any
audit any
audit system
backup any table
 
debug any procedure
debug connect session
delete any table
dequeue any queue
drop any cluster
drop any context
drop any dimension
drop any directory
drop any evaluation context
drop any index
drop any indextype
drop any library
drop any operator
drop any outline
drop any procedure
drop any role
drop any rule
drop any rule set
drop any sequence
drop any snapshot
drop any synonym
drop any table
drop any trigger
drop any type
drop any view
drop profile
drop public database link
drop public synonym
drop rollback segment
drop tablespace 







become user
comment any table
create any cluster
create any context
create any dimension
create any directory
create any evaluation context
create any index
create any indextype
create any library
create any operator
create any outline
create any procedure
create any rule
create any rule set
create any sequence
create any snapshot
create any synonym
create any table
create any trigger
create any type
create any view
create cluster
create database link
create dimension
create evaluation context
create indextype
create library
create operator
create procedure
create profile
create public database link
create public synonym
create role
create rollback segment
create rule
create rule set
create sequence
create session
create user
create view
 







drop user
enqueue any queue
execute any evaluation context
execute any indextype
execute any library
execute any operator
execute any procedure
execute any rule
execute any rule set
execute any type
exempt access policy
flashback any table
force any transaction
force transaction
global query rewrite
grant any object privilege
grant any privilege
grant any role
insert any table
lock any table
manage any queue
manage tablespace
on commit refresh
query rewrite
restricted session
resumable
select any dictionary
select any sequence
select any table
under any table
under any type
under any view
unlimited tablespace
update any table
create snapshot
create synonym
create table
create tablespace
create trigger
create type 

2、角色創建、修改、刪除
角色創建

create role role_name;

角色權限修改

grant privilege_name to role_name;
revoke privilege_name from role_name;

角色刪除

drop role role_name;

系統角色:

AQ_ADMINISTRATOR_ROLE
AQ_USER_ROLE
AUTHENTICATEDUSER
CONNECT
CTXAPP
DBA
DELETE_CATALOG_ROLE
EJBCLIENT
EXECUTE_CATALOG_ROLE
EXP_FULL_DATABASE
GATHER_SYSTEM_STATISTICS
HS_ADMIN_ROLE
WKUSER
WM_ADMIN_ROLE
XDBADMIN 
IMP_FULL_DATABASE
JAVADEBUGPRIV
JAVAIDPRIV
JAVASYSPRIV
JAVAUSERPRIV
JAVA_ADMIN
JAVA_DEPLOY
LOGSTDBY_ADMINISTRATOR
OEM_MONITOR
RECOVERY_CATALOG_OWNER
RESOURCE
SALES_HISTORY_ROLE
SELECT_CATALOG_ROLE

3、權限增加和收回

grant privilege_name to role_name; (增加權限)
revoke privilege_name from role_name; (回收權限)

三、表操作
1、單表創建
直接創建

Create table table_name
(
字段 1 類型 1,
字段 2 類型 2,
、、、、、
字段 n 類型 n
) tablespace_name;

創建類似表

create table table_name as select * from table_name1;

創建表結構

create table table_name as select * from table_name字段 1=字段 2;

表查詢:

select * from table_name;
select * from table_name where條件
 
Select 字段 1別名 1,字段 2 別名 2,字段 n 別名 n 
from table_name
 
字段中可以進行代數運算,包括:+-×÷,count sum avg trunk round等函數

表插入:

insert 字段 1,字段 2、、字段 n into table_name values (字段值 1,字段值 2、、字段值 n );

循環插入:

begin
for i in 1..10 loop
insert into table_name values (...);
end loop;
end;

表更新:

update table_name set 字段 1 where條件;

表刪除:

drop table table_name;

表記錄刪除:

delete table_name where條件;
truncate table table_name; 清空表記錄,保留表結構

表名修改:

rename table_name1 to table_name2;

注意:表名修改後,索引還在

表遷移,(從一個表空間遷移到另外一個表空間)

alter table table_name move tablespace tablespace_name nologging parallele 4 ;

注意:將表從一個表空間遷移到另外一個表空間,必須進行索引重建,存儲過程、觸發器、其他程序包都需要編譯,以免執行報錯。例如:
表壓縮:
不同表空間:

alter table table_name move tablespace tablespace_name compress;

相同表空間:

alter table table_name move compress; 

表統計信息收集

exec dbms_stats.gather_table_stats(ownname => 'username',tabname =>'table_name',degree =>10,cascade =>true,estimate_percent =>25);

例如:

exec dbms_stats.gather_table_stats(ownname => 'test',tabname =>'data_table1_name1',degree =>4,cascade =>true,estimate_percent =>30);

select a.row2_id, sum(nvl(b.item_value, 0)) from zk.name _201001 a, zk.table_name _201001 b
where a.so_row1 = b.so_row1 and a.row_a in (1, 4, 5) and a.row2_id = XXXXXXX and book_row3_id in (NNNNNXXX1, NNNNNXXX2, NNNNNXXX3, NNNNNXXX4,NNNNNXXX5, NNNNNXXX6) 
group by a.row _id;

表語句執行很慢,檢查執行計劃,zk.table_name_201001 b不引用索引,做表分析、重建索引都無效,執行計劃中均沒有引用索引,最後強制使用索引效果明顯,執行計劃改變,索引引用。效果明顯

select /*+ index(b pk_table_name_201001)*/
a.serv_id, sum(nvl(b.item_value, 0))
from zk.name_201001 a, zk. table_name _201001 b
where a. so_row1 = b.so_row1 and a.busi_code in (1, 4, 5) and a.row2_id = XXXXXXX and book_row3_id in (NNNNNXXX1, NNNNNXXX2, NNNNNXXX3, NNNNNXXX4,NNNNNXXX5, NNNNNXXX6)
group by a.row2_id;

2、分區表創建
爲了使大量的數據在讀寫操作和查詢中速度更快,Oracle提供了對錶和索引進行分區的技術,

以改善大型應用系統的性能。使用分區的優點:

A、增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用;

B、維護方便:如果表的某個分區出現故障,需要修復數據,只修復該分區即可;

C、均衡I/O:可以把不同的分區映射到磁盤以平衡I/O,改善整個系統性能;
D、改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度

Oracle數據庫提供對錶或索引的分區方法有三種:

1、範圍分區

2、Hash分區(散列分區)

3、列表分區

4、範圍—散列分區

5、範圍—列表分區

2.1、範圍分區表
分區表表創建:一般都是按照時間來創建

create table table_name
(
row1 char1 not null,
row2 char2 not null,
、、、、、、
rown  number not null
)
partition by range (paration_row)
(
partition partition_name1 values less than (to_date('value_name', 'yyyy-mm-dd',
'nls_calendar=gregorian')) tablespace tablespace_name1,
partition partition_name2 values less than (to_date('value_name', 'yyyy-mm-dd',
'nls_calendar=gregorian')) tablespace tablespace_name2,
、、、、、、、、、、
partition partition_namen values less than (to_date('value_name', 'yyyy-mm-dd',
'nls_calendar=gregorian')) tablespace tablespace_namen,
partition partmax values less than (maxvalue)
tablespace ora_data
pctfree 10
initrans 16
maxtrans 255
storage
(
initial 64k
minextents 1
maxextents unlimited ))

表插入:

insert into table_name1 as select * from table_name2;

表分區刪除:

alter table表名 truncate partition分區名稱 drop storage;

注意:分區刪除以後,需要重新創建索引。

分區分割:

alter table table_name split partition partmax at(to_date('values_name', 'yyyy-mm-dd')) into (partition prtition_namexx tablespace tablespace_name , partition partmax);

分區查詢:

select * from table_name partition (partition_name);

2.2、hash分區表(散列分區)
Hash分區表創建:hash分區表的分區數量一般是 2的 n次冪,這樣記錄分佈在各個分區上就比較均勻,可以進行 I/O的均衡。

reate table table_name
(
row1 char1 not null,
row2 char2 not null,
、、、、、、
rown  NUMBER not null
)
partition by hash (paration_row)
(
partition partition_name1 tablespace tablespace_name1,
partition partition_name2 tablespace tablespace_name2,
partition partition_name3 tablespace tablespace_name3
、、、、、、、、、、
partition partition_nameX tablespace tablespace_nameX
)

表插入:

insert into table_name1 as select * from table_name2;

分區查詢:

select * From table_name Partition (partition_name); 

hash分區表一般由於數據分佈均衡性,查詢不是通過對分區的操作進行的。update、insert操作同普通表。

2.3、列表分區表
散列分區表創建:

create table table_name
(
row1 char1 not null,
row2 char2 not null,
、、、、、、
rown  number not null
)
partition by list (paration_row)
(
 
partition   partition_name1 values (row_value1,row_value3,row_value8) tablespace tablespace_name1,
 
partition   partition_name2 values (row_value4,row_value6,row_value7) tablespace tablespace_name2, 

partition   partition_name3 values (row_value9,row_value10,row_value11,row_value12,row_value15) tablespace tablespace_name3,
、、、、、、、、、、
partition partition_nameX values (default) tablespace tablespace_nameX
)

表的插入、更新、刪除和普通表相同,在 hash分區和 list分區中,比較困難的操作是:從一張 5千萬以上的表中,要刪除一千萬條記錄比較困,可以通過以下方法進行清理:
第一種方法:
a創建中間表和表備份,b進行數據插入,c進行鎖表,d進行表名修改,e進行索引創建和存儲過程編譯,f進行表 truncate操作。
第二種方法:直接創建 job進行 delete刪除:這樣長期做,會降低表的執行效果
a進行備份數據,b進行表記錄刪除,每次刪除 1000——2000條記錄,不然會發生鎖表,c重建索引,d進行表分析。

declare
v_lognum number; --數據庫中擁有的日誌文件數
v_needarc number; --需要歸檔的日誌文件數
begin
select count(1) into v_lognum from v$log;
loop
loop
select count(1) into v_needarc from v$archive;
if v_needarc < v_lognum - 1 then
exit;
end if;
end loop;
 
delete from
 
對象.table_name where條件 1 and條件 2 and rownum<1000;
 
if sql%rowcount = 0 then
exit;
end if;
commit;
end loop;
end;
––––––————— -- - - - - - - - - - - - - - - - - - - - - - -
create or replace procedure procedure_name(exp_date1 varchar2 ,exp_date2 varchar2)
as
del_sql varchar2(1024);
v_c integer;


begin 

del_sql:='delete from對象.表名 a where exists (select 1 from對象.表名 b where
條件 1 and
條件 2 and、、、、
條件 n)and rownum<1000';


for i in 1..10000 loop
execute immediate del_sql using exp_date1,exp_date2;
if sql%rowcount = 0 then
exit;
end if;
commit;

end loop;
end procedure_name;

3、分區操作
添加分區

alter table table_partition_name add partition partition_name values less than (to_date('row_values','yyyy-mm-dd'));

注意:以上添加的分區界限應該高於最後一個分區界限。

alter table table_partition_name modify partition partition_name add subpartition subpartition_name values('row_values');

刪除分區
以下代碼刪除表分區:

alter table table_partition_name drop partition partition_name storage;

注意:如果刪除的分區是表中唯一的分區,那麼此分區將不能被刪除,要想刪除此分區,必須刪除表

截斷分區
截斷某個分區是指刪除某個分區中的數據,並不會刪除分區,也不會刪除其它分區中的數據。當表
中即使只有一個分區時,也可以截斷該分區。通過以下代碼截斷分區:

alter table table_partition_name truncate partition partition_name;

合併分區
合併分區是將相鄰的分區合併成一個分區,結果分區將採用較高分區的界限,值得注意的是,不能
將分區合併到界限較低的分區。以下代碼實現了 partition_name1與 partition_name分區的合併:

alter table table_partition_name merge partitions partition_name1,partition_name2 into partition partition_name2; 

拆分分區
拆分分區將一個分區拆分兩個新分區,拆分後原來分區不再存在。注意不能對 HASH類型的分
區進行拆分。

alter table table_partition_name sblit partition partition_name1 at(to_date('row_value','yyyy-mm-dd')) into (partition partition_name1,partition partition_name2);

接合分區(coalesca)
結合分區是將散列分區中的數據接合到其它分區中,當散列分區中的數據比較大時,可以增加散列分區,然後進行接合,值得注意的是,接合分區只能用於散列分區中。通過以下代碼進行接合分區:

alter table table_hash_partition_name coalesca partition;

重命名錶分區
以下代碼將 partition_name1更改爲 partition_name2

alter table table_partition_name rename partition partition_name1 to partition_name2;

相關查詢
跨分區查詢

select sum( *) from 
(select count(*) cn from table_partition_name partition (partition_name1)
union all
select count(*) cn from table_partition_name partition (partition_name2));

查詢表上有多少分區

select * from user_tab_partitions where table_name ='table_partition_name';

查詢索引信息

select object_name,object_type,tablespace_name,sum(value)
from v$segment_statistics
where statistic_name in ('physical reads','physical write','logical reads')and object_type='index'
group by object_name,object_type,tablespace_name order by 4 desc;
--顯示數據庫所有分區表的信息:
select * from dba_part_tables

--顯示當前用戶可訪問的所有分區表信息:
select * from all_part_tables

--顯示當前用戶所有分區表的信息:
select * from USER_PART_TABLES

--顯示錶分區信息顯示數據庫所有分區表的詳細分區信息:
select * from dba_tab_partitions 

--顯示當前用戶可訪問的所有分區表的詳細分區信息:
select * from all_tab_partitions

--顯示當前用戶所有分區表的詳細分區信息:
select * from user_tab_partitions

--顯示子分區信息顯示數據庫所有組合分區表的子分區信息:
select * from dba_tab_subpartitions

--顯示當前用戶可訪問的所有組合分區表的子分區信息:
select * from all_tab_subpartitions

--顯示當前用戶所有組合分區表的子分區信息:
select * from user_tab_subpartitions

--顯示分區列顯示數據庫所有分區表的分區列信息:
select * from dba_part_key_columns

--顯示當前用戶可訪問的所有分區表的分區列信息:
select * from all_part_key_columns

--顯示當前用戶所有分區表的分區列信息:
select * from user_part_key_columns

--顯示子分區列顯示數據庫所有分區表的子分區列信息:
select * from dba_subpart_key_columns

--顯示當前用戶可訪問的所有分區表的子分區列信息:
select * from all_subpart_key_columns

--顯示當前用戶所有分區表的子分區列信息:
select * from user_subpart_key_columns

--怎樣查詢出 oracle數據庫中所有的的分區表
select * from user_tables a where a.partitioned='yes'

--刪除一個表的數據是
truncate table table_name;

--刪除分區表一個分區的數據是
alter table table_partition_name truncate partition partition_nameN drop storage; 

4、表狀態查詢

select * From Dba_Tab_Partitions Where Table_Name=’%表名%’;
select owner,index_name,status,degree,table_name from dba_indexes where
table_name=’table_name ’;
select owner,bytes/1024/1024,segment_nam,segment_type,tablespace_name from dba_segments
where
segment_name=’table_name’ and segment_type=’TABLE’ ;

5、DDL語句操作
創建表
基本語法:

create [global temporary] table table_name(
column_name type [constraint constraint_def default default_exp]
[,column_name type [constraint constraint_def default default_exp] ...])
[on commit {delete | preserve} rows]
tablespace tab_space;

其中:
1)global temporary說明改表的行都是臨時的,這種表就稱爲臨時表。
行的有效期由 on commit字句指定。臨時表對於所有的會話都是可見的,但是這些行則是特定於
某個會話的。
2)table_name指定了要分配給該表的名稱。
3)column_name指定了要分配給某個列的名稱。
4)type指定了對某個列的類型。
5)constraint_def指定了對某個列的約束的定義。
6)default_def指定了一個表達式,用來爲某個列賦予默認值。
7)on commit控制臨時表中行的有效期。delete說明這些行在事務的末尾要被刪除。
preserve說明這些行在會話的末尾要被刪除。若對臨時表沒有指定 on commit選項,那末默認值是
delete。
8)tab_space爲該表指定表空間。若沒有指定表空間,該表就被存儲在該用戶的默認表空間中。

獲得有關表的信息可以通過如下操作獲取有關表的信息:
對錶執行 describe命令。

desc order_status_temp;

–注意 desc是 SQL*PLUS命令,在 SQL中不能執行。
查詢 user_tables,它是數據字典的一部分。另:查詢用戶可訪問的表的相關信息,可以查詢all_tables。

select table_name, tablespace_name, temporary
from user_tables
where table_name in ('table_name', 'ORDER_STATUS_TEMP'); 

獲得表中列的信息
從 user_tab_columns中可以獲得有關表中各列的信息,另:通過訪問 all_tab_columns,可以獲得有關可以訪問的表中所有列的信息。

select column_name, data_type, data_length, data_precision, data_scale
from user_tab_columns
where table_name = 'table_name';

修改表
alter table語句可以用於對錶進行修改。
alter table語句可以執行以下任務:
1)添加、修改、刪除列;
2)添加或刪除約束;
3)啓用或禁用約束。

添加列

alter table table_name add modified_by integer;
alter table table_name add rowname類型 [date default sysdate not null];

修改列
1)修改列的長度,條件是該列的類型的長度可以修改,比如 char或 varchar2;
2)修改數字列的精度;
3)修改列的數據類型;
4)修改列的默認值。

修改列的長度
alter table table_name modify rowname類型(長度);
只有在表中還沒有任何行或所有列都爲空值的情況下纔可以減小列的長度。
修改數字列的精度
alter table table_name modify column類型;
只有在表中還沒有任何行或列爲空值時纔可以減小數字列的精度。


修改列的數據類型
alter table table_name modify column類型;

若一個表中還沒有任何行或列爲空值,就可以將列修改爲任何一種數據類型。否則,就只能將列的
數據類型修改爲一種兼容的數據類型。
例如,可以將 varchar2類型修改爲 char,條件是沒有縮短列的長度;但是不能將 date修改爲
number。

修改列的默認值
alter table table_name modify column column_name;
默認值只適用於新插入表中的行。 


刪除列
alter table table_name drop column column_name;

重命名錶
rename語句可以用於對錶進行重命名。
rename table_name1 table_name2;
刪除表數據,保留表結構
truncate table table_name
發佈了61 篇原創文章 · 獲贊 92 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章