阅读更多
高斌,Oracle首席技术支持工程师,主要负责Oracle RAC、Exadata的技术支持工作,擅长在压力环境下处理复杂的数据库技术问题,多次成功解决国内外客户重要系统的技术问题。日前,笔者采访了高斌,请他解读Oracle RAC,Oracle12c及Oracle RAC的技术解读。从.com到网格计算时代再到云计算的兴起,Oracle经历了哪些产品技术大变革?本文将为你揭晓。

高斌认为,“与其说,云计算给传统数据库带来了前所未有的挑战,不如说是数据库技术在持续的发展和变化,并不断的和新技术进行融合。”



高斌(Allen Gao)首席技术工程师


CSDN:首先请自我介绍下,你所负责的工作以及公司。

高斌:我的朋友都叫我艾伦, 因为我在公司用的名字是Allen。目前就职于Oracle 大连技术支持中心,主要负责RAC,Exadata的技术支持工作。除了日常的技术支持工作,还负责 MOS网站上 RAC,Exadata 文档的翻译工作,在Oracle 内部定期进行数据库相关的知识分享,偶尔在 Oracle官方博客上发表技术文章。目前,主要致力于oracle 12C 和 Exadata新特性的研究,知识分享和技术支持工作。

CSDN:你在Oracle多少年了?在这段期间,有没有给你留下印象特别深的人或事给我们分享下。

高斌:我是2007年5月份加入Oracle, 到现在差不多快9年了。在Oracle的这些年,经历了很多事情也接触了很多人,有些事情让我至今记忆犹新,有些人给了我很多的帮助。记得我来Oracle 之后处理的第一个问题是用户在HP-UX 平台上登录数据库会报错,但是当时自己的技术还很一般,所以做了很多研究工作,想到了很多用户可能问到的问题,而且找到了相关的文档支持,但是在给出解决方案的时候,心里还是忐忑不安,好在最后问题成功解决,也算是让我处理的第一个问题顺利结束。

后来,我有幸在2009年去墨尔本参加当年的RAC pack 培训并和当地的同事一起工作了一段时间,在那里我见到了后来给了我很大帮助的几位当地的工程师,例如:Joei,Thomas,他们已经在Oracle 工作了差不多20年,一直从事技术支持的工作,他们对Oracle 产品的理解深度令我肃然起敬,而且从他们的身上,我能看到优秀工程师的品质:基本功扎实,思维严谨,敬业,勤奋,技术精湛,而且能保持对新技术的好奇心。更加幸运的是还遇到了Oracle 的顶级专家,也是当时Oracle RAC全球技术领导小组组长 Michael,在和他的交流过程中感受到了全球顶尖专家的风采。可以说2009年的墨尔本之行对我的触动很大,让我找到了目标,不断地锤炼自己的技术能力。三年后,也就是2012年,终于获得了去Oracle 总部参加了RAC pack培训的机会,和Oracle 集群产品的核心研发成员进行了交流,并和美国同事一起处理了一些北美的case,也是在红木城遇到了Edward(现任RAC全球技术领导小组组长)。有了在Oracle 5年的积累之后,发现在处理美国问题时并没有想象中的那么难,完全可以跟得上美国同事的节奏,而且也能和他们正常交流。可以说,这次总部之行,让我建立了信心,为自己的进一步成长奠定了基础。我还想感谢我的经理王兰一直以来对我工作的肯定,和在技术以外给予我的很多帮助和点拨,让我受益匪浅。还要感谢我的同事,你们的帮助和鼓励让我倍感温暖。

CSDN:怎么会想到写《Oracle RAC核心技术详解》这本书的?耗时多久完成的?写书期间有遇到过哪些困难吗?

高斌:事实上,写这本书的想法是从2013年开始的,当时计划给我所在的中文数据库组和其他的团队做一次比较系统的RAC 培训,可是发现可以参考的中文资料不是很多,也比较零散,不成体系。而且恰好要整理培训资料和翻译文档,就希望借此机会把自己掌握的知识进行归纳和总结并写成一本书,之后就开始为写书做准备,搜集素材。到了2014年下半年,准备工作差不多完成了,就开始真正动笔写书了。到了2015年春节前,书的初稿完成,之后又花了几个月时间进行修改,调整和校对,一直到2015年的6,7月份才最终定稿。这样算下来,从开始筹备到最后定稿大概用了1年多的时间。

