1. 程式人生 > >Oracle 同義詞、DBLINK、表空間的使用

Oracle 同義詞、DBLINK、表空間的使用

Oracle 同義詞

Oracle同義詞建立及其作用
Oracle的同義詞(synonyms)從字面上理解就是別名的意思,和試圖的功能類似,就是一種對映關係。本文介紹如何建立同義詞語句,刪除同義詞以及檢視同義詞語句。
  oracle的同義詞總結:
  從字面上理解就是別名的意思,和試圖的功能類似。就是一種對映關係。
  1.建立同義詞語句:
  create public synonym table_name for user.table_name;
  其中第一個user_table和第二個user_table可以不一樣。
  此外如果要建立一個遠端的資料庫上的某張表的同義詞,需要先建立一個Database Link(資料庫連線)來擴充套件訪問,然後在使用如下語句建立資料庫同義詞:create synonym table_name for 
[email protected]
_Link;   當然,你可能需要在user使用者中給當前使用者(user2)授權: grant select/delete/update on user2   2.刪除同義詞:   drop public synonym table_name;   3.檢視所有同義詞:   select * from dba_synonyms   同義詞擁有如下好處:節省大量的資料庫空間,對不同使用者的操作同一張表沒有多少差別;擴充套件的資料庫的使用範圍,能夠在不同的資料庫使用者之間實現無縫互動;同義詞可以建立在不同一個數據庫伺服器上,通過網路實現連線。 Oracle資料庫中提供了同義詞管理的功能。Oracle同義詞是資料庫方案物件的一個別名,經常用於簡化物件訪問和提高物件訪問的安全性。 AD:在Oracle中對使用者的管理是使用許可權的方式來管理的,也就是說,如果我們想使用資料庫,我們就必須得有許可權,但是如果是別人將許可權授予了我們,我們也是能對資料庫進行操作的,但是我們必須要已授權的表的名稱前鍵入該表所有者的名稱,所以這就是比較麻煩的,遇到這種情況,我們該怎麼辦呢?建立個Oracle同義詞吧!這樣我們就可以直接使用同義詞來使用表了。 1.同義詞的概念 Oracle資料庫中提供了同義詞管理的功能。同義詞是資料庫方案物件的一個別名,經常用於簡化物件訪問和提高物件訪問的安全性。在使用同義詞時,Oracle資料庫將它翻譯成對應方案物件的名字。與檢視類似,同義詞並不佔用實際儲存空間,只有在資料字典中儲存了同義詞的定義。在Oracle資料庫中的大部分資料庫物件,如表、檢視、同義詞、序列、儲存過程、包等等,資料庫管理員都可以根據實際情況為他們定義同義詞。 2.Oracle同義詞的分類 Oracle同義詞有兩種型別,分別是公用Oracle同義詞與私有Oracle同義詞。 1)公用Oracle同義詞:由一個特殊的使用者組Public所擁有。顧名思義,資料庫中所有的使用者都可以使用公用同義詞。公用同義詞往往用來標示一些比較普通的資料庫物件,這些物件往往大家都需要引用。 2)私有Oracle同義詞:它是跟公用同義詞所對應,他是由建立他的使用者所有。當然,這個同義詞的建立者,可以通過授權控制其他使用者是否有權使用屬於自己的私有同義詞。 3.Oracle同義詞建立及刪除 建立公有Oracle同義詞的語法:Create [public] synonym 同義詞名稱 for [username.]objectName; Drop [public] synonym 同義詞名稱 4.Oracle同義詞的作用 1) 多使用者協同開發中,可以遮蔽物件的名字及其持有者。如果沒有同義詞,當操作其他使用者的表時,必須通過user名.object名的形式,採用了Oracle同義詞之後就可以隱蔽掉user名,當然這裡要注意的是:public同義詞只是為資料庫物件定義了一個公共的別名,其他使用者能否通過這個別名訪問這個資料庫物件,還要看是否已經為這個使用者授權。 2) 為使用者簡化sql語句。上面的一條其實就是一種簡化sql的體現,同時如果自己建的表的名字很長,可以為這個表建立一個Oracle同義詞來簡化sql開發。 3)為分散式資料庫的遠端物件提供位置透明性。 5.Oracle同義詞在資料庫鏈中的作用 資料庫鏈是一個命名的物件,說明一個數據庫到另一個數據庫的路徑,通過其可以實現不同資料庫之間的通訊。 Create database link 資料庫鏈名 connect to user名 identified by 口令 using ‘Oracle連線串’; 訪問物件要通過 object名@資料庫鏈名。同義詞在資料庫鏈中的作用就是提供位置透明性 ------------------------------------------------------------------ Oracle同義詞建立及分配使用者建立同義詞許可權 (1)--授權某個使用者crate synonym的許可權,若使用者名稱為scott grant create synonym to scott (2)--建立同義詞 create [or replace] synonym syn_name from table_name; (3)--撤銷scott建立同義詞的許可權 revoke create synonym from scott; (4)--刪除同義詞 Drop synonym syn_name 注:在副表上建立同義詞 create or replace synonym JC_GROUP1(對應副表中的組織機構表) for wlmqpb.ZHPT_DEPT(主表的資料庫名.主表的組織機構表); 這樣建立成功後就可以直接在副表select ------------------------------------------------------------------------ Oracle的同義詞(synonyms)總結   synonyms 英['sɪnənɪmz] 美['sɪnənɪmz] 同義詞( synonym的名詞複數 );   和檢視的功能類似,是一種對映關係。   (1)建立同義詞的語法     create public synonym table_name for user.table_name;     其中第一個user_table和第二個user_table可以不一樣。     此外如果要建立一個遠端的資料庫上的某張表的同義詞,需要先建立一個Database Link(資料庫連線)來擴充套件訪問,     然後在使用如下語句建立資料庫同義詞:create synonym table_name for
[email protected]
_Link;     create or replace synonym MONTHHOURS for [email protected];     你可能需要在user使用者中給當前使用者(user2)授權: grant select/delete/update on user2   (2)刪除同義詞     drop public synonyms table_name;   (3)查詢所有同義詞     select * from dba_synonyms;   同義詞擁有如下好處:     節省大量的資料庫空間,對不同使用者的操作同一張表沒有多少差別;     擴充套件的資料庫的使用範圍,能夠在不同的資料庫使用者之間實現無縫互動;     同義詞可以建立在不同一個數據庫伺服器上,通過網路實現連線 ------------------------------------------------------------------------------

