存储结构

tablespace

表空间是逻辑结构,数据要存储在数据文件中,数据文件是容器;

一个表空间至少拥有一个数据文件最多1023个;

大文件表空间只能又有一个数据文件;

表空间的空间管理模式有两种DMT & LMT

DMT:字典管理模式

LMT:本地管理模式


segment空间管理模式:(table)段的空闲空间如何管理

占用存储空间的对象!段在占用空间时不能跨越表空间!

段可以使用表空间中的任何一个数据文件!

MANUAL

AUTO


extent的管理:

1.创建段时会分配初始范围(extent)

create table scott.t as select * from scott.emp where 1=0;


select segment_name,FILE_ID,block_id,blocks,bytes

from dba_extents

where segment_name='T4'

and owner='SCOTT';


select tablespace_name,file_name

from dba_data_files where file_id=4;


2.数据增长:

insert into scott.t select * from scott.emp;

insert into scott.t select * from scott.t;


select dbms_rowid.ROWID_BLOCK_NUMBER(rowid),count(*)

from scott.t

group by dbms_rowid.ROWID_BLOCK_NUMBER(rowid)

order by 1;


create table scott.t1 (a number(1)) PCTFREE 0;

begin

for i in 1..1000 loop

insert into scott.t1 values (null);

end loop;

commit;

end;

/


select dbms_rowid.ROWID_BLOCK_NUMBER(rowid),count(*)

from scott.t1

group by dbms_rowid.ROWID_BLOCK_NUMBER(rowid)

order by 1;


3.手工分配:

alter table scott.t allocate extent (size 64k datafile '/u01/app/oracle/oradata/test/users02.dbf');


extent空间的回收:

1.手工回收:

alter table scott.t deallocate unused;

只能回收崭新的范围!


2.碎片整理(oracle 10g):(HWM --> high water mark 段级别所使用过的最后一个块)

delete scott.t;

commit;

alter table scott.t enable row movement;

alter table scott.t shrink space;


3.截断表:

truncate table scott.t;

保留初始范围和结构!


4.删除表:

drop table scott.t purge;

释放初始范围!


extent的分配类型:(在创建表空间时指定)

系统分配

统一分配(制式管理)

select tablespace_name,ALLOCATION_TYPE

from dba_tablespaces;


SYSTEM

UNIFORM


SYSTEM(自动分配):使用后台算法分配范围的尺寸!范围的尺寸阶梯增长!

前16个范围的尺寸是 8*8k 64k

接下来的63个范围的尺寸是 128*8k 1M

再接下来的120个范围的尺寸是 1024*8k 8M

再接下来的所有范围的尺寸是 8192*8k 64M

表中数据量越大范围的尺寸也越大!

范围的尺寸也越大表所占用的空间中碎片越少!


UNIFORM(制式分配):一成不变的分配模式!

create tablespace data01 datafile

'/u01/app/oracle/oradata/test/data01.dbf' size 100m

uniform size 10m;


select

TABLESPACE_NAME,

INITIAL_EXTENT,

NEXT_EXTENT,

ALLOCATION_TYPE

from dba_tablespaces;


create table scott.t2 tablespace data01

as select * from scott.emp where 1=0;


段空间的管理类型:(在创建表空间时指定)

select tablespace_name,segment_space_management

from dba_tablespaces;

段空间的管理类型指的是段级别现有空闲空间的管理模式!

MANUAL:使用空闲列表(freelist)管理空闲空间

freelist:是指向表中第一个空闲块的地址,存在于segment header!

空闲块:可以用来作insert操作的块!


AUTO:使用映射位图块管理空闲空间(以来于表空间的本地管理模式)

alter system dump datafile 4 block min 185 block max 192;

生成用户跟踪文件!放在参数unser_dump_dest所指定的目录下,

名字叫做_ora_.trc

show parameter unser_dump_dest

= $ORACEL_SID

:

select spid from v$session s,v$process p

where p.addr=s.paddr

and s.sid=(select sid from v$mystat where rownum=1);

7728


extent:

是分配空间的单位!

set long 2000

select dbms_metadata.get_ddl('TABLE','T','SCOTT')

from dual;


CREATE TABLE "SCOTT"."T"

( "EMPNO" NUMBER(4,0),

"ENAME" VARCHAR2(10),

"JOB" VARCHAR2(9),

"MGR" NUMBER(4,0),

"HIREDATE" DATE,

"SAL" NUMBER(7,2),

"COMM" NUMBER(7,2),

"DEPTNO" NUMBER(2,0)

) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

TABLESPACE "USERS" ENABLE ROW MOVEMENT;


create table scott.t4 (id int) storage (initial 1m);


oracle block的管理:

