简介

pgloader是一个数据同步工具,用来将数据从其它地方迁移到postgresql中,支持从如下源迁移:

  • 文件:CSV、Fixed Format、Postgres COPY text format、DBF、IXF
  • 数据库系统:SQLite、MySql、MSSQLServer、PostgreSQL、Redshift

应用场景

需要往postgresql中导入数据的时候,如数据迁移。

安装

安装概述

安装方式比较丰富,详见 https://pgloader.readthedocs.io/en/latest/install.html

遗憾的是未提供CentOS环境编译好的程序供下载,所以需要手动编译安装。

CentOS编译安装

去官网下载最新源码:

https://github.com/dimitri/pgloader

将源码放到 /usr/bin下,本文为例:


[root@bogon pgloader-3.6.9]# pwd
/usr/local/pgloader-3.6.9

如果下载的是源码压缩包需要使用如下命令解压:


tar -zxvf pgloader-3.6.9.tar.gz

赋予脚本执行权限:

cd /usr/local/pgloader-3.6.9

chmod -R 777 *

执行 bootstrap-centos7.sh 脚本,下载相关依赖


bootstrap-centos7.sh

执行编译:


make pgloader

如果有提示到 ("libcrypto.so.1.1" "libcrypto.so.1.0.0" "libcrypto.so.3" "libcrypto.so") 没有找到或者相关信息

需要先安装 openssl


yum -y install openssl openssl-devel

复制编译好的程序到系统执行目录 /usr/local/bin/ 下


cp /usr/local/pgloader-3.6.9/build/bin/pgloader /usr/local/bin/

查看是否安装好了:


[root@bogon home]# pgloader --version
pgloader version "3.6.7~devel"
compiled with SBCL 2.2.5

使用

pgloader 有两种常见的使用方式:

  • 通过命令行
  • 通过迁移配置文件

命令行

如下命令行:

pgloader mysql://user:password@ip:3306/dbName postgresql://user:password@ip:5432/dbName

  • 将名为dbName的数据库结构和数据 从mysql迁移到postgresql
  • pgloader 为上述 /usr/local/bin/pgloader 的可执行文件
  • 后面是mysql 的连接信息 , postgresql 的连接信息,中间使用空格分隔
  • 需要使用有写入权限的账号,建议使用root用户操作

配置文件迁移

另外一种方式就是编写迁移配置文件,然后使用 pgloader sync.load 命令执行配置文件。

如下配置文件演示了仅同步mysql的source_db库中的ramble_doc 表到 postgresql中的target_db库中,执行完毕之后将在postgresql中新建一个名为ramble_doc 的表,并新增数据。

LOAD DATABASE
FROM mysql://root:xxx@192.168.1.92:3306/source_db
INTO postgresql://postgres:xxx@192.168.1.24:5432/target_db INCLUDING ONLY TABLE NAMES matching 'ramble_doc' ;
  • LOAD DATABASE :表示从数据库执行迁移
  • FROM :源数据库连接信息
  • INTO :目标数据库连接信息
  • INCLUDING ONLY TABLE NAMES matching :仅包含匹配的表
  • 最后那个分号不可少
  • 配置文件需要按照格式编写,如缩进

如下配置文件演示了同步mysql 的source_db库下所有表到postgresql的target_db库下面,包含表结构和数据。

LOAD DATABASE
FROM mysql://root:xxx@192.168.1.92:3306/source_db
INTO postgresql://postgres:xxx@192.168.1.24:5432/target_db
WITH batch rows = 10000 , batch size =200MB , prefetch rows = 5000 , workers = 4 ,concurrency = 3
;
  • WITH:with 后面可以追加一些附属参数,各个参数使用英文逗号分隔。常见的参数如:是否需要同步数据还是仅同步结构,是否在写入数据前先删除表等
  • batch rows :在同步数据的时候分批插入postgresql的行数,默认为2.5万。
  • batch size:每批最大数据大小,设置此参数可避免出现内存溢出
  • prefetch rows:在同步数据的时候分批从mysql读取的行数,默认为1000。
  • workders: 线程数量
  • concurrency:并发线程数量

可能遇到的错误

内存溢出

报错信息为:


Heap exhausted during garbage collection: 64 bytes available, 80 requested. 垃圾回收期间堆已耗尽:可用64个字节,请求80个字节。

解决方案为调优分批数量和并发数量,需要根据源数据库数据量,硬件情况不断尝试。

更多配置参考

官网给了一个例子:


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

https://pgloader.readthedocs.io/en/latest/ref/mysql.html

总结

pgloader是一个数据库迁移工具,花一点点时间研究一下如何使用,将在数据库迁移的时候起到事半功倍的效果,往往比自己编写迁移脚本更加完善和可靠。

引用