DBLINK

1.檢視dblink

select owner,object_name from dba_objects where object_type='DATABASE LINK';
或者

select * from dba_db_links;
2.建立dblink
前提:
   建立dblink的使用者有對應的資料庫許可權
       create public database link 或者create database link 
       可以使用

grant create public database link,create database link to myAccount;
       來授權.
create public database link dblinkname connect to usernameidentified by password
   using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = database_ip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME =servicename)
)
)';
如果在create之後不加public,則建立的dblink就不是公共的,就只有建立者可以使用了.
補充:如何確定資料庫的servicename:
   1.在sqlplus中使用

show parameter[s] service_names;
       注意parameter和parameters都可以
    2.使用

select name,value from v$parameter where name='service_names'

    
3.使用db link
   例如,在本機資料庫上建立了一個scott_rmthost的publicdblink(使用遠端主機的scott使用者連線),則用sqlplus連線到本機資料庫,執行select * [email protected]_rmthot即可以將遠端資料庫上的scott使用者下的emp表中的資料獲取到.
   也可以在本地建一個同義詞來指向[email protected]_rmthost,這樣取值就方便多了.
4.刪除
    注意:使用者有createpublic database link 或者create database link 許可權.

drop public database link dblinkname;
--------------------- 
Oracle 建立 DBLink 的方法
當用戶要跨本地資料庫,訪問另外一個數據庫表中的資料時,本地資料庫中必須建立了遠端資料庫的dblink,通過dblink本地資料庫可以像訪問本地資料庫一樣訪問遠端資料庫表中的資料。下面講介紹我之前專案中如何在本地資料庫中建立dblink.

create database link TestDblink
 connect to dbName identified by dbPassword
  using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.2.158)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';
TestDblink : 表示dblink名字

dbName :表示 遠端資料庫的使用者

dbPassword:表示 遠端資料庫的密碼

HOST : 表示遠端資料庫IP

PORT : 表示遠端資料庫埠

SERVICE_NAME : 遠端資料庫的例項名

-- 查詢、刪除和插入資料和操作本地的資料庫是一樣的,只不過表名需要寫成“表名@dblink伺服器”而已。 

例如:如果想在本地資料庫中通過dblink訪問遠端資料庫'orcl'中dbName.tb_test表,sql語句如下所示

select * from [email protected];
 

DBLINK其他相關的知識:

1、檢視所有的資料庫連結,登入管理員檢視  

select owner,object_name from dba_objects where object_type='DATABASE LINK';
2.刪除資料庫連線

drop database link TestDblink;
-----------------------------------------------------------
查詢DBLINK資訊
select * from dba_db_links;
select owner,object_name from dba_objects where object_type='DATABASE LINK';
select * from ALL_DB_LINKS;

Oracle建立dblink報錯:ORA-01017、ORA-02063解決:
根據ORA-01017的提示是連線到另一方的使用者密碼錯誤,當9i或10g的版本的Oracle資料庫連線11g的版本時,會自動將密碼轉化為大寫。
**密碼最好用雙引號引起來,否則可能在連線的時候報錯

