尝试将数据库从MySQL迁移到PostgreSQL。我阅读的所有文档都非常详细地介绍了如何迁移结构。我发现很少有关于迁移数据的文档。该模式有13个表(已成功迁移)和9 GB数据。
MySQL版本:5.1.x
PostgreSQL版本:8.4.x
我想使用R编程语言使用SQL select语句分析数据; 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
一切都好到这里。接下来,重新启动服务器并使用这些installation instructions:
配置数据库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
配置数据库并创建架构。
剧集在一个称为bash
的远程shell中继续,两个数据库都在运行,并且安装了一组带有相当不寻常徽标的工具: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
(切换到它)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执行这些步骤?需要相当多的信息才能做到这一点:
谢谢!
答案 0 :(得分:4)
我通常为此类迁移做的事情有两方面:
然后进行转换,并用您最熟悉的任何语言编写程序,以实现以下目标:
重新设计PostgreSQL的表格以利用其功能。
如果您只是使用sed
脚本将SQL转储从一种格式转换为下一种格式,那么您所做的就是将一个MySQL数据库放在PostgreSQL服务器中。您可以这样做,这样做仍然会带来一些好处,但如果您要迁移,请完全迁移。
这将花费更多的前期时间,但我还没有遇到过不值得的情况。
答案 1 :(得分:2)
按如下方式转换数据(不要使用mysql2pgsql.perl):
转义引号。
sed "s/\\\'/\'\'/g" climate-my.sql | sed "s/\\\r/\r/g" | sed "s/\\\n/\n/g" > escaped-my.sql
用搜索路径替换USE "climate";
并评论评论:
sed "s/USE \"climate\";/SET search_path TO climate;/g" escaped-my.sql | sed "s/^\/\*/--/" > climate-pg.sql
连接数据库。
sudo su - postgres
psql climate
设置编码(mysqldump忽略其编码参数),然后执行脚本。
\encoding iso-8859-1
\i climate-pg.sql
这一系列步骤可能不适用于具有许多混合类型的复杂数据库。但是,它适用于integer
s,varchar
和float
s。
由于mysqldump
在生成INSERT
语句时包含主键,因此它们将胜过表的自动序列。所有表格的序列在检查时保持为1。
使用ALTER SEQUENCE
命令将它们设置为所需的任何值。
不需要使用模式名称为表添加前缀。使用:
SET search_path TO climate;
答案 2 :(得分:2)
如果您已经转换了架构,那么迁移数据将是一件容易的事情:
从PostgreSQL转储模式(你说你已经将模式转换为postgres,所以我们暂时将其转储,因为我们将删除并重新创建目标数据库,以便清除它):
pg_dump dbname > /tmp/dbname-schema.sql
将模式拆分为2个部分 - /tmp/dbname-schema-1.sql
包含create table语句,/tmp/dbname-schema-2.sql
- 其余部分。 PostgreSQL需要在导入外键,触发器等之前导入数据,但是在导入表定义之后。
仅使用一部分模式重新创建数据库:
drop database dbname create database dbname \i /tmp/dbname-schema-1.sql -- now we have tables without data, triggers, foreign keys etc.
导入数据:
( echo 'start transaction'; mysqldump --skip-quote-names dbname | grep ^INSERT; echo 'commit' ) | psql dbname -- now we have tables with data, but without triggers, foreign keys etc.
MySQL 5.1.3中添加了--skip-quote-names
选项,因此如果您的版本较旧,请在/tmp/mysql
(configure --prefix=/tmp/mysql && make install
应该执行)中临时安装较新的mysql并使用{{1 }}
导入架构的其余部分:
psql dbname start transaction \i /tmp/dbname-schema-2.sql commit -- we're done
答案 3 :(得分:0)
结帐etlalchemy。它允许您从4行Python中的 MySQL 迁移到 PostgreSQL ,或者在其他几个数据库之间迁移。您可以阅读更多相关信息here。
安装:pip install etlalchemy
运行:
from etlalchemy import ETLAlchemySource, ETLAlchemyTarget
# Migrate from MySQL to PostgreSQL
src = ETLAlchemySource("mysql://user:passwd@hostname/dbname")
tgt = ETLAlchemyTarget("postgresql://user:passwd@hostname/dbname",
drop_database=True)
tgt.addSource(src)
tgt.migrate()