search 2013 adfgs

在 2017 DTCC – 数据库大会的现场,老朋友盖总的公司发布了『Oracle Database 12.2 体系结构图』,该体系结构图,几乎涵盖了 Oracle 最新的 12.2 的所有技术细节和新的特点。

体系结构图中尤其对 Oracle 12cR2中的众多新特性,比如多租户、In-Memory、Sharding,还有Recovery Buddy和LMS等,尽皆涵盖。

废话不多说,请赏图!

 

1920x1080dpi

 

最后,大家如果想要下载高清图,可以关注他们微信公众号“数据和云”去获取。

创建MySQL Cloud Service时,会要求提供一个SSH登录密钥,所有的Oracle云服务主机登录用户都是opc,因此在服务创建完毕,收到通知邮件之后,就可以通过ssh登录到服务器上。

登录到主机以后,服务器显示了MySQL运行状态和存储使用量的提醒。

MySQL Cloud Service Host

这里介绍了 Oracle MySQL Cloud Service 提供的安全选件功能,如果我们用MySQL Workbench登录到数据库中,在Server Status页面可以看到:SSL连接,PAM验证,密码校验,数据库审计等多种安全功能全部是开启的。

Oracle RDS security

类比,阿里云的 MySQL RDS 并没有开启任何安全选项,或许是为了性能考虑?

Aliyun RDS security

Oracle对于数据库安全性的看重确实超越了大多数数据库提供商,而这也带来了一些小麻烦。

