■ 오라클 관리 수업 복습
1장: 오라클 아키텍쳐
2장: 오라클 소프트웨어 설치(뒤에서 수행)
3장: dbca 를 이용해서 db 생성
4장: 오라클 인스턴스의 구조
5장: ASM 인스턴스 관리(뒤에서 수행)
6장: 오라클 네트워크 관리
7장: 저장영역 관리
1. 테이블 스페이스 생성
2. 테이블 스페이스에 공간 추가
3. 테이블 스페이스 삭제
4. 테이블 스페이스의 상태를 변경( offline ) 하면서 데이터 파일을 이동
5. 테이블 스페이스의 세그먼트 관리 방법
6. OMF 사용하는 방법
▩ 예제59. 테이블 스페이스의 세그먼트 관리 방법을 알아야해요.

pct free 를 두는 이유는 나중에 이 블럭에 데이터가 update 될 때 이 공간을
사용하기 위해서 입니다.
만약에 이 공간이 너무 작거나 없다면 "row migration" 현상이 일어나면서
성능이 느려집니다. 그래서 dba 가 2달 한번씩 또는 3달한번씩 토요일에 출근해서
row migration 현상이 일어난 row 들을 정리해주는 작업을 수행합니다.

row migration 이 발생하게 되면 db 성능이 떨어집니다. 왜냐면 데이터를 찾으러
갔는데 이사갔다가 해서 이사간데를 찾아가야하기 때문입니다.
그래서 pct free 영역을 꼭 넉넉히 확보하고 있어야합니다.
※ 지금 배운 내용중에 꼭 dba 가 알아야할 주요용어 4가지?
■ 실습
#1. emp 테이블의 pct free 와 pct used 가 어떻게 셋팅되어있는지 확인합니다.
PROD> select table_name, pct_free, pct_used
from user_tables
where table_name='EMP';
#2. emp 테이블의 pct free 를 20으로 늘리시오 !
PROD> alter table emp pctfree 20;
PROD> select table_name, pct_free, pct_used
from user_tables
where table_name='EMP';
문제1. dept 테이블의 pct free 와 pct used 를 조회하고 dept 테이블이
앞으로 update 가 많이 일어날것 같으므로 row migration 현상을
줄이기 위해서 pctfree 를 30으로 늘리시오 !
PROD> select table_name, pct_free, pct_used
from user_tables
where table_name='DEPT';
PROD> alter table dept pctfree 30;
※ row migration 이 많이 일어나는 테이블은 pctfree 를 늘릴 필요가 있습니다.
▣ emp 테이블에 row migration 현상이 발생했는지 확인하는 방법
PROD> @?/rdbms/admin/utlchain.sql
Table created.
PROD> desc chained_rows
PROD> analyze table emp list chained rows ;
PROD> select count(*) from chained_rows;
0 이 나옵니다. row migration 이 발생안했습니다.

