Oracle 自治数据库的思考

时间:2023-01-03 11:05:27

数据库的名词越来越多,比如NewSQL、HATP、分布式、云原生、自治等,一不留神就发现不了解的新物种,难道是自己OUT了?

什么是自治数据库(Autonomous Database),一种新型的数据库?还是一种新的数据库技术?

实际上我理解自治数据库只是一个概念,他的目的主要是最大程度降低DBA运维工作量,减少人为误操作,同时又能提高数据库性能和安全性。

数据库的运维场景有很多,安装部署、性能优化、故障处理、监控、备份、恢复、迁移、补丁维护等。

如果说你的数据库可以实现这些所有运维场景的自治管理,即故障的自动发现,自动处理、性能问题的自动优化、危险操作的自动备份、

数据丢失后的自动恢复、补丁自动更新等,那么理论上也可以称为自治数据库。

而不是说某个数据库产品某一个模块加入了自动化功能,就可以称为自治数据库。

下面先看看甲骨文官网对自治数据库的一些介绍:

自治数据库的定义:

自治数据库是一种采用了机器学习技术,可自动执行数据库调优、保护、备份和更新以及其他传统上由 DBA 执行的常规管理任务的云数据库,

与传统数据库不同,它无需人工干预就能执行所有这些以及更多其他任务。

为什么要使用自治数据库?

数据库存储着重要的业务信息,对现代组织的有效运作至关重要。

然而在现实中,数据库管理员 (DBA) 常常需要耗费大量时间和精力来手动管理和维护数据库,非常容易出错,给数据库正常运行时间、

性能和安全性带来灾难性影响。

例如,未及时、正确地打补丁和安装安全更新可能导致数据库漏洞,削弱甚至造成数据库保护措施完全失效,

进而使企业面临严重的数据泄露风险,遭受严重的财务影响和商誉损失。

此外,随着业务应用不断将新记录添加到现有数据库,使用数据库信息创建报告、分析趋势和探测异常,

数据库会迅速增长到 TB 级规模,变得高度复杂,导致 DBA 难以有效进行管理、保护和调优,发挥数据库的最佳性能。

而一旦数据库运行缓慢或不可用,员工生产力就将受到影响,客户也会感到沮丧和失望。

面对加速增长的数据规模,企业需要高效、安全地管理数据库,增强数据安全性,降低停机时间, 提高数据库性能和消除人为错误。

而选择自治数据库,您可以轻松做到这一切。

自治数据库的工作原理:

自治数据库充分利用 AI 和机器学习技术,支持全面、端到端的自动化供应、安全性、更新、可用性、性能、变更管理和防错。

在这一意义上,自治数据库具有以下特征。

自治驾驶:

自治数据库可自动化管理、监视和调优所有数据库和基础设施。

这意味着,DBA 可以专注于更加重要的任务,包括数据聚合、建模、处理、治理策略,以及帮助开发人员使用数据库内特性和功能,

而尽可能减少对应用代码的更改。

自治安全:

自治数据库内置专业的安全性功能,可有效防范 外部攻击和内部恶意用户访问,避免因未打补丁或执行数据库加密而遭到网络攻击。

自治修复:

自治数据库可防止计划外维护等原因导致停机。

据统计,自治数据库每个月包括打补丁在内的停机时间不超过 2.5 分钟。

自治数据库的优势:

自治数据库可提供以下多种优势:

1.尽可能提高数据库正常运行时间、性能和安全性 — 包括自动修补和修复。

2.通过自动化技术消除易于出错的手动管理任务。

3.自动执行日常任务,降低成本,提高工作效率。

此外,自治数据库管理员还可以专注处理具有更高业务价值的的工作,例如数据建模,为程序员提供数据架构支持,以及规划未来容量等。

企业则可以缩减 DBA 团队,或抽调 DBA 去从事更具战略性的任务,从而节省成本和资金。

智能技术驱动自治数据库:

智能技术可驱动自治数据库自动化处理各种虽繁琐但又极其重要的任务,包括日常维护、扩展、安全性和数据库调优等。