show parameter db_block_size --标准块大小


使用打包因子(只能在段级别指定)管理块空间的使用:

PCTFREE 10 :空闲用来应付块内行自身的增长!减少行的迁移!

行的链接:行的数据量太大,任何一个8k块都放不下!

PCTUSED 40:


freelist中存在的都是什么样的块?

练习

如何查看表空间空间的存储管理模式?有什么优缺点?


如何查看段空间的存储管理模式?


创建段空间的存储管理模式为手工的表空间


创建段空间的存储管理模式为自动的表空间


如何查看段空间占用情况?


如何查看范围空间存储管理模式?


创建范围的分配类型为system的表空间


创建范围的分配类型为uniform的表空间


在范围的分配类型为system的表空间中创建表,插入大量数据后查看段空间占用情况


在范围的分配类型为uniform的表空间中创建表,插入大量数据后查看段空间占用情况


如何回收段的空闲空间?


如何测试块的数据存储能力?

裸设备数据库的管理

准备裸设备列表文件

--vi /home/oracle/dbca_raw_config.txt--

spfile=/dev/raw/raw1

control1=/dev/raw/raw2

control2=/dev/raw/raw3

control3=/dev/raw/raw4

redo1_1=/dev/raw/raw5

redo1_2=/dev/raw/raw6

redo1_3=/dev/raw/raw7

system=/dev/raw/raw8

sysaux=/dev/raw/raw9

undotbs1=/dev/raw/raw10

temp=/dev/raw/raw11

users=/dev/raw/raw12

example=/dev/raw/raw13


准备设备:

dd if=/dev/zero of=/u01/spfile bs=1M count=10

dd if=/dev/zero of=/u01/ctl1 bs=1M count=10

dd if=/dev/zero of=/u01/ctl2 bs=1M count=10

dd if=/dev/zero of=/u01/ctl3 bs=1M count=10

dd if=/dev/zero of=/u01/redo1 bs=1M count=51

dd if=/dev/zero of=/u01/redo2 bs=1M count=51

dd if=/dev/zero of=/u01/redo3 bs=1M count=51

dd if=/dev/zero of=/u01/system bs=1M count=550

dd if=/dev/zero of=/u01/sysaux bs=1M count=300

dd if=/dev/zero of=/u01/undo bs=1M count=250

dd if=/dev/zero of=/u01/temp bs=1M count=50

dd if=/dev/zero of=/u01/users bs=1M count=50

dd if=/dev/zero of=/u01/example bs=1M count=150


增加循环设备:

--------------------------------------------------------------------------------------------------

方法1:

[root@ ~]# vi /etc/modprobe.conf

options loop max_loop=25


[root@ ~]# /sbin/modprobe loop

[root@ ~]# /sbin/rmmod loop

[root@ ~]# modprobe -v loop

[root@ ~]# ll /dev/loop*


方法2:

for i in $(find /dev/ -type b -name "loop*");do chown oracle:oinstall $i;done


for i in {0..13};do mknod -m 640 /dev/loop$i b 7 $i;done

chown root:disk /dev/loop*

--------------------------------------------------------------------------------------------------


losetup /dev/loop1 /u01/spfile

losetup /dev/loop2 /u01/ctl1

losetup /dev/loop3 /u01/ctl2

losetup /dev/loop4 /u01/ctl3

losetup /dev/loop5 /u01/redo1

losetup /dev/loop6 /u01/redo2

losetup /dev/loop7 /u01/redo3

losetup /dev/loop8 /u01/system

losetup /dev/loop9 /u01/sysaux

losetup /dev/loop10 /u01/undo

losetup /dev/loop11 /u01/temp

losetup /dev/loop12 /u01/users

losetup /dev/loop13 /u01/example


raw /dev/raw/raw1 /dev/loop1

raw /dev/raw/raw2 /dev/loop2

raw /dev/raw/raw3 /dev/loop3

raw /dev/raw/raw4 /dev/loop4

raw /dev/raw/raw5 /dev/loop5

raw /dev/raw/raw6 /dev/loop6

raw /dev/raw/raw7 /dev/loop7

raw /dev/raw/raw8 /dev/loop8

raw /dev/raw/raw9 /dev/loop9

raw /dev/raw/raw10 /dev/loop10

raw /dev/raw/raw11 /dev/loop11

raw /dev/raw/raw12 /dev/loop12

raw /dev/raw/raw13 /dev/loop13


chown oracle.oinstall /dev/raw/raw*


su - oracle

dbca

------------------------------------------------------------------------------------------------------------------

安装iscsi服务端rpm包:

yum install scsi-target-utils

安装iscsi客户端rpm包:

yum install iscsi-initiator-utils


