我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL怎么删除数据

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL怎么删除数据

这篇文章主要介绍了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怎么删除数据”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL怎么删除数据

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

下载Word文档

猜你喜欢

怎么删除mysql数据库数据

如何删除 mysql 数据库中的数据?使用 truncate table 命令快速删除所有记录,无需提交更改。使用 delete 语句逐行删除记录,可指定条件并触发删除触发器。显式设置 null 值删除列中的数据,保留记录。如何删除 MyS
怎么删除mysql数据库数据
2024-08-05

mysql数据库怎么删除数据

使用 delete 语句可从 mysql 数据库中删除数据:delete from {表名} where {条件}。步骤包括:连接数据库、选择数据库、编写 delete 语句、执行语句、验证删除。如何删除 MySQL 数据库中的数据删除
mysql数据库怎么删除数据
2024-08-05

mysql怎么删除行数据

MySQL删除行数据指南使用DELETE语句通过条件筛选删除表中的行。可指定WHERE子句指定条件,或默认删除所有行。其他选项包括:LIMIT:限制删除行数ORDERBY:按顺序删除TRUNCATE:快速删除所有行(不可回滚)对于大量数据,使用批量删除或分区表以提高效率。同时,备份数据并仔细审查语句,避免意外数据丢失。
mysql怎么删除行数据
2024-05-12

mysql中怎么删除数据库数据

mysql中删除数据的方法包括:删除整个数据库(drop database database_name;)、删除表中所有数据(truncate table table_name;)、删除表中特定行(delete from table_nam
mysql中怎么删除数据库数据
2024-08-05

mysql数据库怎么删除表数据

可以通过以下方法删除 mysql 表数据:1. truncate table:立即删除所有数据,重置自增主键值。2. delete 语句:逐行删除数据,可使用 where 子句指定条件。3. where 子句:用于指定要删除的行,支持比较和
mysql数据库怎么删除表数据
2024-08-05

mysql删除数据怎么恢复

已删除的 mysql 数据可以通过三种方法恢复:从备份恢复、使用 mysql 二进制日志或使用磁盘恢复工具,需注意数据未被覆盖,在操作前备份数据库。MySQL 数据恢复:删除数据的补救措施如何恢复已删除的 MySQL 数据?已删除的 M
mysql删除数据怎么恢复
2024-05-30

MySQL怎么删除字段数据

要删除MySQL数据库中的字段数据,可以使用DELETE语句。以下是删除字段数据的方法:删除整个表中的数据:DELETE FROM 表名;这将删除表中的所有数据,但保留表的结构。删除满足特定条件的数据:DELETE FROM 表名 W
MySQL怎么删除字段数据
2023-10-30

mysql怎么删除表数据库

使用 drop table 语句删除表,最简单的方法是直接删除,只需提供表名即可。级联删除则可以通过 cascade 选项删除表及其相关记录,而 restrict 选项只删除表,如果存在外键约束则会失败。如何用 MySQL 删除表直接删除
mysql怎么删除表数据库
2024-08-05

mysql数据库怎么删除列

可以通过以下步骤在 mysql 数据库中删除列:连接到数据库。选择要修改的数据库。使用 alter table 语句删除列,语法为:alter table table_name drop column column_name;如何在 MyS
mysql数据库怎么删除列
2024-08-05

mysql数据库怎么删除行

有三种方法从 mysql 数据库删除行:使用 delete 语句删除特定行,指定条件进行过滤。使用 truncate table 语句立即删除所有行,并重置自动增量计数器。使用 drop table 语句删除整个表,注意此操作不可撤销。如何
mysql数据库怎么删除行
2024-08-05

怎么删除mysql数据库表

要删除 mysql 数据库表,可以使用 drop table 语句,其中 table_name 为要删除的表名。该语句具有可选的 if exists 子句,可确保仅在表存在时才删除它。如需删除名为 users 的表,可使用 drop tab
怎么删除mysql数据库表
2024-08-05

mysql怎么删除数据库表

在MySQL中,删除数据库表可以使用DROP TABLE语句。这个操作会移除表及其所有的数据,因此在执行之前请确保已经备份了任何重要数据。以下是具体步骤:登录到MySQL服务器。打开命令行工具或终端,并使用mysql命令登录到MySQL服
mysql怎么删除数据库表
2024-05-22

怎么删除mysql的数据库

删除 mysql 数据库:使用 drop database 语句,如 drop database 数据库名;。如果数据库包含子对象,可使用 cascade 级联删除,如 drop database 数据库名 cascade;。在操作前,确认
怎么删除mysql的数据库
2024-08-05

怎么删除mysql数据库名

通过使用 drop database 命令,您可以删除 mysql 数据库,步骤包括:连接到服务器,选择要删除的数据库,执行 drop database 命令,并确认删除。如何删除 MySQL 数据库?步骤:连接到数据库服务器:使用 My
怎么删除mysql数据库名
2024-08-05

编程热搜

目录