Pgloader极简教程的更多相关文章

  1. Typora极简教程

    Typora极简教程 ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档.” ...

  2. CentOS安装使用.netcore极简教程(免费提供学习服务器)

    本文目标是指引从未使用过Linux的.Neter,如何在CentOS7上安装.Net Core环境,以及部署.Net Core应用. 仅针对CentOS,其它Linux系统类似,命令环节稍加调整: 需 ...

  3. Asky极简教程:零基础1小时学编程,已更新前8节

    Asky极简架构 开源Asky极简架构.超轻量级.高并发.水平扩展.微服务架构 <Asky极简教程:零基础1小时学编程>开源教程 零基础入门,从零开始全程演示,如何开发一个大型互联网系统, ...

  4. Python 极简教程(八)字符串 str

    由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍. 对于字符串,前面在数据类型中已经提到过.但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作.而我们在实际编码过程 ...

  5. Nginx 极简教程(快速入门)

    作者:dunwu github.com/dunwu/nginx-tutorial 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模式内容聚合 4.  ...

  6. 【转】Typora极简教程

    Typora极简教程 Typora download ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转 ...

  7. nginx极简教程

    Nginx 极简教程 本项目是一个 Nginx 极简教程,目的在于帮助新手快速入门 Nginx. examples 目录中的示例模拟了工作中的一些常用实战场景,并且都可以通过脚本一键式启动,让您可以快 ...

  8. NodeJS 极简教程 <1> NodeJS 特点 & 使用场景

    NodeJS 极简教程 <1> NodeJS 特点 & 使用场景 田浩 因为看开了所以才去较劲儿.   1. NodeJS是什么 1.1 Node.js is a JavaScri ...

  9. 自制 os 极简教程1:写一个操作系统有多难

    为什么叫极简教程呢?听我慢慢说 不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了 ...

  10. python极简教程04:进程和线程

    测试奇谭,BUG不见. 大家好,我是谭叔. 这一场,主讲python的进程和线程. 目的:掌握初学必须的进程和线程知识. 进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个 ...

随机推荐

  1. 虚拟文件系统VFS-片段一

    文件系统类型 基于磁盘的文件系统 如FAT.EXT4 虚拟文件系统 如proc 网络文件系统 顾名思义,网络文件系统还将网络通信封装起来,这意味可以直接通过通信访问另一台设备的文件系统. man fs ...

  2. 使用 Nuxt 的 showError 显示全屏错误页面

    title: 使用 Nuxt 的 showError 显示全屏错误页面 date: 2024/8/26 updated: 2024/8/26 author: cmdragon excerpt: 摘要: ...

  3. 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现

    高并发场景:秒杀商品. 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:1000个)的商品(比如:手机),以极低的价格(比如:0.1元),让大量用户参与活动,但只有极少数用户能够购买成功. 示例 ...

  4. SQL查折线图数据

    在做后台管理系统的时候,有很大概率是要与各种图表数据打交道, 那么如何通过SQL查出基本图表的数据呢,以折线图为例, X轴为日期,Y轴为统计数据,那么我们通过SQL如何查询出连续日期下的统计数据呢, ...

  5. 从Linq的Where方法理解泛型、委托应用场景

       最近遇到了一个问题,Linq的Where里面传递的是什么?Where的功能是什么实现的?没有第一时间答上来,在整理相关资料后决定自行实现Linq的Where方法来加深印象. 什么是泛型   指在 ...

  6. 搭建高效攻防靶场vulfocus与Docker仓库管理实战:从听说到入门系列

    搭建高效攻防靶场vulfocus与Docker仓库管理实战:从听说到入门系列 vulfocus 简介 vulfocus,作为一款前沿的漏洞集成平台,它巧妙地将多种最新的CVE漏洞环境封装于Docker ...

  7. 手脱upx

    其实已经是大一下刚开始的事情了,补个档 手动脱壳の新年快乐 查壳,有壳,UPX X32dbg打开文件,查看初始断点 点击PUSHAD跟进,CTRL+*设置EIP,开始F8步过,寻找ESP寄存器第一次单 ...

  8. HTTP——简介

    HTTP   

  9. MoNA:复用跨模态预训练模型,少样本模态的福音 | ICML'24

    跨模态转移旨在利用大型预训练模型来完成可能不属于预训练数据模态的任务.现有的研究在将经典微调扩展到跨模态场景方面取得了一定的成功,但仍然缺乏对模态差距对转移的影响的理解.在这项工作中,进行了一系列关于 ...

  10. 2.2.2 PyTorch 2.0 GPU NVIDIA运行库的安装 ——CUDA+cuDNN安装教程

    参考文章: https://blog.csdn.net/mbdong/article/details/121769951 CUDA download: https://developer.nvidia ...