V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gancl
V2EX  ›  数据库

oracle 随着用户不断攀升遇到性能瓶颈了怎么办?

  •  
  •   gancl · 2018-10-17 23:26:42 +08:00 · 4887 次点击
    这是一个创建于 2220 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们的两节点 oracle 查询量多时经常挂掉, 是部署在自建机房或 IDC 的. 了解到阿里云有提供兼容 oracle 的产品 ppas, 但这价格太贵了,相比于免费的不注册的 oracle 来说. 还不能试用,不知道效果不能马上买的. 或者有其他只要能解决我们的痛点的解决方案吗? 我们用机器一年前已经买了 20 万价格的性能的机器. 现在遇到瓶颈了. 切换到 mysql 吗? 工程量可能有点大? mysql 可以解决性能问题吗?

    51 条回复    2018-10-19 10:33:18 +08:00
    stabc
        1
    stabc  
       2018-10-17 23:30:32 +08:00
    转 mysql 未必能解决你的问题,但是一定能得到更多的来自社区的帮助。
    FullBridgeRect
        2
    FullBridgeRect  
       2018-10-17 23:35:45 +08:00 via Android   ❤️ 1
    买了 oracle 的应该去问 oracle 的技术支持吧?
    LeoSocks
        3
    LeoSocks  
       2018-10-17 23:37:29 +08:00 via iPhone   ❤️ 1
    @FullBridgeRect 他们没有用 oracle 的授权
    msg7086
        4
    msg7086  
       2018-10-17 23:38:47 +08:00
    呃……加钱可及?用 Oracle 了不是明摆着准备掏钱的吗……
    gancl
        5
    gancl  
    OP
       2018-10-17 23:38:47 +08:00
    转 postgresSQL? @stabc
    liprais
        6
    liprais  
       2018-10-17 23:45:24 +08:00
    oracle 都解决不了的性能问题,mysql 大概也不行的
    pgsql 可能也不行,毕竟单机性能最强的就是 oracle 了
    还是先做 profile 看看瓶颈在哪,再想想怎么调优吧
    单节点 20 万?
    我猜 32 核心 128g 内存这样,性能很不错了
    gancl
        7
    gancl  
    OP
       2018-10-17 23:53:43 +08:00
    @liprais 主要还是系统有大批量导数据的功能, 一下子导出了几年的十几万条的数据, 不同的用户会同时在月底时更频繁地操作. 有什么可改进的地方呢?
    ShareDuck
        8
    ShareDuck  
       2018-10-17 23:57:26 +08:00 via Android
    @gancl 改成用户预约处理,仅在系统空闲时进行数据批量导出。
    gancl
        9
    gancl  
    OP
       2018-10-17 23:57:41 +08:00
    是在 java 里执行 sql 进行导出来的 @liprais
    gancl
        10
    gancl  
    OP
       2018-10-17 23:58:27 +08:00
    @ShareDuck 要怎么判断 oracle 空闲呢?
    liprais
        11
    liprais  
       2018-10-17 23:59:31 +08:00
    @gancl
    看你应用场景了
    1.改成异步队列处理,控制并发
    2.预先生成数据文件
    gancl
        12
    gancl  
    OP
       2018-10-17 23:59:37 +08:00
    做成 MQ, 导数据的队列, 按顺序执行. 这样对用户就会慢一些,综合体验可能会更好一些 @ShareDuck
    gancl
        13
    gancl  
    OP
       2018-10-18 00:00:51 +08:00
    @liprais 预先生成的,如果有涉及到实时的数据产生,就不准了,要怎么更好地解决?
    liprais
        14
    liprais  
       2018-10-18 00:03:03 +08:00
    @gancl
    我猜你是月末导出这个月的数据
    不会变的数据预先生成,实时的数据异步队列,这样?
    gancl
        15
    gancl  
    OP
       2018-10-18 00:05:53 +08:00
    嗯,谢谢! 可能多表查询一有关联到客户表的, 肯定会有实时的. 可能预先生成一个 xls 还不现实, 不同的查询条件. 如果做预生成, 要根据 sql 去把结果缓存到 redis 吗?
    annoy1309
        16
    annoy1309  
       2018-10-18 00:07:04 +08:00
    1 能否对用户进行分流?比如结算时间部分分到月初?部分用户结算时间分流到月中?
    2 能否可以在空闲时对用户往年的历史数据进行预打包,比如我现在先把 8 月,7 月和更之前的数据进行按用户打包(看你的描述只是撑不过月末的峰值,可以在凌晨或者低负载的情况下做)。用户请求下载了,只从数据库里面导 9 月及以后的数据,这样对实况数据准确度也无大影响
    likuku
        17
    likuku  
       2018-10-18 00:08:40 +08:00
    @gancl 要么尝试把用户预约的导出申请,不要立即执行,将申请记录在其它 DB 里,当作一个订单处理,只反馈给用户当前处理进度(排队中,前方还有多少人等待,大约时间)。

    这些订单塞入异步队列,使用独立的导出程序,来消化异步队列里的任务,过程里,更新队列状态,队列状态再反馈到用户订单里。

    消化异步队列的程序,可以根据机器负载,CPU 核数,多只并行,但保持在机器负载峰值上运行,但不要超载,每只导出任务的异步任务顺利完成后,数据打包,存放好,或者处理成客户需要的格式,给客户订单反馈,并各种手段通知客户可以下载数据。

    Oracle 假若可以实现从一个数据源同步出去多台专用导出机器的话,以上消化异步队列程序什么,就可以尝试让它们使用多台镜像的导出 Oracle 机器源,甚至是分布式在独立机器上执行导出任务。

    异步化,任务分散化,并行化,分布式。 这几个方向可以考虑下。
    gancl
        18
    gancl  
    OP
       2018-10-18 00:12:21 +08:00
    @annoy1309 除了月末 oracle 顶不住外, 平时也有 oracle 挂了的情况,通常就是某些 sql 执行占用的 CPU 或内存太大了影响了其他正常业务, 或是根本不知道什么原因就挂了...
    gancl
        19
    gancl  
    OP
       2018-10-18 00:15:40 +08:00
    @likuku 谢谢,我研究一下. 现在数据挂了影响太大了,用户不能访问,所有现场流程走手工纸质流程,电话打爆了
    stabc
        20
    stabc  
       2018-10-18 00:19:11 +08:00
    @gancl 不是转啥的问题,现在应该是支持的问题。数据库本身我更推荐 PG,但是现在中文环境 MySQL 能得到的社区帮助应该更多一些。
    oovveeaarr
        21
    oovveeaarr  
       2018-10-18 00:35:13 +08:00
    如果是频繁读取无法缓存的内容,建议考虑下群集,做读写分离,或者列队处理之类的,尽量保证异步处理吧。
    likuku
        22
    likuku  
       2018-10-18 00:38:10 +08:00
    假若要 Oracle 转 PG,或许可以尝试下 EnterpriseDB,基于 PG 作的商业产品,但也有免费版,目标就是兼容 Oracle,
    当年它们噱头就是高度兼容 Oracle,迁移工作量小,有迁移工具。

    Homepage | EnterpriseDB : https://www.enterprisedb.com/
    bukip
        23
    bukip  
       2018-10-18 00:44:51 +08:00
    遇到性能瓶颈了怎么办? 加硬件
    gefranks
        24
    gefranks  
       2018-10-18 01:13:48 +08:00
    1. 买 oracle 的 support 了么? 什么版本的 DB, 打了什么补丁?
    2. 错误日志是否已经拿到?
    lolizeppelin
        25
    lolizeppelin  
       2018-10-18 02:13:00 +08:00 via Android
    我觉得坑在业务层

    用 oracle 的很多都喜欢拿 oracle 的存储过程写代码
    一堆业务逻辑都往里塞
    kslr
        26
    kslr  
       2018-10-18 02:24:57 +08:00 via Android
    当然是迁移了,虽然不如 Oracle
    但是免费什么规模的方案都有
    fortunezhang
        27
    fortunezhang  
       2018-10-18 08:32:33 +08:00   ❤️ 1
    我说下我的处理,和楼上差不多。我的业务是一个定时任务,没 5min 跑一次所有的数据;一个 web,提供数据分析。开始做的时候觉得没什么问题,等到数据大了,请求大的时候,在 cup 密集运算的时候就会出现等待。比如请求 2 周的数据。我的步骤是这样的:
    1.定时任务单独在一个端口上跑
    2.web 在另外一个任务上跑
    3.这种以天为单位的数据,cache 起来,楼主可以用 file 或者可以用 ,跑在定时任务的应用上,每天凌晨跑。
    4.当有请求天的数据是,先判断有没有这个文件,有的话直接异步读取用,没有的话,直接计算,然后存储,返回。

    建议:
    1 楼主说的瓶颈在问题里面描述清楚,我在评论里找了好久。
    2 既然设计到了年,那么可能这块会复杂一些,以年,月,日为单位分别存储,在融合起来会麻烦一些。写一个通用接口自动计算是必须的,但是规则也提前想好,读大于写次数要考虑进去。
    3.既然 oracle 遇到了瓶颈,那么其他数据库解决可能性也不大,除非 oracle 存储了关系型数据。 我感觉瓶颈不在与数据库,在于业务的处理。
    nandaye
        28
    nandaye  
       2018-10-18 08:38:59 +08:00 via Android
    oracle 单机都能玩挂,换 MySQL 没有专业人员更容易出问题。感觉是你们配置有问题,oracle 亿级多表关联,导出千万数据从来没挂过,这种级别的软件正常来说再大的压力也只会性能变差,不可能完全挂掉,否则谁还敢用
    ShareDuck
        29
    ShareDuck  
       2018-10-18 09:01:58 +08:00
    @lolizeppelin #25 哈哈,还真是,我之前搞了半年的 Oracle,真的写了一大堆的存储过程。不过当时用的是小型机,所以性能不是问题,批量处理数据时最长的过程是 15 分钟。但在测试机( PC Server )上跑时经常死锁,哈哈。
    ShareDuck
        30
    ShareDuck  
       2018-10-18 09:04:30 +08:00
    @gancl #10 我们现在是手动设置的,例如设置为凌晨 3 点才进行批量处理。当然,用户体验是不好的。不好我们完全不用考虑这个问题,因为我们是内部的系统,哈哈。
    janus77
        31
    janus77  
       2018-10-18 09:17:08 +08:00
    @fortunezhang #27 基本同意,做成分离的应用,用单独的服务器资源、单独跑定时任务,每天凌晨都跑,百万级,经过常规优化( db 配置优化、sql 优化、索引、应用层代码逻辑优化等等)可以撑住了。
    同时发现楼主说平时不忙的时候也会莫名其妙的慢下来,感觉主要还是在常规优化上做文章。
    linxl
        32
    linxl  
       2018-10-18 09:18:39 +08:00
    查询挂掉就加缓存啊。。。
    cstj0505
        33
    cstj0505  
       2018-10-18 09:19:12 +08:00
    @gancl postgresql 的 copy 功能可接,导文件。到的标准输出或者直接在代码里把数据转成二进制用 copyin,我们之前一个项目也遇到这个问题,后来从 mysql 换到 pg 解决
    jingrui
        34
    jingrui  
       2018-10-18 09:41:01 +08:00
    oracle 没毛病,程序上优化吧
    est
        35
    est  
       2018-10-18 09:42:51 +08:00
    应该是使用姿势不对。对数据结构动刀子可破
    zarte
        36
    zarte  
       2018-10-18 09:51:37 +08:00
    移动的数据是提交计划,如果有就直接下载,要不然就要等一段时间。每天的报表是自动定时生成。
    USNaWen
        37
    USNaWen  
       2018-10-18 10:12:06 +08:00
    扩容 or 加一个硬件层 buffer。
    试试傲腾?
    xiaoxinshiwo
        38
    xiaoxinshiwo  
       2018-10-18 13:45:38 +08:00
    @gancl #7 需要将导出的业务进行隔离,数据也要进行隔离,分库,然后归档,优化导出逻辑
    dalieba
        39
    dalieba  
       2018-10-18 15:19:15 +08:00 via Android
    负载均衡了解一下
    philipjf
        40
    philipjf  
       2018-10-18 15:33:50 +08:00
    你怎麽會覺得 MySQL 能解決 Oracle 解決不了的性能瓶頸的
    youxiachai
        41
    youxiachai  
       2018-10-18 15:35:46 +08:00
    话说..20w 的硬件都买了...

    oracle 的技术支持服务..买不起?
    lcy630409
        42
    lcy630409  
       2018-10-18 15:50:00 +08:00
    做预约,或者用户在操作的时候,先记录下来,然后空闲期 比如晚上,自动化处理,白天提供下载
    encro
        43
    encro  
       2018-10-18 17:15:04 +08:00
    没有数据量,访问量,讲什么都没用,慢日志有记录吗?查查慢日志,说不定几分钟解决了。
    encro
        44
    encro  
       2018-10-18 17:26:32 +08:00
    作为程序员,不知道慢在哪里,做了很多年还是菜鸟,是可悲的。

    数据库优化都离不开的步骤:
    1,通过慢查询日志记录慢查询;
    2,通过慢日志分析工具分析出 topN 慢查询;
    3,通过 explain 获取慢查询原因;
    4,通过优化索引和表结构解决查询慢问题(只有当硬件性能已经被发挥充分或者优化的性价比较低时才更换硬件);

    我说的方法是 mysql 的,同样适用于 pg 和 oracle。

    这是我随便搜索到的:
    https://blog.csdn.net/laokaizzz/article/details/78685196
    https://blog.csdn.net/diquren/article/details/53410047?utm_source=blogxgwz0
    wmhx
        45
    wmhx  
       2018-10-18 19:59:02 +08:00
    慢首先考虑的是代码和 sql,而不是加硬件, 百度有很多优化建议,你可以试试, 数据量增加 你的 cpu,内存,io 的压力如何, 如何真要加硬件就再来一套 rac 吧, 换 mysql,够你改代码的了.
    jimrok
        46
    jimrok  
       2018-10-18 23:44:53 +08:00
    1. 把要查询的数据复制到 mysql 上,按照用户可以分成几个库去查询。
    2. 用户需要下载数据可以做成任务,文件生成完毕后,发邮件通知用户,保留 1 周。用户点邮件里的连接可以下载文件。
    mawenjian
        47
    mawenjian  
       2018-10-19 07:11:42 +08:00 via iPhone
    歪个楼,Oracle 没授权的免费版不是有 cpu 和内存限制么? lz 家 20 万一台的服务器能跑满?

    另外,看 lz 家的需求,主要瓶颈还是大 SQL 导致的,我觉得一是数据能 Cache 的做好 Cache ;二是服务器可以做个水平扩展加节点,毕竟是读多写少的业余嘛;三是将快慢查询分开,慢查询使用专用的服务器,保证线上系统不会全挂。
    gancl
        48
    gancl  
    OP
       2018-10-19 09:11:21 +08:00
    谢谢大家! 双机热备的投资通常都是百万级(人民币), 阿里云等于是几十家企业一起投资一个机房,然后通过虚拟机方式把资源分配给这些企业,平摊成本.
    一个是应用层面的优化把, 像我们这些每天只有几千人用的系统,ORACLE 的处理能力绝对不是问题。 如何避免重复的数据导出 SQL 在同一时间并发 10 几个进行操作,磁盘 IO 会收到严重的负荷压力,从而引起严重的 IO 等待,其他的应用模块也会受到影响。
    另外一个是提高 IO 硬件,比如换了 SSD 硬盘,这种情况就少了很多
    还有就是上面#44 说的优化 sql: https://blog.csdn.net/yaonianlong/article/details/21158727
    @encro 慢查询是 mysql 吧, oracle 没有怎么办?
    gancl
        49
    gancl  
    OP
       2018-10-19 09:12:44 +08:00
    @encro 刚才看错了, oracle 的慢查询应该就是你发的那两个链接, 谢谢!
    gancl
        50
    gancl  
    OP
       2018-10-19 09:23:19 +08:00
    oracle 双机热备有没简版的方案呢?
    saximoer
        51
    saximoer  
       2018-10-19 10:33:18 +08:00
    找云和恩墨啊
    一切都给你安排的明明白白
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5907 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:10 · PVG 10:10 · LAX 18:10 · JFK 21:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.