- 浏览: 659473 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
HkEndless:
不好意思,请问这确定是回调机制吗。你的例子中只是将接口的实现类 ...
Spring CallBack回调机制介绍 -
hanmiao:
写的真乱啊,完全不知所云...
Java如何调用可执行文件和批处理命令 -
junia_1:
junia_1 写道 shock: ...
为什么要使用EJB -
junia_1:
shock:
为什么要使用EJB -
coollifer:
不错
SQL Server数据导入到Oracle中的方法
Oracle Instance实例就是Oracle数据库服务器上一块可共享内存和一系列的背景进程。在Windows环境和Unix/Linux环境中,实现Oracle实例的方式存在很大差异。Windows环境由于自身的特点,Oracle实例中的共享内存和多进程模型被实现为单进程多线程模型。此时的共享内存SGA被实现为进程OracleService.exe的专享区域。
而在Unix/Linux下,Oracle实例是被实现为多进程模型的,多进程之间通过信号量(semaphore)和共享内存(shared memory)进行通信。在这个过程中,操作系统层面要进行更多的共享内存和信号量管理工作。本篇,我们就研究一下操作系统的shmmax参数含义和与SGA分配的关系。
1、Oracle实例启动和共享内存
回顾两个问题:
ü 在Oracle Startup的时候,要经历三个阶段:unmount、mount和open。在unmount阶段,Oracle会进行实例的创建和整理工作。具体来说包括:参数文件init.ora读取、backgroup process创建和共享内存SGA分配;
ü 我们在安装Unix/Linux版本的Oracle时,是需要手工配置一些参数内容。其中就有shmmax参数的配置。该参数的作用就是定义Unix/Linux环境一次可以分配的最大共享段segment的大小;
配置shmmax参数就在/etc/sysctl.conf中。
[root@bspdev ~]# cat /etc/sysctl.conf
# Kernel sysctl configuration file for Oracle Linux
kernel.sem = 250 32000 100 142
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4294967295
net.core.rmem_default = 262144
(篇幅原因,有省略……)
共享内存信息为:
[root@bspdev ~]# ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x1e853bdc 32768 grid 660 4096 0
0x01606d30 98305 oracle 640 4096 0
------ Semaphore Arrays --------
key semid owner perms nsems
0x00000000 0 root 600 1
0x00000000 32769 root 600 1
0xa83075d0 163842 grid 660 104
0xc05587f0 294915 oracle 640 154
------ Message Queues --------
key msqid owner perms used-bytes messages
2、SGA空间分配方式
SGA的大小是Oracle实例相关的一个重要方面。在Oracle10g之前,SGA总大小是根据DBA进行手工调整配置。但是进入10g之后,可以使用sga_target参数进行统一划定,其中各个部分组成由Oracle自动根据负载进行动态调整。在11g之后,使用memory_target参数,更进一步的将整个Oracle服务器所有使用空间进行自动化调整。
在实例启动的时候,Oracle会从参数文件parameter file中读取需要创建的SGA大小,之后就会向操作系统申请相应的共享空间。在这个过程中,需要结合shmmax参数与SGA参数进行匹配。
单对于SGA而言,是划分为四个组成部分的:
ü Fixed Portion:是一个固定的分配常量;
ü Variable Portion:可变部分,大部分的可变部分都是由shared_pool的大小来确定的;
ü Redo block buffer:是Oracle SGA的redo buffer pool的空间;
ü Data block buffer:是SGA的buffer cache的空间使用;
SQL> select * from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 1250428
Variable Size 222301060
Database Buffers 381681664
Redo Buffers 7135232
3、分配SGA的三种方法
简单的说,在SGA分布在物理内存的方式上,存在三种模型:单段(one-segment)、连续多段(contiguous multi-segment)和非连续多段(non-contiguous multi-segment)。
在Oracle启动实例,进行共享SGA分配的时候,会依次尝试着三种方法。在每个方法尝试中,分配成功或者最后抛出相关ORA异常。如果出现异常抛出,Oracle会以异常处理的方式,清理错误信息,尝试下一种分配模型。最后,整个SGA会存放在shared memory中,共享内存的各个片段累积和就是sgasize的大小。
ü One-segment单段
单段one-segment是sga分配最简单也是最先尝试的一种模型。该模型下,SGA会分配在一个共享内存区域里。采用这种模型时,Oracle会向内存申请分配一块与SGA期望大小相同的共享内存空间。
在操作系统层面,oracle相当于调用shmget内核函数进行分配。但是该操作所能分配的最大共享内存大小受到参数shmmax的限制。如果申请的共享内存SGASIZE大小小于或者等于shmmax的大小,这样通常是可以申请到共享内存segment的。
但是,如果设置的SGA大小超过了shmmax空间,shmget函数操作就会返回一个错误信息。这样,SGA就需要放在多个共享段multi-shared segment中了。
注意两个细节:如果shmget()函数在分配过程中,遇到非空间不够问题,会抛出错误ORA_7306。在分配空间之后,会将共享内存的分配信息计入到ksms.o文件中。这个过程被称为attach过程,如果这个过程出错,系统报错ORA_7307。
ü Multi-Segment Contiguously连续多段分配
当没有成功的将SGA放置在一个共享内存段时,Oracle会开始尝试放置在多个段中。这个方法有两种类型:一个是连续的分配多段,另一个是非连续的多段分配。首先尝试的是连续contiguously方式的分配。
此时,Oracle需要直接访问获取shmmax参数,从而了解到底需要分配多少个共享段。大部分情况下,需要多段分配的场景都是shmmax<sgasize。
在连续共享段的分配方式下,Oracle会分配SGASIZE/SHMMAX(向下进位)个分区给SGA。由于空间是连续的,所以容纳SGA的时候也是连续存放。
对多个分配下去的共享内存,同样存在allocate和attach的过程。在attach到ksms.o文件的时候,只会将分配的第一个共享段首地址放置。其他的共享段都是通过上一个的地址加上空间大小,从而实现连续分配的效果。
注意:如果这个分配的共享大小个数超过了SS_SEG_MAX规定的大小数量,那么Oracle会报错ORA_7329。
比如:SGASIZE的大小是5G,而shmmax参数为2G。此时系统若有条件进行连续共享段分配,会分配出:2G、2G、1G三个共享段连续排列。
如果连续多共享段操作分配失败,Oracle内部会返回错误ORA_7336。那么就意味着第二种分配模型失败。要根据返回错误的具体值进行判定。
如果在allocate过程中出现错误,而且返回信息为EINVAL,则直接转入到第三种分配SGA模型中。否则,Oracle会持续报错ORA_7337。
ü Multi-Segment Non-Contiguously非连续多段分配
第三种分配模型是三种模型中最复杂的一个。首先,Oracle也是会去获取shmmax参数的取值,之后进行一系列复杂的评估过程。按照如下步骤进行:
1、Oracle检查是否有一个shared memory segment可以将SGA的fix portion和variable portion两块存放在一起。如果可以,将两个部分放置在一个共享段中;
2、如果步骤一的检查失败,那么转而尝试是否可能将fix portion和variable portion分别放置在两块共享内存上;
3、在这个过程中,如果fix portion要大于shmmax参数,也就意味着不存在单独可以防止fix portion的空间,那么系统报错ORA_7330。如果variable portion要大于shmmax参数,系统报错ORA_7331;
4、Oracle计算容纳进一个shared memory segment的redo block的个数。如果shmmax的大小小于一个redo block的大小,系统报错ORA_7332;
5、同理,Oracle计算容纳进一个shared memory segment的data buffer block的个数。如果shmax的大小小于一个data buffer block,Oracle抛出错误ORA_7333;
6、通过步骤4、5的计算,Oracle获取到容纳redo buffer和data block buffer的共享段的个数。注意,redo buffer和data block buffer的计量方式是通过blocks进行的。所以,使用buffers/(buffers per segment)可以近似获取到容纳的segments个数;
7、SGA四部分分配到需要的segment数量之后,总和就是总的共享segment个数。如果这个综合超过了ss_seg_max参数,报错ORA_7334;
经过一系列的计算确定,Oracle最后还是要进行空间的allocate和attach过程。在ksms.o中,会记录上对应的所有segment的头地址和大小信息。
在算法中,如果Oracle接收到操作系统级别的错误,首先会抛出ORA_7336错误,之后检查返回错误参数。如果是EINVAL,就抛出错误ORA_7310。否则是ORA_7337。
4、结论
经过三种算法的计算分配,Oracle获取到了和SGASIZE相同的共享内存。之后的过程就是进行信号量semaphore的分配。
综合上面的阐述,我们也就理解了shmmax参数在Unix/Linux平台设置的原因。
发表评论
-
ORA-14551: 无法在查询中执行 DML 操作
2013-11-30 13:45 1364最近在调试一个带DML操作的函数时,一直不成功,在PL/SQ ... -
Oracle Recursive Calls 说明
2013-04-09 23:11 1492一. Recursive Calls 说明 在执行计划 ... -
consistent gets db block gets
2013-04-09 19:58 1440consistent gets :consistent_ge ... -
SQL Server数据导入到Oracle中的方法
2012-07-17 17:09 1597在我们使用SQL Server数据库的过程中,有时需要将SQL ... -
更改ORACLE归档路径及归档模式
2012-07-16 18:23 1868在ORACLE10g和11g版本,ORAC ... -
disable/enable validate/novalidate 的区别
2012-01-08 11:41 1235启用约束: enable( validate) :启用约束,创 ... -
linux用dd测试磁盘速度
2012-01-07 21:58 1013首先要了解两个特殊的设备: /dev/null:回收站、 ... -
在数据分布严重不均的列上使用绑定变量容易错过更好的执行计划
2012-01-07 20:49 1034在数据分布严重不均的列上使用绑定变量容易错过更好的执行计划,原 ... -
Oracle hash join
2012-01-07 17:00 953hash join是oracle里面一个非常强悍的功能 ... -
恢复被rm意外删除数据文件
2012-01-05 12:30 1268一.模拟数据文件删除 [oracle ... -
oracle 块延迟清除(delayed block cleanout)
2012-01-04 22:47 1361为了保证事务的回退和满足多用户的 CR , orac ... -
Oracle数据库SCN号详解
2012-01-04 19:25 1542Oracle数据库SCN号详解: 系统检查点scn(v$da ... -
oracle常见问题与解答
2012-01-03 20:22 16911.对于sql,有几种方法查看执行计划,每种方法有什么区别,对 ... -
Oracle虚拟私有数据库(VPD)概述及简单举例
2011-12-23 12:35 1567Oracle虚拟私有数据库(VPD)概述及简单举例 1、Ora ... -
alter table move跟shrink space的区别
2011-12-17 15:02 1297都知道alter table move 或shrink spa ... -
How to dump Oracle Data Block?
2011-12-16 15:22 999Often while doing instance tuni ... -
oracle索引的5种使用模式
2011-12-14 21:19 1080索引的使用对数据库的性能有巨大的影响。 共有五类不同的使用模式 ... -
HP Unix中的dba MLOCK
2011-12-14 19:14 2236最近在HP平台上遇到两次跟dba MLOCK权限相关的错误: ... -
NESTED LOOP、HASH JOIN、SORT MERGE JOIN
2011-12-13 23:18 1379表连接方式及使用场合 ... -
Oracle用户权限
2011-12-12 19:48 1514系统权限: 1、使用GRANT语句向用户赋予系统权限: ...
相关推荐
1. **kernel.shmmax**: 此参数定义了共享内存段的最大尺寸,单位为字节。在Oracle中,它应该大于SAG(System Global Area)的最大初始化参数值,以避免多个内存段导致的效率降低。通常,推荐设置为物理内存的一半或...
- **添加至 sysctl.conf 文件**:还可以通过 `echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf` 的方式向文件末尾追加参数设置,不建议使用这种方式,因为可能会导致文件中出现重复或冲突的参数设置。...
当需要增大内存时,需要调整系统内核参数,如`kernel.shmmax`,以及Oracle的内存池设置。 9. **表空间利用率**:监控表空间使用情况以确保数据库空间的有效利用。当表空间接近满载时,可以通过创建新的表空间或扩展...
2. **最大内存分配(shmmax)**: `kernel.shmmax`参数控制了共享内存段的最大大小。Oracle需要这个参数来创建SGA(System Global Area),通常设置为数据库实例所需的总内存大小。 3. **共享内存段的数量(shmmni)...
- 分配适当的存储空间以避免磁盘空间不足的问题。 6. **创建应用系统对象属主用户 (ZYDB)**: - 创建新的数据库用户用于存储应用系统数据。 - 授予必要的权限,如创建表、视图等。 7. **导入数据到用户 ZYDB**...
- **内存分配策略**:根据系统总内存来设置SGA(System Global Area)和PGA(Program Global Area)的大小,以确保数据库高效运行。 7. **环境变量设置**: - **编辑`/etc/profile.d/oracle.sh`**:定义如`ORACLE...
确保参数设置符合你的业务需求,例如内存分配、表空间大小等。 ### 7. **用户和权限管理** Oracle数据库需要特定的用户和权限来运行和服务。创建`oracle`用户和`dba`组,并赋予相应的文件和目录权限。 ### 8. **...
- 监控系统资源使用情况,调整SGA和PGA内存分配。 12. **备份与恢复策略**: - 设计合理的备份计划,使用RMAN(Recovery Manager)进行数据库备份。 - 测试备份恢复流程,确保数据安全性。 以上就是在SUSE ...
Oracle运行需要调整一些内核参数,例如最大打开文件数(`ulimit -n`)、共享内存段大小(`kernel.shmmax`)、最大进程数等。 7. **安装Oracle 9i**: 使用提供的安装介质启动安装程序,按照提示选择“高级安装”...
- **表空间管理**:优化表空间的分配和使用。 ##### 2.4 应用程序优化 - **连接池管理**:合理设置连接池大小,减少连接创建和释放的开销。 - **事务处理**:优化事务处理逻辑,减少锁等待时间。 ##### 2.5 硬件...
例如,`shmsys:shmmax` 设置为最大内存(这里设为2GB),`shmmni`、`shmseg` 和 `semsys:seminfo_semmns` 等用于控制共享内存和信号量的数量。这些参数的调整有助于优化Oracle数据库的性能。 2. **用户和组的创建**...
3. 用户与权限:创建一个名为`oracle`的用户,分配适当的文件系统权限,并将该用户添加到`dba`和`oinstall`组。 二、软件依赖 1. 安装必要的软件包:包括`binutils`, `gcc`, `kernel-headers`, `glibc-devel`, ` ...
- **资源分配**:设置SGA、PGA大小,根据应用程序类型(OLTP/OLAP)进行合理分配。 - **其他设置**:如字符集、数据块大小、最大进程数等。 **3.3 检查oracle实例是否安装成功** - **检查方法**:使用SQL*Plus或其他...
- **性能调优**:根据系统负载和应用需求,调整初始化参数文件,如SGA大小、PGA大小等。 9. **测试与维护**: - **测试连接**:确保从客户端能够成功连接到数据库并执行查询。 - **备份与恢复**:建立定期备份...
- 根据实际负载调整数据库参数,如PGA、SGA大小、归档模式等。 11. **维护和监控**: - 定期备份数据库,以防止数据丢失。 - 监控数据库性能,使用`gdb`, `top`, `iostat`等工具进行性能分析。 这个过程涉及的...
此外,扩大内存后配置Hugepages但SGA未有效利用或出现内存不足错误(ORA-27102),需检查`limits.conf`中的`memlock`、`kernel.shmmax`和`shmall`参数。 2. **网络风险**:网络通信问题可能导致IP包重组失败,而...