0

有点绞尽脑汁,试图做我认为很容易做的事情。我正在尝试使用 shell 脚本/MySQL 选项从数据库中的一个表获取数据到另一个数据库中的临时表。基本上截断表 db2.stage_customer_log,然后 db1.customer_log -> db2.stage_customer_log。我尝试了几个选项,但每个选项都取得了有限的成功,我已经准备好接受建议。

我尝试的第一个想法是:

mysqldump -p dbname -u uname customer_log > stage_customer_log.csv --no-create-info

但事实证明这不是一个好的选择,因为生成的文件是原始表名的 INSERT。所以我必须做一些操作才能让它工作。

接下来,我用这个创建了一个 shell 脚本:

#!/bin/sh
mysql -h hostname -P 99999 -u uname -p --database dbname <<STOP

SELECT * FROM customer_log INTO OUTFILE 'stage_dm_customer_log.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'; 

\q
STOP
test $? = 0 && echo "Your batch job terminated gracefully"

这给了我想要的结果(逗号分隔文件),但它把文件放在 MySQL 目录中(即使我输入了绝对路径,或 './' 或其他)。看到我托管在亚马逊上,第二部分(导入)不起作用,因为我遇到了访问错误。

然后,当我阅读有关选项的更多信息时,我又回到了第一个选项。我的最终命令是这样的:

mysqldump -p dbname -u uname customer_log --no-create-info --no-create-db --tab='/tmp/' --fields-optionally-enclosed-by='"' --fields-terminated-by=',' --fields-escaped-by='' --lines-terminated-by='\n' --verbose 

但再次以必须操纵的文件名结束。

我终于尝试使用 Pentaho 引入表,我不知道它是否是我们的实例,但对于这么少的记录需要相当长的时间(85,000 条记录需要 32 分钟)。所以,我不需要具体细节,但这样的最佳途径是什么?其他人实施了什么?

谢谢。

4

1 回答 1

0

如果两个数据库都位于同一主机上,则可以运行以下命令:

INSERT INTO db2.stage_customer_log (column1, column2, ...)
SELECT column1, column2, ...
FROM db1.stage_customer_log
WHERE [your filters here]

但是,如果它们在不同的服务器上,那么这可能会有所帮助:

mysqldump -u user1 -ppassword1 -h host1 [some options here] db1 stage_customer_log | mysql -u user2 -ppassword2 -h host2 [some options here] db2

mysqldump始终将 csv 文件保存在服务器计算机上,并在客户端保存 sql 转储。

更新 1

另一个技巧,可以是使用 MySQL Workbench(您可以将转储文件保存在本地硬盘上)或使用FEDERATED 存储引擎

于 2012-11-09T00:54:04.320 回答