赞
踩
pgloader
是一个强大的数据迁移工具,专为将不同数据库之间的数据迁移到PostgreSQL
而设计。它支持从MySQL到PostgreSQL的迁移,并提供了一种简单且灵活的方式来转移数据。
1、命令行方式
2、脚本方式
pgloader load.script
#下载镜像
docker pull dimitri/pgloader
#后台启动一个容器
docker run -tid --name pgloader_test dimitri/pgloader
# copy laoder 脚本
docker cp ./mysql2pgsql.load pgloader_test:/
#进入容器
docker exec -it pgloader_test /bin/bash
#执行loade 命令
pgloader mysql2pgsql.load
没有验证
语法参考:https://pgloader.readthedocs.io/en/latest/command.html , https://pgloader.readthedocs.io/en/latest/ref/mysql.html
LOAD <source-type>
FROM <source-url>
[ HAVING FIELDS <source-level-options> ]
INTO <postgresql-url>
[ TARGET TABLE [ "<schema>" ]."<table name>" ]
[ TARGET COLUMNS <columns-and-options> ]
[ WITH <load-options> ]
[ SET <postgresql-settings> ]
[ BEFORE LOAD [ DO <sql statements> | EXECUTE <sql file> ] ... ]
[ AFTER LOAD [ DO <sql statements> | EXECUTE <sql file> ] ... ]
;
DATABASE
:从数据库加载CSV
: 从CSV文件加载指定数据来源,可以是CSV ,或者Mysql等
CSV支持 inline
,stdin
,filename
等方式。
mysql必须是MYSQL 连接串。
指定目标存储位置,可以指定数据库,表或字段。
指定参数,可以是以下格式:
所有数据源都支持以下参数:
并行控制参数:
一些参数:
include drop
:先删除所有已存在的表。不光是在源数据库中的表,还会删除级联的表。
include no drop
:不删除任何表。
truncate
: 对每个表先进行 truncate
操作。
disable triggers
:禁用触发器。
create tables
:创建表
create no tables
:不创建表。
create indexes
:创建索引
schema only
:仅表结构
data only
:仅数据
指定session参数。
加载CSV
数据之前的操作,例如创建表。
参考:https://www.postgresql.org/docs/9.3/libpq-connect.html#LIBPQ-CONNSTRING
ostgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
postgresql://
postgresql://localhost
postgresql://localhost:5433
postgresql://localhost/mydb
postgresql://user@localhost
postgresql://user:secret@localhost
postgresql://other@localhost/otherdb?connect_timeout=10&application_name=myapp
user
或者password
中含有@
,则用2个@
代替。含有:
,则用2个:
代替。
LOAD DATABASE FROM mysql://root@localhost/sakila INTO postgresql://localhost:54393/sakila WITH include drop, create tables, create indexes, reset sequences, workers = 8, concurrency = 1, multiple readers per thread, rows per range = 50000 SET PostgreSQL PARAMETERS maintenance_work_mem to '128MB', work_mem to '12MB', search_path to 'sakila, public, "$user"' SET MySQL PARAMETERS net_read_timeout = '120', net_write_timeout = '120' CAST type bigint when (= precision 20) to bigserial drop typemod, type date drop not null drop default using zero-dates-to-null, -- type tinyint to boolean using tinyint-to-boolean, type year to integer MATERIALIZE VIEWS film_list, staff_list -- INCLUDING ONLY TABLE NAMES MATCHING ~/film/, 'actor' -- EXCLUDING TABLE NAMES MATCHING ~<ory> -- DECODING TABLE NAMES MATCHING ~/messed/, ~/encoding/ AS utf8 -- ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films' -- ALTER TABLE NAMES MATCHING ~/_list$/ SET SCHEMA 'mv' ALTER TABLE NAMES MATCHING ~/_list$/, 'sales_by_store', ~/sales_by/ SET SCHEMA 'mv' ALTER TABLE NAMES MATCHING 'film' RENAME TO 'films' ALTER TABLE NAMES MATCHING ~/./ SET (fillfactor='40') ALTER SCHEMA 'sakila' RENAME TO 'pagila' BEFORE LOAD DO $$ create schema if not exists pagila; $$, $$ create schema if not exists mv; $$, $$ alter database sakila set search_path to pagila, mv, public; $$;
时间类型:MySQL 中是 datetime
,转换到 PostgreSQL 为 timestamp with time zone
,它变成带时区的时间了。
需求是不需要带上时区,因为转换会默认使用当前本机的时区,也可以指定时区。
type datetime to timestamp without time zone
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。