Oracle 同義詞、DBLINK、表空間的使用
阿新 • • 發佈:2019-01-14
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;
------------------------------------------------------------------------------------