在写书的过程中遇到的最大的困难就是需要思考如何设计整本书的结构,每一章内容结构,以及每一部分的内容应该讲解到什么程度,使用什么样的语言才能让读者更容易理解。而且,由于书中包含了很多原理的解释和测试,所以这也需要花费很多时间和精力。好在整个的编写过程中我的家人给了我很多的帮助和鼓励,让我能够坚持把书写完,也要感谢来自于mooracle 网站的很多朋友在写作过程中给予了我很多灵感和建议。

CSDN:Oracle RAC是什么?它有哪些新特性?它的优势是什么?又有哪些缺点呢?

高斌:RAC 是 Real Application Cluster的缩写,中文可以翻译为实时应用集群,目前最新版本为12c。RAC属于典型的share-everything结构的集群技术, 能够为用户的数据库提供极高的高可用性,可测量性,可伸缩性和基于用户实时工作负载状况的负载均衡功能,以及有修改的对于应用透明的故障 切换功能。RAC数据库已成为成千上万的Oracle 用户十多年来首选的解决方案,而且帮助了太多的客户取得成功。在中国,几乎所有的大型企业(移动,联通,电信,电力,银行,政府,医疗,电子商务等等)都在使用RAC 数据库作为核心数据库。由于RAC 采用了独有的基于分布式锁的内存融合技术,所以能让同一个数据库在多个节点同时进行读写操作,而且完全能给保证数据的一致性,所以可以实现灵活的系统横向扩展能力和优秀的可测量性,而且当集群数据库中的一个实例崩溃后能够提供极快的实例恢复和应用程序链接的故障切换。当然,就像大家所熟知的一样,没有一款软件是完美的,RAC也存在着一些问题,其中最主要的就是由于内存融合技术相对比较复杂,所以需要数据库的维护和开发人员要具有比较高的专业能力。

当然,随着《Oracle RAC 核心技术详解》这本书的出现,以及我和我的朋友在mooracle 网站上不断的知识共享和为广大用户答疑解惑,相信能够帮助越来越多的人了解RAC技术,让这个产品更好的帮助用户取得更多的成功。对于12C 这个最新的版本,Oracle 也在向云架构进行转变,推出了很多优秀的新特性:12C 中提供的Flex Cluster 结构使Oracle的集群能够管理更多的节点,降低了集群节点之间的耦合度,极大地增加了集群的灵活性; Flex ASM 功能,消除了数据库实例和ASM实例之间的1对1关系,提高了RAC数据库的灵活性,并且增强了系统的高可用性; Application continuity和transaction guard 功能使得Oracle RAC的故障切换功能变得更加强劲,它的出现使得应用程序的所有事务(包括select 和 DML语句)在当前实例崩溃之后能够透明的切换到其他运行实例,从而完成了全面的应用程序故障切换能力。

CSDN:在你看来,在Oracle RAC环境中应该如何有效地进行客户端故障转移?

高斌:正如在上一个问题中介绍的, Oracle RAC 可以提供全面的客户端故障切换,它不仅能够保证连接时的链接故障切换,而且能够提供运行时的故障切换。不仅如此,针对不同类型的链接,Oracle 都针对性的提供了相应的故障率切换功能,例如:针对使用了OCI方式的链接,Oracle 提供了 TAF来实现运行时的故障切换,而且随着12C的 Application continuity和transaction guard 新特性的出现,故障切换已经可以做到将用户的select 和 DML语句透明的切换到其他运行实例;针对使用了thin client 的链接,Oracle 提供了基于ONS的FAN,FCF特性,来保证用户连接的切换。如果大家希望了解更多的这部分信息,可以参考《Oracle RAC 核心技术详解》的第十三章中的内容。

CSDN:你在Oracle12c方面有着深入的研究,你是怎么看待Oracle12c的核心新特性?可以给我们解读下吗?

