Exadata在V2时代,ORACLE为了进一步拓宽客户人群,除了宣称Exadata适用OLAP系统,同时也适用于OLTP系统,那怎么才能满足OLTP系统的高IOPS要求呢?于是Exadata引入了闪存卡,但当时的闪存卡一是价格昂贵,二是存储空间较小,才几十G的大小,如何充分利用这些闪存卡就成了一项艺术,最开始是将这些闪存卡创建成flashcache,但发现flashcache对数据文件的读取有非常大的帮助,此时日志文件写性能问题开始成为Exadata做为OLTP架构的障碍。
于是,从存储软件版本11.2.2.4开始,Exadata引入了Exadata Smart Flash Logging的新特性,该特性的主要优化思想是从存储节点的闪存卡中开辟出一小块区域作为redo log的辅助重做日志目的地,当接收到写redo log的请求时,Exadata允许LGWR进程将redo同时并行写入flash log 和 disk controller 中的在线日志文件, 只要在flash log 和 disk controller中的在线日志文件 有任意一个率先写完成就会通知RDBMS数据库继续工作, 该特性着眼于改善了Exadata对Redo写入的响应时间和吞吐量。
需要注意的是,flashlog并不是永久的redo日志存放目的地,它仅仅是一个临时的redo日志存放地,目的是为了提供快速的重做日志写的响应时间,以改善整个数据库的性能。Flashlog会一直存放着这些redo日志,直到这些redo日志被安全地写回到了在线日志文件中。
如下图所示,Smart Flash Logging特性的工作原理:
一旦磁盘写入或闪存写入的完成更快,CELLSRV就会确认重做日志写入数据库完成,继续后续工作。
从Smart Flash Logging的工作原理可以看出,Smart Flash Logging特性可以防止偶尔缓慢的硬盘,或者偶尔缓慢的闪存盘给数据库带来的性能问题,但二者不能出现同时缓慢,但同时出现缓慢也是一个极其罕见的事件。如下图所示,为Smart Flash Logging特性关闭和开启的日志文件写性能响应对比。
(1)、在一组闪存磁盘中均匀分配(默认为512MB。在X2-2环境中,flashlog分布为16个闪存磁盘上的32MB块;而后期的X5-2,则flashlog是分布在4块闪存磁盘上)。
在默认情况下,会从flash闪存卡中分配512 MB的空间来做为Smart Flash Logging。相对于在每个Exadata存储节点 384 gb(注意:X2-2的每个存储节点闪存空间为384GB,而后面几代Exadata的闪存空间将会成倍或几十倍地增长)的闪存空间来说,这是一个微不足道的投入,但会对数据库带来巨大的性能提升。
CellCLI> ALTER IORMPLAN - dbPlan=( - (name=prod, flashcache=on, flashLog=on), - (name=dw, flashcache=on, flashLog=on), - (name=prod_test, flashcache=off, flashLog=off), - (name=prod_dev, flashcache=off, flashLog=off) - (name=other, flashcache=on, flashLog=on)) |
[root@sddxdb01 onecommand]# dcli -g ./cell_group -l root cellcli -e list flashlog attributes name,size,status sddxcel01: sddxcel01_FLASHLOG 512M normal sddxcel02: sddxcel02_FLASHLOG 512M normal sddxcel03: sddxcel03_FLASHLOG 512M normal [root@sddxdb01 onecommand]# |
[root@sddxcel01 ~]# cellcli -e drop flashlog all Flash log sddxcel01_FLASHLOG successfully dropped [root@sddxcel01 ~]# [root@sddxdb01 onecommand]# dcli -g ./cell_group -l root cellcli -e list flashlog attributes name,size,status sddxcel02: sddxcel02_FLASHLOG 512M normal sddxcel03: sddxcel03_FLASHLOG 512M normal [root@sddxdb01 onecommand]# |
--如果打算创建flashcache和flashlog,则必须先创建flashlog,然后再创建flashcache。如果先创建flashcache,则会将全部空间使用光。
[root@sddxcel01 ~]# cellcli -e create flashlog all Flash log sddxcel01_FLASHLOG successfully created [root@sddxcel01 ~]# [root@sddxcel01 ~]# cellcli -e create flashcache all Flash cache sddxcel01_FLASHCACHE successfully created |
[root@dm02celadm01 ~]# cellcli -e list flashlog detail name: dm02celadm01_FLASHLOG cellDisk: FD_00_dm02celadm01,FD_01_dm02celadm01,FD_02_dm02celadm01,FD_03_dm02celadm01 creationTime: 2016-10-19T18:28:02+08:00 degradedCelldisks: effectiveSize: 512M efficiency: 99.99785580691346 id: ea422489-a82e-4fa7-877a-16b1c57ee63c size: 512M status: normal [root@dm02celadm01 ~]# |
[root@dm02celadm01 ~]# cellcli -e CREATE FLASHLOG ALL SIZE=1G |
Smart Flash Logging特性可以从存储软件层面,或从数据库层面进行关闭:
数据库版本从11.2.0.2BP9之后,就默认自动地开启了Smart Flash Logging特性,但可以通过修改数据库隐含参数的方式来手动关闭Smart Flash Logging特性:
Alter system set "_third_spare_parameter"=0 scope=spfile sid='*'; |
Alter system set "_enable_flash_logging"=false scope=spfile sid='*'; |
1、直接删除flashlog,但这种方式将导致整个Exadata上的所有数据库都无法使用Smart Flash Logging特性。
2、使用IORM来控制Smart Flash Logging特性的开启或关闭。
对于绝大部分的系统而言,强烈建议开启Smart Flash Logging特性,只有那种只读的数据库或测试数据库,才可以尝试关闭Smart Flash Logging特性。