create database link dblink名
  connect to 資料庫使用者名稱 identified by "資料庫密碼"
 using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';  

-- 如果建立全域性 dblink,必須使用 systm 或 sys 使用者,在 database 前加 public。  
create public database link dblink名
  connect to 資料庫使用者名稱 identified by "資料庫密碼"
  using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';  

--刪除DBLINK
DROP DATABASE LINK [name];  
--或  
DROP PUBLIC DATABASE LINK [name];  
--------------------- 

表空間的使用
 

Oracle表空間基本操作
普通表空間:
1》  建立表空間:

  Create tablespace tablespace_name

  Datafile ‘E:\oracle\tablespace_datafile.dbf’ size 20M

  Autoextend on

  Next 5M

  Maxsize 50M;

2》  新增資料檔案:

  Alter tablespace tablespace_name

  Add datafile ‘E:\oracle\tablespace_new_add_datafile.dbf’

  Size 20M

  Autoextnend off;

3》  更改資料檔案大小:

  Alter database datafile ‘E:\oracle\tablespace_datafile.dbf’

  Resize 50M

4》  更改表資料檔案自增:

  Alter database datafile ‘E:\oracle\tablespace_new_add_datafile.dbf’

  Autoextend on

 

5》  查詢所有表空間名字等 :user_tablespaces;

6》  查詢預設表空間,臨時表空間:user_users

7》  查詢表空間空閒情況:dba_free_space

8》  查詢資料檔案:dba_data_files

9》  查詢表空間狀態:dba_tablespaces

10》 移動資料檔案:

  ①   :alter tablespace tablespace_name offline

  ②   :物理硬碟上移動資料檔案

  ③   :alter tablespace tablespace_name

    rename datafile ‘E:\oracle\old\tablespace_datafile.dbf’

    to ‘E:\oracle\new\tablespace_datafile.dbf’

11》   刪除表空間:

  Drop tablespace tablespace_name

  Including contents and datafiles;(刪除內容和檔案)

 

 

臨時表空間:  
1》  建立臨時表空間:

  Create temporary tablespace tablespace_name

  Tempfile ‘E:\oracle\temptablespace_datafile.dbf’

  Size 5M

  Autoextend on

  Next 3M

  Maxsize 10M

2》  新增資料檔案:

  Alter tablespace tablespace_name

  Add tempfile ‘E:\oracle\temptablespace_new_add_datafile.dbf’

  Size 5M;

3》  更改資料檔案大小:

4》  更改臨時檔案狀態:

  Alter database tempfile ‘E:\oracle\temptablespace_datafile.dbf’ offline

5》  建立臨時表空間組:

  Create temporary tablespace temptablespace_name

  Tempfile ‘E:\oracle\temptablespace_datafile.dbf’

  Size 5M

  Tablespace group tablespace_group_name

6》  把臨時表空間新增到表空間組:

  Alter tablespace temptablespace_name tablespace group tablespace_group_name

7》  刪除表空間組 == 刪除表空間組中的所有表空間

  Drop tablespace temptablespace_name including contents and datafiles  
--------------------------------------------------------------------------------
查看錶空間使用情況

--1G=1024MB
--1M=1024KB
--1K=1024Bytes
--1M=11048576Bytes
--1G=1024*11048576Bytes=11313741824Bytes
SELECT a.tablespace_name "表空間名",
       total "表空間大小",
       free "表空間剩餘大小",
       (total - free) "表空間使用大小",
       total / (1024 * 1024 * 1024) "表空間大小(G)",
       free / (1024 * 1024 * 1024) "表空間剩餘大小(G)",
       (total - free) / (1024 * 1024 * 1024) "表空間使用大小(G)",
       round((total - free) / total, 4) * 100 "使用率 %"
  FROM (SELECT tablespace_name, SUM(bytes) free
          FROM dba_free_space
         GROUP BY tablespace_name) a,
       (SELECT tablespace_name, SUM(bytes) total
          FROM dba_data_files
         GROUP BY tablespace_name) b
 WHERE a.tablespace_name = b.tablespace_name;

查看錶資料檔案情況

select   b.file_name 物理檔名,
         b.tablespace_name 表空間,
         b.bytes / 1024 / 1024 大小M,
         (b.bytes - sum(nvl(a.bytes, 0))) / 1024 / 1024 已使用M,
         substr((b.bytes - sum(nvl(a.bytes, 0))) / (b.bytes) * 100, 1, 5) 利用率   from dba_free_space a,
       dba_data_files b   where a.file_id = b.file_id   group by b.tablespace_name,
       b.file_name,
       b.bytes   order by b.tablespace_name;

檢視資料庫的版本 

SELECT version
  FROM product_component_version
 WHERE substr(product, 1, 6) = 'Oracle';
