【问题标题】:How do I get a tab delimited MySQL dump from a remote host ?如何从远程主机获取制表符分隔的 MySQL 转储?
【发布时间】:2011-12-10 20:23:26
【问题描述】:

类似如下的mysqldump命令:

mysqldump -u<username> -p<password> -h<remote_db_host> -T<target_directory> <db_name> --fields-terminated-by=,

将为每个表写出两个文件(一个是架构,另一个是 CSV 表数据)。要获得 CSV 输出,您必须指定目标目录(使用 -T)。当 -T 传递给 mysqldump 时,它将数据写入运行 mysqld 的服务器的文件系统 - 而不是发出命令的系统。 有没有一种简单的方法可以从远程系统转储 CSV 文件?

注意:我熟悉使用简单的 mysqldump 和处理 STDOUT 输出,但我不知道如何在不进行大量解析的情况下以这种方式获取 CSV 表数据。在这种情况下,我将使用 -X 选项并转储 xml。

【问题讨论】:

  • 您是否有幸找到了解决方案?
  • 抱歉 - 还没有。我认为 xml 选项是您最好的选择(假设您使用的是足够新版本的 mysql)
  • 我确实可以访问远程主机,但是 SELECT INTO FILE 失败了,所以我最终使用了这个:mysql -h"host" -u"user" -p"password" -e “选择 * FROM mydb.mytable” > /tmp/table.csv。然后从我的本地机器: scp my_user@remote_server:/tmp/table.csv ~/table.csv

标签: mysql csv export mysqldump


【解决方案1】:
mysql -h remote_host -e "SELECT * FROM my_schema.my_table" --batch --silent > my_file.csv

【讨论】:

  • 这很好用。请注意,它是制表符分隔的,而不是逗号。
  • 如何导入批处理文件?
  • 当某些列中的某些值包含制表符时会发生什么?你如何让它转义制表符和换行符?
  • @Milimetric 有一点,我还想补充一点,它不能正确处理 NULL 值。对于导入,NULL 应该是 \N,但在文件中将是 NULL。
【解决方案2】:

我想补充一下codeman的答案。它有效,但需要大约 30 分钟的时间来满足我的需求。

我的网络服务器使用 centos 6/cpanel,而上面 codeman 使用的标志和序列对我不起作用,我不得不重新排列和使用不同的标志等。

另外,我将它用于本地文件转储,它不仅对远程数据库有用,因为我在 selinux 和 mysql 用户权限方面遇到了太多问题,例如 SELECT INTO OUTFILE 命令等。

什么在我的 Centos+Cpanel 服务器上工作

mysql -B -s -uUSERNAME -pPASSWORD < query.sql > /path/to/myfile.txt

注意事项

没有列名

我无法让列名出现在顶部。我尝试添加标志:

--column-names

但这并没有什么不同。我仍然坚持这一点。我目前在处理后将其添加到文件中。

选择数据库

由于某种原因,我无法在命令行中包含数据库名称。我试过了

-D databasename

在命令行中,但我不断收到权限错误,所以我结束了在我的 query.sql 顶部使用以下内容:

USE database_name;

【讨论】:

  • 尝试从 mysql --help 中删除列名的 -s,它与 -B 是多余的,但在我的系统上它有所作为
【解决方案3】:

在许多系统上,MySQL 以不同的用户身份运行(例如用户“mysql”),如果 MySQL 用户在转储目录中没有写权限,你的 mysqldump 将失败 - 不管你自己的写权限是什么在那个目录中。将您的目录(至少暂时)更改为全局可写 (777) 通常会解决您的导出问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2016-10-30
    • 2019-12-03
    • 1970-01-01
    相关资源
    最近更新 更多