我有一个大约270万个logging,63个字段和几个索引的表格。 我需要能够从MySQL快速获取这个表格postgresql(一个小时内)。 我知道mysql可以快速导出数据,但是postgresql在导入数据时似乎很慢。 有任何想法吗? 我现在已经导入了一个由mysqldump生成的CSV大约3个小时。
我能想到的最快的方法是在postgresql的表中删除所有的索引和触发器(或至lessALTER TABLE foo DISABLE TRIGGER ALL; ),添加\. input结束行到CSV文件的末尾,然后把文件放在服务器上(最好是用于数据库的驱动器以外的驱动器上,或者可能是服务器可以通过NFS访问的networking上); COPY foo FROM '/some/file.csv' WITH CSV; (8.x语法,在9.0中支持。根据CSV文件格式,您可能需要进行修改 。)之后,重新创build索引并重新启用触发器。
postgres的一些configuration选项会影响数据加载时间。 禁用自动清理和增加检查点之间的时间可以帮助处理巨大的负载,但是您需要重新启动postgresql才能更改checkpoint_segments或autovacuum设置,并且您需要在完成后重新设置autovacuum。
mysqldump --compatible=postgresql -h... -u... -p... dbname tablename > PostgresqlData.sql
这个选项存在
--compatible=name Change the dump to be compatible with a given mode. By default tables are dumped in a format optimized for MySQL. Legal modes are: ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, no_field_options. One can use several modes separated by commas. Note: Requires MySQL server version 4.1.0 or higher. This option is ignored with earlier server versions.
试一试 !!!
有许多专业的ETL工具可以以相当高的速度在数据库之间迁移 – 例如,我使用了Pentaho的开源PDI(nee Kettle),命中率为100K行/秒。 这些还带来了其他一些优点,例如允许您将数据按摩到几个新的结构,映射过程的graphics界面等等。