--------------------- 
Oracle 表空間查詢與操作方法
一。查詢篇 
1.查詢oracle表空間的使用情況 
select b.file_id  檔案ID, 
  b.tablespace_name  表空間, 
  b.file_name     物理檔名, 
  b.bytes       總位元組數, 
  (b.bytes-sum(nvl(a.bytes,0)))   已使用, 
  sum(nvl(a.bytes,0))        剩餘, 
  sum(nvl(a.bytes,0))/(b.bytes)*100 剩餘百分比 
  from dba_free_space a,dba_data_files b 
  where a.file_id=b.file_id 
  group by b.tablespace_name,b.file_name,b.file_id,b.bytes 
  order by b.tablespace_name 
2.查詢oracle系統使用者的預設表空間和臨時表空間 
select default_tablespace,temporary_tablespace from dba_users 
3.查詢單張表的使用情況 
select segment_name,bytes from dba_segments where segment_name = 'RE_STDEVT_FACT_DAY' and owner = USER 
RE_STDEVT_FACT_DAY是您要查詢的表名稱 
4.查詢所有使用者表使用大小的前三十名 
select * from (select segment_name,bytes from dba_segments where owner = USER order by bytes desc ) where rownum <= 30 
5.查詢當前使用者預設表空間的使用情況 
select tablespacename,sum(totalContent),sum(usecontent),sum(sparecontent),avg(sparepercent) 
from 
( 
SELECT b.file_id as id,b.tablespace_name as tablespacename,b.bytes as totalContent,(b.bytes-sum(nvl(a.bytes,0))) as usecontent,sum(nvl(a.bytes,0)) as sparecontent,sum(nvl(a.bytes,0))/(b.bytes)*100 as sparepercent 
FROM dba_free_space a,dba_data_files b 
WHERE a.file_id=b.file_id and b.tablespace_name = (select default_tablespace from dba_users where username = user) 
group by b.tablespace_name,b.file_name,b.file_id,b.bytes 
) 
GROUP BY tablespacename 
6.查詢使用者表空間的表 
select * from user_tables 
================================================================================== 
一、建立表空間 
CREATE TABLESPACE test 
DATAFILE 'c:/oracle/oradata/db/test01.dbf' SIZE 50M 
UNIFORM SIZE 1M; #指定區尺寸為128k,如不指定,區尺寸預設為64k 
或 
CREATE TABLESPACE test 
DATAFILE 'c:/oracle/oradata/db/test01.dbf' SIZE 50M 
MINIMUM EXTENT 50K EXTENT MANAGEMENT LOCAL 
DEFAULT STORAGE (INITIAL 50K NEXT 50K MAXEXTENTS 100 PCTINCREASE 0); 
可從dba_tablespaces中檢視剛建立的表空間的資訊 
二、建立UNDO表空間 
CREATE UNDO TABLESPACE test_undo 
DATAFILE 'c:/oracle/oradata/db/test_undo.dbf' SIZE 50M 
UNDO表空間的EXTENT是由本地管理的,而且在建立時的SQL語句中只能使用DATAFILE和EXTENT MANAGEMENT子句。 
ORACLE規定在任何時刻只能將一個還原表空間賦予資料庫,即在一個例項中可以有多個還原表空間存在,但只能有一個為活動的。可以使用ALTER SYSTEM命令進行還原表空間的切換。 
SQL> ALTER SYSTEM SET UNDO_TABLESPACE = test_undo; 
三、建立臨時表空間 
CREATE TEMPORARY TABLESPACE test_temp 
TEMPFILE '/oracle/oradata/db/test_temp.dbf' SIZE 50M 
檢視系統當前預設的臨時表空間 
select * from dba_properties where property_name like 'DEFAULT%' 
改變系統預設臨時表空間 
alter database default temporary tablespace test_temp; 
四、改變表空間狀態 
1.使表空間離線 
ALTER TABLESPACE test OFFLINE; 
如果是意外刪除了資料檔案,則必須帶有RECOVER選項 
ALTER TABLESPACE game test FOR RECOVER; 
2.使表空間聯機 
ALTER TABLESPACE test ONLINE; 
3.使資料檔案離線 
ALTER DATABASE DATAFILE 3 OFFLINE; 
4.使資料檔案聯機 
ALTER DATABASE DATAFILE 3 ONLINE; 
5.使表空間只讀 
ALTER TABLESPACE test READ ONLY; 
6.使表空間可讀寫 
ALTER TABLESPACE test READ WRITE; 
五、刪除表空間 
DROP TABLESPACE test INCL ING CONTENTS AND DATAFILES CASCADE CONSTRAINTS; 
DROP TABLESPACE 表空間名 [INCL ING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]] 
1. INCL ING CONTENTS 子句用來刪除段 
2. AND DATAFILES 子句用來刪除資料檔案 
3. CASCADE CONSTRAINTS 子句用來刪除所有的引用完整性約束 