高斌:从Oracle 为最新版本的数据库起名为12c(其中c代表cloud),就能够感觉到Oracle 向云迁移的决心。而12c 非常重要的一个新特性就是多租户,它打破了传统数据库的限制,提出了容器数据库(CDB)和可插拔数据库(PDB)的概念,每个CDB提供数据库的基本组件,在其之上可以灵活的plug 和Unplug 一个或多个PDB, 而且PDB数据库还可以进行快速的复制,这种架构可以让用户更加有效的利用系统的资源,更加灵活的管理数据库资源,部署数据库。另外,CDB和PDB能够和Oracle RAC和Data Guard完全兼容,依然可以保证数据库的高可用性。多租户的这种灵活架构非常适用企业构建公有云上的DBaaS服务,并为SaaS提供了保障。12C的另一项重要新特性被称为内存选件(in-memory option),Oracle 在独立于SGA之外的内存中开辟出一块单独的内存空间(称为in-memory area),并根据用户的需要将数据文件中以行的形式保存的数据,转换成列模式加载到in-memory area 当中,也就是Oracle提到的双模式数据:数据文件和buffer cache 中使用行模式;in-memory area 中使用列模式。

众所周知,大部分的OLAP或DSS系统中大部分的SQL语句只会访问某些表中的特定的一些列,使用列模式对这种SQL语句更适合,也会获得更高的性能,不仅如此,in-memory option 还通过使用 bloom filter, in-memory aggregation 等技术,极高的提升分析型SQL语句的性能。不仅如此,内存选件的出现也可以让用户删除之前为了分析数据而创建的繁重的分析型索引,释放了数据库的空间并消除OLTP应用由于维护索引而造成的额外开销。内存选件,还可以和Oracle RAC 组件透明融合,从而通过多实例的并发技术,在进一步加快SQL语句性能的同时,仍然保证数据库的高可用性。对于上面介绍的新特性和其他12c的更多新特性,也希望大家关注mooracle网站,我和我的小伙伴们会陆续的介绍更多的内容。

CSDN:随着云计算和大数据的到来,传统的数据库面临前所未有挑战,你怎么看待这一现象?传统数据库应该如何应对这种变革?

高斌:基于个人的观察,IT产业大概每10年都会经历一轮新的浪潮,大概20多年前的.com时代,Oracle推出了适用于internet应用的Oracle 8i,9i 数据库产品;接下来的网格计算时代, Oracle又推出了自己的集群管理软件CRS和GI,以及Oracle 10g,11g 数据库产品;最近几年兴起的云计算,Oracle 12C也随之出现。一路看下来,与其说是云计算给传统数据库带来了前所未有的挑战,不如说是数据库技术在持续的发展和变化,并不断的和新技术进行融合。

现在我还记得我来Oracle的第一天,我的经理对我说了语句Oracle里流行的名言adapt to change(适应改变),至今仍然记忆犹新,以至于现在有新同事入职,都会有意无意的向他们说一句Only change never changes,adapt to change(只有改变是一成不变的,要适应改变)。只要数据库技术持续的发展并融入最新的技术理念,它会在一轮一轮的技术浪潮中不断前进。

对于大数据,我对这个领域的了解并不是很多,只能说说自己一些浅显的看法。由于现在搜集数据的技术已经非常先进,很多企业和机构已经拥有了大量的搜集到的数据,并且需要从搜集到的数据中获取相应的知识并转换成为价值,虽然,数据挖掘技术早就存在,但是面临庞大的样本数量(而且大部分的样本数据是离散的或者是半结构化的),也需要一种新的技术来更好的保存和访问这些大量数据,而传统的关系型数据库技术在应对这种问题时出现了困难,也就应运而生出现了基于分布式文件系统(例如:JSON)的甚至不再支持SQL语言的新的数据库技术。不过,正如之前提到的,Oracle数据库技术一直在不断的发展和变化,并和新技术进行融合。在12.1.0.2 版本,Oracle开始支持从Oracle 数据库使用SQL语句或者REST接口访问JSON文件,同时通过in-memory option 的方式将数据在内存中采用了列式存储,而且使用了share-nothing 的架构。不仅如此,在即将推出的12.2 版本中,Oracle数据库的sharding 特性可以实现数据库对象级别的,跨多个数据库的数据分片,也就是物理数据库层面的share-nothing,支持水平扩展的结构。与此同时,Oracle每次推出的新特性都可以和之前版本的特性相兼容,这意味着用户并不需要花费过多的成本去学习新的技术或者改变原有的使用习惯,原有版本所具有的特性仍然还会被保留。

