如何在 mysqldump 中只删除一个 table 的数据?

how to drop data of only one table in mysqldump?

我的情况:网上商店 运行 Shopware6,数据库很大(总共 34GB)但大部分是日志(table log_entry = 28GB)和保存的购物车(table cart = 3GB)。

我想做一个 mysqldump,但是对于 2 tables log_entrycart,我只想保存模式。

我知道如何只为所有带有 --no-data 标志的 table 做架构,或者只为带有 --no-create-info 标志的数据做架构并忽略 table --ignore-table=[tablename].

我最好选择做 2 个转储,一个只包含模式,另一个只包含数据,而我忽略了 2 个 tables?

那会得到

mysqldump -u user -p $dbname --no-data > backup_schema.sql
mysqldump -u user -p $dbname --no-create-info --ignore-table=$dbname.cart --ignore-table=$dbname.log_entry > backup_data.sql

如果可行,这可能是您最好的选择。虽然,是否可以直接在您的环境中发送 SQL 语句?另一种方法可能是使用 SQL 语句将数据导出为 CSV 格式,以获取您想要的确切数据。此代码将只获取数据(用户名、电子邮件和状态):

SELECT username, email, state
FROM TABLENAME
INTO OUTFILE '/temp/yourdata.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

这个将把列和数据放在一起:

SELECT 'username', 'email', 'state'
UNION ALL
SELECT username, email, state
FROM TABLENAME
INTO OUTFILE '/temp/yourdatafull.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

我知道这可能不是您正在寻找的确切答案,但它可能会为您提供辅助或替代备份方法的替代想法。或者至少将一个可以轻松加载到 excel 中的文件放在一起很方便,您可以使用它来进行一些手动计算或数据挖掘。虽然缺点是我相信如果你这样做,它会在你进行连接时使用第一个数据类型,所以如果你有日期或数字,它可能会有点混淆。此外,如果您将 --secure-file-priv 设置为 ON,您将只能输出到 MySQL 设置中直接指定的特定位置。

当然,如果您有一个将整数和日期保存为字符串的环境,我认为您应该没问题。肯定需要对此进行一些测试,如果您想了解有关此方法的更多信息,只是在这里偶然发现了它:

https://www.databasestar.com/mysql-output-file/

如果你想使用原生的mysqldump,你自己已经提到过两次调用是不可避免的。

我们使用 SmileSA 的 GDPRdump 工具来处理此类工作,您可以在转储期间省略(截断)甚至匿名化数据。

GitHub 上已有一个 Shopware 6 模板 https://github.com/portaltech-reply/gdpr-dump-shopware

一种不太复杂的解决方案,它基本上以更灵活的方式完成您已经尝试过的操作并放入一个转储文件中,是 https://github.com/amenk/SelfScripts/blob/master/mysql-stripped-dump (self-link)