六、擴充套件表空間 
首先查看錶空間的名字和所屬檔案 
select tablespace_name, file_id, file_name, 
round(bytes/(1024*1024),0) total_space 
from dba_data_files 
order by tablespace_name; 
1.增加資料檔案 
ALTER TABLESPACE test 
ADD DATAFILE '/oracle/oradata/db/test02.dbf' SIZE 1000M; 
2.手動增加資料檔案尺寸 
ALTER DATABASE DATAFILE 'c:/oracle/oradata/db/test01.dbf' 
RESIZE 100M; 
3.設定資料檔案自動擴充套件 
ALTER DATABASE DATAFILE 'c:/oracle/oradata/db/test01.dbf' 
AUTOEXTEND ON NEXT 100M 
MAXSIZE 200M; 
設定後可從dba_tablespace中查看錶空間資訊,從v$datafile中檢視對應的資料檔案資訊 
================================================================================== 
create tablespace scgl 
datafile 'E:\ORACLE\PROD T\10.1.0\ORADATA\ORCL\scgl2.dbf' 
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local; 
create tablespace test_data 
logging 
datafile 'E:\ORACLE\PROD T\10.1.0\ORADATA\ORCL\user_data.dbf' 
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local; 
create user scgl identified by qwer1234 
default tablespace scgl 
temporary tablespace scgl_temp; 
tempfile 'E:\ORACLE\PROD T\10.1.0\ORADATA\ORCL\user_temp.dbf' 
create temporary tablespace scgl_temp 
tempfile 'E:\ORACLE\PROD T\10.1.0\ORADATA\ORCL\scgl_temp.dbf' 
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local; 
grant connect,resource, dba to scgl; 
oracle建立表空間 SYS使用者在CMD下以DBA身份登陸: 
在CMD中打sqlplus /nolog 
然後再 
conn / as sysdba 
//建立臨時表空間 
create temporary tablespace user_temp 
tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf' 
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local; 
//建立資料表空間 
create tablespace test_data 
logging 
datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf' 
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local; 
//建立使用者並指定表空間 
create user username identified by password 
default tablespace user_data 
temporary tablespace user_temp; 
查詢表空間使用情況 
SELECT UPPER(F.TABLESPACE_NAME) "表空間名", 
D.TOT_GROOTTE_MB "表空間大小(M)", 
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)", 
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比", 
F.TOTAL_BYTES "空閒空間(M)", 
F.MAX_BYTES "最大塊(M)" 
FROM (SELECT TABLESPACE_NAME, 
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES, 
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES 
FROM SYS.DBA_FREE_SPACE 
GROUP BY TABLESPACE_NAME) F, 
(SELECT DD.TABLESPACE_NAME, 
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB 
FROM SYS.DBA_DATA_FILES DD 
GROUP BY DD.TABLESPACE_NAME) D 
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME 
ORDER BY 1 
查詢表空間的free space 
select tablespace_name, 
count(*) as extends, 
round(sum(bytes) / 1024 / 1024, 2) as MB, 
sum(blocks) as blocks 
from dba_free_space 
group by tablespace_name; 
--查詢表空間的總容量 
select tablespace_name, sum(bytes) / 1024 / 1024 as MB 
from dba_data_files 
group by tablespace_name; 
查詢表空間使用率 
select total.tablespace_name, 
round(total.MB, 2) as Total_MB, 
round(total.MB - free.MB, 2) as Used_MB, 
round((1 - free.MB / total.MB) * 100, 2) || '%' as Used_Pct 
from (select tablespace_name, sum(bytes) / 1024 / 1024 as MB 
from dba_free_space 
group by tablespace_name) free, 
(select tablespace_name, sum(bytes) / 1024 / 1024 as MB 
from dba_data_files 
group by tablespace_name) total 
where free.tablespace_name = total.tablespace_name; 
----------------------------------------------------------------------------------------------------------------------------- 
1.建立表空間:create tablespace test datafile '/u01/test.dbf' size 10M uniform size 128k 
#指定區尺寸為128k ,塊大小為預設8K 
#大檔案表空間 create bigfile tablespace big_tbs datafile '/u01/big_tbs.dbf ' size 100G 
2.建非標準表show parameter db alter system set db_2k_cache_size=10M create tablespace test datafile '/u01/test.dbf' size 10M blocksize 2K uniform size 128k 
#常見錯誤 
SQL> alter system set db_2k_cache_size=2M; alter system set db_2k_cache_size=2M ERROR at line 1: ORA-02097: parameter cannot be modified because specified value is invalid ORA-00384: Insufficient memory to grow cache 
#解決 
SQL> alter system set sga_max_size=400M scope=spfile; SQL> shutdown immediate; SQL> startup SQL> alter system set db_2k_cache_size=10M; System altered. 
3.檢視區大小與塊大小#區大小 conn y / 123 create table t(i number) tablespace test; Insert into t values(10) select bytes/1024 from user_segments where segment_name=upper('t'); 
#塊大小 Show parameter block(預設64K) 
#非標準表空間的blocksize SQL> select * from v$dbfile; SQL> select name,block_size,status from v$datafile; SQL> select block_size from v$datafile where file#=14; 
4.刪除表空間drop tablespace test including contents and datafiles 
5.查表空間:#查資料檔案 select * from v$dbfile; #所有表空間 select * from v$tablespace; 
#表空間的資料檔案 select file_name,tablespace_name from dba_data_files; 
6.建立undo表空間create undo tablespace undotbs01 datafile '/u01/undotbs01.dbf' size 5M; 
#切換到新建的undo表空間 alter system set undo_tablespace=undotbs01; 
7.建立臨時表空間create temporary tablespace temp_data tempfile '/u01/temp.db' size 5M; create bigfile temporary tablespace bigtem tempfile '/u01/bigtemp.db' size 5M; 
8.改變表空間狀態 
(0.)檢視狀態 
#表空間狀態 select tablespace_name,block_size,status from dba_tablespaces; 
#資料檔案狀態 select name,block_size,status from v$datafile; 
(1.)表空間離線alter tablespace test offline 
#如果意外刪除了資料檔案 alter tablespace test offline for recover 
(2.)表空間聯機alter tablespace test online 
(3.)資料檔案離線select * from v$dbfile; alter database datafile 3 offline 
(4.)資料檔案聯機recover datafile 3; alter database datafile 3 online; 
(5.)使表空間只讀alter tablespace test read only 
(6.)使表空間可讀寫alter tablespace test read write; 
9.擴充套件表空間#首先查看錶空間的名字和所屬檔案及空間 select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name; #三種擴充套件方法 
1.alter tablespace test add datafile '/u01/test02.dbf' size 10M(自動加一個datafile) 
2.alter database datafile '/u01/test.dbf' resize 20M; 
3.alter database datafile '/u01/test.dbf' autoextend on next 10M maxsize 1G; 
#設定後查看錶空間資訊 
select a.tablespace_name,a.bytes total,b.bytes used,c.bytes free,(b.bytes*100)/a.bytes "% used",(c.bytes*100)/a.bytes "% free" from sys.sm$ts_avail a,sys.sm$ts_used b,sys.sm$ts_free c where a.tablespace_name=b.tablespace_name and a.tablespace_name=c.tablespace_name; 
10.移動表空間的資料檔案 
#先確定資料檔案據在表空間 
SQL>select tablespace_name,file_name from dba_data_files where file_name='/u01/test.dbf'; 
#open狀態 
SQL>alter tablespace test offline; SQL>host move /u01/test.dbf /u01/oracle/test.dbf; SQL>alter tablespace test rename datafile '/u01/test.dbf' to '/u01/oracle/test.dbf'; SQL>alter tablespace test offline; 
#mount狀態 SQL>shutdown immediate; SQL>startup mount SQL>host move /u01/test.dbf /u01/oracle/test.dbf; SQL>alter database rename file '/u01/test.dbf' to '/u01/oracle/test.dbf'; 
11.表空間和資料檔案常用的資料字典與動態效能檢視v$dbfile v$datafile dba_segments user_segments dba_data_files v$tablespace dba_tablespaces user_tablespaces 
--查詢表空間使用情況 
SELECT UPPER(F.TABLESPACE_NAME) "表空間名", 
D.TOT_GROOTTE_MB "表空間大小(M)", 
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)", 
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比", 
F.TOTAL_BYTES "空閒空間(M)", 
F.MAX_BYTES "最大塊(M)" 
FROM (SELECT TABLESPACE_NAME, 
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES, 
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES 
FROM SYS.DBA_FREE_SPACE 
GROUP BY TABLESPACE_NAME) F, 
(SELECT DD.TABLESPACE_NAME, 
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB 
FROM SYS.DBA_DATA_FILES DD 
GROUP BY DD.TABLESPACE_NAME) D 
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME 
ORDER BY 1 
--查詢表空間的free space 
select tablespace_name, 
count(*) as extends, 
round(sum(bytes) / 1024 / 1024, 2) as MB, 
sum(blocks) as blocks 
from dba_free_space 
group by tablespace_name; 
--查詢表空間的總容量 
select tablespace_name, sum(bytes) / 1024 / 1024 as MB 
from dba_data_files 
group by tablespace_name; 
--查詢表空間使用率 
select total.tablespace_name, 
round(total.MB, 2) as Total_MB, 
round(total.MB - free.MB, 2) as Used_MB, 
round((1 - free.MB / total.MB) * 100, 2) || '%' as Used_Pct 
from (select tablespace_name, sum(bytes) / 1024 / 1024 as MB 
from dba_free_space 
group by tablespace_name) free, 
(select tablespace_name, sum(bytes) / 1024 / 1024 as MB 
from dba_data_files 
group by tablespace_name) total 
where free.tablespace_name = total.tablespace_name; 
//給使用者授予許可權 
grant connect,resource to username; 
//以後以該使用者登入,建立的任何資料庫物件都屬於user_temp 和user_data表空間, 
這就不用在每建立一個物件給其指定表空間了 
撤權: 
revoke 許可權... from 使用者名稱; 
刪除使用者命令 
drop user user_name cascade; 

