DBA
表に対するオブジェクト権限を付与するSQLを既存環境からつくる
systemユーザでログインしてこのSQLを実行する
SELECT 'GRANT ' || Privilege || ' ON ' || Table_Name || ' TO ' || grantee || ';'
FROM DBA_TAB_PRIVS
WHERE grantor ='{付与元ユーザ}'
AND grantee = '{付与先ユーザ}'
ORDER BY grantee;
結果はこんな感じ。
GRANT ALTER ON emp TO {付与先ユーザ};
GRANT SELECT ON emp TO {付与先ユーザ};
GRANT INSERT ON emp TO {付与先ユーザ};
...
付与元ユーザでログインしてこのSQLを実行する
SQLトレースを取るための準備
autotraceに必要なロールを作成し、テーブルへの参照権限を与える
SQL> connect sys as sysdba
パスワードを入力してください:
接続されました。
SQL> @/oracle/product/9.2.0/sqlplus/admin/plustrce.sql
検索を実行するユーザでplan_tableを作成
SQL> connect user/pwd@sid
SQL> @/oracle/product/9.2.0/rdbms/admin/utlxplan.sql
データファイルをいじる
alter database datafile '/oracle/dbf/tbs_test_01.dbf' resize 40m;
alter tablespace tbs_md01 add datafile '/oracle/dbf/tbs_test_02.dbf' size 20m;
レコード長をざっくり計算
select
count(*) as column_cnt,
sum(DATA_LENGTH) as record_length
from
user_tab_columns
where
table_name = 'T_JYUTMISI'
date型は7byte、number型は一律22byteで計算してます。
コアレス(連続領域をくっつける)
alter tablespace tbs_goto_hell coalesce;
でも、領域のお尻しか消せない。真ん中に空いた穴はそのまま。
インポートとエクスポート
imp {usr}/{pwd}@{sid} file=t_uri.dmp tables=T_uri log=imp_uri2.log ignore=y
exp {usr}/{pwd}@{sid} file=t_uri.dmp tables=T_uri log=exp_uri.log direct=Y compress=Y
ignoreオプションをつけると、tableが存在していても無理やり詰め込む
パッケージやファンクションの定義をみる
パッケージに含まれる関数・プロシージャのパラメータを一覧表示
select *
from ALL_ARGUMENTS
where package_name='PK_TEST'
order by position;
パッケージ内の関数などを一覧表示
select PROCEDURE_NAME
from ALL_PROCEDURES
where object_name = 'PK_TEST';
PCTUSEDとPCTFREE
→全件検索には有利
→もともとDELETEされることがないなら、関係ない
- PCTFREE(データが増えた時のためにとる余裕%)が大きい
- 更新によってレコード長が長くなる場合に向いている(移行行を防ぐことが
できる)
→UPDATEが行われない表には大きな値を設定する必要は無い。
- ブロックに余裕がある(空いている領域が多い→レコードは多く格納されて
いない)
→全件検索が中心の表には不利(1ブロックあたりのレコード数が少ないという
ことは同じ件数でも多くのブロックが必要)
テーブルが実際に使っている領域サイズ
SELECT DISTINCT
a.OWNER,
a.SEGMENT_TYPE,
a.SEGMENT_NAME,
c.CREATED,
a.TABLESPACE_NAME,
NVL(F.BYTES, 0) AS NO_USE_SIZE,
NVL(G.BYTES, 0) AS TOTAL_SIZE ,
NVL(G.MAXBYTES,0) AS MAX_SIZE,
(NVL(G.BYTES, 0) - NVL(F.BYTES, 0)) AS USE_SIZE ,
b.FILE_NAME,
b.BYTES
FROM
dba_segments a,
dba_data_files b,
all_objects c,
(SELECT
TABLESPACE_NAME,
SUM(BYTES) BYTES
FROM
DBA_FREE_SPACE
GROUP BY
TABLESPACE_NAME
) F,
(SELECT
TABLESPACE_NAME,
SUM(BYTES) BYTES,
SUM(MAXBYTES) MAXBYTES
FROM
DBA_DATA_FILES
GROUP BY
TABLESPACE_NAME
) G
WHERE
a.TABLESPACE_NAME = b.TABLESPACE_NAME AND
a.SEGMENT_NAME = c.OBJECT_NAME AND
a.OWNER = c.OWNER AND
c.SUBOBJECT_NAME IS NULL AND
a.TABLESPACE_NAME = f.TABLESPACE_NAME AND
a.TABLESPACE_NAME = g.TABLESPACE_NAME
AND c.OBJECT_NAME LIKE 'T_JYUT%'
ORDER BY
a.OWNER,
a.SEGMENT_TYPE,
a.SEGMENT_NAME
LOCK情報
col USERNAME heading ユーザ名 format a7
col to_char(LOGON_TIME,'yyyy/mm/dd_hh24:mi:ss') heading 接続開始時刻 format a19
col SID heading SID format 999
col SERIAL# heading SERIAL# format 999999
col MACHINE format a15
col PROGRAM format a27
col STATUS format a8
col SERVER format a10
col OSUSER format a14
col OBJECT_NAME heading LOCK対象TBL format a20
set pagesize 999
set lin 120
prompt
prompt === 接続ユーザ 一覧 ===
select USERNAME, SID, SERIAL#, to_char(LOGON_TIME,'yyyy/mm/dd_hh24:mi:ss'),
STATUS, SERVER, OSUSER, MACHINE, PROGRAM
from v$session where USERNAME is not null
order by LOGON_TIME;
prompt
prompt === LOCK 一覧 ===
select a.USERNAME, a.SID, a.SERIAL#, a.OSUSER, a.MACHINE, a.PROGRAM,
c.OBJECT_NAME
from v$session a, v$lock b, dba_objects c
where a.SID = b.SID
and b.ID1 = c.OBJECT_ID
and c.OBJECT_ID in ( select ID1 from v$lock where TYPE = 'TM' )
order by b.SID, c.OBJECT_NAME;
セッション情報
Oracleに接続中のセッション情報を表示する
セッションを切断する場合、systemユーザでログインして以下のコマンドを発行する
alter system kill session '<下記SQLで取得したSID_SERIAL>';
COLUMN SID_SERIAL FORMAT A15
COLUMN osuser FORMAT A15
COLUMN username FORMAT A10
Column status format a10
Column Program format a60
SET PAGES 33
SET LINE 4000
SELECT
sid || ',' || serial# AS SID_SERIAL,
username ,
status ,
osuser,
program,to_char(LOGON_TIME,'mm/dd hh24:mi')
FROM
V$SESSION;
指定したテーブルに付与されたインデックスをみる
COLUMN TABLE_OWNER FORMAT A10
COLUMN TABLE_NAME FORMAT A15
COLUMN INDEX_NAME FORMAT A20
COLUMN COLUMN_NAME FORMAT A20
COLUMN COLUMN_POSITION FORMAT 99
set line 2000
SELECT
TABLE_OWNER ,
TABLE_NAME ,
INDEX_NAME ,
COLUMN_NAME ,
COLUMN_POSITION
FROM
ALL_IND_COLUMNS
WHERE
TABLE_OWNER like UPPER('&TableOwner') AND
TABLE_NAME like UPPER('&TableName')
ORDER BY
TABLE_NAME ,
INDEX_NAME ,
COLUMN_POSITION
現在実行されているSQL
set pagesize 999
set lin 120
col USERNAME format a9
col SID format 999
col SERIAL# format 999999
col OSUSER format a15
col SQL_TEXT format a70
SELECT S.USERNAME, S.OSUSER, S.SID, S.SERIAL#, T.ADDRESS, T.SQL_TEXT
FROM V$SQLTEXT T, V$SESSION S
WHERE S.SQL_ADDRESS = T.ADDRESS
AND S.SQL_HASH_VALUE = T.HASH_VALUE
AND S.USERNAME is not null
ORDER BY S.OSUSER, T.ADDRESS, T.PIECE;
コンパイルされているソースを見る
set line 4000
set pages 0
select
lpad(to_char(line),5,'0') || ': ' || text
from
all_source
where
owner = upper('&uid') and
name like upper('%&pk_name%') and
line >= &line_from and
line <= &line_to and
type = 'PACKAGE BODY'
/
表領域を指定して格納されているオブジェクト、サイズを見る
set line 5000
col tablespace_name format a30
col SEGMENT_NAME format a30
select
TABLESPACE_NAME
,SEGMENT_NAME
,FILE_ID
,BLOCK_ID
,BYTES/1024 AS SIZE_KB
,BLOCKS
from DBA_EXTENTS
where TABLESPACE_NAME = 'TBS_WK01_I'
union
select
TABLESPACE_NAME
,'<free>'
,FILE_ID
,BLOCK_ID
,BYTES/1024 AS SIZE_KB
,BLOCKS
from DBA_FREE_SPACE
where TABLESPACE_NAME = 'TBS_WK01_I'
order by file_id,block_id
表領域ごとの空き容量
col tablespace_name format a30
col free_kb format 999,999,999,999,999
select
TABLESPACE_NAME,
SUM(FREE_KB) AS FREE_KB
from
(
select
A.TABLESPACE_NAME
,A.BYTES/1024 AS FREE_KB
from DBA_FREE_SPACE A,
(
SELECT TABLESPACE_NAME,FILE_ID,MAX(BLOCK_ID) AS max_block
FROM DBA_EXTENTS
GROUP BY TABLESPACE_NAME,FILE_ID
) B
where A.TABLESPACE_NAME = B.TABLESPACE_NAME
and A.FILE_ID = B.FILE_ID
and A.BLOCK_ID > B.max_block
)
GROUP BY
TABLESPACE_NAME
/
表領域ごとの使用率
col TABLESPACE_NAME format a20
col USED format a20
set line 2000
select
A.TABLESPACE_NAME,
A.INITIAL_EXTENT,
A.NEXT_EXTENT,
B.USED_SIZE_KB,
To_Char( Round( B.USED_SIZE_KB / A.INITIAL_EXTENT * 100 ) ) || '%' AS USED
from
dba_tablespaces A,
( /* tablespaceの使用サイズを計算 */
select
TABLESPACE_NAME,
SUM(SIZE_KB) AS USED_SIZE_KB
from
(
select
TABLESPACE_NAME
,SEGMENT_NAME
,FILE_ID
,BLOCK_ID
,BYTES/1024 AS SIZE_KB
,BLOCKS
from DBA_EXTENTS
union
select
TABLESPACE_NAME
,'<free>'
,FILE_ID
,BLOCK_ID
,BYTES/1024 AS SIZE_KB
,BLOCKS
from DBA_FREE_SPACE
)
GROUP BY
TABLESPACE_NAME
) B
where
A.TABLESPACE_NAME = B.TABLESPACE_NAME
/
表領域ごとの使用量、空き、無駄領域を計算する
set line 2000
col tablespace_name format a30
col data_kb format 999,999,999,999
col free_kb format 999,999,999,999
col lost_kb format 999,999,999,999
col used_pct format a10
select
TABLESPACE_NAME,
SUM(DATA_KB) AS DATA_KB,
SUM(FREE_KB) AS FREE_KB,
SUM(LOST_KB) AS LOST_KB,
To_CHAR(
Round( (SUM(DATA_KB) + SUM(LOST_KB)) /
(SUM(DATA_KB) + SUM(FREE_KB) + SUM(LOST_KB)) *
100)
) || '%' AS USED_PCT
from
(
select
TABLESPACE_NAME
,SEGMENT_NAME
,FILE_ID
,BLOCK_ID
,BYTES/1024 AS DATA_KB
,0 AS FREE_KB
,0 AS LOST_KB
from DBA_EXTENTS
union
select
A.TABLESPACE_NAME
,'<free>'
,A.FILE_ID
,A.BLOCK_ID
,0 AS DATA_KB
,A.BYTES/1024 AS FREE_KB
,0 AS LOST_KB
from DBA_FREE_SPACE A,
(
SELECT TABLESPACE_NAME,FILE_ID,MAX(BLOCK_ID) AS max_block
FROM DBA_EXTENTS
GROUP BY TABLESPACE_NAME,FILE_ID
) B
where A.TABLESPACE_NAME = B.TABLESPACE_NAME
and A.FILE_ID = B.FILE_ID
and A.BLOCK_ID > B.max_block
union
select
A.TABLESPACE_NAME
,'<free>'
,A.FILE_ID
,A.BLOCK_ID
,0 AS DATA_KB
,0 AS FREE_KB
,A.BYTES/1024 AS LOST_KB
from DBA_FREE_SPACE A,
(
SELECT TABLESPACE_NAME,FILE_ID,MAX(BLOCK_ID) AS max_block
FROM DBA_EXTENTS
GROUP BY TABLESPACE_NAME,FILE_ID
) B
where A.TABLESPACE_NAME = B.TABLESPACE_NAME
and A.FILE_ID = B.FILE_ID
and A.BLOCK_ID < B.max_block
)
GROUP BY
TABLESPACE_NAME
/
最終更新:2006年12月06日 19:55