大表delete删数据导致数据库异常解决

目录
  • 一、问题描述
  • 二、查看数据库情况
  • 三、提出方案
  • 四、执行过程

一、问题描述

早上正在上班路上,群里客户说,有一张24G的大表,delete删了26小时还没有跑完,目前进程还在跑让帮忙处理下,停止当前进程,并保留对应条件的数据,多余数据删掉。

二、查看数据库情况

1.未开归档

2.UNDO表空间爆满

三、提出方案

1.经过沟通,该表为测试数据表,目前没有在使用;

于是打算rename该表,通过ctas的方式去将需要的数据捞出来,重建索引和相关约束。

2.存在一个问题:delete进程已经执行了26小时,如果kill进程,必然会导致undo回滚,回滚默认开启并行会导致数据库和系统负载很高,于是需要提前处理下,设置参数_fast_start_parallel_rollback_关掉UNDO并行。

--查看回滚参数设置,是否是默认并行
SQL> show parameter fast_start_parallel_rollback
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback         string      LOW
--LOW 代表 开启CPU*2并行
--设置spfile取消并行
SQL> alter system set fast_start_parallel_rollback=false;
System altered.

四、执行过程

1.备份保留 表创建语句。

2.记录当前无效对象。

SELECT  d.OWNER
       ,d.OBJECT_NAME
       ,d.OBJECT_TYPE
       ,d.status
FROM dba_objects d
WHERE d.status = 'INVALID'
AND d.owner = '**';

3.查看delete进程pid,系统级kill掉。

--查询SID, SERIAL#
select s.SQL_TEXT, se.SID, se.SERIAL#
  from v$session se, v$sql s
 where s.sql_id = se.SQL_ID
   and username = '**'
   and status = 'ACTIVE'
   and s.SQL_TEXT like '%delete * from *****%';
--数据库级kill进程
alter system kill session '2953,31083';

报错

ERROR at line 1:
ORA-00031: session marked for kill
--系统级 kill进程
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=2953;
kill -9 105257

4.观察undo回滚情况

--查看等待事件
select inst_id,event,count(*)
  from gv$session a
 where a.status='ACTIVE'
 and not (a.type = 'BACKGROUND' and a.state='WAITING' and  a.wait_class='Idle')
 group by inst_id,event
 order by a.inst_id,count(*) desc;
---------------------------------------------------
1	wait for a undo record	61
1	resmgr:cpu quantum	29
1	enq: RO - fast object reuse	22
1	enq: CR - block range reuse ckpt	20
1	free buffer waits	17
--查看当前数据回滚情况
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select usn,
       state,
       undoblockstotal "Total",
       undoblocksdone "Done",
       undoblockstotal - undoblocksdone "ToDo",
       decode(cputime,
              0,
              'unknown',
              sysdate + (((undoblockstotal - undoblocksdone) /
              (undoblocksdone / cputime)) / 86400)) "Estimated time to complete"
  from v$fast_start_transactions
  where state = 'RECOVERING';
---------------------------------------------------
83	RECOVERING	9026713	455	9026258	26-4月 -21

5.观察系统负载,IO负载,内存使用情况

6.等待回滚完成,持续时间较久。

7.回滚成功后,rename 原表。

rename table to table_20210410;

8.CTAS将需要的数据捞到新表(原来的表名)中。

create table USER.TABLE
nologging
parallel 8
tablespace TBS
as select /*+parallel(TABLE,'8')*/ *
from USER.TABLE_20210410
where *** like '******%';
--取消并行
alter table USER.TABLE noparallel;
--开启logging
alter table USER.TABLE logging;

9.rename索引,并重建索引。

alter index USER.INDEX1 rename to INDEX1_20210410;
--重建索引
create index USER.INDEX1 on USER.TABLE (***) tablespace TBS parallel 8;
--取消并行
alter index USER.INDEX1 noparallel;

10.创建约束,授权。

11.比对无效对象,数据是否一致

12.drop掉rename的表。

drop table USER.TABLE_20210410 cascade;

以上就是大表delete删数据导致数据库异常解决的详细内容,更多关于delete删数据数据库异常的资料请关注我们其它相关文章!