建立表空間 
CREATE TABLESPACE data01 
DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M 
UNIFORM SIZE 128k; #指定區尺寸為128k,如不指定,區尺寸預設為64k 

刪除表空間 
DROP TABLESPACE data01 INCL ING CONTENTS AND DATAFILES; 
一、建立表空間 
CREATE TABLESPACE data01 
DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M 
UNIFORM SIZE 128k; #指定區尺寸為128k,如不指定,區尺寸預設為64k 
二、建立UNDO表空間 
CREATE UNDO TABLESPACE UNDOTBS02 
DATAFILE '/oracle/oradata/db/UNDOTBS02.dbf' SIZE 50M 
#注意:在OPEN狀態下某些時刻只能用一個UNDO表空間,如果要用新建的表空間,必須切換到該表空間: 
ALTER SYSTEM SET undo_tablespace=UNDOTBS02; 
三、建立臨時表空間 
CREATE TEMPORARY TABLESPACE temp_data 
TEMPFILE '/oracle/oradata/db/TEMP_DATA.dbf' SIZE 50M 
四、改變表空間狀態 
1.使表空間離線 
ALTER TABLESPACE game OFFLINE; 
如果是意外刪除了資料檔案,則必須帶有RECOVER選項 
ALTER TABLESPACE game OFFLINE FOR RECOVER; 
2.使表空間聯機 
ALTER TABLESPACE game ONLINE; 
3.使資料檔案離線 
ALTER DATABASE DATAFILE 3 OFFLINE; 
4.使資料檔案聯機 
ALTER DATABASE DATAFILE 3 ONLINE; 
5.使表空間只讀 
ALTER TABLESPACE game READ ONLY; 
6.使表空間可讀寫 
ALTER TABLESPACE game READ WRITE; 
五、刪除表空間 
DROP TABLESPACE data01 INCL ING CONTENTS AND DATAFILES; 

