很久以前在一个很远很远的系统上......
尝试将数据库从 MySQL 迁移到 PostgreSQL。我读过的所有文档都非常详细地介绍了如何迁移结构。我发现很少有关于迁移数据的文档。该模式有 13 个表(已成功迁移)和 9 GB 的数据。
MySQL 版本:5.1.x
PostgreSQL 版本:8.4.x
我想使用 R 编程语言使用 SQL 选择语句分析数据;PostgreSQL 有 PL/R,但 MySQL 什么都没有(据我所知)。
新希望
创建数据库位置(/var
空间不足;也不喜欢到处都有 PostgreSQL 版本号——升级会破坏脚本!):
sudo mkdir -p /home/postgres/main
sudo cp -Rp /var/lib/postgresql/8.4/main /home/postgres
sudo chown -R postgres.postgres /home/postgres
sudo chmod -R 700 /home/postgres
sudo usermod -d /home/postgres/ postgres
一切都好到这里。接下来,重新启动服务器并使用这些安装说明配置数据库:
sudo apt-get install postgresql pgadmin3
sudo /etc/init.d/postgresql-8.4 stop
sudo vi /etc/postgresql/8.4/main/postgresql.conf
- 更改
data_directory
为/home/postgres/main
sudo /etc/init.d/postgresql-8.4 start
sudo -u postgres psql postgres
\password postgres
sudo -u postgres createdb climate
pgadmin3
用于pgadmin3
配置数据库和创建模式。
这一集在一个名为 的远程 shell 中继续bash
,两个数据库都在运行,并安装了一组带有相当不寻常的徽标的工具:SQL Fairy。
perl Makefile.PL
sudo make install
sudo apt-get install perl-doc
(奇怪的是,它没有被调用perldoc
)perldoc SQL::Translator::Manual
提取 PostgreSQL 友好的 DDL 和所有MySQL
数据:
sqlt -f DBI --dsn dbi:mysql:climate --db-user user --db-password password -t PostgreSQL > climate-pg-ddl.sql
- 编辑
climate-pg-ddl.sql
标识符并将其转换为小写,并插入模式引用(使用 VIM)::%s/"\([A-Z_]*\)"/\L\1/g
:%s/ TABLE / TABLE climate./g
:%s/ on / on climate./g
mysqldump --skip-add-locks --complete-insert --no-create-db --no-create-info --quick --result-file="climate-my.sql" --databases climate --skip-comments -u root -p
将 MySQL 中的表和列简单地重命名为小写可能是值得的:
select concat( 'RENAME TABLE climate.', TABLE_NAME, ' to climate.', lower(TABLE_NAME), ';' ) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='climate';
- 执行上一步中的命令。
- 可能有一种方法可以对列执行相同的操作;我手动更改了它们,因为它比弄清楚如何编写查询要快。
数据库反击
在 PostgreSQL 中重新创建结构如下:
pgadmin3
(切换到它)- 单击执行任意 SQL 查询图标
- 打开
climate-pg-ddl.sql
- 搜索
TABLE "
替换为TABLE climate."
(插入架构名称climate
) - 搜索
on "
替换为on climate."
(插入架构名称climate
) - 按下
F5
执行
这导致:
Query returned successfully with no result in 122 ms.
绝地的回复
在这一点上,我很难过。
- 我从这里去哪里(步骤是什么)转换
climate-my.sql
到,climate-pg.sql
以便它们可以针对 PostgreSQL 执行? - 如何确保正确复制索引(以保持引用完整性;我目前没有限制来缓解过渡)?
- 如何确保在 PostgreSQL 中添加新行将从插入的最后一行的索引开始枚举(并且不与序列中的现有主键冲突)?
- 在将数据从 MySQL 转换为 PostgreSQL 插入时,如何确保模式名称通过?
资源
需要相当多的信息才能做到这一点:
- https://help.ubuntu.com/community/PostgreSQL
- http://articles.sitepoint.com/article/site-mysql-postgresql-1
- http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#MySQL
- http://pgfoundry.org/frs/shownotes.php?release_id=810
- http://sqlfairy.sourceforge.net/
谢谢!