PROD> alter table emp modify job varchar2(100);
PROD> update emp
set job='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
PROD> analyze table emp list chained rows;
PROD> select count(*) from chained_rows;
PCT FREE 가 여유가 넘쳐서 row migration 이 발생하지 않은것 입니다.
아주 이상적인 상태입니다.
PROD> @demobld.sql
PROD> alter table emp pctfree 1;
PROD> alter table emp modify job varchar2(4000);
PROD> update emp
set job='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
PROD> analyze table emp list chained rows;
PROD> select count(*) from chained_rows;
이제 부터 emp 테이블 검색할 때 성능이 떨어지게 됩니다.
그래서 dba 나 db 엔지니어가 이 현상을 해결해줘야합니다.
PROD> select table_name, tablespace_name
from user_tables
where table_name='EMP';
PROD> alter table emp move tablespace example;
PROD> truncate table chained_rows;
PROD> analyze table emp list chained rows;
PROD> select count(*) from chained_rows;
문제1. dept 테이블을 row migration 현상이 일어나게 구성하고
이를 해결하시오 !
alter table dept pctfree 1;
alter table dept
modify loc varchar2(4000);
update dept
set loc='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
테이블이 작아서 잘 테스트가 안되는데 발생했다고 가정하고 해결합니다.
답:
PROD> analyze table dept list chained rows;
PROD> select count(*) from chained_rows;
PROD> alter table dept move tablespace example;
PROD> analyze table dept list chained rows;
PROD> select count(*) from chained_rows;
그래서 우리가 처음에 테이블을 생성할 때 row migraiton 현상이 일어날것으로 예상되는
테이블은 pct free 를 크게 잡고 생성해줘야합니다.
그런데 오라클에 pctfree 를 알아서 자동조절되게하는 기능이 있습니다.
그게 바로 ASSM (Automatic Segment Space Management) 입니다.
ASSM 은 세그먼트의 공간관리를 오라클이 알아서 자동으로 하겠다는것입니다
테이블 스페이스를 생성할 때 다음과 같이 만들면 됩니다.
create tablespace ts800
datafile '/home/oracle/ts800.dbf' size 10m
segment space management auto;
select tablespace_name, segment_space_management
from dba_tablespaces;
create table emp800
( empno number(10),
ename varchar2(10),
sal number(10) )
tablespace ts800;
위와 같이 생성하면 emp800 에 pct free 와 pct used 는 오라클에 의해서
자동관리 됩니다. 이렇게 하면 크게 신경안써도 되지만 가끔 테이블을 분석해서 row migration 이 일어났는지 확인하는 작업을 하고 해결해야합니다.
create tablespace ts800
datafile '/home/oracle/ts800.dbf' size 10m
segment space management auto; <--- 안주면 이게 default 입니다.
▩ 예제60. OMF(Oracle Managed File) 이 뭔지 알아야해요 !
OMF(Oracle Managed File) 기능을 켜면 테이블 스페이스 생성할 때
물리적인 data file 의 위치와 이름을 신경안써도 됩니다.
OMF 기능이 안켜있을 때 테이블 스페이스 생성 방법
create tablespace ts201
datafile '/home/oracle/ts201.dbf' size 10m;
OMF 기능을 켰을 때의 테이블 스페이스 생성 방법
create tablespace ts202 datafile size 10m;
■ 실습
PROD> show parameter db_create_file_dest
PROD> alter system set db_create_file_dest='/home/oracle' scope=both;
PROD> show parameter db_create_file_dest
PROD> create tablespace ts202;
size 를 안써주면 기본값이 100m 로 만들어집니다.
datafile 위치와 이름은 오라클이 알아서 해줍니다.
PROD> @tablespace.sql
문제1. 그럼 OMF 기능을 다시 끄시오
PROD> alter system set db_create_file_dest='' scope=both;
PROD> show parameter db_create_file_dest
스토리지 3가지 중에 raw device 는 안되고 file system 과 asm 에서만
사용가능합니다.
문제2. 방금 생성한 ts202 테이블 스페이스를 drop 하시오 !
PROD> drop tablespace ts202 including contents and datafiles;
OMF 기능을 켜고 만든 테이블 스페이스는 아래와 같이 DROP 해도
os 의 파일이 같이 지워집니다.
PROD> drop tablespace ts202;
문제3. 다시 OMF 기능을 켜는데 이번에는 기본 위치를
/u01/app/oracle/oradata/PROD/disk1/ 로 되게하시오 !
PROD> alter system set db_create_file_dest='/u01/app/oracle/oradata/PROD/disk1/' scope=both;
문제4. ts501 이라는 테이블 스페이스를 다음과 같이 생성하면
data file 사이즈가 어떻게 되는지 확인하시오 !
PROD> create tablespace ts501;
PROD> @tablespace
$ cd /u01/app/oracle/oradata/PROD/disk1/PROD/datafile
$ ls -lh o1mf_ts501_lwop9388.dbf
문제5. 다음과 같이 ts501 테이블 스페이스에 datafile 을 추가해서 공간을 늘리면 생성되는
datafile 의 크기가 어떻게 되는지 확인하시오 !
alter tablespace ts501 add datafile;
@/home/oracle/tablespace.sql
[PROD:datafile]$ ls -lh *
-rw-r----- 1 oracle dba 101M 2월 13 11:55 o1mf_ts501_lwopjsf8.dbf
-rw-r----- 1 oracle dba 101M 2월 13 11:57 o1mf_ts501_lwopnkgy.dbf
100 메가 자리가 있어야 테이블스페이스 데이터 파일을 만들 수 있다.
▣ 예제61.테이블 스페이스 생성 시 extent 관리 방법을 알아야해요
테이블 스페이스 생성시 자동으로 관리되는 기능 2가지 ?
오라클에서는 특별한 문제가 없는 한 자동으로 사용하기를 권장하고 있습니다.
문법
create tablespace ts5000
datafile '/home/oracle/ts5000.dbf' size 10m
autoextend on maxsize 100m
segment space management auto
extent management local;
create tablespace emp5000
( ........ )
tablespace ts5000
이 두 줄이 가장 중요함.
extent management 가 local 이라는 것은?
select tablespace_name, segment_space_management, extent_management
from dba_tablespace;
만약에 extent_management 가 local 이 아니라
dictionary 면 지도가 system tablespace
에만 있기 때문에 데이터 입력할 때 마다
system tablespace 에 부하가 갑니다.

