mysql2pgsql

使用pgloader进行迁移

pgloader是一个强大的数据迁移工具,专为将不同数据库之间的数据迁移到PostgreSQL而设计。它支持从MySQL到PostgreSQL的迁移,并提供了一种简单且灵活的方式来转移数据。

安装pgloader

使用pgloader迁移数据

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

使用 py-mysql2pgsql

没有验证

附录

pgloader脚本

语法参考: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> ] ... ]
    ;

LOAD子句

  • DATABASE:从数据库加载
  • CSV: 从CSV文件加载

FROM子句

指定数据来源,可以是CSV ,或者Mysql等

CSV支持 inlinestdinfilename 等方式。

mysql必须是MYSQL 连接串。

INTO子句

指定目标存储位置,可以指定数据库,表或字段。

WITH子句

指定参数,可以是以下格式:

  • key = value
  • use option
  • do not use option

所有数据源都支持以下参数:

  • on error stop, on error resume next
  • batch rows = R
  • batch size = … MB
  • prefetch rows = …

并行控制参数:

  • workers = W
  • concurrency = C
  • max parallel create index = I

一些参数:

include drop:先删除所有已存在的表。不光是在源数据库中的表,还会删除级联的表。

include no drop:不删除任何表。

truncate: 对每个表先进行 truncate 操作。

disable triggers:禁用触发器。

create tables:创建表

create no tables:不创建表。

create indexes:创建索引

schema only:仅表结构

data only:仅数据

SET子句

指定session参数。

BEFORE LOAD DO

加载CSV数据之前的操作,例如创建表。

BEFORE LOAD EXECUTE

AFTER LOAD DO

AFTER LOAD EXECUTE

AFTER CREATE SCHEMA DO

AFTER CREATE SCHEMA EXECUTE

Connection URIs

参考: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个代替。

pgloader示例

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; $$;

pgloader问题

1、MySQL的datetime转换为PostgreSQL无时区的timestamp

时间类型:MySQL 中是 datetime,转换到 PostgreSQL 为 timestamp with time zone,它变成带时区的时间了。

需求是不需要带上时区,因为转换会默认使用当前本机的时区,也可以指定时区。

type datetime to timestamp without time zone 

相关推荐

  1. mysql2pgsql

    2023-12-31 05:04:01       37 阅读
  2. pgsqlmysql比较

    2023-12-31 05:04:01       10 阅读
  3. Springboot2+mybatisplus+多数据源更换mysql数据库为pgsql

    2023-12-31 05:04:01       37 阅读
  4. MySQLPgSQL的优缺点对比

    2023-12-31 05:04:01       33 阅读
  5. PgSQL高级

    2023-12-31 05:04:01       38 阅读
  6. <span style='color:red;'>MySQL</span>-<span style='color:red;'>2</span>

    MySQL-2

    2023-12-31 05:04:01      34 阅读
  7. MySQL2

    2023-12-31 05:04:01       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-31 05:04:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-31 05:04:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-31 05:04:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-31 05:04:01       20 阅读

热门阅读

  1. 第7章 锁

    2023-12-31 05:04:01       41 阅读
  2. NodeJs 第五章 模块化

    2023-12-31 05:04:01       33 阅读
  3. C++——STL标准模板库——容器详解——deque

    2023-12-31 05:04:01       24 阅读
  4. 数据挖掘 聚类度量

    2023-12-31 05:04:01       33 阅读
  5. pymysql工具类封装详解

    2023-12-31 05:04:01       38 阅读
  6. Global Mapper SDK 19 中文开发文档(十)

    2023-12-31 05:04:01       28 阅读
  7. python3 csv解析单引号包含特殊字符的字段

    2023-12-31 05:04:01       37 阅读
  8. linux 网络系统管理 技能大赛 NFS赛题配置

    2023-12-31 05:04:01       36 阅读
  9. spring核心技术控制反转IoC详细使用教程包含例子

    2023-12-31 05:04:01       37 阅读
  10. D. X-Sum 求矩形里面斜线的和的最大值

    2023-12-31 05:04:01       39 阅读
  11. 第二百三十六回

    2023-12-31 05:04:01       34 阅读
  12. 动态规划09-完全背包

    2023-12-31 05:04:01       32 阅读
  13. 云卷云舒:数据库还能发展多少年

    2023-12-31 05:04:01       37 阅读