毕竟,mysqldump 只是我要查找的命令的包装器。
不,实际上不是。
像mysqladmin 和mysqlcheck 这样的其他一些实用程序只不过是“方便”(或者,如果你问我,基本上没有意义)你可以自己发布的 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是有原因的。