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博客

相关推荐
未来并未来23 分钟前
深入解析MyBatis中一对一与一对多映射的实现方法与区别
java·数据库·mybatis
ken_coding24 分钟前
使用mybatis plus的@Select自定义sql时,如何实现通用的分页查询?
数据库·spring boot·sql·mybatis plus
微微%25 分钟前
mongodb安装教程以及mongodb的使用
数据库·mongodb
obboda1 小时前
web高可用集群项目(数据库主从同步、文件共享存储、nginx动静分离+负载均衡+高可用)
数据库·nginx·负载均衡
m0_748246351 小时前
MySQL Workbench安装教程以及菜单汉化
android·数据库·mysql
编程修仙1 小时前
mysql的管理
数据库·mysql·oracle
CodeJourney.2 小时前
Deepseek助力思维导图与流程图制作:高效出图新选择
数据库·人工智能·算法
2的n次方_2 小时前
Redis 中如何保证缓存与数据库的数据一致性
数据库·redis·缓存
m0_748247552 小时前
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
java·开发语言·数据库
Elastic 中国社区官方博客2 小时前
通过计费集成和警报监控 Elasticsearch Service 成本
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索