(0)

相关推荐

  • MySQL delete删除数据后释放磁盘空间的操作方法

    目录 一.删除表|清空数据表 二.删除表数据 三.优化表空间 当 MySQL 数据库服务删除部分数据后:有些情况下这些数据占用的存储空间会释放掉,有些情况这些存储空间则不会释放.以下是对这种情况的简单说明: 一.删除表|清空数据表 当执行删除数据表或者清空数据表的全部数据操作时,都会释放掉相应的磁盘存储空间. drop table table_name; truncate table table_name; 在MyISAM和InnoDB(innodb_file_per_table)存储引擎中,数

  • oracle数据库删除数据Delete语句和Truncate语句的使用比较

    当表中的数据不需要时,则应该删除该数据并释放所占用的空间,删除表中的数据可以使用Delete语句或者Truncate语句,下面分别介绍. 一.delete语句 (1)有条件删除 语法格式:delete [from] table_name [where condition]; 如:删除users表中的userid为'001'的数据:delete from users where userid='001'; (2)无条件删除整个表数据 语法格式:delete table_name; 如:删除user

  • MySQL Delete 删数据后磁盘空间未释放的原因

    问题描述 在 MySQL 中使用 delete 语句删除数据之后,监控视图中可用的磁盘空间没有增加,磁盘使用率没有下降等等. 解决方案 delete 不释放空间是 MySQL 自身机制的原因,需要重建表才可以释放磁盘空间,可以参考的操作: 执行 optimize table ${table_name}. 如果是 InnoDB 的表,执行 alter table ${table_name} engine = innodb. 需要注意以下两个问题: 这两个命令都会重建表,尽量不要在磁盘空间紧张(>9

  • delete误删数据使用SCN号恢复(推荐)

    问题描述:使用scn号恢复误删数据 1.查询系统闪回的scn值以及当前日志的scn值,因为我这个是测试,创建的表是在在后边,所以scn值要大于下边这两个scn值,所以对我恢复数据没有用,如果我创建的数据是在下边这两个SCN值之前,也就是比这两个时间点SCN值小,就可以用这两个scn用来恢复数据,但是我下边这个实验创建的测试表晚,就不行了 SQL> select dbms_flashback.get_system_change_number from dual; SQL> select curr

  • 你也许连删库跑路都不会(delete、drop和truncate删除数据)

    前言 这两年 IT 界隔三岔五的出现一次程序员删库的新闻,这种删库跑路的行为往往会给受害公司造成很大的损失,甚至会导致一个公司的破产.我们程序员看到这类新闻的时候很大一部分会把它当作一个闲聊的摊子,但是各位读者你是否想过这么一个问题:我知道怎么正确删库吗?看到这里估计有读者会感觉删库谁不会啊 Delete 以下呗.如果你这么想的话那就接着看这篇文章吧,在后面的内容中我将讲解数据库删除数据的方式以及原理. 在 MySQL 中有三种删除数据的方式,分别是 delete.drop 和 truncate

  • oracle delete误删除表数据后如何恢复

    1.根据时间进行恢复 此种方式需要我们大致知道执行delete语句的时间. 查询系统当前时间:select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss’) from dual; 假设在2022-04-02 16:27:11分钟,执行了删除语句delete from demo ; 此时已经表中不能查询到数据了.我们知道delete执行的时间,往前推1分钟(delete执行时间之前都可以,越小越好,本例以1分钟为例),执行如下语句 select * from DEM

  • 大表delete删数据导致数据库异常解决

    目录 一.问题描述 二.查看数据库情况 三.提出方案 四.执行过程 一.问题描述 早上正在上班路上,群里客户说,有一张24G的大表,delete删了26小时还没有跑完,目前进程还在跑让帮忙处理下,停止当前进程,并保留对应条件的数据,多余数据删掉. 二.查看数据库情况 1.未开归档 2.UNDO表空间爆满 三.提出方案 1.经过沟通,该表为测试数据表,目前没有在使用: 于是打算rename该表,通过ctas的方式去将需要的数据捞出来,重建索引和相关约束. 2.存在一个问题:delete进程已经执行

  • 解决layui table表单提示数据接口请求异常的问题

    问题一:直接拿别人的文件放在本地打开 如下图 原因:这是提示"交叉源请求仅支持协议方案:HTTP.数据.Chrome.Chrome扩展.HTTPS." 也就是你不能用本地文件打开,本地打开是file:///C:/Users/Administrator/Desktop/git/layui_table1.html 可以在本地服务器上展示没有问题 http://localhost/git/layui_table1.html 问题二:返回数据格式不符合要求(经常是这样的) 输出格式为 { &q

  • asp实现批量插入表单中的数据到数据库的方法

    input域指定相同name属性,而后你requet.form来这个值是以逗号分割的字符串,分割字符串为数组,然后遍历,并执行sql语句.

  • 如何将Oracle的一个大数据表快速迁移到 Sqlserver2008数据库(图文教程)

    oracle 服务器  版本  11.2.0.1.0 Sqlserver2008  R2 前提条件是 SQLSERVER服务器上安装了Oracle客户端并且进行了配置 不会配置的请参照 这个链接 1  登录MSSM 工具 2 选中其中一个数据库  右键⇒任务⇒导入数据 3   打开窗口 Sqlserver导入和导出向导   点击下一步 4 进入选择数据源画面 a: 数据源 选择  Microsoft OLE DB Provider for Oracle  然后 点击 右侧的 属性 按钮 5  数

  • mysql 大表批量删除大量数据的实现方法

    问题参考自:https://www.zhihu.com/question/440066129/answer/1685329456 ,mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业和个体户,个体户的数据量差不多占50%,根据条件把个体户的行都删掉.请问如何操作?答案为个人原创 假设表的引擎是 Innodb, MySQL 5.7+ 删除一条记录,首先锁住这条记录,数据原有的被废弃,记录头发生变化,主要是打上了删除标记.也就是原有的数据 deleted_flag

  • 关于Spring的@Transaction导致数据库回滚全部生效问题(又删库跑路)

    1 前言 很多需要使用事务的场景,都只是在方法上直接添加个@Transactional注解 但是,你以为这真的够了吗? 事务如果未达到完美效果,在开发和测试阶段都难以被发现,因为你难以考虑到太多意外场景.但当业务数据量发展,就可能导致大量数据不一致的问题,就会造成前人栽树后人踩坑,需要大量人力排查解决问题和修复数据. 2 如何确认Spring事务生效了? 使用@Transactional一键开启声明式事务, 这就真的事务生效了?过于信任框架总有"意外惊喜".来看如下案例 领域层 实体

  • Postgresql删除数据库表中重复数据的几种方法详解

    一直使用Postgresql数据库,有一张表是这样的: DROP TABLE IF EXISTS "public"."devicedata"; CREATE TABLE "public"."devicedata" ( "Id" varchar(200) COLLATE "pg_catalog"."default" NOT NULL, "DeviceId&qu

  • 从云数据迁移服务看MySQL大表抽取模式的原理解析

    摘要:MySQL JDBC抽取到底应该采用什么样的方式,且听小编给你娓娓道来. 小编最近在云上的一个迁移项目中被MySQL抽取模式折磨的很惨.一开始爆内存被客户怼,再后来迁移效率低下再被怼.MySQL JDBC抽取到底应该采用什么样的方式,且听小编给你娓娓道来. 1.1 Java-JDBC通信原理 JDBC与数据库之间的通信是通过socket完,大致流程如下图所示.Mysql Server ->内核Socket Buffer -> 客户端Socket Buffer ->JDBC所在的JV

  • php使用PDO从数据库表中读取数据的实现方法(必看)

    创建了PDO对象后,就可以通过创建的对象进行数据检索了.查询数据我们可以使用PDO::query()方法,具体代码如下: try{ $pdo=new PDO('mysql:host=localhost;dbname=alpha','root','password'); }catch(PDOException $e){ echo "数据库连接失败,原因是:".$e->getMessage(); } //从数据库中选择数据,并将结果赋予一个变量,testtable为数据库表 $res

随机推荐