在创建MySQL云服务的时候,需要指定数据库root用户的密码,这个密码有比较强的安全要求,需要有大写、小写英文字母,有数字,同时还需要有特殊字符(比如#)。因此在后续创建Login Path时,在mysql_config_editor命令提示输入密码的时候,需要在密码前后加上双引号(比如”Passw#rd”),否则会一直出现拒绝访问的提示。

--opc用户没有办法直接登录MySQL,需要切换到oracle用户
[opc@mysql-cloud-mysql-1 ~]$ mysql -uroot -p
Please switch to "oracle" user to use mysql client
[opc@mysql-cloud-mysql-1 ~]$ sudo su - oracle
--使用密码直接登录是没有问题的
[oracle@mysql-cloud-mysql-1 ~]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1509246
Server version: 5.7.17-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit
Bye
--创建Login Path,仍然输入上述一样的密码
[oracle@mysql-cloud-mysql-1 ~]$ mysql_config_editor set --host=localhost --user=root --password
Enter password:
--检查确认Login Path已经创建成功
[oracle@mysql-cloud-mysql-1 ~]$ mysql_config_editor print --login-path=client
[client]
user = root
password = *****
host = localhost
--直接登录报错
[oracle@mysql-cloud-mysql-1 ~]$ mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
--在密码前后加上双引号重新创建Login Path
[oracle@mysql-cloud-mysql-1 ~]$ mysql_config_editor set --host=localhost --user=root --password
Enter password:
WARNING : 'client' path already exists and will be overwritten.
 Continue? (Press y|Y for Yes, any other key for No) : Y
--再次登录,成功
[oracle@mysql-cloud-mysql-1 ~]$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1510011
Server version: 5.7.17-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.7.17, for linux-glibc2.5 (x86_64) using  EditLine wrapper

Connection id:		1510011
Current database:
Current user:		root@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.7.17-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8mb4
Db     characterset:	utf8mb4
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/tmp/mysql.sock
Uptime:			10 days 13 hours 24 min 56 sec

Threads: 13  Questions: 50733146  Slow queries: 0  Opens: 6203  Flush tables: 1  Open tables: 4808  Queries per second avg: 55.610
--------------

在进行Audit功能的检查之前,对于默认的mysql命令行提示只有mysql> 这样简陋的显示不能忍,要加上当前登录的用户和数据库名称。在oracle用户的.my.cnf下增加以下行。

[mysql]
prompt=\\u@\\h [\\d]>\\_

再次登录,mysql命令行的提示就比较顺眼了。

[oracle@mysql-cloud-mysql-1 ~]$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1510385
Server version: 5.7.17-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

root@localhost [(none)]> show databases;
+-------------------------+
| Database                |
+-------------------------+
| information_schema      |
| mem                     |
| mem__advisor_text       |
| mem__advisors           |
| mem__bean_config        |
| mem__config             |
| mem__enterprise         |
| mem__events             |
| mem__instruments        |
| mem__instruments_config |
| mem__inventory          |
| mem__quan               |
| mysql                   |
| performance_schema      |
| sys                     |
| testdb                  |
+-------------------------+
16 rows in set (0.00 sec)

root@localhost [(none)]> use testdb
Database changed
root@localhost [testdb]> show tables;
Empty set (0.00 sec)

root@localhost [testdb]>

接下来进入本文的正题,在Oracle MySQL Cloud Service中默认是如何设置Audit的? 首先先检查一下audit_log的相关参数设置。

root@localhost [testdb]> show variables like 'audit_log_%';
+-----------------------------+--------------+
| Variable_name               | Value        |
+-----------------------------+--------------+
| audit_log_buffer_size       | 1048576      |
| audit_log_connection_policy | ALL          |
| audit_log_current_session   | ON           |
| audit_log_exclude_accounts  |              |
| audit_log_file              | audit.log    |
| audit_log_filter_id         | 0            |
| audit_log_flush             | OFF          |
| audit_log_format            | NEW          |
| audit_log_include_accounts  |              |
| audit_log_policy            | ALL          |
| audit_log_rotate_on_size    | 1073741824   |
| audit_log_statement_policy  | ERRORS       |
| audit_log_strategy          | ASYNCHRONOUS |
+-----------------------------+--------------+
13 rows in set (0.01 sec)

那么audit_log_file=audit.log表示仍然使用了默认的名字,到MySQL的数据文件目录中检查一下audit.log文件的存在。

[oracle@mysql-cloud-mysql-1 mysql]$ ls -l audit*
-rw-r----- 1 oracle oracle  838348830 Apr 21 13:42 audit.log
-rw-r----- 1 oracle oracle 1073742130 Apr 14 23:20 audit.log.14922120508218349.xml

这里可以看到总共的audit日志已经有1.9GB之大,在第一个audit.log达到audit_log_rotate_on_size参数设置的大小之后,自动切换成了新的audit.log。

题外话,之所以有这么巨大的audit.log,是由于启用了MySQL Enterprise Monitor,不断地记录了Monitor进程的登录和退出,为了方便后面观察audit.log,先将Monitor停止。

[oracle@mysql-cloud-mysql-1 monitor]$ pwd
/u01/bin/enterprise/monitor
[oracle@mysql-cloud-mysql-1 monitor]$ ./mysqlmonitorctl.sh stop
Stopping tomcat service . [ OK ]

接下来进行一些常规操作,并观察audit.log文件的输出内容。

1. 用root用户登录,在audit文件中显示一条Connect类型的记录。TIMESTAMP记录了时间,USER标签记录了登录的用户,HOST标签记录了登录的机器,COMMAND_CLASS为connect。

NewImage

2. 尝试直接CTAS一张测试表,在enforce_gtid_consistency=ON时会报1786错误,这是GTID特性决定的。

root@localhost [testdb]> create table mytables as select * from information_schema.tables;
ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.

在audit.log中也记录下了这次报错的操作,STATUS标签为错误代码1786,STATUS_CODE标签值为1表示这条SQL没有成功执行,SQLTEXT标签记录了整个SQL语句。

NewImage

3. 下面的三条语句,select,create table,insert均没有在audit.log中记录下来。

root@localhost [testdb]> select count(*) from information_schema.tables;
+----------+
| count(*) |
+----------+
|      591 |
+----------+
1 row in set (0.01 sec)

root@localhost [testdb]> create table mytables like information_schema.tables;
Query OK, 0 rows affected (0.10 sec)

root@localhost [testdb]> insert into mytables select * from information_schema.tables;
Query OK, 592 rows affected (1.94 sec)
Records: 592  Duplicates: 0  Warnings: 0

这样的行为是由audit_log_statement_policy=ERRORS参数决定的,默认只记录报错的SQL,而不会记录所有的执行语句。

4. 将audit_log_statement_policy参数修改为ALL,再执行同样的select语句。

root@localhost [testdb]> SET GLOBAL audit_log_statement_policy = ALL;
Query OK, 0 rows affected (0.00 sec)

root@localhost [testdb]> select count(*) from mytables;
+----------+
| count(*) |
+----------+
|      592 |
+----------+
1 row in set (0.00 sec)

可以发现audit.log中已经有记录了。

NewImage

结论:在Oracle MySQL Cloud Service中默认会启动MySQL Enterprise Audit组件,并且设置即记录用户登录又记录执行语句(audit_log_policy=ALL),用户登录情况则不管登录成功还是失败每次都记录(audit_log_connection_policy=ALL),而执行语句则只记录执行失败的语句(audit_log_statement_policy=ERRORS)。

感谢Kamus

首先盗用一下盖总这边的一张照片,哈哈!

11.png

2015年8月 Tom 大师归隐, Oracle RWP 团队几乎就暂停了外部公开亮相。不过,2017年3月28日,RWP 团队再次亮相在了ACOUG和Oracle公司的联合主办的Oracle 性能优化之旅的中国北京站,在北京广播大厦酒店为咱们国内的Oracle 技术人呈现了 6个小时的精彩内容!

作为Oracle届的大神级人物,Andrew 和 Graham 领导了 Oracle 公司数据库性能优化领域的顶尖团队。为全球Oracle用户分享了大量的优化方法级经验,包括Oracle Database软件本身,以及Oracle Database软件所运行的硬件环境和网络环境的优化。

国内Oracle大神盖总做了简单的开场之后,就是 Andrew和Graham的干货分享啦,第一个主体为OLTP的秘密。从OLTP系的内部机制,以及系统为什么会出现各类性能问题等等,再找到问题的根源,最终解决这些问题。

Graham从Oracle 数据库运行硬件环境的CPU的工作原理的角度做了剖析,在OLTP中,CPU繁忙对于系统意味着一切问题的开始,包括数据库响应时间分片等,这些都对于数据库优化有很大的影响。

这里饮用盖总的说法:“在RWP团队的优化策略中,他们一直遵循top-down的原则,努力从根源处解决问题,正如我们之前所说,数据库性能的问题绝大部分都可以归结为SQL的问题,SQL的问题来自于应用开发部门,而解决性能问题的却是运维人员,由于开发与运维目前仍不能携手同行的现状,Andrew感慨地对现场的开发人员说,你们的地位非常重要,因为你们在很大程度上决定了应用的效率。”

 

分享结束后的交流时间,演变成了与大神们的合影摩拜时间,这里我也凑个热闹把之前和三位国际大神以及咱国内的盖总大神的合影摆上来显摆下吧!

IMG_0991

 

Andrew 的风采:

 

33.png

 

 

最后,恩墨侯院长的风采,哈哈!

55.png

 

真的应该好好感谢 Andrew和Graham不远万里过来的授业解惑,给咱们这些技术人带来了不一样的优化视角!

这是 Oracle Sharding 介绍系列文章的最后一篇,前面总攻介绍了4篇:

  1. Oracle Sharding 介绍系列I(什么是Oracle Sharding)
  2. Oracle Sharding 介绍系列II(特性优势)
  3. Oracle Sharding 介绍系列 III(横向对比)
  4. Oracle Sharding 介绍系列 IV(技术实现)

这里我们再来看看 Oracle 官方文档还给我们介绍了哪些关于 Oracle Sharding 的信息呢?

首先看看, Oracle 云服务上支持Oracle Sharding吗?

Oracle数据库云服务(PaaS)目前不提供用于部署分片数据库的整体自动化,但可以使用Oracle数据库云服务自动部署Oracle Sharding将会在2017年被列入计划,计划支持混合云和全部云部署模型,以及单数据中心和多数据中心部署。

然后,Oracle Sharded数据库可以使用cookbook部署在Oracle Cloud(DBCS实例)上。

问:如何为Oracle Cloud(PaaS)授权Oracle Sharding?

答:使用DBCS EE和DBCS EE高性能(HP),仅限使用三个主分片。 (待机分片数量没有限制);使用DBCS EE极端性能(EP)和Exadata云服务(ECS),对主分片或备用分片数量没有限制。

真实场景下Oracle Sharding的优势比较和选择:
1、Oracle Sharding与Microsoft

Azure弹性数据库的比较 Microsoft提供了一个分片式数据库架构,具有与Oracle Sharding相同的许多目标,其产品是仅限云上部署的,称为Azure弹性数据库。 Oracle Sharding与Microsoft Azure相比有很多优势:

  1. Microsoft Azure将碎片作为外部表并对其协调器节点执行所有查询处理来处理多碎片查询。这种设计导致系统难以扩展并且需要在分片和协调器节点之间进行大量的网络数据移动。相比之下,Oracle Sharding多分片查询被下推到每个分片,从而提高性能并减少网络上传输的数据量。
  2. Microsoft Azure要求客户明确配置和维护在多分片查询中使用的分片列表。如果配置更改,则需要由客户端更新映射。而Oracle Sharding自动为客户维护此元数据,由Oracle Sharding维护此类列表,不需要客户端的干预。
  3. Microsoft Azure仅限于副本碎片上的只读查询。更新必须通过数据库链接返回到协调器数据库。 Oracle Sharding支持对Active Data Guard分片上的临时表的任何表和DML更新的只读查询,以及对Oracle GoldenGate分片上的所有表的完全读写访问。

2、Oracle Sharding与NoSQL数据存储的比较

NoSQL数据存储无法提供应用程序透明的可伸缩性,但Oracle可以为使用Oracle RAC和Active Data Guard的任何应用程序执行此操作。 与Oracle Sharding类似,NoSQL数据存储也可以使用分片式架构来实现可扩展性和高可用性的组合。 更喜欢为分片式架构明确设计应用程序的客户可能会认为他们可以选择将Oracle Sharding与Oracle Enterprise Edition结合使用,或者使用NoSQL数据存储库。

客户将选择Oracle Sharding与Oracle企业版,原因如下:

  1. NoSQL数据存储器缺乏企业RDBMS的功能,包括:关系模式,SQL和其他编程接口,支持复杂数据类型,在线模式更改,多核可扩展性,高级安全性,高级可扩展性,ACID属性,一致性读取,JSON的开发人员敏捷性等。例如,Oracle对事务的固有支持意味着并发更新/读取从不会获得不一致的结果; NoSQL数据存储不能这样做。 Oracle还将读一致性扩展到多分片操作,以及使用全局一致性读取,这是NoSQL数据存储不可能实现的。
  2. Oracle Sharding将Oracle企业版与用于部署分片式架构的全面解决方案相结合,包括自动化以简化生命周期管理的多个方面,提高灵活性的高级分区方法以及基于智能数据的路由以实现卓越的运行时性能。

Oracle Sharding和Oracle RDBMS的结合为客户提供了两个方面的优势:能够大规模使用分片式数据库架构,而不会牺牲NoSQL数据存储的特点

3、Oracle Sharding和Oracle NoSQL使用场景的选择

评估简单键值的客户NoSQL数据存储架构选择:

  • 选择Oracle Sharding,如果他们在Oracle企业版和一组全面的功能的组合中看到价值,部署一个分片式架构,实现极高的可扩展性和可用性。
  • 选择Oracle NoSQL,如果他们不把价值放在Oracle企业版的功能,而是寻求降低NoSQL解决方案的所有权成本,旨在提供高可靠性,可扩展和可用的数据存储跨可配置的系统集 存储节点。

4、其他NoSQL数据库对Oracle Sharding有什么优势?

NoSQL竞争对手,例如Cassandra,MongoDB等已经使可扩展性和可用性的分片成为其产品的核心价值主张。与Oracle Sharding相比,他们享有以下优势:

  • 低成本 - 它们是Oracle数据库企业版和更简单的基础架构(尽管功能越少,企业级功能越少)的成本的一小部分。 NoSQL是为不受益于企业RDBMS的简单工作负载而设计的。
  • 开发人员共享 - 分片的决定由架构师和开发人员进行,而不是数据库管理
  • 更简单的HA复制机制 - 直接写入每个副本对数据库复制从主机到其副本。
  • 用于执行多分片查询的多个协调器 - 可以比第一版Oracle Sharding支持的单个协调器更具扩展性(请注意,多分片查询不是Oracle Sharding的主要用例,并且多个协调器计划用于下一版本)。

当客户重视与企业RDBMS的分片的好处时,Oracle Sharding将击败NoSQL数据库。如果一个低成本的NoSQL解决方案更适合客户的需求,销售Oracle NoSQL。 Sharding是Oracle EE和Oracle NoSQL都支持的一流的HA架构。

5、COTS应用程序(如SAP或Oracle电子商务套件)是否可以使用Sharding?

不能,Sharding是明确地用于专门为了利用分片式数据库架构的应用程序。 没有任何应用程序提供商已经认证他们的应用程序用于Oracle Sharding。

在上一篇Oracle Sharding 介绍系列 III(横向对比) 对 Oracle Sharding 与其他产品进行了横向对比之后,这一篇我们再看看 Oracle Sharding 背后的技术实现 1、数据在分片之间如何分配?

Oracle Sharding使用水平分区来跨分片(离散物理数据库)分割数据库表,以便每个分片包含具有相同列但行的不同子集的表。 跨分片的分区的分布在表空间级别完成。分片表的每个分区驻留在单独的表空间中,每个表空间与特定分片相关联。每个分片上的表分区与非分片Oracle数据库中使用的常规分区没有区别。即使表的分区驻留在多个数据库中,对应用程序开发人员来说,表的外观和行为与单个数据库中的常规分区表完全相同。应用程序发出的SQL语句从不引用分片,也不依赖于分片数及其配置。 Oracle Sharding提供了几种可选的分区方法,可以自动或由用户确定数据的分布,或两者的组合。

2、Oracle Sharding支持哪些类型的Sharding方法呢?

Oracle Sharding支持三种分片方法:系统管理,用户定义和复合分片。

  • 系统管理的分片不要求用户指定数据到分片的映射。使用按照一致性哈希分区,自动在分片中分布数据。分区算法均匀且随机地在分片之间分布数据。这种分布旨在消除热点并在整个碎片上提供均匀的性能。当向SDB添加或从SDB中删除分片时,Oracle Sharding会自动维护平衡的数据分布。系统管理的分片使用为Oracle Sharding优化的一致性哈希分区策略。系统管理的分片是最常用的分片形式。
  • 用户定义的分片允许用户明确指定数据到各个分片的映射。当由于性能,法规或其他原因,某些数据需要存储在特定分片上,并且用户需要对分片之间的数据移动进行完全控制时使用。用户定义的分片的另一个优点是,在分片的计划或计划外中断的情况下,用户准确地知道什么数据不可用。用户定义的分片的缺点是用户需要监视和维护跨分片的数据和工作负载的平衡分布。用户定义的分片使用范围或列表分区策略。
  • 复合分片是用户定义和系统管理的分片的组合,在需要时提供这两种方法的优点。使用复合分片,数据首先按列表或范围分区,然后通过一致的散列进一步分区。这两个级别的分片使得可以将数据映射到一组分片,然后自动保持该组分片上的数据的平衡分布。

3、如何在单个分片上包含多个事务?

对于许多应用程序,可以通过将水平分区与跨所有分片的少量只读或读取主表的复制结合来实现高百分比的单分片操作。对于通常与分片表一起访问的相对较小的表,完整表的复制是一个不错的选择。在每个分片中具有相同内容的表称为重复表。 Oracle Sharding使用物化视图复制来同步重复表的内容。每个分片上的重复表由只读物化视图表示。物化视图的主表位于称为碎片目录的特殊数据库中。所有分片上的物化视图都将以可配置的频率自动刷新。 CREATE DUPLICATED TABLE自动创建主表,物化视图和物化视图复制所需的其他对象。

4、应用程序如何知道它在运行时必须连接到哪个分片?

应用程序必须指定一个分片键,以使用分片式数据库架构实现高性能。例如,网上银行应用程序可以设计为使用当用户作为分片键登录时生成的customer_id。 当处理数据库事务时,应用程序将分片键传递到连接层:

  • Oracle JDBC,OCI和ODP.net客户端能够识别连接字符串中指定的分段键,以实现高性能数据相关的路由。连接层中的分片路由缓存用于将请求直接路由到数据所在的分片。
  • 用于JDBC客户端的Oracle通用连接池(UCP)还能够识别连接URL中指定的分片键。分片路由缓存用于将连接直接路由到数据所在的分片。 Oracle UCP还支持非Oracle应用程序客户端(如Apache Tomcat,WebSphere等)与Oracle Sharding一起使用。

例如,UCP分片路由缓存包含分片键范围到分片的映射。当应用程序通过分片键检出连接时,UCP从其路由缓存中查找其上存在此键的相应分片。如果池中有匹配的连接可用,则UCP通过应用其内部连接选择算法来返回到这些分片中的一个的连接。如果没有匹配的连接,则通过将具有分片关键字的请求转发到Shard Director来创建新的连接。在第一次连接到分片时,连接池检索分片中的所有键范围,并将它们添加到其路由缓存中,以便后续连接直接转到分片(即绕过Shard Director)。 如果分片不可用,客户端连接将自动重定向到HA的分片副本。

5、如果重新平衡数据或添加/删除碎片,则路由缓存如何更新?

所有重新平衡和添加/删除分片操作都由SDB管理层(Shard Catalog和Shard Director)执行。在所有这些操作期间,SDB保持可用并在线。一旦重新平衡完成,分片路由高速缓存将失效,并在下次将连接路由到分片时自动刷新。

6、如何在多个shard之间重新平衡工作负载?

在以下情况下需要跨分片的数据迁移:

  • 当一个或多个分片添加到SDB或从SDB中删除时
  • 当跨分片的数据或工作负载分布存在偏差时

在由分片数量变化触发的分片之间重新分布数据的过程称为重新分片。自动重新分片可以在SDB上提供统一的数据分布。要理解这是如何完成的,有必要了解如何在碎片上物理分区数据。 跨分片的分区分布通过在驻留在不同分片上的表空间中创建分区来实现。为了最小化多分片连接的数量,表族中所有表的相应分区总是存储在同一分片中。分片表的每个分区存储在单独的表空间中。 因此,表空间是SDB中的数据分布的物理单位。分片之间的数据迁移单位是块。块是一组表空间,用于存储表系列中所有表的相应分区。块包含来自表系列的每个表的单个分区。这保证来自不同分片表的相关数据一起移动。在创建SDB时指定每个分片中的块数。 当发生数据或工作负载倾斜时,特定块也可以从一个碎片移动到另一个碎片,而碎片数量没有任何变化。在这种情况下,块迁移由DBA启动以消除热点。或者,Oracle Sharding也支持在线拆分一个块。 当块变得太大时,或者只有一部分块必须迁移到另一个块时,需要拆分。 RMAN增量备份,可传输表空间和Oracle Notification Service技术用于将块迁移对应用程序可用性的影响降至最低。块在块迁移期间保持联机。当存储在块中的数据仅可用于只读访问时,有一段很短的时间(几秒钟)。迁移组块的过程由管理员自动启动。 启用FAN的客户端在块即将在源分片中变为只读时,以及在完成块迁移时在目标分片中完全可用时接收通知。当客户端接收到”chunk read-only”事件时,它们可以重复连接尝试,直到块移动完成,或访问源块中的只读块。在后一种情况下,尝试写入块将导致运行时错误。

7、分片如何提供线性可伸缩性?

线性可扩展性通过消除碎片之间的任何依赖性来实现。 每个分片是独立的Oracle数据库,不共享任何硬件或软件。 需要高性能和可扩展性的事务只访问单个分片中包含的数据。 设计用于Oracle分区的OLTP应用程序可以在任何平台上弹性扩展(数据,事务和用户)到任何级别,只需在额外的独立服务器上部署新的分片。 每个分片通常使用本地存储器,闪存和存储器,提供以相对低的成本进一步优化性能的机会。 通过应用程序提供的分片键和Oracle客户端(JDBC,OCI和ODP.net)及Oracle通用连接池(UCP)支持的高性能数据相关路由,将工作负载定向到相应的分片。 分片键的示例包括:customer_id,account_no,country_id等。

8、分片如何实现故障隔离?

根据定义,每个分片是独立的Oracle数据库,不与其他分片共享硬件或软件。一个或多个碎片的中断或减速不会影响其他碎片上应用程序的可用性。在分片级别用于HA的复制在分片经历中断时快速恢复可用性。同样,一个分片的计划维护不会影响其他分片的可用性。 另外,分片导向器和分片目录数据库的其他组件也有助于消除单点故障。碎片导向器是一个非常轻量级的进程,不包括Oracle数据库实例。冗余碎片引导器部署在每个区域内部署碎片,以确保对SDB的连续应用程序访问。分片目录数据库使用Oracle Data Guard复制和自动故障转移来提供高可用性。目录数据库对运行时连接的路由没有影响 – 客户端连接使用分片路由缓存来实现高性能数据相关的路由。在Data Guard自动故障转移期间,目录数据库的瞬时不可用性仅导致碎片维护操作或多分片查询的短暂中断。

9、如何为分片数据库实施高可用性和灾难恢复?

用于任何Oracle数据库的所有常用Oracle高可用性解决方案也用于为分片式数据库提供HA,备份和恢复以及灾难恢复。

  1. 具有自动数据库故障转移的Data Guard是用于计划外中断和计划维护的默认HA配置,并自动为每个分片部署;
  2. 管理员可以自动部署Active Data Guard(所有分片副本以只读方式打开)或Oracle GoldenGate双向复制用于分片HA;
  3. 管理员可以手动配置用于分片HA的Oracle RAC
  4. Oracle恢复管理器(RMAN)和闪回在提供分片级别的备份和基于时间点的恢复
  5. 零数据丢失恢复设备提供高效的企业备份和恢复。恢复设备可以执行实时备份,从而保护SDB中的每个事务。
  6. 每个分片的其他远程副本由Data Guard,Active Data Guard或Oracle GoldenGate维护,并为站点中断提供实时灾难恢复和数据保护。
  7. 基于版本的重新定义在部署修改后端数据库对象的应用程序的新版本时提供了对分片的在线修补。