我知道可以忽略一些表来进行数据库备份。 但是我想备份所有表的数据,只需要备份其中20%或40%的数据,因为整个备份文件太大了。 这是我的正常备份查询。
mysqldump -h dburl -u user -p password --databases dbname > dbname.sql
我不在寻找具体的操作系统,而是使用Linux Ubuntu。
我知道可以忽略一些表来进行数据库备份。 但是我想备份所有表的数据,只需要备份其中20%或40%的数据,因为整个备份文件太大了。 这是我的正常备份查询。
mysqldump -h dburl -u user -p password --databases dbname > dbname.sql
我不在寻找具体的操作系统,而是使用Linux Ubuntu。
80-20规则指出,最小的80%的表可能只占用20%的空间。因此,为它们准备一个mysqldump。
然后,对于每个剩余的小于20%空间的表,都要有更多的mysqldump。
最后,任何大表都需要Nambu14提到的--where
选项。或者,您可以尝试使用--where="true LIMIT 20000,10000"
的方法来偷偷地添加OFFSET
和LIMIT
。(请参见https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html中的评论之一)。但是在这样做时不要允许对表进行写入操作,否则可能会导致额外/缺失的记录。
LIMIT
糟糕的情况。幸运的是,您可以硬编码所需的范围值,例如--where="my_pk >= 'def' AND my_pk < 'mno'"
不要忘记处理触发器、存储过程、视图等。听起来您想避免编写脚本,一个快速的解决方案是使用mysqldump的--where
选项。
mysqldump --opt --where="1 limit 1000" myschema
mysqldump --opt --where="1 limit 1000 offset 1000" --no-create-info myschema
mysqldump --opt --where="1 having rand() < 0.40" myschema
mysqldump -h dburl -u user -p password --no-data --databases dbname > dbname.schema.sql
,然后使用一系列的SELECT ... INTO OUTFILE
语句进行数据表数据的筛选和导出。最后,使用LOAD DATA INFILE
语句将数据加载回去。详情请参见 https://dev.mysql.com/doc/refman/8.0/en/select-into.html。 - Yuri Lachin