阅读使人充实,讨论使人敏捷,写作使人精确。

 迁移工具简介

今天介绍一个MySQL迁移PostgreSQL的自动化工具py-mysql2pgsql,该工具通过python使用不落地方式,或写出到文件方式(可选),直接将MySQL中的表结构转化到pg,并自动导入数据、自动在pg端创建相关索引。

MySQL迁移PostgreSQL数据类型转化

目前该工具可将以下38种数据类型自动转化为PostgreSQL对应的兼容类型,如需其他类型转化,在配置文件添加即可。

MySQL PostgreSQL
char character
varchar character varying
tinytext text
mediumtext text
text text
longtext text
tinyblob bytea
mediumblob bytea
blob bytea
longblob bytea
binary bytea
varbinary bytea
bit bit varying
tinyint smallint
tinyint unsigned smallint
smallint smallint
smallint unsigned integer
mediumint integer
mediumint unsigned integer
int integer
int unsigned bigint
bigint bigint
bigint unsigned numeric
float real
float unsigned real
double double precision
double unsigned double precision
decimal numeric
decimal unsigned numeric
numeric numeric
numeric unsigned numeric
date date
datetime timestamp without time zone
time time without time zone
timestamp timestamp without time zone
year smallint
enum character varying (with check constraint)
set ARRAY[]::text[]

 自动化迁移过程

工具运行后,整个过程可以分为三个阶段:

l 在PostgreSQL端自动创建表结构;l 在PostgreSQL端自动loading加载数据;l 在PostgreSQL端自动创建索引、约束。 工具安装及使用例子l 下载源码安装包下载地址

https://pypi.org/project/py-mysql2pgsql/#description

l 解压安装1.需解决的依赖包:python需按照这几个依赖包:termcolor、mysql-python、psycopg2、argparse2.安装mysql2pgsql

[root@dbhost ]# pwd/data/aken/tools/py-mysql2pgsql-0.1.5[root@dbhost ]# python setup.py install

3.验证安装,查看help帮助

[root@dbhost /data/aken/tools/py-mysql2pgsql-0.1.5]# py-mysql2pgsql -husage: py-mysql2pgsql [-h] [-v] [-f FILE] [-V]Tool for migrating/converting data from mysql to postgresql.optional arguments:  -h, --help            show this help message and exit  -v, --verbose         Show progress of data migration.  -f FILE, --file FILE  Location of configuration file (default:mysql2pgsql.yml). If none exists at that path, one will be created for you.  -V, --version         Print version and exit.https://github.com/philipsoutham/py-mysql2pgsql[root@dbhost /data/aken/tools/py-mysql2pgsql-0.1.5]#

 迁移存量数据如下将MySQL中的test.tab_testtext表存量迁移到PostgreSQL中akendb的public下面。l 编辑迁移配置文件vi mysql2pgsql.yml 如下:

#source # if a socket is specified we will use that# if tcp is chosen you can use compressionmysql:      hostname: 100.66.66.66 port: 15140 socket: username: dbmgr password: 520DBA database: test compress: falsedestination: # if file is given, output goes to file, else postgres.  file: postgres:  hostname: 100.88.88.88  port: 11005  username: aken  password: aken123  database: akendb# 指定迁移的表,默认迁移database下所有表。if only_tables is given, only the listed tables will be converted.  leave empty to convert all tables.only_tables:#- table1#- table2 tab_testtext# 指定排除的表。if exclude_tables is given, exclude the listed tables from the conversion.#exclude_tables:#- table3#- table4# 指定是否只导出表结构,ture表示只迁移dll表结构。if supress_data is true, only the schema definition will be exported/migrated, and not the datasupress_data: false# 指定是否只迁移数据,true表示只迁移数据。if supress_ddl is true, only the data will be exported/imported, and not the schemasupress_ddl: false# 表存在是否清空导入,true表示清空再导入。if force_truncate is true, forces a table truncate before table loadingforce_truncate: false# if timezone is true, forces to append/convert to UTC tzinfo mysql datatimezone: false# if index_prefix is given, indexes will be created whith a name prefixed with index_prefixindex_prefix:

l 执行数据迁移执行导入数据后,自动执行过程分3个阶段:1.自动在PostgreSQL创建表结构;2.自动加载数据(约1w rows/sec);3.自动在PostgreSQL创建索引。

[root@dbhost]# py-mysql2pgsql -v -f mysql2pgsql.yml >>>>>>>>>> STARTING <<<<<<<<<<START CREATING TABLES  START  - CREATING TABLE tab_testtext  FINISH - CREATING TABLE tab_testtextDONE CREATING TABLESSTART WRITING TABLE DATA  START  - WRITING DATA TO tab_testtext  FINISH - WRITING DATA TO tab_testtextDONE WRITING TABLE DATASTART CREATING INDEXES AND CONSTRAINTS  START  - ADDING INDEXES TO tab_testtext  FINISH - ADDING INDEXES TO tab_testtext  START  - ADDING CONSTRAINTS ON tab_testtext  FINISH - ADDING CONSTRAINTS ON tab_testtextDONE CREATING INDEXES AND CONSTRAINTS>>>>>>>>>> FINISHED <<<<<<<<<<

