pt-archiver删除数据库的数据表/各种报错类型

这篇帖子是前面文的一部分延申

mysqlimport导入一亿数据的csv文件/一行命令删除表-CSDN博客

如需转载,标记出处

目录

pt-archiver命令格式

如果执行后出现下面报错

[1)Cannot find an ascendable index in table at /usr/bin/pt-archiver line 3233.](#1)Cannot find an ascendable index in table at /usr/bin/pt-archiver line 3233.)

[2)ERROR 1030 (HY000): Got error 100 - 'InnoDB error' from storage engine或者ERROR 3 (HY000): Error writing file '/tmp/MLfd=35' (OS errno 28 - No space left on device)](#2)ERROR 1030 (HY000): Got error 100 - 'InnoDB error' from storage engine或者ERROR 3 (HY000): Error writing file '/tmp/MLfd=35' (OS errno 28 - No space left on device))

[3)DBD::mysql::st execute failed: Incorrect TIMESTAMP value: '0000-00-00 00:00:00' [for Statement "SELECT /*!40001 SQL_NO_CACHE */ `userid`,`itemid`,`categoryid`,`timestamp` FROM `uba`.`userBehavior` FORCE INDEX(`idx_userid`) WHERE (timestamp != '0000-00-00 00:00:00') ORDER BY `userid` LIMIT 1000"] at /usr/bin/pt-archiver line 6586.](#3)DBD::mysql::st execute failed: Incorrect TIMESTAMP value: '0000-00-00 00:00:00' [for Statement "SELECT /*!40001 SQL_NO_CACHE */ userid,itemid,categoryid,timestamp FROM uba.userBehavior FORCE INDEX(idx_userid) WHERE (timestamp != '0000-00-00 00:00:00') ORDER BY userid LIMIT 1000"] at /usr/bin/pt-archiver line 6586.)

4)文件系统根目录上的磁盘空间不足

5)ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2))

报错原因

解决方法


这个删除好慢要等挺久的,如果要数据表里的数据全删,直接用就好了

lang-sql 复制代码
TRUNCATE TABLE LargeTable
 GO

pt-archiver命令格式

先下载一个pt-archiver,时间太久忘记原来的命令了,复制黏贴下面的命令他会提示你安装命令

bash 复制代码
pt-archiver --source h=127.0.0.1,D=uba,t=userBehavior \
> --purge --limit 10000 --commit-each --no-check-charset \
> --where "timestamp = '0000-00-00 00:00:00'" \
> --user root --password 'root'

解释:

  • --source h=127.0.0.1,D=uba,t=userBehavior:指定 MySQL 数据库连接的主机(127.0.0.1),数据库名(uba)以及表名(userBehavior)。
  • --purge:在删除数据后,直接从数据库中删除这些记录,而不是将其转移到其他地方。
  • --limit 10000:控制每次处理的记录数,增加它的值可以减少操作次数
  • --commit-each:每删除一批数据(1000条),就立即提交事务,确保数据删除不会因为其他问题导致回滚。
  • -no-check-charset 跳过字符集检查,减少不必要开销
  • --where "timestamp = '0000-00-00 00:00:00'":仅删除 timestamp 等于 '0000-00-00 00:00:00' 的记录
  • --user root --password 'root':使用用户名 root 和密码 'root' 进行 MySQL 连接。

整体来说,这条命令的目的是从 userBehavior 表中按批次删除数据,每次删除最多 1000 条记录,且仅删除 timestamp 字段为 '0000-00-00 00:00:00' 的记录。

如果执行后出现下面报错

1)Cannot find an ascendable index in table at /usr/bin/pt-archiver line 3233.

说明没创建索引

其中id_userID下划线后面的userID一定要和表中的列名保持一致,大小写也一样

sql 复制代码
CREATE INDEX idx_userID ON userBehavior(userID);

