iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL和PostgreSQL之间如何跨数据库进行复制
  • 353
分享到

MySQL和PostgreSQL之间如何跨数据库进行复制

2024-04-02 19:04:59 353人浏览 泡泡鱼
摘要

这篇文章主要介绍“Mysql和postgresql之间如何跨数据库进行复制”,在日常操作中,相信很多人在mysql和Postgresql之间如何跨数据库进行复制问题上存在疑惑,小编查阅了各式资料,整理出简单

这篇文章主要介绍“Mysqlpostgresql之间如何跨数据库进行复制”,在日常操作中,相信很多人在mysql和Postgresql之间如何跨数据库进行复制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL和PostgreSQL之间如何跨数据库进行复制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

涉及跨数据库复制的databases一般被称作异构databases。这是将数据从一种RDBMS server复制到另一种server的一种很好的方法。

PostgreSQL和MySQL都是传统的RDBMS数据库,但是他们也提供了NoSQL的能力。本文主要从RDBMS的角度讨论PostgreSQL和MySQL之间的复制问题。不对复制内部机制做详细介绍,只对一些基本元素、如何配置、有点、限制以及一些使用案例进行阐述。

通常情况下,两个种类相同的主备之间使用binary模式或者query模式进行复制。复制的目的在于,在备上能够得到主的实时备份数据,从而形成一个active-passive模式(因为复制只配置单向复制)。当然,也可以配置成向同步,构建active-active模式。

可以在两个不同数据库server之间配置上面的两种模式,其中一个数据库server可以配置从另外一个完全不同的数据库server上接收副本数据并维护副本数据的实时快照。MySQL和PostgreSQL通过原生机制或者第三方插件(包括binlog方法、磁盘块方法、基于语句和行的方法)完成上面提到的模式。

由于MySQL和PostgreSQL使用不同的复制协议,所以他们之间不能互相交互。为了达到通信流的目的,可以使用一个开源软件pg_chameleon。

pg_chameleon背景

pg_chameleon是由python3开发的MySQL to PG的复制工具。该插件也会使用一个mysql-replication的开源库,该库也是由python3开发。从MySQL表中拉取行镜像并存储成JSONB形式,然后同步到PG数据库。PG数据库通过pl/pgsql进行解析并回放。

pg_chameleon特性

1、同一个集群中多个MySQL schema可以复制到一个PG database,形成many-to-one复制模式。

2、源和目的schema名可以不一样

3、复制数据可以从mysql级联副本中拉取。

4、会排除复制失败的表及复制过程中产生错误的表。

5、每个复制功能通过守护进程进行管理

6、配置参数和配置文件以yaml结构进行控制。

Demo

Host

Vm1

Vm2

操作系统

Centos linux release 7.6 x86_64

Centos linux release 7.5 x86_64

数据库版本

MySQL5.7.26

PostgreSQL10.5

数据库端口号

3306

5433

IP地址

192.168.56.102

192.168.56.106

首先需要安装Python,他在创建虚拟环境以及激活的时候会用到。

$> wget  
$> tar -xJf Python-3.6.8.tar.xz$> cd Python-3.6.8$> ./configure --enable-optimizations$> make altinstall

安装成功后需要创建并激活虚拟环境。另外需要将pip模块升级到最新版本。pg_chameleon最新版本是2.0.10,为了不引入新的bug,建议先使用2.0.9版本。

$> python3.6 -m venv venv
$> source venv/bin/activate(venv) 
$> pip install pip --upgrade(venv) 
$> pip install pg_chameleon==2.0.9

下一步需要通过set_configuration_files配置启用pg_chameleon,并创建默认路径以及配置文件:

(venv) $> chameleon set_configuration_filescreating directory /root/.pg_chameleoncreating directory /root/.pg_chameleon/configuration/creating directory /root/.pg_chameleon/logs/creating directory /root/.pg_chameleon/pid/copying configuration  example in /root/.pg_chameleon/configuration//config-example.yml

此时,创建一个config-example.yml文件作为默认的配置文件。一个简单的配置例子如下所示:

$> cat default.yml
---
#global settings
pid_dir: '~/.pg_chameleon/pid/'
log_dir: '~/.pg_chameleon/logs/'
log_dest: file
log_level: info
log_days_keep: 10
rollbar_key: ''
rollbar_env: ''
 