比方说,自治数据库的机器学习和人工智能算法可以优化查询并自动管理内存和存储,是一个完全自调优的数据库。

在自治数据库中,机器学习算法可以分析大量数据记录,标记异常值和异常模式,帮助企业提高安全性,防范入侵者破坏。

机器学习还可以在系统运行的同时自动、连续地对系统进行打补丁、调整、备份和升级,而无需人工干预。

这将尽可能减少人为错误或恶意行为,确保数据库高效运行、安全无失。

此外,自治数据库还具有以下特性:

轻松伸缩:

基于云的数据库服务器支持即时按需伸缩计算和内存资源。例如,企业可以在每个季度末将计算核心从 8 个扩展到 16 个以满足峰值处理需求,

然后在处理结束后将计算核心缩减到 8 个以降低成本。事实上,您甚至可以在周末关闭所有计算资源,然后在周一早上重新启动,

进一步降低成本。

无缝数据库打补丁:

大部分数据泄露是未及时安装安全或漏洞补丁,未及时修补系统漏洞导致的。对此,自治数据库可以自动按顺序滚动安装云服务器补丁,

有效解决这一问题,避免业务停摆。

集成智能:

自治数据库集成了基于机器学习和人工智能的监视、管理和分析功能,其目标是实现数据库调优自动化,防止应用中断,

并加强整个数据库应用的安全性。

如何选择自治数据库?

自治数据库可提供多种优势。在选择自治数据库产品时,请关注以下关键特性。

自动供应:

自动部署容错、高度可用的任务关键型数据库,同时无缝扩展数据库,提供服务器故障保护,在应用运行过程中以滚动方式应用更新。

自动配置:

自动配置数据库,针对特定工作负载进行优化。全面优化内存配置、数据格式和访问结构的一切要素,提高性能。

您只需加载数据即可开始使用。

自动索引:

自动监视工作负载并检测缺失的索引,加快应用运行。在实施之前验证每一个索引,确保其有效,同时使用机器学习从其自身错误中学习。

自动扩展:

根据工作负载需求自动扩展计算资源;所有扩展均可在应用运行过程中在线上完成;支持真正的按用量付费。

自动数据保护:

通过统一的管理控制台自动保护数据库中的敏感数据和受监管数据;评估配置、用户、敏感数据和异常数据库活动的安全性。

自动安全:

自动对整个数据库、备份以及所有网络连接进行加密;无需访问操作系统或管理员特权即可阻止网络钓鱼攻击;

有效防范云操作和所有内部恶意用户访问。

自动备份:

自动按日或按需备份数据库;可将数据库还原或恢复到您指定的过去 60 天内的任意时间点。

自动打补丁:

自动、零停机地打补丁或升级。修补操作将在集群节点或服务器之间循环进行,同时应用将保持不间断运行。

自动检测和处理:

通过模式识别自动预测硬件故障,避免长时间停机。IO 会立即重定向,绕开非正常运行的设备,从而避免数据库挂起。

持续监视各个数据库,针对任意偏差自动生成服务请求。

自动故障切换:

自动故障切换至备用数据库,确保零数据丢失;对最终用户应用完全透明;SLA 高达 99.995%。

自治数据库基础部分应该包括:

Oracle Database Enterprise Edition、Exadata Database Machine、Oracle Cloud Infrastructure。

Autonomous Database整合并许多Oracle独有的高级数据库技术,包括:

1.支持scale-out、failover和online patching等功能的RAC(Real Application Clusters)。

2.在线的操作系统变更。

3.支持数据库感知灾难恢复的ADG(Active Data Guard)。

4.提供的高性能的n-MemoryI。

5.用于数据保护的透明数据库加密。

6.用于角色分离的Database Vault。

对于Oracle数据库,有哪些可以称为自治的功能呢?

下面简单列出结果功能示例:

一:间隔分区表(INTERVAL)

马上跨年了,你的分区表已经创建了明年的分区吗,不想在假期收到ORA-14400错误吧,间隔分区实现了分区的自动创建。

间隔分区是Oracle 11.1引入的新功能,通过该功能,可以在输入相应分区的数据时自动创建相应的分区。

