导出与导入之间如果可以用管道符, 则可以节约生成文件的时间, 以缩减数据迁移的时间, SQLULDR2和Oracle的SQL * Loader可以这样用, 在跨网络迁移数据时, 也行可以用”导出->压缩->网络->解压->导入”这样的管理流程. 这段时间在测试从Oracle向MySQL迁移数据时, 发现MySQL的LOAD DATA命令无法从标准输入读入数据, 也就是没有办法进行普通的管道操作, 必须导出成文件, 然后导入文件.

    考虑到MySQL没有绑定变量的概念, 其实都是文本SQL操作, 因此使用Insert的性能也许不比LOAD DATA差. 在加入MySQL标准的转义符支持后, 要生成INSERT语句也很容易, 就在SQLULDR2中加入了这个功能.

    使用SQLULDR2的FORMAT参数, 可以实现这个功能.

sqluldr2 … table=tablename format=mysql null=null escape=0x5c quote=0×27

    这时在输出文件中, 就是INSERT语句, 如下所示, 一个批处理(由ARRAY参数决定)是一条INSERT语句.

INSERT INTO tablename (COL1,COL2,COL3) VALUES
(‘A\\B\”\t’,’2009-10-28 22:31:22′,1),
(‘A\\B\”\t’,’2009-10-28 22:32:24′,2);

    当我们要迁移数据时, 就可以用管道操作了.

sqluldr2 … table=table_name format=mysql null=null escape=0x5c quote=0×27 file=- | mysql database_name

    这样迁移数据, 也许要比生成文件中转来得快, 有空找几百万条记录试试看. 并研究准备的插入语句, 是不是值得支持一下.