alter system set db_create_file_dest='' scope=both;
PROD > show parameter db_create

drop tablespace ts5000 including contents and datafiles;
@tablespace.sql
@/home/oracle/tablespace.sql
예제62. bigfile tablespace 가 뭔지 알아야 해요
*테이블 스페이스 파일의 종류에 따라 2가지로 분류됨
bigfile tablespace : 하나의 테이블 스페이스에 하나의 데이터 파일만 저장할 수 있고
하나의 파일의 크기를 최대 128 테라 바이트까지 생성할 수 있습니다.
small file tablespace : 하나의 테이블 스페이스에 여러개의 데이터 파일들을 저장할 수 있는 테이블 스페이스
실습:
#1. 지금까지 만든 테이블 스페이스가 bigfile tablespace 인지 small file tablespace 인지 확인하시오 !
select tablespace_name, bigfile
from dba_tablespace;
문제1. bigfile 테이블 스페이스에는 하나의 데이터 파일만 생성할 수 있습니다.
정말로 그런지 bigts01 테이블 스페이스에 datafile 을 추가해보세요
PROD > alter tablespace bigts01
2 add datafile '/home/oracle/bigts01b.dbf' size 10m;
alter tablespace bigts01텍스트
big file 테이블 스페이스는 1개의 datafile 만 담을 수 있습니다
문제2. bigts01 테이블 스페이스를 drop 하시오 !
drop tablespace bigts01 including contents and datafiles;
8장 유져 보안 관리
소목차 : 1. 유져 생성 방법
2. 권한 부여
3. 권한의 집합인 role 을 생성, 관리
4. 자원 사용 할당을 제한하는 프로파일 생성, 관리
예제63. 유져 생성시 상세한 옵션들을 dba 는 알고 있어야합니다.

sql 시간에 배웠던 유져 생성 방법
create user smith2
identified by tiger;
오라클 관리 수업 때의 유져 생성 방법
create tablespace test5000
datafile '/home/oracle/test5000.dbf' size 10m;
create user scott2
identified by tiger
default tablespace test5000
temporary tablespace temp3
profile default
account lock;
접속할 수 있는 권한을 부여합니다.
grant connect to scott2;
show user
USER is ""
connect / as sysdba
Connected.
PROD >
PROD > show user
USER is "SYS"
PROD >
잠금을 해제해주어야 한다
show user
alter user scott2
account unlock;
connect scott2/tiger

문제1 ts7000 이라는 테이블 스페이스를 사이즈 10m 로 생성하고
ts7000 테이블 스페이스를 default tablespace 로 하는 유져를 생성하는데 유져명은 king2 라고 하고 잠금을 해제하면서 생성하시오
sys 에서 해야함
create tablespace ts7000
datafile '/home/oracle/ts7000.dbf' size 10m;
create user king2
identified by tiger
default tablespace ts7000
temporary tablespace temp3
profile default
account unlock;
PROD > connect system/oracle
Connected.
PROD > select * from session_privs;
GRANT CREATE SESSION TO KING2;
문제1. king2 계정으로 접속해서 가지고 있는 권한들을 확인하시오 !
PROD > connect king2/tiger
Connected.
PROD > select * from session_privs;
예제65. 유져를 생성하기 위해서 유져 인증 방법 3가지를 알고 있어야 해요
어떤 유져를 생성하느냐에 따라서 인증방법이 달라집니다.
접속을 엄격하게 하느냐 아니냐에 따라 나뉠 수 있습니다.
실습 1. password 인증 방법
패스워드를 통해서 접속 인증을 해주는 방법
sys 에서 해야 함
#1. james 라는 유져를 패스워드 tiger 로 해서 생성하시오 !
create user james
identified by tiger;
grant connect to james;
#2. 유져명과 패스워드를 조회하시오
select username, password from dba_users;
패스워드란 컬럼이 있긴 하지만 패스워드가 보이지 않는다.
그럼 패스워드를 잊어버리면 어떻게 하는가 ?
**- 패스워드를 새로 변경 합니다.
패스워드 변경 문법 : alter user james identified by oracle;**
실습2. external 인증 방법 : 가장 느슨한 인증 방법
손님(guest) 계정으로 생성할 때 사용하는 인증 방법
#1. 리눅스 os 에서 접속한 os 의 유져를 확인합니다.
[PROD:~]$ pwd
/home/oracle
[PROD:~]$ id
uid=500(oracle) gid=504(oinstall) groups=504(oinstall),505(dba)
#2. sys 유저로 접속해서 os_authent

