【问题标题】:Exporting MySQL database from within a command prompt mysql tool. Without mysqldump从命令提示符 mysql 工具中导出 MySQL 数据库。没有 mysqldump
【发布时间】:2013-11-20 07:55:32
【问题描述】:

我在我的服务器上登录了 mysql 并且能够从那里输入命令。我找不到可以让我从命令行工具中导出的命令。当然我可以注销并运行mysqldump -u -p...,但这很痛苦。要从客户端内部导入,只需输入 source path/to/the/source

出口肯定有这样的东西,但是网上的所有东西都指向mysqldump,所以我找不到我要找的工具。毕竟,mysqldump 只是我正在寻找的命令的包装器。有谁知道用什么?感谢任何可以提供帮助的人。

【问题讨论】:

    标签: mysql mysqldump command-prompt


    【解决方案1】:

    毕竟,mysqldump 只是我要查找的命令的包装器。

    不,实际上不是。

    mysqladminmysqlcheck 这样的其他一些实用程序只不过是“方便”(或者,如果你问我,基本上没有意义)你可以自己发布的 SQL 语句包装器,所以我想你的假设可以从这个角度来看是合理的,但mysqldump 并非如此。

    mysqldump 的源代码约为 5,061 行 C 代码——甚至不包括实际管理与 MySQL 服务器或许多其他服务器的 TCP 或 Unix 套接字通信的代码在 MySQL 服务器和实用程序之间共享的公共代码库。

    是的,mysqldump 实用程序会(在可行的情况下)组装一些 SQL 语句,将它们发送到服务器执行,并将服务器的响应写入转储文件中......

    my_snprintf(query, sizeof(query), "SHOW CREATE TABLE %s", result_table);
    

    ...这是一种不费吹灰之力,几乎不需要重新发明的轮子。

    但是,它执行的许多操作根本不由 MySQL 服务器代码处理。例子...

    if (opt_drop_trigger)
      fprintf(sql_file, "/*!50032 DROP TRIGGER IF EXISTS %s */;\n", (*show_trigger_row)[0]);
    
    fprintf(sql_file,
          "DELIMITER ;;\n"
          "/*!50003 SET SESSION SQL_MODE=\"%s\" */;;\n"
          "/*!50003 CREATE */ ",
          (*show_trigger_row)[6]);
    

    mysql 内部没有功能可以执行该操作,或者这个...

    if (write_data)
    {
      if (opt_replace_into)
        dynstr_append_checked(&insert_pat, "REPLACE ");
      else
        dynstr_append_checked(&insert_pat, "INSERT ");
      dynstr_append_checked(&insert_pat, insert_option);
      dynstr_append_checked(&insert_pat, "INTO ");
      dynstr_append_checked(&insert_pat, opt_quoted_table);
      if (complete_insert)
      {
        dynstr_append_checked(&insert_pat, " (");
      }
      else
      {
        dynstr_append_checked(&insert_pat, " VALUES ");
        if (!extended_insert)
          dynstr_append_checked(&insert_pat, "(");
      }
    }
    
    while ((row= mysql_fetch_row(result)))
    {
      if (complete_insert)
      {
        if (init)
        {
          dynstr_append_checked(&insert_pat, ", ");
        }
        init=1;
        dynstr_append_checked(&insert_pat,
                      quote_name(row[SHOW_FIELDNAME], name_buff, 0));
      }
    }
    num_fields= mysql_num_rows(result);
    mysql_free_result(result);
    

    对于包装器来说,这似乎是很多不必要的工作。 :) 您现在可能已经解决了,这是 mysqldump 所做的一些简单事情的示例,在发出 SELECT /*!40001 SQL_NO_CACHE */ * FROM ... 以从中获取所有数据后,以打包的二进制格式读取从服务器返回的行数据每个表,并将其转换为 SQL 语句。实际制作这些INSERT 语句的代码来自mysqldump。不在服务器中。

    互联网上的所有内容都指向mysqldump是有原因的。

    【讨论】:

    • 嗯,这确实解释了为什么一切都指向它。我还没有完全消化你发给我的代码,所以可能只是我,但没有source 的倒数似乎仍然很奇怪。虽然我知道构建它可能很复杂,但它仍然令人惊讶。真的是必须注销才能转储数据库吗?
    • 在任何实际意义上,是的。此外,虽然,谈论“source 的倒数”有点像尝试除以零,但......因为sourcemysqldump 并不完全相反......你可以制作一个文本文件其中包含任何类型的任意 SQL 语句,source 将尽职尽责地将这些语句发送到服务器执行。恢复转储文件只是 source 可以用来做的事情之一,而 mysqldump 专门用于构建等效的 SQL 语句,以准确地重新创建现有数据库的当前状态。
    【解决方案2】:

    mysqldump 可以通过不同的SHOW 命令实现,经过足够的努力,您最终会得到mysqldump ;)

    查看http://dev.mysql.com/doc/refman/5.5/en/show.html 了解所有可能的变体。

    在我看来,使用mysqldump 更方便,因为它采用与mysql 命令行工具相同的所有连接参数。

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 2015-11-26
      相关资源
      最近更新 更多