校验iscsi所需服务启动否:

service iscsi status

service iscsid status

service tgtd status


配置脚本:

vi /etc/tgt/targets.conf

----------------------------------------


backing-store /dev/sda10

initiator-address 10.1.1.22


----------------------------------------


vi /etc/udev/scripts/iscsidev.sh

----------------------------------------

#!/bin/bash

BUS=${1}

HOST=${BUS%%:*}

[ -e /sys/class/iscsi_host ] || exit 1

file="/sys/class/iscsi_host/host${HOST}/device/session*/iscsi_session*/targetname"

target_name=$(cat ${file})

if [ -z "${target_name}" ] ; then

exit 1

fi

echo "${target_name##*:}"

----------------------------------------


chmod +x /etc/udev/scripts/iscsidev.sh


vi /etc/udev/rules.d/55-openiscsi.rules

-----------------------------------------------

KERNEL=="sd*",BUS=="scsi",PROGRAM="/etc/udev/scripts/iscsidev.sh %b",SYMLINK+="iscsi/%c"

-----------------------------------------------


在服务端发布设备:

service tgtd restart

tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL

service iscsi start


扫描iscsi服务器:

iscsiadm -m discovery -t sendtargets -p 10.1.1.xx -l

(关闭扫描错误的设备

iscsiadm -m session -u

iscsiadm -m discovery -t sendtargets -p 10.1.1.xx -l)


对iscsi共享盘分区:

dd if=/dev/zero of=/u01/spfile bs=1M count=10

dd if=/dev/zero of=/u01/ctl1 bs=1M count=10

dd if=/dev/zero of=/u01/ctl2 bs=1M count=10

dd if=/dev/zero of=/u01/ctl3 bs=1M count=10

dd if=/dev/zero of=/u01/redo1 bs=1M count=101

dd if=/dev/zero of=/u01/redo2 bs=1M count=101

dd if=/dev/zero of=/u01/redo3 bs=1M count=101

dd if=/dev/zero of=/u01/system bs=1M count=550

dd if=/dev/zero of=/u01/sysaux bs=1M count=300

dd if=/dev/zero of=/u01/undo bs=1M count=50

dd if=/dev/zero of=/u01/temp bs=1M count=50

dd if=/dev/zero of=/u01/users bs=1M count=50

dd if=/dev/zero of=/u01/example bs=1M count=150


将新建的分区加入rawdevice:

vi /etc/udev/rules.d/60-raw.rules

------------------------------------------------

ACTION=="add", KERNEL=="sdb1", RUN+="/bin/raw /dev/raw/raw1 %N"

ACTION=="add", KERNEL=="sdb2", RUN+="/bin/raw /dev/raw/raw2 %N"

ACTION=="add", KERNEL=="sdb3", RUN+="/bin/raw /dev/raw/raw3 %N"

ACTION=="add", KERNEL=="sdb5", RUN+="/bin/raw /dev/raw/raw5 %N"

ACTION=="add", KERNEL=="sdb6", RUN+="/bin/raw /dev/raw/raw6 %N"

ACTION=="add", KERNEL=="sdb7", RUN+="/bin/raw /dev/raw/raw7 %N"

ACTION=="add", KERNEL=="sdb8", RUN+="/bin/raw /dev/raw/raw8 %N"

ACTION=="add", KERNEL=="sdb9", RUN+="/bin/raw /dev/raw/raw9 %N"

ACTION=="add", KERNEL=="sdb10", RUN+="/bin/raw /dev/raw/raw10 %N"

ACTION=="add", KERNEL=="sdb11", RUN+="/bin/raw /dev/raw/raw11 %N"

ACTION=="add", KERNEL=="sdb12", RUN+="/bin/raw /dev/raw/raw12 %N"

ACTION=="add", KERNEL=="sdb13", RUN+="/bin/raw /dev/raw/raw13 %N"

ACTION=="add", KERNEL=="sdb14", RUN+="/bin/raw /dev/raw/raw14 %N"

KERNEL=="raw[1-3]", MODE="0660", GROUP="oinstall", OWNER="oracle"

KERNEL=="raw[5-9]", MODE="0660", GROUP="oinstall", OWNER="oracle"

KERNEL=="raw10", MODE="0660", GROUP="oinstall", OWNER="oracle"

KERNEL=="raw11", MODE="0660", GROUP="oinstall", OWNER="oracle"

KERNEL=="raw12", MODE="0660", GROUP="oinstall", OWNER="oracle"

KERNEL=="raw13", MODE="0660", GROUP="oinstall", OWNER="oracle"

KERNEL=="raw14", MODE="0660", GROUP="oinstall", OWNER="oracle"


启动udev:

start_udev