2)ERROR 1030 (HY000): Got error 100 - 'InnoDB error' from storage engine或者ERROR 3 (HY000): Error writing file '/tmp/MLfd=35' (OS errno 28 - No space left on device)

这俩表明存储不够,将存储目录tmpdir 移动到更大的分区

1.显示数据库服务器的临时目录路径。

SHOW VARIABLES LIKE 'tmpdir';

bash 复制代码
#创建新的 tmpdir 目录

sudo mkdir -p /mnt/mysqltmp
sudo chown -R mysql:mysql /mnt/mysqltmp
sudo chmod 1777 /mnt/mysqltmp  # 确保目录对 MySQL 具有正确权限

#修改 MySQL 配置 编辑 MySQL 配置文件(通常是 /etc/mysql/my.cnf 或 /etc/my.cnf)
#Ubuntu/Debian: /etc/mysql/my.cnf 是主配置文件
#CentOS/RHEL: /etc/my.cnf 是默认的主配置文件

[mysqld]
tmpdir=/mnt/mysqltmp


#重启 MySQL 以使更改生效

sudo systemctl restart mysql
sql 复制代码
--sql里面验证是否生效 执行:

SHOW VARIABLES LIKE 'tmpdir';

如果你的mnt也满了,换更大空间的目录,我自己用/dev/shm/mysqltmp成功的

成功了!!

3)DBD::mysql::st execute failed: Incorrect TIMESTAMP value: '0000-00-00 00:00:00' [for Statement "SELECT /*!40001 SQL_NO_CACHE */ `userid`,`itemid`,`categoryid`,`timestamp` FROM `uba`.`userBehavior` FORCE INDEX(`idx_userid`) WHERE (timestamp != '0000-00-00 00:00:00') ORDER BY `userid` LIMIT 1000"] at /usr/bin/pt-archiver line 6586.

表明时间戳出错

解决办法

关掉严格模式(临时性解决)

sql 复制代码
-- 临时禁用严格模式
SET GLOBAL sql_mode = '';


-- 恢复严格模式
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

4)文件系统根目录上的磁盘空间不足

我自己的虚拟机已经扩充过一次,直接去看教程吧

【2023年全新保姆级教程】解决Ubuntu文件系统磁盘空间不足low disk space on filesystem root-CSDN博客

5)ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

报错原因

这个报错大部分情况下是配置文件和sock文件的问题。今天下午按照常规处理实在没辙了,直接返回之前的快照。现在晚上又遇到它了,冤家路窄,结果我搞定了

数据库存储的太多,日志文件满了

比如我的

解决方法

这个问题有点普遍,我单开了一篇

如何安全清理无用以释放磁盘空间(开源+节流)-CSDN博客

相关推荐
消失在人海中5 分钟前
oracle sql 语句 优化方法
数据库·sql·oracle
Clang's Blog9 分钟前
一键搭建 WordPress + MySQL + phpMyAdmin 环境(支持 PHP 版本选择 & 自定义配置)
数据库·mysql·php·wordpr
zzc92114 分钟前
MATLAB仿真生成无线通信网络拓扑推理数据集
开发语言·网络·数据库·人工智能·python·深度学习·matlab
未来之窗软件服务35 分钟前
JAVASCRIPT 前端数据库-V1--仙盟数据库架构-—-—仙盟创梦IDE
数据库·数据库架构·仙盟创梦ide·东方仙盟数据库
LjQ204043 分钟前
网络爬虫一课一得
开发语言·数据库·python·网络爬虫
烙印6011 小时前
MyBatis原理剖析(二)
java·数据库·mybatis
RestCloud1 小时前
如何通过ETLCloud实现跨系统数据同步?
数据库·数据仓库·mysql·etl·数据处理·数据同步·集成平台
你是狒狒吗1 小时前
TM中,return new TransactionManagerImpl(raf, fc);为什么返回是new了一个新的实例
java·开发语言·数据库
Channing Lewis2 小时前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠2 小时前
MySQL安装与配置
数据库·mysql·adb