在Linux(Kubuntu)上从MySQL迁移到PostgreSQL

Dav*_*vis 18 mysql postgresql database-migration

很久以前在一个遥远的系统上......

试图将数据库从MySQL迁移到PostgreSQL.我阅读的所有文档都非常详细地介绍了如何迁移结构.我发现很少有关于迁移数据的文档.该模式有13个表(已成功迁移)和9 GB数据.

MySQL版本:5.1.x
PostgreSQL版本:8.4.x

我想使用R编程语言使用SQL select语句分析数据; PostgreSQL有PL/R,但MySQL什么都没有(据我所知).

新希望

创建数据库位置(/var没有足够的空间;也不喜欢在任何地方都有PostgreSQL版本号 - 升级会破坏脚本!):

  1. sudo mkdir -p /home/postgres/main
  2. sudo cp -Rp /var/lib/postgresql/8.4/main /home/postgres
  3. sudo chown -R postgres.postgres /home/postgres
  4. sudo chmod -R 700 /home/postgres
  5. sudo usermod -d /home/postgres/ postgres

一切都好到这里.接下来,使用以下安装说明重新启动服务器并配置数据库:

  1. sudo apt-get install postgresql pgadmin3
  2. sudo /etc/init.d/postgresql-8.4 stop
  3. sudo vi /etc/postgresql/8.4/main/postgresql.conf
  4. 更改data_directory/home/postgres/main
  5. sudo /etc/init.d/postgresql-8.4 start
  6. sudo -u postgres psql postgres
  7. \password postgres
  8. sudo -u postgres createdb climate
  9. pgadmin3

使用pgadmin3配置数据库和创建模式.

该剧集继续在一个名为的远程shell中bash运行,并且安装了一组具有相当不寻常的徽标的工具:SQL Fairy.

  1. perl Makefile.PL
  2. sudo make install
  3. sudo apt-get install perl-doc(奇怪的是,它没有被调用perldoc)
  4. perldoc SQL::Translator::Manual

提取PostgreSQL友好的DDL和所有MySQL数据:

  1. sqlt -f DBI --dsn dbi:mysql:climate --db-user user --db-password password -t PostgreSQL > climate-pg-ddl.sql
  2. 编辑climate-pg-ddl.sql标识符并将其转换为小写,然后插入模式引用(使用VIM):
    • :%s/"\([A-Z_]*\)"/\L\1/g
    • :%s/ TABLE / TABLE climate./g
    • :%s/ on / on climate./g
  3. 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中的表和列重命名为小写可能是值得的:

  1. select concat( 'RENAME TABLE climate.', TABLE_NAME, ' to climate.', lower(TABLE_NAME), ';' ) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='climate';
  2. 执行上一步中的命令.
  3. 可能有一种方法可以对列进行相同的操作; 我手动更改了它们,因为它比确定如何编写查询更快.

数据库反击

在PostgreSQL中重新创建结构如下:

  1. pgadmin3 (切换到它)
  2. 单击" 执行任意SQL查询"图标
  3. 打开 climate-pg-ddl.sql
  4. TABLE "TABLE climate."(插入模式名称climate)搜索替换
  5. on "on climate."(插入模式名称climate)搜索替换
  6. 按下F5执行

这导致:

Query returned successfully with no result in 122 ms.
Run Code Online (Sandbox Code Playgroud)

绝地的回复

此时我很难过.

  • 我在哪里从这里走(有什么步骤)转换climate-my.sql,以climate-pg.sql使他们能够对PostgreSQL的执行?
  • 如何确保正确复制索引(以保持参照完整性;我目前没有约束来简化转换)?
  • 如何确保在PostgreSQL中添加新行将从插入的最后一行的索引开始枚举(并且不与序列中的现有主键冲突)?
  • 在将数据从MySQL转换为PostgreSQL插入时,如何确保模式名称通过?

资源

为了达到这个目的,需要相当多的信息:

谢谢!

Mic*_*sch 4

我通常为此类迁移做两件事:

  • 从 MySQL 中提取整个数据库定义并使其适应 PostgreSQL 语法。
  • 检查数据库定义并对其进行转换,以利用 PostgreSQL 中 MySQL 中不存在的功能。

然后进行转换,并用您最熟悉的任何语言编写一个程序来完成以下任务:

  • 从 MySQL 数据库读取数据。
  • 对要存储在 PostgreSQL 数据库中的数据执行任何必要的转换。
  • 将现在转换的数据保存在 PostgreSQL 数据库中。

重新设计 PostgreSQL 的表以利用其功能。

如果您只是使用脚本sed将 SQL 转储从一种格式转换为另一种格式,那么您所做的就是将 MySQL 数据库放入 PostgreSQL 服务器中。您可以这样做,而且这样做仍然会有一些好处,但如果您要迁移,请完全迁移。

这将需要花费更多的前期时间,但我还没有遇到过不值得的情况。