# type_override allows the user to override the default type conversion into a different one.
type_override:
  "tinyint(1)":
    override_to: boolean
    override_tables:
      - "*"
 
#postgres  destination connection
pg_conn:
  host: "192.168.56.106"
  port: "5433"
  user: "usr_replica"
  passWord: "pass123"
  database: "db_replica"
  charset: "utf8"
 
sources:
  mysql:
    db_conn:
      host: "192.168.56.102"
      port: "3306"
      user: "usr_replica"
      password: "pass123"
      charset: 'utf8'
      connect_timeout: 10
    schema_mappings:
      world_x: pgworld_x
    limit_tables:
#      - delphis_mediterranea.foo
    skip_tables:
#      - delphis_mediterranea.bar
    grant_select_to:
      - usr_readonly
    lock_timeout: "120s"
    my_server_id: 100
    replica_batch_size: 10000
    replay_max_rows: 10000
    batch_retention: '1 day'
    copy_max_memory: "300M"
    copy_mode: 'file'
    out_dir: /tmp
    sleep_loop: 1
    on_error_replay: continue
    on_error_read: continue
    auto_maintenance: "disabled"
    gtid_enable: No
    type: mysql
    skip_events:
      insert:
        - delphis_mediterranea.foo #skips inserts on the table delphis_mediterranea.foo
      delete:
        - delphis_mediterranea #skips deletes on schema delphis_mediterranea
      update:

本文使用的配置文件是pg_chameleon提供的样例文件改造过的,以适应源和目标环境。下面是配置文件改造的摘要。

默认情况下.yml文件有“global settings”段,用以控制详细信息比如文件位置、日志位置、日志保留期等。接着是“type override”段,这部分是在复制期间重写类型的集合。默认情况下使用样本类型重写规则,即将tinyint(1)转换成布尔值。然后是“pg_conn”,是目标数据库连接的详细信息。最后一部分是源数据库信息,控制源数据库的连接、源和目标直接的schema映射、需要跳过不复制的表、时间超时、内存等配置。注意,“sources”表示可以有多个源。

本文使用的demo中有一个“world_x”database,包括4个表,MySQL社区提供了下载位置:https://dev.mysql.com/doc/index-other.html

在MySQL和PostgreSQL中都需要创建一个专用用户“usr_replica”,用以复制。在MySQL中该用户需要赋予额外的权限用以访问需要复制表:

mysql> CREATE USER usr_replica ;
mysql> SET PASSWORD FOR usr_replica='pass123';mysql> GRANT ALL ON world_x.* TO 'usr_replica';
mysql> GRANT RELOAD ON *.* to 'usr_replica';mysql> GRANT REPLICATION CLIENT ON *.* to 'usr_replica';
mysql> GRANT REPLICATION SLAVE ON *.* to 'usr_replica';
mysql> FLUSH PRIVILEGES;

PostgreSQL段创建一个“db_replica”database用以接收MySQL数据。PG中的“usr_replica”用户自动配置成两个schemas(pgworld_x和sch_chameleon)的拥有者。这两个schema包含实际复制表和catalog表。通过create_replica_schema参数自动配置:

postgres=# CREATE USER usr_replica WITH PASSWORD 'pass123';
CREATE ROLE
postgres=# CREATE DATABASE db_replica WITH OWNER usr_replica;
CREATE DATABASE

MySQL配置如下,需重启服务才能生效:

$> vi /etc/my.cnf
binlog_fORMat= ROW
binlog_row_image=FULL
log-bin = mysql-binserver-id = 1

此时需要测试下连接是否正常,保证执行pg_chameleon命令时不出问题:

PostgreSQL端:

$> mysql -u usr_replica -Ap'admin123' -h 192.168.56.102 -D world_x

MySQL端:

psql -p 5433 -U usr_replica -h 192.168.56.106 db_replica

下面pg_chameleon的3个命令时搭建环境时执行,添加源并初始化一个备。“create_replica_schema”创建默认的schema(sch_chameleon)以及复制的schema(pgworld_x)。“add_source”通过读取配置文件信息添加source database,本文中是“mysql”。“init_replica”基于配置文件进行初始化。

$> chameleon create_replica_schema --debug
$> chameleon add_source --config default --source mysql --debug
$> chameleon init_replica --config default --source mysql --debug

上面的三个命令执行成功后,会分别输出明显的执行成功信息。任何错误和语法错误都会清晰的输出。

最后一步是通过“start_replica”启动复制:

$> chameleon start_replica --config default --source mysqloutput: Starting the replica process for source mysql

通过show_status显示复制状态:

$> chameleon show_status --source mysql  
OUTPUT: 
  Source id  Source name    Type    Status    Consistent    Read lag    Last read    Replay lag    Last replay
-----------  -------------  ------  --------  ------------  ----------  -----------  ------------  -------------
          1  mysql          mysql   running   No            N/A                      N/A
 
== Schema mappings ==
Origin schema    Destination schema
---------------  --------------------
world_x          pgworld_x
 
== Replica status ==
---------------------  ---
Tables not replicated  0
Tables replicated      4
All tables             4
Last maintenance       N/A
Next maintenance       N/A
Replayed rows
Replayed DDL
Skipped rows
---------------------  ---
$> chameleon show_errors --config default 
output: There are no errors in the log

通过ps命令查看守护进程:

$>  ps -ef|grep chameleon
root       763     1  0 19:20 ?        00:00:00 /u01/media/mysql_samp_dbs/world_x-db/venv/bin/python3.6 /u01/media/mysq l_samp_dbs/world_x-db/venv/bin/chameleon start_replica --config default --source mysql
root       764   763  0 19:20 ?        00:00:01 /u01/media/mysql_samp_dbs/world_x-db/venv/bin/python3.6 /u01/media/mysq l_samp_dbs/world_x-db/venv/bin/chameleon start_replica --config default --source mysql
root       765   763  0 19:20 ?        00:00:00 /u01/media/mysql_samp_dbs/world_x-db/venv/bin/python3.6 /u01/media/mysq l_samp_dbs/world_x-db/venv/bin/chameleon start_replica --config default --source mysql

直到“real-time 回放”搭建复制才能完成。涉及创建表、向MySQL数据库中插入数据;PG的sync_tables命令更新守护进程并将表记录复制到PG:

mysql> create table t1 (n1 int primary key, n2 varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values (1,'one');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values (2,'two');
Query OK, 1 row affected (0.00 sec)
$> chameleon sync_tables --tables world_x.t1 --config default --source mysql
Sync tables process for source mysql started.

测试确认复制正常:

$> psql -p 5433 -U usr_replica -d db_replica -c "select * from pgworld_x.t1";
 n1 |  n2
----+-------
  1 | one
  2 | two

如果是一个迁移需求,执行下面命令标记迁移结束。在所有需要复制的表复制完成后执行这些命令:

$> chameleon stop_replica --config default --source mysql
$> chameleon detach_replica --config default --source mysql --debug

下面的命令可选:

$> chameleon drop_source --config default --source mysql --debug
$> chameleon drop_replica_schema --config default --source mysql --debug

Pros of Using pg_chameleon

安装并配置比较简单

错误日志易看懂

无需更改任何配置,初始化完成后可以添加额外的复制表

可配置成多源复制

可以指定不复制哪些表

Cons of Using pg_chameleon

仅支持MySQL5.5及其以上的版本到Pg9.5及其以上之间进行复制

每个复制表需要有主键或唯一键

只能MySQL到PG

到此,关于“MySQL和PostgreSQL之间如何跨数据库进行复制”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL和PostgreSQL之间如何跨数据库进行复制

本文链接: https://www.lsjlt.com/news/63827.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL和PostgreSQL之间如何跨数据库进行复制
    这篇文章主要介绍“MySQL和PostgreSQL之间如何跨数据库进行复制”,在日常操作中,相信很多人在MySQL和PostgreSQL之间如何跨数据库进行复制问题上存在疑惑,小编查阅了各式资料,整理出简单...
    99+
    2024-04-02
  • SQLServer中如何进行数据库复制和同步
    SQL Server中可以通过以下步骤进行数据库复制和同步: 在源数据库中启用发布器(Publisher):在源数据库中创建一个...
    99+
    2024-04-02
  • 如何使用MySQL进行跨数据库的数据同步?
    如何使用MySQL进行跨数据库的数据同步?在现代的软件开发中,数据库的使用无处不在。而随着软件项目的增长,数据的同步和备份变得越来越重要。MySQL是一个强大的关系型数据库管理系统,同时也提供了一些可靠的方法来实现跨数据库的数据同步。本文将...
    99+
    2023-10-22
    数据同步 MySQL跨数据库 跨数据库同步
  • mysql如何复制数据库
    本篇文章为大家展示了mysql如何复制数据库,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。mysql如何复制数据库1.在DOS窗口下mysql -u root -p...
    99+
    2024-04-02
  • 如何在MySQL中进行跨数据库的查询操作
    在MySQL中进行跨数据库的查询操作,可以使用以下两种方法: 使用全限定表名(Fully Qualified Table Name...
    99+
    2024-03-06
    MySQL
  • 如何备份和恢复PostgreSQL数据库
    备份和恢复PostgreSQL数据库可以通过以下步骤进行: 备份数据库: 使用pg_dump命令备份数据库,例如: pg_dum...
    99+
    2024-04-09
    PostgreSQL
  • mysql数据库如何复制表
    在MySQL中,可以使用CREATE TABLE … SELECT语句来复制表。下面是一个示例: CREATE TABLE ...
    99+
    2024-04-09
    mysql
  • MySQL中如何进行数据备份和恢复
    MySQL 中可以通过使用 mysqldump 工具来进行数据备份和恢复操作。以下是备份和恢复的步骤: 数据备份: 打开命令行工具...
    99+
    2024-03-06
    MySQL
  • MySQL中如何进行备份和恢复数据
    在MySQL中,可以使用mysqldump命令来备份数据库,使用mysql命令来恢复数据库。 备份数据: mysqldump -u ...
    99+
    2024-04-09
    MySQL
  • postgresql如何强制删除数据库
    在 PostgreSQL 中,可以使用以下命令强制删除数据库: DROP DATABASE database_name WITH (...
    99+
    2024-04-08
    postgresql
  • Teradata如何支持跨地域和跨数据中心的数据复制和同步
    Teradata支持跨地域和跨数据中心的数据复制和同步的方式有多种,包括: Teradata Data Mover:Terada...
    99+
    2024-04-09
    Teradata
  • 如何在ASP和Django框架之间进行数据同步?
    ASP和Django是目前常用的两种web框架,它们都有自己独特的特点和优势。在实际应用中,我们有时需要将数据在这两种框架之间进行同步,以满足特定的业务需求。本文将介绍如何在ASP和Django框架之间进行数据同步的方法。 一、ASP框架数...
    99+
    2023-09-07
    同步 django 框架
  • 如何在MySQL中进行数据备份和恢复
    在MySQL中进行数据备份和恢复可以使用以下几种方法: 使用mysqldump命令进行数据备份: 备份数据库:mysqldum...
    99+
    2024-04-09
    MySQL
  • 如何使用MySQL进行数据备份和恢复?
    如何使用MySQL进行数据备份和恢复?数据库中的数据对于任何企业或个人而言都是非常重要的。由于各种原因(如硬件故障、人为错误或恶意攻击等),数据可能会丢失或损坏。因此,定期进行数据库备份是非常重要的。MySQL作为最受欢迎的开源关系型数据库...
    99+
    2023-10-22
    数据恢复 MySQL备份 MySQL数据备份
  • 如何进行MySql数据库C++访问
    如何进行MySql数据库C++访问,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 MySql数据库C++访问...
    99+
    2024-04-02
  • 如何在Mysql数据表中使用蠕虫进行复制
    本文章向大家介绍如何在Mysql数据表中使用蠕虫进行复制,主要包括如何在Mysql数据表中使用蠕虫进行复制的使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。首先...
    99+
    2024-04-02
  • 如何在PostgreSQL中实现数据复制和同步
    在PostgreSQL中,可以使用以下方法实现数据复制和同步: 使用流复制(streaming replication):这是最...
    99+
    2024-04-09
    PostgreSQL
  • 如何在Oracle中进行数据库重建和恢复
    在Oracle数据库中进行数据库重建和恢复通常包括以下步骤: 备份数据库:在进行重建和恢复之前,务必要先备份数据库,以防止数据丢...
    99+
    2024-04-09
    Oracle
  • Mysql数据库之备份和恢复
     一、为什么要数据备份?   备份的主要目的是灾难恢复。 在生产环境中,数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。 造成数据丢失的原因: 程序错误人为,操作错误,运算错误,磁盘故障灾难(如火灾、地震)和盗窃. 二、...
    99+
    2023-09-15
    数据库 mysql
  • 如何进行MySQL并行复制测试
    今天就跟大家聊聊有关如何进行MySQL并行复制测试,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。    对于主从延迟,其实一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作