优化Oracle数据库以实现更快的启动(闪回)

9
我正在使用Oracle数据库11.2版本。 我经常执行FLASHBACK DATABASE操作。 似乎FLASHBACK DATABASE循环会重启数据库实例,这在我的设置中大约需要7秒钟。
该数据库很小(~1 GB表空间),所有文件应该都在I/O缓存/缓冲区中。 因此,我认为瓶颈不是基于I/O的。
我正在寻求调优建议,以节省用户时间和/或CPU时间来执行闪回操作。
更新: 闪回序列(每个步骤的时间)如下:
1. Get SYSDBA connection with prelim_auth=true [15 ms]

2. SHUTDOWN ABORT; [1034 ms]

3. STARTUP (unrestricted) [1241 ms]

4. Close SYSDBA connection [2 ms]

5. Get SYSDBA connection with prelim_auth=false [18 ms]

6. ALTER DATABASE MOUNT [4073 ms]

7. FLASHBACK DATABASE TO RESTORE POINT <restore_point_name> [306 ms]

8. ALTER DATABASE OPEN RESETLOGS [1652 ms]

9. CLOSE SYSDBA connection [2 ms]

2
7秒听起来非常快 - 这个时间是否包含了所有步骤?列出每个步骤及其持续时间可能会有所帮助。例如,在我的小型系统上:shutdown immediate(29秒), startup mount(28秒), flashback database to timestamp systimestamp - interval '5' minute;(2秒), alter database open resetlogs(5秒)。总共为64秒,不包括输入命令的时间。 - Jon Heller
你是否考虑过采用不同的方法来完成你正在进行的工作,而不需要闪回整个数据库;例如对特定的表执行多个“flashback table”命令,这不需要重启数据库? - Mark Stewart
你能描述一下需要频繁刷新数据库的场景吗? - cdub
您是手动输入或复制/粘贴这些步骤吗?如果是,您可以用“STARTUP FORCE MOUNT”代替步骤2-6,从而节省一些时间。 - cdub
2
这个时间非常棒,我认为。对于自动化测试,我们在Java端使用内存数据库(H2)来提高速度。如果你真的需要用Oracle,我认为多个模式可能是一个很好的替代方案,如果必要的话可以同时重置多个模式。如果必要的话,您也可以在同一台机器上运行多个Oracle实例,并通过监听器在它们之间切换。 我不知道有什么方法可以加快当前系统的速度。 - Hash
显示剩余5条评论
3个回答

1
  1. 启动

    a. 实现大页面(hugepages)

    b. 将 statistics_level 设置为 basic

  2. 挂载

    a. 只使用一个控制文件。不要多路复用。

    b. 最小化数据文件和临时文件的数量。使用 bigfile 表空间。

    c. 从跟踪文件重新创建控制文件。省略非关键项目。

  3. 重置日志

    a. 每个重做日志组只使用一个日志文件。不要多路复用。

    b. 只创建2个重做日志组。

    c. 最小化每个重做日志的大小。

尽管这些选项会影响可靠性和可管理性。


0

您的大部分响应时间都花费在与I/O相关的操作上:

访问控制文件:ALTER DATABASE MOUNT [4073毫秒]

重置重做日志:ALTER DATABASE OPEN RESETLOGS [1652毫秒]

尝试将控制文件和重做日志文件放置在非常快的存储器上,例如基于NVMe的SSD。

此外,您有多少个重做日志文件和日志文件组?减少它们也会有所帮助-如果您可以允许的话。


完整的数据库存储在ramdisk中。正如评论中所提到的,该操作主要受CPU限制,因为在ramdisk上I/O几乎没有成本。顺便说一句,Oracle 19在同一台机器上的时间略有增加。 - MRalwasser

0

您可以使用存储快照。在这种情况下,在t0时刻拍摄一个快照。进行操作后,一旦您准备回滚,请停止数据库并将t0快照挂载为数据文件。这应该与在t0时启动数据库所需的时间相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接