自动共享管理内存 ASMM
从 Oracle 10g 开始,Oracle 提供了自动 SGA 的管理(简称 ASMM,Automatic Shared Memory Management)新特性。不再需要手工设置若干内存池的大小,而是为 SGA 设置一个总的大小尺寸即可。
原理:Oracle 新引入了一个名为 MMAN(Memory Manager)的后台进程。每隔很短的一段时间,MMAN 进程就会启动,然后去询问一下 Oracle 提供的各个内存组件顾问,由这些顾问根据当前的负载情况,将可以自动调整的内存池建议的大小尺寸,返回给 MMAN。
MEMORY_TARGET
参数定义了整个 SGA 的总容量,不能超过MEMORY_MAX_TARGET
。
statistics_level
必须设置为 typical 或 all 才能启动ASMM,否则如果设置为 basic,则关闭 ASMM。
参数大小设置如下:
关机指令
-
SHUTDOWN NORMAL(普通关闭)
- 如果没有指定任何模式,则默认使用NORMAL模式。
- 在此模式下,Oracle服务器在完成关闭之前会等待所有用户断开连接。
- 数据库高速缓冲区缓存和重做日志缓冲区被写入磁盘。
- 终止后台进程,并从内存中删除SGA(系统全局区)。
- 在关闭实例之前,Oracle服务器会关闭并卸除数据库。
-
SHUTDOWN IMMEDIATE(立即关闭)
- 使用此命令时,Oracle服务器不等待当前连接到数据库的用户直接断开连接。
- Oracle服务器会回滚活动事务并断开所有已连接用户的连接。
- 在关闭实例之前,Oracle服务器会关闭并卸除数据库。
-
SHUTDOWN TRANSACTIONAL(事务保证关闭)
- 在此模式下关闭可防止客户端丢失数据,包括其当前活动会话的结果。
- 没有客户端可以在此实例上启动新事务。
- 当客户端结束正在进行的事务时,客户端将断开连接。
- 完成所有事务后,将立即关闭。
-
SHUTDOWN ABORT(强制终止/强制关闭)
- 在某些紧急情况下,如果其他关闭模式均无效,可以使用此命令。
- Oracle服务器正在处理的当前SQL语句将立即终止。
- Oracle服务器不等待当前连接到数据库的用户直接断开连接。
- 数据库高速缓冲区缓存和重做缓冲区未写入磁盘。
- 未提交的事务不会回滚。
- 该实例将终止而不关闭文件。
- 数据库未关闭或卸载
scope参数
SCOPE
参数在Oracle数据库中用于控制ALTER SYSTEM
命令对数据库参数修改的生效范围和时机,总共有三个值:BOTH、MEMORY,SPFILE。
- MEMORY:仅对当前实例的内存中的参数值进行修改,不改变服务器参数文件(SPFILE)中的值,修改立即生效,但只持续到数据库实例关闭。
- SPFILE:仅对服务器参数文件(SPFILE)中的参数值进行修改,不改变当前实例的内存中的值。修改不会立即生效,而是在数据库实例下一次启动时生效。
- BOTH:同时修改当前实例的内存中的参数值和服务器参数文件(SPFILE)中的值。修改立即生效(针对内存中的值),并且在数据库实例下一次启动时仍然有效(因为SPFILE中的值也被修改了)。
ASM实现高可用的方式
ASM(Automatic Storage Management,自动存储管理)是Oracle推荐的一种智能化数据库文件存储管理方式,它通过自动管理磁盘组来平衡I/O负载,提高数据的可靠性和可用性。
ASM提供三种镜像类型来实现数据冗余:
- 外部冗余(External Redundancy):没有镜像的一种冗余方式,即在磁盘组中没有故障组。这种方式下,Oracle不管理镜像,镜像功能由外部存储系统实现(如RAID技术)。
- 常规冗余(Normal Redundancy):要求磁盘组具有两个故障组,每个故障组一个磁盘控制器。这种方式下,Oracle提供两份镜像来保护数据,有效磁盘空间是所有磁盘设备大小之和的1/2。
- 高冗余(High Redundancy):要求磁盘组具有三个故障组,每个故障组一个磁盘控制器。这种方式下,Oracle提供三份镜像来保护数据,以提高性能和数据的安全性。有效磁盘空间是所有磁盘设备大小之和的1/3。
block_size对应最大的表空间大小
Oracle的Rowid使用22位来代表数据块号,因此Oracle表空间数据文件每个数据文件最多只能包含2^22个数据块。 也因此数据库表空间的数据文件不是无限增长的,例如:
登DBA用户,查询当前ORACEL数据库数据库的大小:
SQL> select name,value from v$parameter where name = 'db_block_size';
NAME VALUE
------------------------------ --------------------
db_block_size 8192
在数据块为8k的情况下,单个数据文件的最大容量为8K*2^22 = 32G。
因此,有的表空间扩容不能直接resize,需要去添加新的数据文件到表空间中,例如:
ALTER TABLESPACE TAB_CC ADD DATAFILE '/oradata/test2.dbf' SIZE 10G;
Oracle几种启动状态
1、startup nomount;
非安装启动,数据库实例已经启动,但并未加载任何数据库文件,因此不能访问数据库中的数据。此阶段通常用于新建数据库、修复控制文件等场景。
-
启动实例:数据库实例开始运行,但此时并不加载数据库文件。
-
初始化SGA:系统全局区(SGA)被初始化,分配内存结构供实例使用。SGA包括数据库缓冲区缓存、日志缓冲区、共享池等关键内存结构。
-
启动后台进程:启动一系列必需的后台进程,如PMON(进程监控器)、SMON(系统监控器)、DBWn(数据库写入器)、LGWR(日志写入器)和CKPT(检查点进程)等,这些进程负责数据库的运行和维护。
-
读取初始化文件:读取并解析初始化文件(如init.ora或spfile),该文件包含数据库启动和运行所需的配置参数。
-
打开警告日志和跟踪文件:启动过程中,相关的警告日志和跟踪文件被打开,用于记录数据库的运行状态和错误信息。
2、startup mount (dbname);
安装启动,这种模式将启动实例,加载数据库并保持数据库关闭状态。这种方式启动下可执行:数据库日志归档、数据库介质恢复、使数据文件联机或脱机、重新定位数据文件、重做日志文件。
此时我们可以查看数据字典,因为控制文件已经打开;不能访问数据库的数据文件(表,视图),此时数据文件没有打开。
改变归档模式
archive log list;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE NOARCHIVELOG;
暂停和重开数据库
ALTER SYSTEM SUSPEND;
ALTER SYSTEM RESUME;
(接上)
- 打开控制文件:控制文件是Oracle数据库的关键文件之一,它包含了数据库的物理结构信息,如数据文件、重做日志文件的位置和状态等。在MOUNT阶段,数据库会打开控制文件,并读取其中的信息,以确认数据文件和联机日志文件的位置和状态。但此时不会对数据文件和日志文件进行实际的读写操作。
- 准备数据访问:虽然MOUNT阶段不会直接打开数据文件,但数据库会确保控制文件中记录的数据文件和日志文件的位置是有效的,并准备在后续的OPEN阶段中打开这些文件。
- 记录日志信息:如实例启动的详细信息、控制文件的打开情况等。这些日志信息对于数据库的故障排查和恢复非常重要。
3、startup open (dbname);
ALTER DATABASE OPEN
:从mount或nomount状态切换到open
STARTUP
:先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件,这种方式下可访问数据库中的数据。
startup 等于以下三个命令
startup nomount;
alter database mount;
alter database open;
查看oracle 启动状态:
select status from v$instance; (showdown | nomount | mount | open)
Oracle索引类型
- b-tree索引 Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。CREATE INDEX语句时,默认就是在创建b-tree索引。没有特别规定可用于任何情况。
- 位图索引(bitmap index) 位图索引特定于该列只有几个枚举值的情况,比如性别字段,标示字段比如只有0和1的情况。
- 基于函数的索引 比如经常对某个字段做查询的时候是带函数操作的,那么此时建一个函数索引就有价值了。
- 分区索引和全局索引 这2个是用于分区表的时候。前者是分区内索引,后者是全表索引
- 反向索引(REVERSE) 这个索引不常见,但是特定情况特别有效,比如一个varchar(5)位字段(员工编号)含值 (10001,10002,10033,10005,10016..) 这种情况默认索引分布过于密集,不能利用好服务器的并行 但是反向之后10001,20001,33001,50001,61001就有了一个很好的分布,能高效的利用好并行运算。
- HASH索引 HASH索引可能是访问数据库中数据的最快方法,但它也有自身的缺点。集群键上不同值的数目必须在创建HASH集群之前就要知道。需要在创建HASH集群的时候指定这个值。使用HASH索引必须要使用HASH集群。