#3. 손님 계정을 생성합니다
create user ops$oracle
identified by externally;

#4. 손님 계정에게 접속할 수 있는 권한을 부여합니다.
PROD> grant connect to ops$oracle;
#5. os 로 빠져나갔다가 다시 접속하는데 아래와 같이 접속해보시오 !

external 인증 방법이란 리눅스 os 에 접속했으면 그 다음에 oracle 에 접속할 때는
유져이름과 패스워드 없이 접속하게 하는 인증방법입니다
실습3. global 인증방법은 실습 환경이 안됨 ( 예를 들어 지문인식, 홍채인식)
예제 66. 오라클 db 를 올렸다 내렸다 할 수 있는 권한 관리가 2가지가 있어요
오라클 db 를 관리한느 관리자 인증방법 2가지?
db 를 내리려면 서버시를 가거나 putty 로 접속 하거나
실습1. os 인증방법
#1. os 인증방법으로 설정되어 있는지 패스워드 인증방법으로 설정되어 있는지 확인합니다.
PROD > show parameter remote_login_passwordfile
remote_login_passwordfile string EXCLUSIVE
exclusive 이면 password 파일 인증 방법이고 none 이면 os 인증방법 입니다.

#2. os 인증방법으로 변경하기 위해서 remote_login_passwordfile 을 none 으로 변경합니다.
PROD> alter system set remote_login_passwordfile=none scope=spfile;
scope=spfile; ---- > spfile 에만 반영했고 인스턴스에는 반영되지 않음.
리스너 통해서 sys 유져로는 접속 못합니다
#4. remote_login_passwordfile 파라미터가 exclusive 로 되었는지 확인하고 sys 유져로 리스너 통해서 접속해 봅니다.
PROD > show parameter remote_login_passwordfile
remote_login_passwordfile string EXCLUSIVE
sqlplus sys/oracle@192.168.19.43:1521/PROD as sysdba
접속이 안되면 다음과 같이 조치를 취해봅니다.
os 인증방법 : 리스너 통해서 관리자로 접속 못하는 방식
password file 인증방법 : 리스너 통해서 관리자로 접속할 수 있는 방식
password file 인증방법이 가능하려면 password file 이 있어야 접속 가능 합니다.
현재 password file 이 없습니다. 저번에 db를 수동 생성하고 따로 안만들었습니다.
OS 로 나가서
[PROD:admin]$ cd
[PROD:~]$ dbs
[PROD:dbs]$ pwd
/u01/app/oracle/product/11.2.0/dbhome_1/dbs
[PROD:dbs]$ ls -l orapw*
-rw-r----- 1 oracle oinstall 1536 2월 7 16:12 orapwjhs
-rw-r----- 1 oracle oinstall 1536 1월 16 15:16 orapworcl
orapwPROD 가 없다면 만들어야 합니다