CSDN:Oracle Exadata号称是新一代的数据库云服务器,与其他的云服务器相比,它有什么优势吗?

高斌:Oracle的产品大致可以分为公有云和私有云两条线,最初Exadata最初是为私有云环境而设计的数据库一体机,而最新版本的Exadata一体机也开始支持通过OVM来进行虚拟化的配置,也具备了为公有云提供IaaS服务的功能。相对于其他的数据库一体机,Exadata 的主要优势有以下的两点:第一点,Exadata上特有的智能查询(Smart Scan)功能,通过把SQL语句的工作负载卸载到多个存储节点(Cell)上进行分布式运算的方式能够极大的减少了数据库节点和存储之间的数据传输量,而Cell节点上的存储索引, 列过滤,谓词过滤等技术,也可以大幅度的提高Cell几点访问数据的效率,通过这些优秀的特性可以使Exadata为OLAP和DSS应用提供远高于其他数据库一体机的性能。第二点:Exadata 存储节点上的智能闪存(Smart Flash Cache),以及IORM特新也可以时面向事务的OLTP应用在Exadata上表现出优秀的性能。 另外,Exadata的私网使用了光纤网络,而且数据库节点之间,数据库节点和存储节点之间都使用了RDS协议,也使私网性能得到了极大的提升,使得Exadata上运行的RAC数据库性能更上层楼。

CSDN:给从事数据库的开发者分享一些经验吧。

高斌:我并不是一名数据库开发专家,但是可以从一名数据库从业者的角度,给开发人员一些建议。首先,要对Oracle所提供的各类对象有比较清晰的了解,例如,表,不止有大家平时所知道的堆表,还有临时表、IOT表、Cluster表、分区表、外部表等等;还要要了解Oracle所提供的各类索引,例如,B*Tree Index, Bitmap Index, Domain Index等;对于Oracle支持的数据类型也要有所了解,便于在建模时使用恰当的数据类型。 有的时候在处理问题的过程中会看到,在应用系统中,适合用临时表的时候却用了物理表;也遇到过因为使用字符串存储日期而带来的严重的性能问题。另外,对Oracle提供的各类SQL、PL/SQL语法最好有个全面的了解,便于在不同的环境下,采用最优的语法来实现,不但可以减少开发时间,提高性能,也可以减少编码Bug的产生。SQL函数是每个Oracle开发人员都应该了解的一部分内容,我曾经遇到过由于对Oracle提供的函数不了解,通过大量代码实现Oracle函数的例子。最后,推荐各位开发人员能够多看看Oracle的官方文档,多了解一些和Oracle开发的相关知识。