在没有间隔分区技术之前,DBA通常会创建一个maxvalue分区以避免数据查出分区边界而无法插入的ORA-14400问题。

有了间隔分区表以后,作为范围分区(range partition)的扩展,

间隔分区命令数据库在插入表中的数据超过所有现有范围分区时自动创建指定间隔的分区。

示例:

--创建按年分区表

SQL>  conn cjc/a
SQL>  
CREATE TABLE interval_cjc_01
(
  id         NUMBER,
  time       DATE    
)
PARTITION BY RANGE(time)
INTERVAL (NUMTOYMINTERVAL(1,'year'))
(
  PARTITION partition2021 VALUES LESS THAN(to_date('2022-01-01:00:00:00','yyyy-mm-dd hh24:mi:ss')),
  PARTITION partition2022 VALUES LESS THAN(to_date('2023-01-01:00:00:00','yyyy-mm-dd hh24:mi:ss'))
);

插入数据:插入了查过分区最大值的数据,并没有收到ORA-14400错误,可以正常插入数据。

insert into interval_cjc_01 values (1, to_date('2015','YYYY'));
insert into interval_cjc_01 values (2, to_date('2022','YYYY'));
insert into interval_cjc_01 values (3, to_date('2023','YYYY'));
insert into interval_cjc_01 values (4, to_date('2024','YYYY'));
insert into interval_cjc_01 values (5, to_date('2025','YYYY'));
commit;

查询数据

SQL> 
set line 300
col table_owner for a5
col table_name for a15
col partition_name for a15
col tablespace_name for a10
col interval for a10
col high_value for a30
set pagesize 100
select  table_owner,table_name,partition_name,high_value,tablespace_name,interval from dba_tab_partitions where lower(table_name) = 'interval_cjc_01';

超过最大分区的数据,会存储在自动创建的分区里

