广告
返回顶部
首页 > 资讯 > 数据库 >MySQL怎么删除数据
  • 444
分享到

MySQL怎么删除数据

2024-04-02 19:04:59 444人浏览 安东尼
摘要

这篇文章主要介绍了Mysql怎么删除数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 在oracle里面对于

这篇文章主要介绍了Mysql怎么删除数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

oracle里面对于数据清理,如果是非分区表,目前我经常的处理思路是下面三个。
第一种是中规中矩,做好备份,然后开始清理,当然这种情况只是说明数据清理的部分,不考虑高水位线的影响。可以使用shrink,move tablespace等来处理。
补充一句,其实这个dump这是一种形式,可以采用各种形式的数据导出格式,比如sqlldr适用的csv,比如外部表,比如expdp,exp的导出二进制dump等。
MySQL怎么删除数据
第二种思路是逻辑备份,就是把表采用ctas的方式备份一份。然后对原来的表进行数据清理。这种情况下,占用的是数据库内的数据空间。
MySQL怎么删除数据
第三种思路是迂回战术,就是把原表改一个别名,然后新建一个同名的表(表里没有数据,只有表结构),然后把需要的增量数据插入到新表中.
MySQL怎么删除数据
这种思路在mysql里面也是类似,不过值得一提的是MySQL的rename着实比较牛,因为MySQL中的database和Oracle中的user的含义有些类似,MySQL里面很轻松的使用rename操作把一个数据库A中的表TEST很轻松的rename倒数据库B里面。
最近开发的同事反馈有一个业务的查询着实太慢,结果分析下来发现一种改善思路就是删除旧数据。因为确实很长时间没有清理了。
简单和开发沟通了一下,其实有几种思路可以走,不过就看具体的需求了。开发说保留近半年的数据,提供的清理sql如下。
半年以前的数据有大概300万。
mysql> select count(*)from recharge where occur_time<'2015-07-01 00:00:00';
+----------+
| count(*) |
+----------+
|  2945974 |
+----------+
1 row in set (1 min 20.13 sec)
需要保留的数据有50多万。
mysql> select count(*)from fact_recharge where occur_time > '2015-07-01 00:00:00';
+----------+
| count(*) |
+----------+
|   550422 |
+----------+
1 row in set (1 min 25.46 sec)
所以按照这个比例,其实选用第三种方法看起来要好些,不过限于本地的空间,而且开发说这个表删除的旧数据需要查看,恢复的可能性极小,所以我就一次弄干净点,直接物理备份出来清理,采用了第一种方式。
简单评估之后就开始操作。
先开始做备份。
mysqldump --default-character-set=UTF8 --single-transaction -q -R --triggers --tables test_ad xxxx_reGok  |gzip > /data2/dba/databak/tab_bak/full_20150203_us_test_ad_xxxx_regok.sql.gz
然后就按照常规思路开始删除,不过看起来很简单的删除竟然还报错了。
mysql> delete from recharge where occur_time<'2015-07-01 00:00:00';
ERROR 1197 (HY000): Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
这个错误看来和binlog的cache size有很大的关系,目前的binlog设置如下
mysql> show variables like '%binlog%';
+-----------------------------------------+----------------------+
| Variable_name                           | Value                |
+-----------------------------------------+----------------------+
| binlog_cache_size                       | 4194304              |
| binlog_direct_non_transactional_updates | OFF                  |
| binlog_fORMat                           | ROW                  |
| binlog_stmt_cache_size                  | 32768                |
| innodb_locks_unsafe_for_binlog          | OFF                  |
| max_binlog_cache_size                   | 536870912            |
| max_binlog_size                         | 1073741824           |
| max_binlog_stmt_cache_size              | 18446744073709547520 |
| sync_binlog                             | 0                    |
+-----------------------------------------+----------------------+
9 rows in set (0.00 sec)
而且比较纠结的是这个环境是采用了级联复制,动一处需要联动修改多处。目前的binlog cache size是500M左右。删除的数据肯定要大于这个cache_size.
所以这个时候还得使用另外一种迂回战术,那就是分批删了。可以考虑使用datediff来作为一个基准删除。
现在距离2015年7月1日有217天的时间差,那么我们就按照这个时间差来做点文章,分批删除。
mysql> select datediff(now(),'2015-07-01 00:00:00') ;
+---------------------------------------+
| datediff(now(),'2015-07-01 00:00:00') |
+---------------------------------------+
|                                   217 |
+---------------------------------------+
1 row in set (0.00 sec)
当前时间为:
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2016-02-03 00:01:28 |
+---------------------+
1 row in set (0.00 sec)
当然老是喜欢用oracle的语句检验一下。
SQL> SQL> select sysdate-217 from dual;
SYSDATE-217
-------------------
2015-07-01 16:02:03
好了,开始删除数据,可以使用下面的语句,不过还需要改进一下。
delete from fact_recharge where datediff(now(),occur_time) >217
那么删除的边界值怎么确定呢。
mysql> select max(datediff(now(),occur_time)) from fact_recharge where datediff(now(),occur_time) >217 ;
+---------------------------------+
| max(datediff(now(),occur_time)) |
+---------------------------------+
|                           16835 |
+---------------------------------+
1 row in set (3.69 sec)
这个结果让我有些无语,应该是里面有一些数据不光旧,而且还有问题。
SQL>select sysdate-16835 from dual
SYSDATE-16835
-------------------
1969-12-31 16:04:59
需要调节删除的跨度。
mysql> delete from recharge where datediff(now(),occur_time)>218 and  datediff(now(),occur_time) < 800;
ERROR 1197 (HY000): Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
mysql> delete from recharge where datediff(now(),occur_time)>218 and  datediff(now(),occur_time) < 300;
Query OK, 310067 rows affected (36.78 sec)
mysql> delete from recharge where datediff(now(),occur_time)>300 and  datediff(now(),occur_time) < 500;
Query OK, 1065870 rows affected (1 min 50.08 sec)
mysql> delete from recharge where datediff(now(),occur_time)>500 and  datediff(now(),occur_time) <700;
Query OK, 1021640 rows affected (1 min 59.31 sec)
mysql> delete from recharge where datediff(now(),occur_time)>700 and datediff(now(),occur_time) < 1000;
Query OK, 505048 rows affected (2 min 29.91 sec)
数据已经大体删除,我们可以使用修改存储引擎达到释放碎片的目的了。
mysql> alter table recharge  engine=InnoDB;
Query OK, 594253 rows affected (4 min 19.94 sec)
Records: 594253  Duplicates: 0  Warnings: 0
修改之后,删除了大概2G左右的空间。
# ll recharge*|du -sh .
33G     .
# ll recharge*|du -sh .
31G     .
当然刚刚的删除还做了一些保留,为了对比,再次尝试,删除的工作就很快了。
mysql> delete from recharge where datediff(now(),occur_time)>1000;
Query OK, 25712 rows affected (2.03 sec)
mysql> delete from recharge where datediff(now(),occur_time)>218;
Query OK, 14400 rows affected (1.05 sec)
所以通过这个小的尝试也可以看出来其实有些处理思路还是相通的,但是技术细节上还有很多需要继续琢磨的地方。