orapwd file=orapwPROD password=oracle
sqlplus sys/oracle@192.168.19.43:1521/PROD as sysdba
문제1. 고객사 dba 에게 전화가 왔는데 sys 유져의 패스워드를 잊어버려서 sysdba 로 접속이 안된다고 한다.
sys 유져의 패스워드를 반경하려면 패스워드 파일을 재생성하면 되므로
기존 패스워드 파일을 지우고 패스워드를 oracle_4U 로 해서 패스워드 파일을 재생성하고
다음과 같이 접속이 되는지 확인하시오 !
sqlplus sys/oracl_4U@192.168.19.43:1521/PROD as sysdba
답:
rm orapwPROD
orapwd file=orapwPROD password=oracle_4U
sqlplus sys/oracle_4U@192.168.19.43:1521/PROD as sysdba

문제 2. 짝과 자리를 바꿔서 sys 의 패스워드를 아무너가 어려운걸로 변경하고 자리로 돌아옵니다.
rm orapwPROD
orapwd file=orapwPROD password=oracle
sqlplus sys/oracle@192.168.19.43:1521/PROD as sysdba

예제 67 보안을 강화하기 위해서 유져를 잠그거나 암호를 자주 변경해야해요

실습1. 불필요한 계정을 확인하고 잠궈버리기
PROD> select username, account_status from dba_users;

king2 잠궈버리기
alter user king2 account lock;

문제1. scott2 와 james 계정도 잠그시오 !

문제2. 다시 잠긴 계정의 lock 를 해제합니다 king2, scott2, james
실습2. 패스워드 변경하기
#1. scott 계정의 패스워드를 oracle1234 로 변경하시오
sys
PROD> alter user scott identified by oracle1234;

문제1. 그럼 다시 scott 의 패스워드를 tiger 로 변경하세요
PROD > alter user scott identified by tiger;
User altered.
예제 68. 오라클 권한의 종류는 크게 2가지가 있어요
유져들에게 권한을 줄 때는 꼭 필요한 권한만 부여해야합니다.
예 : create , alter, drop
select, update, delete, insert 권한
시스템권한 실습 1.
#1. scott 계정이 가지고 있는 시스템 권한이 무엇인지 확인하시오
PROD > connect scott/tiger
Connected.
PROD >
PROD >
PROD > select * from session_privs;
ALTER SYSTEM
:
:
:
FLASHBACK ARCHIVE ADMINISTER
202 rows selected.
권한을 많이 받음
#2. king2 가 가지고 있는 시스템 권한이 무엇인지 확인하시오
PROD > connect king2/tiger
Connected.
PROD > select * from session_privs;

#3. sys 유져로 접속해서 king2 유져에게 create table 권한을 부여합니다.
PROD > connect / as sysdba
Connected.
PROD > grant create table to king2;
Grant succeeded.

오늘의 마지막 문제.
테이블 스페이스 2개를 10m 로 각각 생성하세요.
테이블 스페이스 이름은 insa01 과 insa02 입니다.
insa01 테이블 스페이스에 emp 테이블과 똑같은 emp_insa 테이블을 생성하고
row migration 현상이 일어나게 합니다.
그리고 row migration 을 해결하는데 emp_insa 테이블을 insa01 테이블 스페이스
에서 insa02 테이블 스페이스로 move 하면 해결되는지 확인하시오 !
create tablespac insa01
create tablespace insa01
datafile '/home/oracle/insa01.dbf' size 10m;
create tablespace insa02
datafile '/home/oracle/insa02.dbf' size 10m;
insa01 테이블 스페이스에 emp 테이블과 똑같은 emp_insa 테이블을 생성하고
create table emp_insa
tablespace insa01
as
select * from emp;
row migration 현상이 일어나게 합니다.
alter table emp_insa modify job varchar2(100);
update emp_insa
set job='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
14 rows updated.
PROD > analyze table emp_insa list chained rows;
Table analyzed.
PROD > select count(*) from chained_rows;
0
PROD > alter table emp_insa pctfree 1;
Table altered.
PROD > alter table emp_insa modify job varchar2(4000);
Table altered.
PROD >
update emp_insa
set job='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
14 rows updated.
PROD > analyze table emp_insa list chained rows;
Table analyzed.
PROD > select count(*) from chained_rows;

row migration 을 해결하는데 emp_insa 테이블을 insa01 테이블 스페이스에서 insa02 테이블 스페이스로 move 하면 해결되는지
확인하시오 !

alter table emp_insa move tablespace insa02;
PROD > truncate table chained_rows;
Table truncated.
PROD > analyze table emp_insa list chained rows;
Table analyzed.
PROD > select count(*) from chained_rows;