TABLE TABLE_NAME      PARTITION_NAME  HIGH_VALUE     TABLESPACE INTERVAL
----- --------------- --------------- ------------------------------ ---------- ----------
CJC   INTERVAL_CJC_01 PARTITION2021   TO_DATE(' 2022-01-01 00:00:00' CJCTBSNO
      , 'SYYYY-MM-DD HH24:MI:SS', 'N
      LS_CALENDAR=GREGORIA
CJC   INTERVAL_CJC_01 PARTITION2022   TO_DATE(' 2023-01-01 00:00:00' CJCTBSNO
      , 'SYYYY-MM-DD HH24:MI:SS', 'N
      LS_CALENDAR=GREGORIA
CJC   INTERVAL_CJC_01 SYS_P61      TO_DATE(' 2024-01-01 00:00:00' CJCTBSYES
      , 'SYYYY-MM-DD HH24:MI:SS', 'N
      LS_CALENDAR=GREGORIA
CJC   INTERVAL_CJC_01 SYS_P62      TO_DATE(' 2025-01-01 00:00:00' CJCTBSYES
      , 'SYYYY-MM-DD HH24:MI:SS', 'N
      LS_CALENDAR=GREGORIA
CJC   INTERVAL_CJC_01 SYS_P63      TO_DATE(' 2026-01-01 00:00:00' CJCTBSYES
      , 'SYYYY-MM-DD HH24:MI:SS', 'N
      LS_CALENDAR=GREGORIA

其中:INTERVAL = 'YES'代表自动创建的分区

二:查询转换

SQL写法有问题,性能差怎么办,每个写SQL的人员必须是SQL大师吗,查询转换技术一定程度上减少了类似问题的发生,

他可以自动将性能差的SQL进行优化改写,提供效率。

or expansion、View Merging、Predicate Pushing、Subquery Unnesting

以or expansion为例:

考虑是否将谓词的or条件转换为union all ,即,执行 or expansion。

例如:

原始SQL:

SELECT   *
   FROM  employees e ,  departments d
  WHERE   ( e.email =   'SSTILES'   OR  d.department_name =   'Treasury' )
    AND  e.department_id =  d.department_id ;

优化器可能会将上面的原始SQL自动改写成如下SQL 。

SELECT   *
   FROM  employees e ,  departments d
  WHERE  e.email =   'SSTILES'
    AND  e.department_id =  d.department_id
UNION   ALL
SELECT   *
   FROM  employees e ,  departments d
  WHERE  d.department_name =   'Treasury'
    AND  e.department_id =  d.department_id ;

三:自适应游标共享

为了减少硬解析,使用了绑定变量,又由于数据存在倾斜,每次谓词不同确使用同一个执行计划,经常会遇到性能问题。

Adaptive Cursor Sharing,简称ACS,是Oracle 11g引入的新特性。

目的是为了解决具有绑定变量的sql当相关列数据分布倾斜时不能根据绑定值生成恰当的执行计划的问题。

绑定变量使Oracle可以为多条SQL语句共享单个游标,以减少分析SQL语句所使用的共享内存量,减少硬解析。

为了提高生成执行计划的准确性,Oracle9i 还引入了绑定扫视(Bind Peek)概念。

使用绑定扫视,优化器会在首次执行语句时查看绑定值。

然后使用这些值来确定一个执行计划,语句的所有其它执行均共享该执行计划。

但这并不适用于列数据有倾斜的场景,在数据有倾斜时,谓词选择不同的值可能需要不同的执行计划,如果完全共享同一个执行计划,

可能会出现性能问题。

所以11g,引入了自适应游标共享,一定程度上解决这个问题。

此功能是一项更复杂的策略,它并不会盲目地共享游标,如果与分析时间和内存使用量开销相比,使用多个执行计划所带来的收益更重要,

则会为使用绑定变量的每条SQL 语句生成多个执行计划。

然而,由于使用绑定变量的目的是共享内存中的游标,因此对于需要生成的子游标数目必须采取一种折衷的方法。

Adaptive Cursor Sharing 作用如下:

通过自适应游标共享,可以仅针对使用绑定变量的语句智能地共享游标。

自适应游标共享用于协调游标共享和优化之间的矛盾。

自适应游标共享具有如下优点:

1.自动检测不同执行受益于不同执行计划的时间

2.将生成的子游标数限制到最小

四:内存自动管理

Oracle数据库内存结构有很多,SHARED_POOL_SIZE、LARGE_POOL_SIZE、JAVA_POOL_SIZE、STREAMS_POOL_SIZE等,

这些内存结构在手动调节时比较麻烦,需要人为干预的场景太多。

Oracle 10g引入了ASMM,全称utomatic Shared Memory Management,

不再需要手工设置相关内存组件的大小,而只为SGA设置一个总的大小,Oracle的MMAN进程会随着时间推移,

根据系统负载的变化和内存需要,自动调整SGA中各个组件的内存大小。

在Oracle 11g中,Oracle引入了AMM的概念,全称Automatic Memory Management,实现了全部内存的自动管理。

DBA可以仅仅通过设置一个目标内存大小的初始化参数(MEMORY_TARGET)和可选最大内存大小初始化参数

(MEMORY_MAX_TARGET)就可以在大多数平台上实现AMM。

AMM可以使实例总内存保持相对稳定的状态,Oracle基于MEMORY_TARGET的值来自动调整SGA和PGA的大小。

MEMORY_TARGET是动态初始化参数,可以随时修改该参数的值而不用重启数据库。

MEMORY_MAX_TARGET作为一个内存上限值,是一个静态参数,它是MEMORY_TARGET可以被配置的最大值。

如果内存发生变化,实例会自动在SGA和PGA之间做调整。

五:自动索引

索引的维护,对于DBA来讲是一块比较大的工作量,数据量的变化、查询语句谓词条件的变化、业务逻辑的变化都可能需要对索引进行维护。

Automatic indexing

自动索引是什么:

自动索引功能是oracle 19c新增加的特性,可自动执行Oracle数据库中的索引管理任务。

根据应用程序工作负载的变化动态在数据库中创建、重构和删除索引,从而提高数据库性能。

对于使用大型数据集并每天运行数百万条SQL语句的OLTP应用程序,索引至关重要。

如果在应用程序工作负载发生变化时不更新索引,则现有索引可能会导致数据库性能大大下降。

自动索引通过基于应用程序工作负载的变化在Oracle数据库中动态地管理索引来提高数据库性能。

限制:

Automatic indexing特性对于on-prem环境仅支持Oracle Exadata平台,对于Oracle Cloud各个Cloud Edition都支持。

自动索引可以做什么

1、以预定义的时间间隔在后台定期运行自动索引过程。

2、分析应用程序工作负载,并相应地创建新索引并删除现有的性能欠佳的索引,以提高数据库性能。

3、重建由于表分区维护操作(例如ALTER TABLE MOVE)而标记为不可用的索引。

4、提供PL / SQL API,用于在数据库中配置自动索引并生成与自动索引操作相关的报告。

自动索引的工作原理:

自动索引模拟人工索引思路,基于手动SQL调优的常用方法,构建了内置的专家系统。

数据库内置的算法通过自动捕获SQL(Capture)、识别候选索引(Identify Candidates)、验证(Verify)、决策(Decide)、

在线确认(Online Validation)、监控(Monitor)等方法实现了索引的自动化管理。

1、捕获:定期的捕获SQL历史进SQL仓库,包括SQL的文本、执行计划、绑定变量,执行统计信息等。

2、识别候选索引:根据SQL语句中表列的使用来识别自动索引候选项。

3、验证:验证优化器对于后期捕捉的SQL是否会使用新创建的索引, 如果这个索引可以提升SQL的性能,就会物化该索引。

4、决策:如果使用这些索引提高了SQL语句的性能,则将这些索引配置为可见索引,可以在SQL语句中使用它们。

如果使用这些索引不能提高SQL语句的性能,则将这些索引配置为不可用的索引,并将SQL语句列入黑名单。

5、在线确认:为其它SQL在线确认新索引的使用情况,开始只允许一个会话使用一个SQL命令使用该索引,这样出问题也不会是大面积。

6、监控:对于自动索引提供连续不断的监控,对于自动创建而长时间不使用的索引会自动删除。

六:Oracle 透明应用故障转移

全称Transparent Application Failover,检查TAF。

当初始化连接出现问题无法连接时,该功能可以保证应用程序重新连接到可用服务。

11g中默认的scan-ip的实现其实还是默认没有failover的选项,如果两个节点,某个节点挂了,

那么原有的连接中继续查询就会提示session已经断开,需要重连。

例如:按此条件将会查询出10000条记录。

select id,sal from t1 where name='CJC';

当RAC中的节点1正在执行此SQL,并已经查询出9000条记录,此时如果节点1故障,客户端会返回一个错误,

之后客户端重新发起查询,这时查询语句会在另一个节点上重新执行。

这将导致两个错误,一个是查询时间变长,第二是查询出现了错误,必须重新发起查询。

如果配置了TAF,可以实现,节点1故障后,客户端没有返回错误,查询请求会自动跑到另一个节点,

继续将剩余的1000条数据查询出来,并正常返回给客户端。

当然中间会有一些上下文环境的切换,对于用户是透明,但是会有一定的延时。

客户端tnsnames.ora配置:

......

 (FAILOVER_MODE =
       (TYPE = SELECT)
       (METHOD = BASIC)

......

总结:

可以看到,真正意义上的自治数据库,并不是实现某一个功能就可以,而是多个自治功能的集合,至少需要覆盖大多的数据库运维场景。

当然,文中只是列举了数据库基础软件的自治,涉及数据库基础设施、云环境的自治等本次不做讨论。

Oracle 自治数据库的思考

Oracle 自治数据库的思考

参考:

what-is-autonomous-database/?bcid=5767063929001

https://www.cnblogs.com/lijiaman/p/11872845.html
https://mp.weixin.qq.com/s?__biz=MjM5MjYxNDcyNA==&mid=2650711406&idx=2&sn=682483d85d96c1ca95faeb8046bad431&chksm=bea9954589de1c532af7e986b38f9daaa93d09e2fe22efc7d4b3e56ebce7f9f198596d0ff222&scene=27