【问题标题】:MySQL dump by queryMySQL 通过查询转储
【发布时间】:2010-10-30 10:49:03
【问题描述】:

SQL query可以做mysqldump吗?

我的意思是转储整个数据库,就像你导出到SQLphpmyadmin所做的那样

【问题讨论】:

    标签: sql mysql database


    【解决方案1】:

    如果您想从表中转储特定字段,这会很方便

    1/ 使用您的查询创建临时表。

    create table tmptable select field1, field2, field3 from mytable where filter1 and fileter2 ;
    

    2/ 转储整个临时表。然后你就有了包含特定字段的转储文件。

    mysqldump -u user -p mydatabase tmptable > my-quick-dump.sql
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

    如果要将最后 n 条记录导出到文件中,可以运行以下命令:

    mysqldump -u user -p -h localhost --where "1=1 ORDER BY id DESC LIMIT 100" database table > export_file.sql
    

    假设您要从中导出的表有一个自动递增的 id 列,以上内容会将最后 100 条记录保存到 export_file.sql。

    您将需要更改用户、本地主机、数据库和表的值。您可以选择更改 id 列和导出文件名。

    【讨论】:

      【解决方案3】:

      mysql导出查询结果命令行:

      mysql -h120.26.133.63 -umiyadb -proot123 miya -e "select * from user where id=1" > mydumpfile.txt
      

      【讨论】:

      • 它在 ubuntu 中为我工作,命令:mysql -h localhost -u root -p dbname -e "select * from users where id=1;select * from staffs where id=1" - -xml > /var/www/html/project/backups/db.xml
      【解决方案4】:

      MySQL Workbench 在 GUI 中也巧妙地具有此功能。只需运行查询,点击导出/导入旁边的保存图标:

      然后在列表中选择“SQL INSERT statements (*.sql)”。

      输入一个名称,点击保存,确认表名,你就会得到你的转储文件。

      【讨论】:

        【解决方案5】:

        结合上面的大部分内容是我真正的实际示例,根据 Meterid 和时间戳选择记录。我多年来一直需要这个命令。执行速度非常快。

        mysqldump -uuser -ppassword main_dbo trHourly --where="MeterID =5406 AND TIMESTAMP<'2014-10-13 05:00:00'" --no-create-info --skip-extended-insert | grep  '^INSERT' > 5406.sql
        

        【讨论】:

          【解决方案6】:

          不是mysqldump,而是mysql cli...

          mysql -e "select * from myTable" -u myuser -pxxxxxxxxx mydatabase
          

          如果需要,您可以将其重定向到文件:

          mysql -e "select * from myTable" -u myuser -pxxxxxxxx mydatabase > mydumpfile.txt
          

          更新: 原始帖子询问他是否可以通过查询从数据库中转储。他问的和他的意思是不同的。他真的只想 mysqldump 所有表。

          mysqldump --tables myTable --where="id < 1000"
          

          【讨论】:

          • 如何恢复这个转储的txt文件?
          • 对于那些尝试 mysql -e 方法的人。我不得不稍微定制一下脚本才能为我工作。这个需要你在运行时输入sql密码。 mysql -e "select * from table WHERE query = 'asdasd'" -u root -p --database=DBNAME > text.txt
          • 您可以为查询创建一个新表 (CREATE TABLE SELECT),然后使用 mysqldump 转储该表。这样您以后就可以轻松恢复它。
          • 想要使用mysqldump和恢复文件的可以看这里:stackoverflow.com/a/2431936/411786
          • 要导入使用 mysql -e 和 -B 选项导出的数据以制表符分隔,运行 mysqlimport --ignore-lines=1 --fields-terminated-by='\t '。见:stackoverflow.com/a/17071108/1676044
          【解决方案7】:

          您可以像这样将查询转储为 csv:

          SELECT * from myTable
          INTO OUTFILE '/tmp/querydump.csv'
          FIELDS TERMINATED BY ','
          ENCLOSED BY '"'
          LINES TERMINATED BY '\n'
          

          【讨论】:

          • 如果我想转储多个表怎么办。
          • 这会在运行 MySQL 数据库的机器上创建一个文件。因此,如果您从远程控制台查询,此方法将失败。如果也有从远程控制台执行此操作的方法,请告诉我。
          • 文件保存在哪里?
          • @dknight 我假设您的意思是通过终端控制台的远程控制台,在这种情况下,您可以在连接终止后通过scp 检索转储文件。这是一个例子。 scp user@remote-server.com:/tmp/querydump.csv ~/local.csv
          • 似乎不安全:#1290 - MySQL 服务器正在使用 --secure-file-priv 选项运行,因此无法执行此语句
          【解决方案8】:

          您可以在 mysqldump 上使用 --where 选项来生成您正在等待的输出:

          mysqldump -u root -p test t1 --where="1=1 limit 100" > arquivo.sql
          

          test.t1 中最多 100 行将从数据库表中转储。

          干杯, 世界银行

          【讨论】:

            【解决方案9】:

            使用 where 查询转储表:

            mysqldump mydatabase mytable --where="mycolumn = myvalue" --no-create-info > data.sql
            

            转储整个表:

            mysqldump mydatabase mytable > data.sql
            

            注意事项:

            • mydatabasemytable 和 where 语句替换为您想要的值。
            • 默认情况下,mysqldump 将在其输出中包含DROP TABLECREATE TABLE 语句。因此,如果您希望在从保存的数据文件恢复时不删除表中的所有数据,请确保使用--no-create-info 选项。
            • 您可能需要在上述示例命令中添加适当的-h-u-p 选项,以便分别指定所需的数据库主机、用户和密码。

            【讨论】:

            • 这正是我想要的。这个答案应该更高。
            • 当我只需要转储某些数据时,我总是在这种用例中使用它 - 所以它非常方便。
            【解决方案10】:

            这应该可以工作

            mysqldump --databases X --tables Y --where="1 limit 1000000"
            

            【讨论】:

            • 一个更好的例子可能是实际上看起来像 where 子句的东西,例如 --where="myColumn
            • @ijw 如果您想要对表进行轻松重新插入的备份,那么除了限制之外,您可能不需要 where 子句。
            • @Sagotharan:嗯,这不是一个查询。这可能就是原因。
            • !!警告!! mysqldump 在导出文件的顶部添加了一个“DROP TABLE”命令。这意味着如果您进行部分导出然后重新导入它,您将丢失其他所有内容。嗯,我做到了。
            • 是的,为了在从保存的数据文件恢复时不删除表中的所有数据,请确保添加--no-create-info 选项。有关示例,请参见 my answer
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-04-27
            • 2021-06-21
            • 2019-12-04
            • 1970-01-01
            • 2012-06-24
            • 2013-09-13
            • 1970-01-01
            相关资源
            最近更新 更多