六、擴充套件表空間 
首先查看錶空間的名字和所屬檔案 
select tablespace_name, file_id, file_name, 
round(bytes/(1024*1024),0) total_space 
from dba_data_files 
order by tablespace_name; 
1.增加資料檔案 
ALTER TABLESPACE game 
ADD DATAFILE '/oracle/oradata/db/GAME02.dbf' SIZE 1000M; 
2.手動增加資料檔案尺寸 
ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf' 
RESIZE 4000M; 
3.設定資料檔案自動擴充套件 
ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf 
AUTOEXTEND ON NEXT 100M 
MAXSIZE 10000M; 

設定後查看錶空間資訊 
SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE, 
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE" 
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C 
----------------------------------------------------------------------
背景
今天發現有一張取樣表從1月5號開始不記錄資料了,所以想檢視一下表空間使用率,在網上零零散散找了很多資料,現在記錄如下,也不知道哪一個最準確。還有一個就是網上拷貝的sql程式碼格式太亂了,不好看,找到一個線上格式化工具。

參考1
複製程式碼
--查詢表空間使用情況
SELECT Upper(F.TABLESPACE_NAME)         "表空間名",
       D.TOT_GROOTTE_MB                 "表空間大小(M)",
       D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)",
       To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99')
       || '%'                           "使用比",
       F.TOTAL_BYTES                    "空閒空間(M)",
       F.MAX_BYTES                      "最大塊(M)"
