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

发布于:2025-03-06 ⋅ 阅读:(8) ⋅ 点赞:(0)

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

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

如需转载,标记出处

目录

pt-archiver命令格式

如果执行后出现下面报错

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)

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)

报错原因

解决方法


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

TRUNCATE TABLE LargeTable
 GO

pt-archiver命令格式

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

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一定要和表中的列名保持一致,大小写也一样

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';


#创建新的 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里面验证是否生效 执行:

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.

表明时间戳出错

解决办法

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

-- 临时禁用严格模式
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博客


网站公告

今日签到

点亮在社区的每一天
去签到