为dbca准备裸设备配置文件:

--vi /home/oracle/dbca_raw_config.txt--

spfile=/dev/raw/raw1

control1=/dev/raw/raw2

control2=/dev/raw/raw3

control3=/dev/raw/raw5

redo1_1=/dev/raw/raw6

redo1_2=/dev/raw/raw7

redo1_3=/dev/raw/raw8

system=/dev/raw/raw9

sysaux=/dev/raw/raw10

undotbs1=/dev/raw/raw11

temp=/dev/raw/raw12

users=/dev/raw/raw13

example=/dev/raw/raw14

练习

将数据库创建在裸设备的好处是什么?

ASM数据库的管理

export ORACLE_SID=+ASM

sqlplus / as sysdba


查看磁盘组信息:

col name for a10

SELECT group_number,name,type,state,total_mb,free_mb,offline_disks FROM V$ASM_diskgroup;


GROUP_NUMBER NAME TYPE STATE TOTAL_MB FREE_MB OFFLINE_DISKS

------------ ---------- ------ ----------- ---------- ---------- -------------

1 DG1 NORMAL MOUNTED 8192 5832 0

2 DG2 EXTERN MOUNTED 2048 1962 0


查看ASM磁盘的信息:

col group# for 99

col disk# for 99

col name for a5

col path for a11

col LABEL for a7

col FAILGROUP for a10

select GROUP_NUMBER group#,DISK_NUMBER disk#,LABEL,STATE,FAILGROUP,name,path,TOTAL_MB,FREE_MB from v$asm_disk;


GROUP# DISK# LABEL STATE FAILGROUP NAME PATH TOTAL_MB FREE_MB

------ ----- ------- -------- ---------- --------------- -------------------- ---------- ----------

2 0 NORMAL DG2_0000 DG2_0000 /dev/raw/raw21 2048 1962

1 3 NORMAL FAIL2 DISK4 /dev/raw/raw20 2048 1473

1 2 NORMAL FAIL1 DISK3 /dev/raw/raw19 2048 1477

1 0 NORMAL FAIL2 DISK2 /dev/raw/raw16 2048 1443

1 1 NORMAL FAIL1 DISK1 /dev/raw/raw15 2048 1439


增加磁盘组:

CREATE DISKGROUP dgd NORMAL REDUNDANCY

FAILGROUP failgroup1 DISK

'/dev/raw/raw1' NAME diskA1 SIZE 120G FORCE,

'/dev/raw/raw2',

'/dev/raw/raw3'

FAILGROUP failgroup2 DISK

'/dev/raw/raw4',

'/dev/raw/raw5',

'/dev/raw/raw6';


增加fail组:

ALTER DISKGROUP dg1 ADD FAILGROUP fail3 DISK '/dev/raw/raw22' name disk5 REBALANCE POWER 11;


添加ASM磁盘:

ALTER DISKGROUP dg1 add failgroup fail1 DISK '/dev/raw/raw19' name disk3;


删除ASM磁盘:

ALTER DISKGROUP dg1 DROP DISK disk4;


卸载磁盘组:要先关闭rdbms实例

ALTER DISKGROUP dg2 DISMOUNT;


检测磁盘组或磁盘:

ALTER DISKGROUP dg1 CHECK ALL;

alter diskgroup dga check disk vol19;


控制均衡容错组数据的速度:

ALTER DISKGROUP dg2 REBALANCE POWER 11;

平衡速度控制参数:

asm_power_limit = 1~11


检查数据库平衡速度:

SELECT group_number, operation, state, est_work, sofar, est_rate, est_minutes FROM v$asm_operation;


删除磁盘组:

drop diskgroup group1 including contents;


取消删除:

ALTER DISKGROUP group1 UNDROP DISKS;


添加目录:

alter diskgroup dg1 add directory '+dg1/asmdb/test';

create tablespace test datafile '+dg1/asmdb/test/test01.dbf' size 10m;


重命名目录:表空间不受任何影响

alter diskgroup dg1 rename directory '+dg1/asmdb/test' to '+dg1/asmdb/demo';


删除目录:

alter diskgroup dg1 drop directory '+dg1/asmdb/demo' force;


创建别名:

alter diskgroup dg1 add alias '+DG1/ASMDB/spfileasmdb.ora' for '+dg1/asmdb/parameterfile/spfile.269.777315781';


重命名别名:

alter diskgroup dg1 rename alias '+DG1/ASMDB/spfile.ora' to '+DG1/ASMDB/spfileasmdb.ora';


删除别名:删除别名文件不会被删除

alter diskgroup dg1 drop alias '+DG1/ASMDB/spfileasmdb.ora';

练习

ASM的好处是什么?