数据对比验证l表结构比对

1.MySQL表结构

MySQL [test]> show create table tab_testtext;+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Table        | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| tab_testtext | CREATE TABLE `tab_testtext` (  `id` int(11) NOT NULL DEFAULT '0',  `name` longtext,  `owners` longtext,  `parent_id` int(11) DEFAULT NULL,  `busid` int(11) DEFAULT NULL,  `uid` varchar(255) DEFAULT NULL,  `level` int(11) DEFAULT NULL,  `update_date` datetime NOT NULL,  `create_date` datetime NOT NULL,  `limit_load` int(11) DEFAULT '65',  `children_count` int(11) DEFAULT '0',  `limit_low_load` int(11) DEFAULT '30',  `history_load` varchar(255) DEFAULT NULL,  `status` int(11) DEFAULT '0',  `group_id` int(11) DEFAULT '21576',  `_alarm_types` varchar(64) DEFAULT NULL,  `star_level` int(11) DEFAULT '0',  `remark` text,  `enable` tinyint(11) NOT NULL DEFAULT '1',  UNIQUE KEY `busid` (`busid`),  UNIQUE KEY `uid` (`uid`),  KEY `core_business_6be37982` (`parent_id`),  KEY `group_id` (`group_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 |+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.01 sec)MySQL [test]>

2.PostgreSQL表结构

akendb=# \d+ tab_testtext                                              Table "public.tab_testtext"     Column     |            Type             | Collation | Nullable | Default | Storage  | Stats target | Description ----------------+-----------------------------+-----------+----------+---------+----------+--------------+------------- id             | integer                     |           | not null | 0       | plain    |              |  name           | text                        |           |          |         | extended |              |  owners         | text                        |           |          |         | extended |              |  parent_id      | integer                     |           |          |         | plain    |              |  busid          | integer                     |           |          |         | plain    |              |  uid            | character varying(255)      |           |          |         | extended |              |  level          | integer                     |           |          |         | plain    |              |  update_date    | timestamp without time zone |           | not null |         | plain    |              |  create_date    | timestamp without time zone |           | not null |         | plain    |              |  limit_load     | integer                     |           |          | 65      | plain    |              |  children_count | integer                     |           |          | 0       | plain    |              |  limit_low_load | integer                     |           |          | 30      | plain    |              |  history_load   | character varying(255)      |           |          |         | extended |              |  status         | integer                     |           |          | 0       | plain    |              |  group_id       | integer                     |           |          | 21576   | plain    |              |  _alarm_types   | character varying(64)       |           |          |         | extended |              |  star_level     | integer                     |           |          | 0       | plain    |              |  remark         | text                        |           |          |         | extended |              |  enable         | smallint                    |           | not null | 1       | plain    |              | Indexes:    "tab_testtext_busid" UNIQUE, btree (busid)    "tab_testtext_uid" UNIQUE, btree (uid)    "tab_testtext_group_id" btree (group_id)    "tab_testtext_parent_id" btree (parent_id)Access method: heapakendb=#

l数据抽样比对

1.MySQL数据

MySQL [test]> select count(*) from tab_testtext;+----------+| count(*) |+----------+|     4919 |+----------+1 row in set (0.00 sec)MySQL [test]> select id,name from tab_testtext limit 3;+------+--------------------------------------+| id   | name                                 |+------+--------------------------------------+| 7306 | [N][测试]                        || 7307 | [N][数据迁移]                      || 7308 | [客户端接入][登陆]    |+------+--------------------------------------+3 rows in set (0.00 sec)MySQL [test]>

2.PostgreSQL数据

akendb=# select count(*) from tab_testtext; count -------  4919(1 row)akendb=# select id,name from tab_testtext limit 3;  id  |                 name                 ------+-------------------------------------- 7306 | [N][测试] 7307 | [N][数据迁移] 7308 | [客户端接入][登陆](3 rows)akendb=#

>>>

参考资料

1.https://github.com/philipsoutham/py-mysql2pgsql

往期推荐

1.PostgreSQL等待事件-锁等待分析

2.基于PG亿级毫秒响应实时推荐系统-解决方案探索

                         ------让学习成为一种习惯-Aken

yii 执行指定迁移文件_MySQL迁移PG工具pymysql2pgsql相关推荐

  1. yii 执行指定迁移文件_Web 云开发 · 云开发数据库迁移指南

    云开发数据库 云开发为我们提供了一个 JSON 文档型数据库(NoSQL),并集成了 「增删改查」 等 API,操作方便,简单易懂.并且相比传统数据库而言它具有「高性能的数据库读写服务」,「可以直接在 ...

  2. yii 执行指定迁移文件_laravel的迁移文件

    1. 迁移是什么? 迁移就像是对数据库进行的版本控制,让你的团队能够轻松地去定义和共享程序的数据库结构.迁移通常配合 Laravel 的结构生成器,可以轻松生成应用程序的数据库结构.如果团队中有个成员 ...

  3. mysql数据库迁移方案_MySQL迁移升级解决方案

    原标题:MySQL迁移升级解决方案 任务背景 由于现有业务架构已不能满足当前业务需求,在保证数据完整的前提下,现需要将原有数据库迁移到另外一台单独的服务器上,在保证原有服务正常的情况下,将原有LAMP ...

  4. linux关机前执行脚本,Linux关机时执行指定脚本

    要实现在Linux关机时执行某个脚本的具体思路 1.在文件夹 /etc/init.d/ 下创建关机时需要执行的脚本 file_name; 2.分别在文件夹 /etc/rc0.d/ 和 /etc/rc6 ...

  5. Ruby on Rails,创建和执行migrations迁移文件

    在<Ruby on Rails,rake工具使用和数据库migrations迁移的概念>中,我们知道Rails中进行数据库迁移操作的基本概念和重要性.现在着手进行一个简单的数据库迁移实践吧 ...

  6. mysql innodb表移植_mysql Innodb引擎独立表空间下通过复制.ibd文件快速迁移数据文件...

    假设需求:需要把库test1中的的数据迁移到test2中,并且test2中数据量特别大 硬性条件:1.mysql 使用 Innodb引擎,且开启独立表空间,2.两个库的mysql版本一致(不同版本下未 ...

  7. Django无法执行迁移文件

    前提 前提 前提 :         必须安装了两个底层包  pymysql 和 mysqlclient 今天分享使用用 IDE,pycharm中的Django来对mysql数据库进行生成数据迁移和执 ...

  8. 【laravel5.4】迁移文件的生成、修改、删除

    建议直接去官方文档查看: https://laravel-china.org/docs/laravel/5.4/migrations#creating-columns 1.生成迁移: 主要方式:1.创 ...

  9. linux如何迁移文件,linux 数据库文件迁移步骤详解

    linux 数据库文件迁移步骤详解 linux 数据库文件迁移步骤详解 数据库所有文件(数据文件.日志文件.临时文件.控制文件)迁移步骤: 1. 迁移步骤概述: 1:具体需求 2:保存现有数据文件.控 ...

最新文章

  1. 用onerror处理图片获取失败问题
  2. linux查看占用端口号的程序及pid
  3. 解决Apache/PHP无法启动的问题
  4. pythonselenium提高爬虫效率_[编程经验] Python中使用selenium进行动态爬虫
  5. 利用MSFM算法计算程函方程的走时CT胖射线反演法
  6. 苹果一体机系统恢复_趁双十一大促销,赶紧升级苹果一体机升级SSD固态和液态内存吧...
  7. mysql使用中文报错,hibernate mysql 插入中文错误
  8. layui 自动渲染_Layui表格自动渲染
  9. 'gbk' codec can't encode character解决方法
  10. 数据助力防疫,疫情密切接触人员追踪算法赛期待你的加入
  11. 神经网络算法是什么意思,人工神经网络英文缩写
  12. RMAN-06091: no channel allocated for maintenance (of an appropriate type)
  13. win10重装系统后出现的0xc0000225问题解决
  14. 云开发魔都团长头像制作微信小程序源码/带流量主
  15. 一加 Ace2是直屏还是曲面屏 一加 Ace2有IP68级防水吗
  16. 45. Django 2.1.7 项目技巧 - 创建apps应用目录归纳所有应用
  17. 涂鸦智能三明治音视频核心板(BK7256)开箱测评
  18. 可视化网络拓扑:两天之内从零到英雄
  19. js  计算是今天多少周
  20. matlab坐标轴标注和特殊字体…

热门文章

  1. 分类变量如何设置变量值的显示顺序
  2. python安装pyinstaller库_python pyinstaller安装
  3. SAP UI5 货币金额显示的格式化逻辑
  4. SAP Commerce Cloud Spartacus UI 的购物车 Cart 功能
  5. 内容分发网络 - Content Delivery Network 学习笔记
  6. 使用CSS属性处理前端开发中长文本造成的内容显示重叠问题
  7. JavaScript ES6对Proxy的原生支持的一个例子:开发人员学习额外的编程语言
  8. 程序员工作生活的好帮手,滴答清单,多平台支持
  9. 使用代码创建SAP BRF ruleset
  10. CBA - Success function for Create Oppt call