DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统 中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
1.数据缓冲区(buffer)
一般设置为内存的40% ~60%, OLAP一般设置比OLTP系统(60~80%)要高
用于存放数据页。当客户端发起读写请求时,第一次会从磁盘的数据文件中读取数据(为物理读)放入数据缓冲区,使用LRU 最小最少使用算法
Normal普通数据页,缓冲区满时淘汰
FAST 数据页、回滚页,常驻缓冲区
Recycle:临时表数据页
Keep:普通表数据页,很少淘汰。
创建表空间时可指定缓冲区类型Normal 和Keep缓冲区。
执行检查点时将数据缓冲区中的数据写入磁盘文件
手动执行检查点:checkpoint(100);完全检查点,100%刷盘
查看参数值:
SELECT * FROM V$DM_INI WHERE PARA_NAME IN
('BUFFER','FAST_POOL_PAGES','RECYCLE','KEEP');
读多页:当数据分布几种,并要读取大量数据时,可开启,默认1 一次读取一页
MULTI_PAGE_GET_NUM参数
- 重做日志缓冲区
缓存重做(redo)信息。数据所有的操作几乎都会产生 REDO 日志,REDO 日志会先写入日 志缓冲区
重做日志写入联机重做日志:
commit时
每隔3s
日志缓冲区满
当我们执行 commit 的时候,
日志缓冲区的日志数据一定会写入联机日志
数据缓冲区的数据是不一定会写入数据文件
- SQL缓冲区
SQL CACHE POOL,简称SCP ,参数:CACHE_POOL_SIZE。
用来缓存 sql 语句、package,对应的执行计划、结果集。 业务要减少硬解析(性能消耗大),提高 sql 软解析(性能消耗小)。
V$CACHEITEM
V$CACHERS 缓存结果集视图
v$dynamic_tables 动态视图表
参数:USE_PLN_POOL 是否缓存结果集,默认0,不开启
RS_CAN_CACHE 是否缓存执行计划,默认1 开启
V$CACHEPLN 记录缓存的执行计划
select * from v$cacheitem;
select * from V$CACHERS;
select * from v$dynamic_tables;
select * from v$cachepln;
SP_CLEAR_PLAN_CACHE(plan_id);清空指定SQL的执行计划plan_id从 V$CACHEPLN 中 的 CACHE_ITEM 列获得
SP_CLEAR_PLAN_CACHE()清空所有的执行计划
- 字典缓冲区
缓存数据库字典信息(表、字段、权限等信息).为了避免频繁从磁盘读取数据字典信息
SELECT * FROM V$DICT_CACHE; 记录数据字典缓冲区使用情况
SELECT * FROM V$DICT_CACHE_ITEM;记录具体的缓存项
- 内存池
当其他缓冲区不够时,可以向内存池申请空间
V$MEM_POOL 详细记录了当前系统中所有的内存池的状态
共享内存池:
MEMORY_POOL 静态参数,共享内存池初始大小
MEMORY_EXTENT_SIZE 共享内存池的扩展大小
MEMORY_TARGET 共享内存池最大大小,为0 表示不限制
MEMORY_N_POOLS:内存池的个数,当系统高并发数,可设置多个提高数据库的性能
运行时内存池
在数据库运行时申请,用完后释放。
包含:VM POOL 、SESSION POOL、排序区、HASH区等
排序区:当SQL语句排序是,优先在内存中排序,使用排序区,如果内存不足排序时,会在临时表空间中排序。业务应尽量避免不必要的大数据量排序
查询排序参数:
SELECT * FROM V$DM_INI WHERE PARA_NAME LIKE 'SORT_%';
HASH区:用于hash join和hash group by
查询hash连接参数
SELECT * FROM V$DM_INI WHERE PARA_NAME LIKE 'HJ_%';
查询hash分组参数
SELECT * FROM V$DM_INI WHERE PARA_NAME LIKE 'HAGR_%';
2.表空间管理
SYSTEM:系统表空间,存放数据库的对象定义信息,权限信息,表结构、字段定义等。
ROLL:回滚表空间,用来存放回滚数据。DML的回滚信息,保存在回滚段中。
MAIN:用户默认表空间,创建用户若未指定默认表空间,则使用main表空间。
TEMP:临时表空间,存放临时数据,临时表、大数据量排序、创建索引等。数据库重启会重建临时表空间
HMAIN:HUGE表(列存储表的默认表空间)
后两个视图可以在mount状态下查询:
SELECT * FROM SYS.DBA_TABLESPACES;
SELECT * FROM SYS.DBA_DATA_FILES;
SELECT * FROM V$TABLESPACE; --查看表空间,可以在mount状态下查询
SELECT * FROM V$DATAFILE; --查看数据文件,可以在mount状态下查询
SELECT * FROM DBA_FREE_SPACE; --查看表空间空闲情况,可结合tablespace视图查询表空间使用率
在线收缩临时表空间
SP_TRUNC_TS_FILE(临时表空间id,数据文件id,目标大小);
UNDO_RETENTION设置undo保留时间参数:
SQL> sp_set_para_double_value(1,'UNDO_RETENTION',1800);
创建DM表空间数据文件大小的取值范围:不小于页大小的4096倍,不超过页大小的2的31次方-1
查看页大小:SELECT PAGE;
--dmdba账号需要有数据文件目录的读写权限,大小单位为M 不能修改
--创建 DM表空间数据文件大小的取值范围:不小于页大小的4096倍,不超过页大小的2的31次方-1,
--默认为normal表空间,自动扩展
CREATE TABLESPACE TS_SCHEMA1 DATAFILE '/dm8/data/DM02/ts_schema1.dbf' SIZE 32;
--修改表空间为KEEP类型,可用于存放经常访问的数据,DM不能指定表的缓存类型
ALTER TABLESPACE TS_SCHEMA1 CACHE ="KEEP";
--添加数据文件
ALTER TABLESPACE TS_SCHEMA1 ADD DATAFILE '/dm8/data/DM02/ts_schema1_02.dbf' SIZE 32;
--关闭自动扩展
ALTER TABLESPACE TS_SCHEMA1 DATAFILE '/dm8/data/DM02/ts_schema1.dbf' AUTOEXTEND OFF;
--增加数据文件的大小,resize不能改小表空间
ALTER TABLESPACE TS_SCHEMA1 RESIZE DATAFILE '/dm8/data/DM02/ts_schema1.dbf' TO 64;
--数据文件自动扩展,每次扩展2m,最大限制10G
ALTER TABLESPACE TS_SCHEMA1 DATAFILE '/dm8/data/DM02/ts_schema1.dbf' AUTOEXTEND ON NEXT 2 MAXSIZE 10240;
SELECT * FROM V$TABLESPACE;
mkdir -p /dm8/data/DM02/tbs
--数据文件迁移(自定义表空间)
--表空间脱机
ALTER TABLESPACE TS_SCHEMA1 OFFLINE;
--迁移数据文件
ALTER TABLESPACE TS_SCHEMA1 RENAME DATAFILE '/dm8/data/DM02/ts_schema1.dbf' TO '/dm8/data/DM02/tbs/ts_schema1_01.dbf';
ALTER TABLESPACE TS_SCHEMA1 RENAME DATAFILE '/dm8/data/DM02/ts_schema1_02.dbf' TO '/dm8/data/DM02/tbs/ts_schema1_02.dbf';
--表空间联机
ALTER TABLESPACE TS_SCHEMA1 ONLINE;
--同步删除数据文件,只能删除空闲的表空间
DROP TABLESPACE TS_SCHEMA1;
--表空间重命名(自定义表空间)
ALTER TABLESPACE TS_SCHEMA1 RENAME TO TS_SCHEMA1_DATA;
SELECT * FROM V$DATAFILE;
3.联机重做日志文件
DM联机日志切换由数据库自动管理,不支持手动切换。过小频繁切换影响性能,过大易丢失数据,空间浪费
--查看重做日志文件
SELECT * FROM V$RLOGFILE;
--查看重做日志总和信息
SELECT * FROM V$RLOG;
--添加重做日志文件
ALTER DATABASE ADD LOGFILE '/dm8/data/DM02/redo03.log' SIZE 256;
--增加日志文件大小
ALTER DATABASE RESIZE LOGFILE '/dm8/data/DM02/redo03.log' TO 400;
--迁移日志文件
mkdir -p /dm8/data/DM02/redo
alter database mount;
alter database RENAME LOGFILE '/dm8/data/DM02/redo03.log' TO '/dm8/data/DM02/redo/redo03.log';
alter database RENAME LOGFILE '/dm8/data/DM02/DM0201.log' TO '/dm8/data/DM02/redo/redo01.log';
alter database RENAME LOGFILE '/dm8/data/DM02/DM0202.log' TO '/dm8/data/DM02/redo/redo02.log';
alter database open;
查看当前使用的redo日志文件:
- 归档管理
默认不开启归档,开归档用于数据库的恢复
select path,arch_lsn,clsn from v$arch_file;
select arch_name,arch_dest,arch_type from v$dm_arch_ini;
oracle兼容视图
select * from v$archived_log;
select * from v$arch_file;
--开启归档
alter database mount;
alter database add archivelog 'dest=/dm8/arch,type=local,file_size=128,space_limit=10240';
alter database archivelog;
alter database open;
--手动切换归档
alter system switch logfile;
alter system ARCHIVE LOG CURRENT;
alter database archivelog current;
--关闭归档
ALTER DATABASE MOUNT;
ALTER DATABASE NOARCHIVELOG;
ALTER DATABASE DELETE ARCHIVELOG 'DEST=/DM8/arch';
ALTER DATABASE OPEN;
--维护归档日志文件
select* FROM v$ifun WHERE NAME LIKE '%ARCHIVELOG%';
--根据lsn删除,删除小于指定lsn的归档
select SF_ARCHIVELOG_DELETE_BEFORE_LSN(33033);
--根据时间删除指定时间以前的归档
select SF_ARCHIVELOG_DELETE_BEFORE_TIME(sysdate-1);
select sf_archivelog_delete_before_lsn(40430);
日志分析系统包:DBMS_LOGMNR