我有一张包含大约 270 万条记录、63 个字段和多个索引的表。我需要能够快速(比如说在一小时内)将此表从 mysql 传输到 postgresql。我知道 mysql 可以快速导出数据,但 postgresql 在导入数据时似乎非常慢。有什么想法吗?我已经导入了 mysqldump 生成的 CSV 大约 3 个小时了。
答案1
ALTER TABLE foo DISABLE TRIGGER ALL;
我能想到的最快方法是删除postgresql 表上的所有索引和触发器(或至少) \.
,将输入结束行添加到 CSV 文件末尾,然后将文件放在服务器上(最好放在用于数据库的驱动器以外的驱动器上,或者放在服务器可以通过 NFS 访问的网络上的某个地方)和COPY foo FROM '/some/file.csv' WITH CSV;
(8.x 语法,9.0 支持该语法。根据 CSV 文件格式,您可能需要做出修改)然后,重新创建索引并重新启用触发器。
postgres 的一些配置选项会影响数据加载时间。禁用自动清理并增加检查点之间的时间可以帮助处理大量负载,但您需要重新启动 postgresql 才能更改checkpoint_segments
或autovacuum
设置,完成后您需要将自动清理重新设置为开启。
答案2
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.
试一试 !!!
答案3
有许多专业提取和加载可以以相当高的速度在数据库之间迁移的工具 - 例如,我使用过 Pentaho 的开源PDI(原名 Kettle)每秒 100K 行左右。这还带来了其他几个优点,例如允许您将数据调整为几个新结构、用于映射过程的图形界面等等。