FROM   (SELECT TABLESPACE_NAME,
               Round(Sum(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES,
               Round(Max(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES
        FROM   SYS.DBA_FREE_SPACE
        GROUP  BY TABLESPACE_NAME) F,
       (SELECT DD.TABLESPACE_NAME,
               Round(Sum(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB
        FROM   SYS.DBA_DATA_FILES DD
        GROUP  BY DD.TABLESPACE_NAME) D
WHERE  D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER  BY 1

--查詢表空間的free space
select tablespace_name, count(*) AS extends,round(sum(bytes) / 1024 / 1024, 2) AS MB,sum(blocks) AS blocks from dba_free_space group BY tablespace_name;

--查詢表空間的總容量
select tablespace_name, sum(bytes) / 1024 / 1024 as MB from dba_data_files group by tablespace_name;
--查詢表空間使用率
SELECT total.tablespace_name,
       Round(total.MB, 2)           AS Total_MB,
       Round(total.MB - free.MB, 2) AS Used_MB,
       Round(( 1 - free.MB / total.MB ) * 100, 2)
       || '%'                       AS Used_Pct
FROM   (SELECT tablespace_name,
               Sum(bytes) / 1024 / 1024 AS MB
        FROM   dba_free_space
        GROUP  BY tablespace_name) free,
       (SELECT tablespace_name,
               Sum(bytes) / 1024 / 1024 AS MB
        FROM   dba_data_files
        GROUP  BY tablespace_name) total
WHERE  free.tablespace_name = total.tablespace_name;
複製程式碼
上述語句查詢結果如下圖所示:



 

參考2:
複製程式碼
SELECT a.tablespace_name                        "表空間名",
       total                                    "表空間大小",
       free                                     "表空間剩餘大小",
       ( total - free )                         "表空間使用大小",
       Round(( total - free ) / total, 4) * 100 "使用率   %"
FROM   (SELECT tablespace_name,
               Sum(bytes) free
        FROM   DBA_FREE_SPACE
        GROUP  BY tablespace_name) a,
       (SELECT tablespace_name,
               Sum(bytes) total
        FROM   DBA_DATA_FILES
        GROUP  BY tablespace_name) b
WHERE  a.tablespace_name = b.tablespace_name
複製程式碼
查詢結果



 

參考3
複製程式碼
SELECT TABLESPACE_NAME "表空間",
       To_char(Round(BYTES / 1024, 2), '99990.00')
       || ''           "實有",
       To_char(Round(FREE / 1024, 2), '99990.00')
       || 'G'          "現有",
       To_char(Round(( BYTES - FREE ) / 1024, 2), '99990.00')
       || 'G'          "使用",
       To_char(Round(10000 * USED / BYTES) / 100, '99990.00')
       || '%'          "比例"
FROM   (SELECT A.TABLESPACE_NAME                             TABLESPACE_NAME,
               Floor(A.BYTES / ( 1024 * 1024 ))              BYTES,
               Floor(B.FREE / ( 1024 * 1024 ))               FREE,
               Floor(( A.BYTES - B.FREE ) / ( 1024 * 1024 )) USED
        FROM   (SELECT TABLESPACE_NAME TABLESPACE_NAME,
                       Sum(BYTES)      BYTES
                FROM   DBA_DATA_FILES
                GROUP  BY TABLESPACE_NAME) A,
               (SELECT TABLESPACE_NAME TABLESPACE_NAME,
                       Sum(BYTES)      FREE
                FROM   DBA_FREE_SPACE
                GROUP  BY TABLESPACE_NAME) B
        WHERE  A.TABLESPACE_NAME = B.TABLESPACE_NAME)
--WHERE TABLESPACE_NAME LIKE 'CDR%' --這一句用於指定表空間名稱
ORDER  BY Floor(10000 * USED / BYTES) DESC;
複製程式碼
查詢結果



 

 

複製程式碼
select tablespace_name,
       max_gb,
       used_gb,
       round(100 * used_gb / max_gb) pct_used
  from (select a.tablespace_name tablespace_name,
               round((a.bytes_alloc - nvl(b.bytes_free, 0)) / power(2, 30),
                     2) used_gb,
               round(a.maxbytes / power(2, 30), 2) max_gb
          from (select f.tablespace_name,
                       sum(f.bytes) bytes_alloc,
                       sum(decode(f.autoextensible,
                                  'YES',
                                  f.maxbytes,
                                  'NO',
                                  f.bytes)) maxbytes
                  from dba_data_files f
                 group by tablespace_name) a,
               (select f.tablespace_name, sum(f.bytes) bytes_free
                  from dba_free_space f
                 group by tablespace_name) b
         where a.tablespace_name = b.tablespace_name(+)
        union all
        select h.tablespace_name tablespace_name,
               round(sum(nvl(p.bytes_used, 0)) / power(2, 30), 2) used_gb,
               round(sum(decode(f.autoextensible,
                                'YES',
                                f.maxbytes,
                                'NO',
                                f.bytes)) / power(2, 30),
                     2) max_gb
          from v$temp_space_header h, v$temp_extent_pool p, dba_temp_files f
         where p.file_id(+) = h.file_id
           and p.tablespace_name(+) = h.tablespace_name
           and f.file_id = h.file_id
           and f.tablespace_name = h.tablespace_name
         group by h.tablespace_name)
order by 4;
------------------------------------------------------------------------------------