2020-11-17 问题记录

polardb-jdbc18.zip polardb-jdbc18 立即下载

问题记录

17日生产问题记录:
1、移动端时间异常bug(暂未确定是前端还是后端问题~)
有使用者反馈,移动端的查询接口出现返回信息错误情况,错误情况是返回的日期应该是2020-11-15 15:30:00,结果返回信息为2046-11-15 15:30:00,查看后端代码,由于前端要求返回的是时间戳,所以后端的SQL查询进行了格式化,如下:
在这里插入图片描述
将此SQL在测试环境的Oracle数据库可以正常查询到结果,且经过时间戳转换工具也是正常时间,生产上一直也是正常的,没有出现过时间戳格式化错误的问题。
解决方案:需要使用者再尝试复现一次,多次切换查询条件,验证问题。

2、开发功能的代码评审意见
(1)代码中使用了几个字符串常量,需要自定义数据字典,避免使用字符串常量。
(2)idea在mvn clean package的时候,指定的settings.xml文件没有生效,需要加-s参数,暂未解决
(3)需要多测试查询Redis服务和原持久层框架切换为jpa后的接口。

3、接口莫名出现503
生产环境上以前一直容易出现504或者是500错误,今天忽然出现503错误,领导让我去排查,在复现过程中,发现接口信息时有时无,且503一般都是网络负载问题,将问题反馈给领导,确定一下是否有在生产环境做压力测试,导致服务器负载出现问题或者是网关是否有问题。
后续反馈:系统间调用采用的服务网格的边车模式,边车相关存在异常,找到相关负责人去排查后解决。
4、生产数据库表恢复
在服务网格问题排查后,对系统进行重启和升级后,发现启动日志中报错,报错信息为表或视图不存在,查看报错SQL,发现是那张最重要的一张表,所以项目组后端成员紧急开会讨论问题所在。
登录生产环境数据库,对该表进行查询后,发现真的删除掉了,而且打电话给运维人员,也得到了确定,是运维人员的误操作导致,所以要尽快恢复。众人拾柴火焰高,开始对数据库表的操作进行分析:
(1)查看Oracle数据库回收站

select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recyclebin;

(2)进行恢复

FLASHBACK TABLE SYS_C008097 TO BEFORE DROP;

在执行第二步操作后,发现表结构已经恢复,但是数据没有恢复,后来运维确定后,是由于使用了truncate 导致数据无法恢复。。

询问原因,是由于近期在做数据库国产化迁移,已将此表的信息迁移到了其他数据库,但是原本想要删除迁移目标库中的此表,由于删除时没有注意,误删了生产上正在使用的表,历史数据也已经迁移到国产化数据库中,所以也还是有历史数据可以恢复的。

恢复方案:
(1)使用迁移工具恢复:由于工具的局限性,仅可以将Oracle数据库迁移至国产化数据库,暂不支持逆向操作。
(2)使用其他数据迁移工具:由于生产环境内网严格,其他工具使用需要提交工单,且需要很多流程,比较复杂。
(3)写个嵌入的程序接口,去迁移目标库查询,再插入回生产数据库表中

经过讨论后,最后采用第三中方式。

数据恢复

恢复方案:
使用最简单的JDBC方式分别连接两个数据库,直接使用main方法的方式实现:

public class DB2DB {
    public static void main(String[] args) {
        DB2DB test = new DB2DB();
        try {
            test.deal();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    private Connection getPolarconn(){
        try {
            Class.forName("com.aliyun.polardb.Driver");
            return DriverManager.getConnection("jdbc:polardb://XXX.XXX.XXX.XXX:XXXX/DB","user","password");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    private Connection getOracleconn(){
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            return DriverManager.getConnection("jdbc:oracle:thin@//XXX.XXX.XXX.XXX:XXXX/DB","user","password");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void deal() throws SQLException {
        //有数据的数据库
        Connection polarConn = getPolarconn();
        Statement itestmt =polarConn.createStatement();
        ResultSet iters = itestmt.executeQuery("select * from test_table_1");

        //结果集获取到的长度
        int size = iters.getMetaData().getColumnCount();
        //直接拼接insert into 语句,为第二个数据库做准备 
        StringBuffer sbf =new StringBuffer();
        sbf.append("insert into test_table_1values (");
        String link ="";
        for (int i = 0; i <size ; i++) {
            sbf.append(link).append("?");
            link=",";
        }
        sbf.append(")");
        //目标数据库
        Connection oracleConn = getOracleconn();
        PreparedStatement dataPstmt = oracleConn.prepareStatement(sbf.toString());

        //取出结果集并使用批处理向数据库插入数据
        //完成条数
        int count =0;
        int num=0;
        //取消事务(不写入日志)
        oracleConn.setAutoCommit(false);
        long start = System.currentTimeMillis();
        while (iters.next()) {
            ++count;
            for (int i=1;i<= size;i++) {
                dataPstmt.setObject(i, iters.getObject(i));
            }

            //将预先语句存储起来,这里还没有向数据库插入
            dataPstmt.addBatch();
            //当count 到达 20000条时 向数据库提交
            if (count % 20000 ==0 ){
                ++num;
                dataPstmt.executeBatch();
                System.out.println("第"+num+"次提交,耗时:"+(System.currentTimeMillis()-start)/1000.0+"s");
            }
        }
        //防止有数据未提交
        dataPstmt.executeBatch();
        //提交
        oracleConn.commit();
        System.out.println("完成 "+count+" 条数据,耗时:"+(System.currentTimeMillis()-start)/1000.0+"s");
        //恢复事务
       // oracleConn.setAutoCommit(true);

        //关闭资源
        close(oracleConn,dataPstmt,null);
        close(polarConn,itestmt,iters);

    }

    public  void  close(Connection conn,Statement stmt,ResultSet rs){

        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

使用此方法,在测试环境上尝试,发现80万条数据大约90s左右,考虑后续优化~
在这里插入图片描述

阿里云polardb-o数据库驱动jar包 阿里云数据库专用jar包:polardb-jdbc18.jar 立即下载

相关推荐

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程 1.NVIDIA驱动检测及安装 2.Anaconda的安装 3.安装cuda、cudnn、pytorch 4.其他报错

aaaccc444的博客 2423

jdbc连接各种数据库的方法

1)连接Oracle 8/8i/9i/10g/11g(thin模式) Class.forName("oracle.JDBC.driver.OracleDriver").newInstance(); String url="JDBC:oracle:thin:@localhost:1521:orcl"       //orcl为Oracle数据库的SID String user="t

Sampson_LJ的博客 604

Figure 03人形机器人与Helix端到端控制系统:具身智能突破深度解析

2026年5月,Figure AI的Figure 03人形机器人在一场震撼业界的直播中完成了长达200小时的连续全自动作业,分拣近25万个包裹,零故障。这一里程碑式的成就标志着人形机器人正式从「实验室展示」迈入「规模化商用」阶段。本文深入剖析Figure 03的核心技术——Helix端到端神经网络控制系统,包括System 0/1/2三层架构、视觉运动策略、全身协同控制等关键技术,并提供完整的Python/Go代码示例,帮助开发者理解具身智能的核心原理与实现路径。关键词。

shao.bing的专栏 991

jdbc连接数据库(保姆级讲解)

用于操作数据库的java技术

qq_45105233的博客 801

第 3 天:Actor 是什么?创建你的第一个游戏对象!

本文详细介绍 Actor 在 Unreal Engine 5 中的作用,并通过 C++ 创建你的第一个游戏对象。你将学习 Actor 的生命周期(BeginPlay、Tick)、如何添加组件(Static Mesh),并让 Actor 在游戏世界中运作。同时提供 常见问题解决方案,助你快速上手 UE5 C++ 开发!🎮 跟随本教程,构建属于你的第一个游戏对象!

m0_37643873的博客 2629

[QMT量化交易小白入门]-十二、QMT回测龙头打首板和连板的策略

class a():passA = a() #创建空的类的实例 用来保存委托状态field_list定义了需要的市场数据字段,而类a用于保存交易状态。

木头大左的博客 4757

java项目使用国产polardb数据库启动报错问题--解决方法

国产polardb数据库下面还有一层schema的概念,默认你不切换schema是在public这个schema下。

lc_tiantian的博客 624

STM32 MCU解除读保护的方法及STM32CubeProgrammer的应用

下面是一个简单的源代码示例,演示如何在STM32CubeProgrammer中使用命令行界面(Command-Line Interface,CLI)来解除STM32 MCU的读保护。通过按照这些步骤操作,您可以成功解除STM32 MCU的读保护,并在需要的时候进行调试、烧录或修改固件。模块调用了STM32CubeProgrammer的命令行界面(CLI),并传递了相应的参数来解除STM32 MCU的读保护。请注意,在进行任何与读保护相关的操作之前,请确保您拥有合法的授权和权利,以避免潜在的安全风险。

ZwcCsharp的博客 3548

基于POLARDB数据库的压测实践

POLARDB架构简介 PolarDB是阿里云ApsaraDB数据库团队研发的基于云计算架构的下一代关系型数据库(暂时仅支持MySQL,PostgreSQL正在紧锣密鼓的开发中),其最大的特色是计算节点(主要做SQL解析以及存储引擎计算的服务器)与存储节点(主要做数据块存储,数据库快照的服务器)分离,其次,与传统的云数据库一个实例一份数据拷贝不同,同一个...

weixin_34126215的博客 502

基于LSTM算法实现交通流量预测(Pytorch版)

本研究采用PyTorch框架,设计并实现了一种基于LSTM(Long Short-Term Memory)网络的交通流量预测模型。针对时序性显著的交通流量数据,模型首先将多节点、多通道的时空信息整合为一维特征输入至多层LSTM单元,利用其捕捉长期依赖及短期波动的能力进行深度学习。全连接层随后调整时间步长以适应预测周期需求。模型结构灵活,能适应不同节点数、输入输出长度及通道配置,实现在给定历史流量数据基础上对未来交通流量的精准预测,为交通管理与规划提供数据驱动支持。

打酱油的葫芦娃 4637

ACS运动控制器编程 怎么学习

本文介绍了ACS运动控制器编程的完整学习路线,从零基础到实战应用。ACS是以色列高端多轴运动控制平台,适用于自动化设备、精密平台等项目。学习路径包括:1)安装官方软件SPiiPlusControlSuite;2)掌握轴、运动模式和指令三个核心概念;3)学习10个基础指令;4)编写首个运动程序;5)结合C#进行联合编程。进阶内容包括多轴同步、电子凸轮等工业应用,并推荐官方手册作为主要学习资源。通过7天的系统学习,即可掌握单轴运动控制,结合C#实现工业级设备开发。

StevenChen的博客 1309

PolarDB入门使用:驾驭云原生数据库的力量

PolarDB是阿里云自主研发的云原生数据库,它基于存储计算分离架构,实现了数据的高并发读写能力和秒级弹性伸缩能力。PolarDB兼容MySQL、PostgreSQL等多种数据库引擎,支持在线扩容、故障自动切换等特性,是现代企业级应用的理想选择。通过本文的详细介绍,相信你已经对PolarDB有了全面的认识,并掌握了其基本使用方法。PolarDB凭借其卓越的性能、高可用性和易管理性,正在成为越来越多企业的首选云数据库解决方案。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 2311

[系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向

娜璋AI安全之家于2020年8月18日开通,将专注于Python和安全技术,主要分享Web渗透、系统安全、CVE复现、威胁情报分析、人工智能、大数据分析、恶意代码检测等文章。真心想把自己近十年的所学所做所感分享出来,与大家一起进步。 系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战等,通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步。第一篇文章先带领大家学习什么是逆向分析,然后详细讲解逆向分析的典型应用,接着通过OllyDbg工具逆向分析经典的游戏扫雷,再通过Cheat Engin

杨秀璋的专栏 2万+

初体验

第一篇博客 记录工作中遇到的问题 2020.11.17

zh_404的博客 159

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

postgresql 数据库 FATAL: terminating connection due to conflict with recovery 的日志分析

db: postgresql 9.6 模拟 FATAL: terminating connection due to conflict with recovery 对pid 执行 kill -11 命令 2020-09-30 17:04:43.742 CST,,,3459,,5f7445b3.d83,3,,2020-09-30 16:45:39 CST,,0,LOG,00000,"server process (PID 3483) was terminated by signal 11: Segment

一名数据库爱好者的专栏 6436

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

php升级解决漏洞,php升级过程及出现的问题解决方法

php升级过程及出现的问题解决方法小编网站之前php版本为5.6.4,由于网站后台一直提示php版本过低需要升级,于是直接升级至7.2.28,不过在升级的过程中真是各种问题层出不穷,现整理出来以后再出问题就容易解决了。1.卸载旧版本php首先通过php -v命令查看服务器版本号小编是通过rpm命令手动安装的,所以通过#rpm -qa|grep php查看全部的php软件包可以看到所有的安装包php...

weixin_42332123的博客 862

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[LeetCode]2020/11/17

文章目录[LeetCode]2020/11/17LeetCode 102题目描述解题思路递归非递归细节整理LeetCode 107题目描述解题记录PythonJava [LeetCode]2020/11/17 LeetCode 102 题目描述 这是一道中等题,就是按层序遍历输出二叉树的节点值 解题思路 递归 采用递归的话,便是使用DFS,需要记录层级数 class Solution: def levelOrder(self, root: TreeNode) -> List[List[int

weixin_33423187的博客 125

2020-11-17

2020/11/9 知识总结: html是超文本标签语言 html相当于素颜,css相当于化妆,js相当于加小饰品 标签的属性=“属性的值” charset----设置字符编码 UTF-8常用 1.添加标题 <title>学生登录系统界面<title> ​ 2.添加标题小图标 <link rel="shortcut icon" href="img/icon.jpg"/> ​ 3.引用样式 <link rel="st

weixin_45569659的博客 238

运动周记(2020.02.17~2020.02.23)

2020.02.17 : 跑步60mins 8.11公里 20圈 俯卧撑20个 压腿各3遍 拉伸2次 2020.02.18 : 跑步58mins 7.70公里 19圈 俯卧撑20个 压腿各3遍 拉伸2次 2020.02.19 : 跑步60mins 8.02公里 20圈 俯卧撑20个 压腿各3遍 拉伸2次 2020.02.20 : 跑步43mins 6.02公里 15圈 俯卧撑20个 压腿各...

阿甘兄 792

JAVA 17版本介绍(一)安装环境介绍

为什么笔者会写这篇文章,主要还是Java更新支持来说。首先我们要知道LTS版本JDK和普通JDK的区别。 (LTS版本,Long-Term-Support),Java 大版本周期变化后的长期支持版本。 1.各个JDK版本介绍 1.1.JDK8新特性(2014年初)(LTS版本) 1、Lambda表达式 2、函数式编程 3、接口可以添加默认方法和静态方法,也就是定义不需要实现类实现的方法 4、方法引用 5、重复注解,同一个注解可以使用多次 6、引入Optional来避免空指针 7、引入Streams相关的AP

歪桃的博客 9万+
上一篇: 简单聊聊云计算
下一篇: Spring Data JPA实践与学习(一)
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值