(责编/夏梦竹,关注编程语言和数据库领域,寻求报道或者投稿请发邮件xiamz@csdn.net)
  • 大小: 30.6 KB
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • DataGridView合并单元格(纵向合并及横向合并)

    DataGridView合并单元格(纵向合并及横向合并) 京华志&精华志出品 分享资源 C# ASP.NET SQL DBA 源码

  • 向datagrid中加横向 纵向的合计 (在datatable中实现,datatable间倒数据)

    没有合计最终效果如果实现?? protected System.Web.UI.WebControls.DataGrid DataGrid1;         ///          /// 数据来源         ///          DataSet CreateDataSource()          {              DataT

  • C# WPF DataGrid底部汇总行合计2

    datagrid 底部汇总行合计,在datagrid 的外部,底部横向滚动条的下面进行的统计。 详情可下载: 。。。

  • WPF DataGrid实现为某个单元格赋值、获取某列的和、积等

    一、DataGrid实现为某个单元格赋值 在WPF中,要对DataGrid的某个单元格进行赋值。一般不便直接对DataGrid赋值。而是对其绑定的数据源进行赋值。 现在假定有: dt_Common 为DataTable类型,dataGrid_CommonSeat为某个DataGrid.可以通过以下方式绑定: //绑定普通坐席数据 ...

  • WPF DataGrid table表格强大功能,样式的实现之合计栏

    WPF DataGrid table表格强大功能,样式的实现之合计栏

  • WPF效果第二百零一篇之实现合并单元格

    早一段时间又一次出差青海省西宁市;回来又是总结又是各种琐事,也没顾得上去分享点东西;大周末的就在家分享一下,这二天再次基于ListBox实现的合并单元格的效果:1、ListBox嵌套ListBox的前台布局:<ListBox ItemsSource="{Binding LCPListData}" x:Name="ManufacturerListBox" ...

  • Asp.Net 中实现DataGrid指定列的自动累加,汇总,显示合计列功能

      void BindData()  {       DataTable curDt = null;//获取数据源方法省略    //增加合计行(第一部分)    DataRow newRow = curDt.NewRow();    //已知DataGrid绑定数据结构为数据结构为:月份 部门 项目 项目编号(隐藏) 核定数 追加数 预算总数 待支出数 已支出数 结余数     newRow

  • easyui05:datagrid数据新增

    目标:就是在书籍管理界面的书籍都来自于数据库而不是前台定死的数据,随着数据库的更改而会更改的数据 com.zking.Dao package com.zking.dao; import java.util.List; import com.zking.entity.Book; public interface IBookDao { /** * 带模糊查询的分页 * @param pageIndex 页数 * @param pageSize 每页几条数据 * @param

  • DataTable分类求和,分类汇总,排序

    对于这个问题,自己郁闷了四五天的时间,之后终于做出来了,分享一下. 主要是从操作内存中的datatable表,而非直接操作数据库,筛选,去除重复行,sum求和,根据某个字段进行排序等等操作....

  • table td 纵向求和

    每次接触table时 少不了的就是要求和,很恶心而且很麻烦 今天自己写了一个td 纵向求和的方法(比较简单和简陋) 但是以此为基础能延伸出其他的操作 二话不多说 #先看js部门的代码 /** * 多行求和统计 * @author Lengff * @time 2018-11-7 10:17:03 */ function countTdSum(...

  • 前端 table 数据纵向展示

    接到一个任务需要纵向table,数据是循环出来的,表头纵向,有字段需要支持修改 因为公司用element,但是这玩意儿的table都是横向,于是开始网上搜索,结果都是将同一表头的数据放进一个list中展示,但是如果这样的话,我无法根据id修改数据库的字段,于是开始想用原生table写,但是找了半天都不行 终于找到一个博主救我dog命 https://www.jianshu.com/p/5907117ecb70 感谢 祭上vue代码 <template> <div clas

  • EasyUI DataGrid 添加水平滚动

    2019独角兽企业重金招聘Python工程师标准>>> ...

  • C# Datatable、List、DataRow[]某列求和

    DataTable dt=new DataTable(); DataRow [] drs=dt.Select("Name='测试'"); List<T> lists=new List<T>(); //假设以上三种里面都含有列名为Test的列 var sum1=dt.Compute("sum(Test)", ""); var sum2=drs.Sum(x=>x.F...

  • 对指定的DataTable列进行求和统计

    DataTable dt=GetData();    DataRow dr = dt.NewRow();    decimal de = 0;    int iCount = 1;    for(int i = iCount; i    {     ///需要对特殊

  • DataTable某个字段倒序显示

    gl_dt.Columns["price"].DataType = typeof(decimal);//设置这个字段的类型,不然不能排序 gl_dt.DefaultView.Sort = "price desc"; //在DataTable的默认视图中的排序设置排序条件 this.dataGridView1.DataSource = g

  • DataTable 实现新增加合计行

    在获取数据后,在客户端合计出数据,添加行,然后再实现绑定, 也可以在数据库存储过程中追加上合计数据,一次返回 public DataView getSellView() { DataTable dt = getDataTable("SELECT * FROM view_Sell"); if (dt.Rows.Count <= 0) return dt.D...

  • DataTable行列转置,实现横向显示数据记录

    例子:班级  人数1班   10 2班   8 3班   9 4班   3 5班   6横向班级 1班  2班 3班 4班 5班人数  10    8    9     3     6 在datatable中进行行列的转置,所以先将您的数据都填充到datatable中。假设您的原始datatale是dt,在dt后加入下面的语句      DataTa

Global site tag (gtag.js) - Google Analytics