我知道要进行数据库转储我可以忽略一些表。 但我想把所有表的转储与一些百分比的数据,如20%40%,因为整个转储太大了。 这是我的普通转储查询。
mysqldump -h dburl -u user -p password --databases dbname > dbname.sql
我不是在寻找特定的操作系统并使用Linux Ubuntu。
答案 0 :(得分:3)
80-20 rule表示最小80%的表可能只消耗20%的空间。所以有一个mysqldump为他们。
然后为每个剩余的表小于20%的空间提供更多的mysqldump。
最后,任何大表都需要Nambu14提到的--where
选项。或者,您可以尝试说出--where="true LIMIT 20000,10000"
隐藏OFFSET
和LIMIT
in。(请参阅https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html上的一条评论)< em>但在执行此操作时不允许写入表 - 这可能会导致额外/丢失记录。
或者您可以按照here所述调整分块技术。这可以避免额外/缺失问题并避免LIMIT
kludge。幸运的是,您可以硬编码像--where="my_pk >= 'def' AND my_pk < 'mno'"
不要忘记处理触发器,存储例程,视图等
答案 1 :(得分:2)
有一个类似的question open。使用 - where 选项,您可以限制 mysqldump (official documentation here)中包含的记录数量,但此选项适用于数据库中的每个表。
另一种方法是给命令一个sql脚本来运行和准备该脚本中的数据,这将作为伪ETL管道。
答案 2 :(得分:2)
听起来你想避免编写脚本,一个快速的解决方案是使用mysqldump的localhost
选项。
private static final String USERNAME = "root";
private static final String PASSWORD = "password";
private static final String CONN_STRING = "jdbc:mysql://localhost:3306/test";
public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(CONN_STRING,USERNAME,PASSWORD);
System.out.println("Connected");
}catch (SQLException e){
System.err.println(e);
}
}
这会将转储限制为1000行 - 显然会根据您的大小限制进行调整。
您可以使用偏移量转储来获取下一个1000 - 需要进行小幅调整,以便不重新创建表。
--where
你可以进一步混淆,比如你只想要随机选择的行中所有数据的40%:
mysqldump --opt --where="1 limit 1000" myschema