Mysql占用整个数据库的10-20%的一些部分

时间:2018-05-22 10:51:47

标签: mysql database database-dump

我知道要进行数据库转储我可以忽略一些表。 但我想把所有表的转储与一些百分比的数据,如20%40%,因为整个转储太大了。 这是我的普通转储查询。

mysqldump -h dburl -u user -p password --databases dbname > dbname.sql

我不是在寻找特定的操作系统并使用Linux Ubuntu。

3 个答案:

答案 0 :(得分:3)

80-20 rule表示最小80%的表可能只消耗20%的空间。所以有一个mysqldump为他们。

然后为每个剩余的表小于20%的空间提供更多的mysqldump。

最后,任何大表都需要Nambu14提到的--where选项。或者,您可以尝试说出--where="true LIMIT 20000,10000"隐藏OFFSETLIMIT 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