感谢你能够认真阅读完这篇文章,希望小编分享的“MySQL怎么删除数据”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网数据库频道,更多相关知识等着你来学习!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL怎么删除数据

本文链接: https://www.lsjlt.com/news/62630.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL怎么删除数据
    这篇文章主要介绍了MySQL怎么删除数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 在Oracle里面对于...
    99+
    2022-10-18
  • mysql怎么删除数据库
    这篇文章主要介绍了mysql怎么删除数据库,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。mysql怎么删除数据库1. 通过win+r快...
    99+
    2022-10-18
  • MySQL怎么删除字段数据
    要删除MySQL数据库中的字段数据,可以使用DELETE语句。以下是删除字段数据的方法: 删除整个表中的数据: DELE...
    99+
    2023-10-30
    MySQL
  • MySQL中怎么删除数据库
    今天就跟大家聊聊有关MySQL中怎么删除数据库,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。MySQL 删除数据库使用 mysqladmi...
    99+
    2022-10-18
  • MYSQL怎么批量删除数据
    这篇文章主要介绍“MYSQL怎么批量删除数据”,在日常操作中,相信很多人在MYSQL怎么批量删除数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MYSQL怎么批量删除数据”...
    99+
    2022-10-18
  • MySQL数据误删除怎么办
    小编给大家分享一下MySQL数据误删除怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!概述Binlog2sql是一个Pyth...
    99+
    2022-10-18
  • mysql怎么删除重复数据
    这篇文章主要讲解了“mysql怎么删除重复数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql怎么删除重复数据”吧!sku对应的重量表,应该一个sk...
    99+
    2022-10-19
  • 怎么彻底删除mysql数据库
    要彻底删除MySQL数据库,需要执行以下步骤:1. 进入MySQL命令行界面,可以使用以下命令登录:```mysql -u root...
    99+
    2023-08-16
    mysql数据库
  • mysql误删除数据怎么恢复
    这篇文章主要介绍“mysql误删除数据怎么恢复”,在日常操作中,相信很多人在mysql误删除数据怎么恢复问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql误删除数据怎么...
    99+
    2022-10-18
  • MySQL中怎么删除多表数据
    MySQL中怎么删除多表数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  MySQL删除多表数据有哪些问题  1、delete...
    99+
    2022-10-18
  • 主机怎么删除mysql数据库
    主机删除mysql数据库的方法:打开控制面板,点击程序和功能,卸载MySQL server服务。在桌面按下win+r键,运行reqedit,按HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\...
    99+
    2022-10-09
  • MySQL 删除数据 批量删除(大量)数据
    在删除数据的时候根据不同的场景使用不同的方法,比如说删除表中部分数据、删除表的结构、删除所有记录并重置自增ID、批量删除大量数据等,可以使用delete、truncate、drop等语句。 一、方法分类 二、具体方法 类型语句删...
    99+
    2023-08-30
    mysql 数据库 java
  • MySQL 删除数据库
    MySQL 删除数据库使用 mysqladmin 删除数据库使用普通用户登陆mysql服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库。所以我们这边使用root用户登录,root用户拥有最高权...
    99+
    2022-10-18
  • MySQL删除数据库
    目录 一、drop命令删除数据库 二、使用mysqladmin删除数据库 三、使用PHP脚本删除数据库 一、drop命令删除数据库 使用普通用户登陆 MySQL 服务器,可能需要特定的权限来创建或者删除 MySQL 数据库,所以这边使用...
    99+
    2023-08-31
    数据库 mysql php
  • MySQL中怎样删除数据库
    MySQL中怎样删除数据库,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。drop命令删除数据库  drop命令格式:  dro...
    99+
    2022-10-18
  • Mysql误删除数据库怎么恢复
    这篇文章主要讲解了“Mysql误删除数据库怎么恢复”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mysql误删除数据库怎么恢复”吧! ...
    99+
    2022-10-18
  • mysql误删除表内数据怎么办
    这篇文章主要介绍了mysql误删除表内数据怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 #添加数据 insert into te...
    99+
    2022-10-18
  • mysql数据库误删除后怎么办
    小编给大家分享一下mysql数据库误删除后怎么办,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!首先,要确保mysql开启了binlog日志功能在/etc/my.cnf文件里的[mysqld...
    99+
    2022-10-18
  • 怎么使用PHP删除MySQL数据库
    本篇内容主要讲解“怎么使用PHP删除MySQL数据库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用PHP删除MySQL数据库”吧!删除一个数据库如果数据库不再需要那么它将可以被永远删除。...
    99+
    2023-06-20
  • MySQL数据库中怎么恢复误删除数据
    本篇文章为大家展示了MySQL数据库中怎么恢复误删除数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 找到binlog恢复数据的前提是必须开启Mysql的bi...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作